

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 BepInEx;
using BepInEx.Logging;
using BepInEx.Unity.Mono;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using Newtonsoft.Json;
using S1API.Conditions;
using S1API.Dialogues;
using S1API.Entities;
using S1API.Entities.Interfaces;
using S1API.GameTime;
using S1API.Internal.Abstraction;
using S1API.Internal.Patches;
using S1API.Internal.Utils;
using S1API.Items;
using S1API.Logging;
using S1API.Map;
using S1API.Messaging;
using S1API.Money;
using S1API.PhoneApp;
using S1API.PhoneCalls.Constants;
using S1API.Products;
using S1API.Quests;
using S1API.Quests.Constants;
using S1API.Saveables;
using S1API.Storages;
using ScheduleOne;
using ScheduleOne.AvatarFramework;
using ScheduleOne.Calling;
using ScheduleOne.DevUtilities;
using ScheduleOne.Dialogue;
using ScheduleOne.Economy;
using ScheduleOne.GameTime;
using ScheduleOne.Interaction;
using ScheduleOne.ItemFramework;
using ScheduleOne.Levelling;
using ScheduleOne.Map;
using ScheduleOne.Messaging;
using ScheduleOne.Money;
using ScheduleOne.NPCs;
using ScheduleOne.NPCs.Behaviour;
using ScheduleOne.NPCs.Relation;
using ScheduleOne.NPCs.Responses;
using ScheduleOne.NPCs.Schedules;
using ScheduleOne.Noise;
using ScheduleOne.Persistence.Datas;
using ScheduleOne.Persistence.Loaders;
using ScheduleOne.PlayerScripts;
using ScheduleOne.PlayerScripts.Health;
using ScheduleOne.Product;
using ScheduleOne.Product.Packaging;
using ScheduleOne.Property;
using ScheduleOne.Quests;
using ScheduleOne.ScriptableObjects;
using ScheduleOne.Storage;
using ScheduleOne.UI;
using ScheduleOne.UI.Phone;
using ScheduleOne.UI.Phone.ContactsApp;
using ScheduleOne.UI.WorldspacePopup;
using ScheduleOne.Variables;
using ScheduleOne.Vehicles;
using ScheduleOne.Vision;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.Events;
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: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("KaBooMa")]
[assembly: AssemblyConfiguration("MonoBepInEx")]
[assembly: AssemblyDescription("A Schedule One Mono / Il2Cpp Cross Compatibility Layer")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+d9665e9bd95b76b033fb53d5c1698afa82fe53ac")]
[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 class DialogueInjection
{
public string NpcName;
public string ContainerName;
public string FromNodeGuid;
public string ToNodeGuid;
public string ChoiceLabel;
public string ChoiceText;
public Action OnConfirmed;
public DialogueInjection(string npc, string container, string from, string to, string label, string text, Action onConfirmed)
{
NpcName = npc;
ContainerName = container;
FromNodeGuid = from;
ToNodeGuid = to;
ChoiceLabel = label;
ChoiceText = text;
OnConfirmed = onConfirmed;
}
}
public static class DialogueInjector
{
private static List<DialogueInjection> pendingInjections = new List<DialogueInjection>();
private static bool isHooked = false;
public static void Register(DialogueInjection injection)
{
pendingInjections.Add(injection);
HookUpdateLoop();
}
private static void HookUpdateLoop()
{
if (!isHooked)
{
isHooked = true;
}
}
private static IEnumerator WaitForNPCsAndInject()
{
while (pendingInjections.Count > 0)
{
for (int i = pendingInjections.Count - 1; i >= 0; i--)
{
DialogueInjection injection = pendingInjections[i];
NPC[] npcs = Object.FindObjectsOfType<NPC>();
NPC target = null;
for (int j = 0; j < npcs.Length; j++)
{
if ((Object)(object)npcs[j] != (Object)null && ((Object)npcs[j]).name.Contains(injection.NpcName))
{
target = npcs[j];
break;
}
}
if ((Object)(object)target != (Object)null)
{
TryInject(injection, target);
pendingInjections.RemoveAt(i);
}
}
yield return null;
}
}
private static void TryInject(DialogueInjection injection, NPC npc)
{
//IL_00d7: Unknown result type (might be due to invalid IL or missing references)
//IL_00dc: Unknown result type (might be due to invalid IL or missing references)
//IL_00f6: Unknown result type (might be due to invalid IL or missing references)
//IL_0102: Unknown result type (might be due to invalid IL or missing references)
//IL_0110: Expected O, but got Unknown
//IL_014b: Unknown result type (might be due to invalid IL or missing references)
//IL_0150: Unknown result type (might be due to invalid IL or missing references)
//IL_015c: Unknown result type (might be due to invalid IL or missing references)
//IL_0169: Unknown result type (might be due to invalid IL or missing references)
//IL_0177: Expected O, but got Unknown
DialogueHandler component = ((Component)npc).GetComponent<DialogueHandler>();
NPCEvent_LocationDialogue componentInChildren = ((Component)npc).GetComponentInChildren<NPCEvent_LocationDialogue>(true);
if ((Object)(object)componentInChildren == (Object)null || (Object)(object)componentInChildren.DialogueOverride == (Object)null || ((Object)componentInChildren.DialogueOverride).name != injection.ContainerName)
{
return;
}
DialogueContainer dialogueOverride = componentInChildren.DialogueOverride;
if (dialogueOverride.DialogueNodeData == null)
{
return;
}
DialogueNodeData val = null;
for (int i = 0; i < dialogueOverride.DialogueNodeData.Count; i++)
{
DialogueNodeData val2 = dialogueOverride.DialogueNodeData.ToArray()[i];
if (val2 != null && val2.Guid == injection.FromNodeGuid)
{
val = val2;
break;
}
}
if (val != null)
{
DialogueChoiceData val3 = new DialogueChoiceData
{
Guid = Guid.NewGuid().ToString(),
ChoiceLabel = injection.ChoiceLabel,
ChoiceText = injection.ChoiceText
};
List<DialogueChoiceData> list = new List<DialogueChoiceData>();
if (val.choices != null)
{
list.AddRange(val.choices);
}
list.Add(val3);
val.choices = list.ToArray();
NodeLinkData item = new NodeLinkData
{
BaseDialogueOrBranchNodeGuid = injection.FromNodeGuid,
BaseChoiceOrOptionGUID = val3.Guid,
TargetNodeGuid = injection.ToNodeGuid
};
if (dialogueOverride.NodeLinks == null)
{
dialogueOverride.NodeLinks = new List<NodeLinkData>();
}
dialogueOverride.NodeLinks.Add(item);
DialogueChoiceListener.Register(component, injection.ChoiceLabel, injection.OnConfirmed);
}
}
}
public class ClickHandler
{
private readonly UnityAction _callback;
public ClickHandler(UnityAction callback)
{
_callback = callback;
}
public void OnClick()
{
_callback.Invoke();
}
}
namespace S1API
{
[BepInPlugin("S1API", "S1API", "1.0.0")]
public class S1API : BaseUnityPlugin
{
private void Awake()
{
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
new Harmony("com.S1API").PatchAll();
}
}
public static class MyPluginInfo
{
public const string PLUGIN_GUID = "S1API";
public const string PLUGIN_NAME = "S1API";
public const string PLUGIN_VERSION = "1.0.0";
}
}
namespace S1API.UI
{
public static class UIFactory
{
private static Sprite roundedSprite;
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) RoundedButtonWithLabel(string name, string label, Transform parent, Color bgColor, float width, float height, int fontSize, Color textColor)
{
//IL_000c: Unknown result type (might be due to invalid IL or missing references)
//IL_0012: Expected O, but got Unknown
//IL_002c: Unknown result type (might be due to invalid IL or missing references)
//IL_006c: Unknown result type (might be due to invalid IL or missing references)
//IL_0089: Unknown result type (might be due to invalid IL or missing references)
//IL_0090: Expected O, but got Unknown
//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_00c9: Unknown result type (might be due to invalid IL or missing references)
//IL_00d6: Unknown result type (might be due to invalid IL or missing references)
//IL_00ec: Unknown result type (might be due to invalid IL or missing references)
//IL_0121: Unknown result type (might be due to invalid IL or missing references)
//IL_0128: Expected O, but got Unknown
//IL_0148: Unknown result type (might be due to invalid IL or missing references)
//IL_0155: Unknown result type (might be due to invalid IL or missing references)
//IL_0162: Unknown result type (might be due to invalid IL or missing references)
//IL_016f: Unknown result type (might be due to invalid IL or missing references)
//IL_01aa: Unknown result type (might be due to invalid IL or missing references)
GameObject val = new GameObject(name + "_RoundedMask");
val.transform.SetParent(parent, false);
RectTransform val2 = val.AddComponent<RectTransform>();
val2.sizeDelta = new Vector2(width, height);
LayoutElement val3 = val.AddComponent<LayoutElement>();
val3.preferredWidth = width;
val3.preferredHeight = height;
Image val4 = val.AddComponent<Image>();
val4.sprite = GetRoundedSprite();
val4.type = (Type)1;
((Graphic)val4).color = Color.white;
Mask val5 = val.AddComponent<Mask>();
val5.showMaskGraphic = true;
GameObject val6 = new GameObject(name);
val6.transform.SetParent(val.transform, false);
RectTransform val7 = val6.AddComponent<RectTransform>();
val7.anchorMin = Vector2.zero;
val7.anchorMax = Vector2.one;
val7.offsetMin = Vector2.zero;
val7.offsetMax = Vector2.zero;
Image val8 = val6.AddComponent<Image>();
((Graphic)val8).color = bgColor;
val8.sprite = GetRoundedSprite();
val8.type = (Type)1;
Button val9 = val6.AddComponent<Button>();
((Selectable)val9).targetGraphic = (Graphic)(object)val8;
GameObject val10 = new GameObject("Label");
val10.transform.SetParent(val6.transform, false);
RectTransform val11 = val10.AddComponent<RectTransform>();
val11.anchorMin = Vector2.zero;
val11.anchorMax = Vector2.one;
val11.offsetMin = Vector2.zero;
val11.offsetMax = Vector2.zero;
Text val12 = val10.AddComponent<Text>();
val12.text = label;
val12.alignment = (TextAnchor)4;
val12.fontSize = fontSize;
val12.fontStyle = (FontStyle)1;
((Graphic)val12).color = textColor;
val12.font = Resources.GetBuiltinResource<Font>("Arial.ttf");
return (val, val9, val12);
}
private static Sprite GetRoundedSprite()
{
//IL_0025: Unknown result type (might be due to invalid IL or missing references)
//IL_002b: Expected O, but got Unknown
//IL_01df: Unknown result type (might be due to invalid IL or missing references)
//IL_01ee: Unknown result type (might be due to invalid IL or missing references)
//IL_01fa: Unknown result type (might be due to invalid IL or missing references)
//IL_007e: Unknown result type (might be due to invalid IL or missing references)
//IL_0087: Unknown result type (might be due to invalid IL or missing references)
//IL_00b5: Unknown result type (might be due to invalid IL or missing references)
//IL_00c7: Unknown result type (might be due to invalid IL or missing references)
//IL_00f5: Unknown result type (might be due to invalid IL or missing references)
//IL_0107: Unknown result type (might be due to invalid IL or missing references)
//IL_013b: Unknown result type (might be due to invalid IL or missing references)
//IL_0156: Unknown result type (might be due to invalid IL or missing references)
//IL_0178: Unknown result type (might be due to invalid IL or missing references)
//IL_0175: Unknown result type (might be due to invalid IL or missing references)
//IL_0179: Unknown result type (might be due to invalid IL or missing references)
if ((Object)(object)roundedSprite != (Object)null)
{
return roundedSprite;
}
int num = 32;
Texture2D val = new Texture2D(num, num, (TextureFormat)5, false);
Color32 val2 = default(Color32);
((Color32)(ref val2))..ctor((byte)0, (byte)0, (byte)0, (byte)0);
Color32 val3 = default(Color32);
((Color32)(ref val3))..ctor(byte.MaxValue, byte.MaxValue, byte.MaxValue, byte.MaxValue);
float num2 = 6f;
for (int i = 0; i < num; i++)
{
for (int j = 0; j < num; j++)
{
bool flag = ((float)j < num2 && (float)i < num2 && Vector2.Distance(new Vector2((float)j, (float)i), new Vector2(num2, num2)) > num2) || ((float)j > (float)num - num2 - 1f && (float)i < num2 && Vector2.Distance(new Vector2((float)j, (float)i), new Vector2((float)num - num2 - 1f, num2)) > num2) || ((float)j < num2 && (float)i > (float)num - num2 - 1f && Vector2.Distance(new Vector2((float)j, (float)i), new Vector2(num2, (float)num - num2 - 1f)) > num2) || ((float)j > (float)num - num2 - 1f && (float)i > (float)num - num2 - 1f && Vector2.Distance(new Vector2((float)j, (float)i), new Vector2((float)num - num2 - 1f, (float)num - num2 - 1f)) > num2);
val.SetPixel(j, i, Color32.op_Implicit(flag ? val2 : val3));
}
}
val.Apply();
Vector4 val4 = default(Vector4);
((Vector4)(ref val4))..ctor(8f, 8f, 8f, 8f);
roundedSprite = Sprite.Create(val, new Rect(0f, 0f, (float)num, (float)num), new Vector2(0.5f, 0.5f), 100f, 0u, (SpriteMeshType)0, val4);
return roundedSprite;
}
public static GameObject ButtonRow(string name, Transform parent, float spacing = 12f, TextAnchor alignment = 4)
{
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
//IL_0008: Expected O, but got Unknown
//IL_002d: 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>();
HorizontalLayoutGroup val3 = val.AddComponent<HorizontalLayoutGroup>();
((HorizontalOrVerticalLayoutGroup)val3).spacing = spacing;
((LayoutGroup)val3).childAlignment = alignment;
((HorizontalOrVerticalLayoutGroup)val3).childControlWidth = false;
((HorizontalOrVerticalLayoutGroup)val3).childControlHeight = false;
((HorizontalOrVerticalLayoutGroup)val3).childForceExpandWidth = false;
((HorizontalOrVerticalLayoutGroup)val3).childForceExpandHeight = false;
return val;
}
public static (GameObject, Button, Text) ButtonWithLabel(string name, string label, Transform parent, Color bgColor, float Width, float Height)
{
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
//IL_0008: Expected O, but got Unknown
//IL_0022: Unknown result type (might be due to invalid IL or missing references)
//IL_0035: 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)
//IL_0070: Expected O, but got Unknown
//IL_008f: 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_00a9: Unknown result type (might be due to invalid IL or missing references)
//IL_00b6: Unknown result type (might be due to invalid IL or missing references)
//IL_00f1: 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(Height, Width);
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 GameObject TopBar(string name, Transform parent, string title, float topbarSize, int paddingLeft, int paddingRight, int paddingTop, int paddingBottom)
{
//IL_0012: Unknown result type (might be due to invalid IL or missing references)
//IL_001d: 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_0052: Unknown result type (might be due to invalid IL or missing references)
//IL_005c: Expected O, but got Unknown
GameObject val = Panel(name, parent, new Color(0.15f, 0.15f, 0.15f), (Vector2?)new Vector2(0f, topbarSize), (Vector2?)new Vector2(1f, 1f), fullAnchor: false);
HorizontalLayoutGroup val2 = val.AddComponent<HorizontalLayoutGroup>();
((LayoutGroup)val2).padding = new RectOffset(paddingLeft, paddingRight, paddingTop, paddingBottom);
((HorizontalOrVerticalLayoutGroup)val2).spacing = 20f;
((LayoutGroup)val2).childAlignment = (TextAnchor)4;
((HorizontalOrVerticalLayoutGroup)val2).childForceExpandWidth = false;
((HorizontalOrVerticalLayoutGroup)val2).childForceExpandHeight = true;
Text val3 = Text("TopBarTitle", title, val.transform, 26, (TextAnchor)3, (FontStyle)1);
LayoutElement val4 = ((Component)val3).gameObject.AddComponent<LayoutElement>();
val4.minWidth = 300f;
val4.flexibleWidth = 1f;
return val;
}
public static void HorizontalLayoutOnGO(GameObject go, int spacing = 10, int padLeft = 0, int padRight = 0, int padTop = 0, int padBottom = 0, TextAnchor alignment = 4)
{
//IL_0012: 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_003b: Expected O, but got Unknown
HorizontalLayoutGroup val = go.AddComponent<HorizontalLayoutGroup>();
((HorizontalOrVerticalLayoutGroup)val).spacing = spacing;
((LayoutGroup)val).childAlignment = alignment;
((HorizontalOrVerticalLayoutGroup)val).childForceExpandWidth = false;
((HorizontalOrVerticalLayoutGroup)val).childForceExpandHeight = false;
((LayoutGroup)val).padding = new RectOffset(padLeft, padRight, padTop, padBottom);
}
public static void SetLayoutGroupPadding(LayoutGroup layoutGroup, int left, int right, int top, int bottom)
{
//IL_0007: Unknown result type (might be due to invalid IL or missing references)
//IL_0011: Expected O, but got Unknown
layoutGroup.padding = new RectOffset(left, right, top, bottom);
}
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 List<QuestEntry> QuestEntries = new List<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;
protected QuestState QuestState => (QuestState)S1Quest.QuestState;
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_0088: Unknown result type (might be due to invalid IL or missing references)
//IL_0092: Expected O, but got Unknown
//IL_0098: Unknown result type (might be due to invalid IL or missing references)
//IL_00a2: Expected O, but got Unknown
//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
//IL_00b2: Expected O, but got Unknown
//IL_00b8: Unknown result type (might be due to invalid IL or missing references)
//IL_00c2: Expected O, but got Unknown
//IL_0145: Unknown result type (might be due to invalid IL or missing references)
//IL_014b: Expected O, but got Unknown
//IL_01c0: Unknown result type (might be due to invalid IL or missing references)
//IL_01c7: 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_0240: Unknown result type (might be due to invalid IL or missing references)
//IL_0247: Expected O, but got Unknown
//IL_0295: Unknown result type (might be due to invalid IL or missing references)
//IL_02a5: Unknown result type (might be due to invalid IL or missing references)
//IL_02ac: Expected O, but got Unknown
_questData = new QuestData(GetType().Name);
_gameObject = new GameObject("Quest");
S1Quest = _gameObject.AddComponent<Quest>();
S1Quest.StaticGUID = string.Empty;
FieldInfo fieldInfo = AccessTools.Field(typeof(Quest), "title");
fieldInfo.SetValue(S1Quest, Title);
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 fieldInfo2 = AccessTools.Field(typeof(Quest), "autoInitialize");
fieldInfo2.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 fieldInfo3 = AccessTools.Field(typeof(POI), "UIPrefab");
fieldInfo3.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)
};
QuestEntries.Add(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 QuestState State => (QuestState)S1QuestEntry.State;
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);
if (quest == null)
{
throw new Exception("Unable to create quest instance of " + questType.FullName + "!");
}
Quests.Add(quest);
return quest;
}
public static Quest? GetQuestByGuid(string guid)
{
string guid2 = guid;
return Quests.FirstOrDefault((Quest x) => x.S1Quest.StaticGUID == guid2);
}
public static Quest? GetQuestByName(string questName)
{
string questName2 = questName;
return Quests.FirstOrDefault((Quest x) => x.S1Quest.Title == questName2);
}
}
}
namespace S1API.Quests.Constants
{
public enum QuestAction
{
Begin,
Success,
Fail,
Expire,
Cancel
}
public enum QuestState
{
Inactive,
Active,
Completed,
Failed,
Expired,
Cancelled
}
}
namespace S1API.Property
{
public abstract class BaseProperty
{
public abstract string PropertyName { get; }
public abstract string PropertyCode { get; }
public abstract float Price { get; }
public abstract bool IsOwned { get; }
public abstract int EmployeeCapacity { get; set; }
public abstract void SetOwned();
public abstract bool IsPointInside(Vector3 point);
}
public static class PropertyManager
{
public static List<PropertyWrapper> GetAllProperties()
{
List<PropertyWrapper> list = new List<PropertyWrapper>();
foreach (Property property in Property.Properties)
{
list.Add(new PropertyWrapper(property));
}
return list;
}
public static List<PropertyWrapper> GetOwnedProperties()
{
List<PropertyWrapper> list = new List<PropertyWrapper>();
foreach (Property ownedProperty in Property.OwnedProperties)
{
list.Add(new PropertyWrapper(ownedProperty));
}
return list;
}
public static PropertyWrapper FindPropertyByName(string name)
{
foreach (Property property in Property.Properties)
{
if (property.PropertyName == name)
{
return new PropertyWrapper(property);
}
}
return null;
}
}
public class PropertyWrapper : BaseProperty
{
internal readonly Property InnerProperty;
public override string PropertyName => InnerProperty.PropertyName;
public override string PropertyCode => InnerProperty.PropertyCode;
public override float Price => InnerProperty.Price;
public override bool IsOwned => InnerProperty.IsOwned;
public override int EmployeeCapacity
{
get
{
return InnerProperty.EmployeeCapacity;
}
set
{
InnerProperty.EmployeeCapacity = value;
}
}
public PropertyWrapper(Property property)
{
InnerProperty = property;
}
public override void SetOwned()
{
InnerProperty.SetOwned();
}
public override bool IsPointInside(Vector3 point)
{
//IL_0007: Unknown result type (might be due to invalid IL or missing references)
return InnerProperty.DoBoundsContainPoint(point);
}
}
}
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;
public Sprite Icon => ((ItemDefinition)S1ProductDefinition).Icon;
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)));
}
}
internal static class ProductDefinitionWrapper
{
internal 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.PhoneCalls
{
public class CallerDefinition
{
internal readonly CallerID S1CallerIDEntry;
public string Name
{
get
{
return S1CallerIDEntry.Name;
}
set
{
S1CallerIDEntry.Name = value;
}
}
public Sprite? ProfilePicture
{
get
{
return S1CallerIDEntry.ProfilePicture;
}
set
{
S1CallerIDEntry.ProfilePicture = value;
}
}
internal CallerDefinition(CallerID s1CallerID)
{
S1CallerIDEntry = s1CallerID;
}
}
public static class CallManager
{
public static void QueueCall(PhoneCallDefinition phoneCallDefinition)
{
Singleton<CallManager>.Instance.QueueCall(phoneCallDefinition.S1PhoneCallData);
}
}
public class CallStageEntry
{
internal readonly Stage S1Stage;
protected readonly List<SystemTriggerEntry> StartTriggerEntries = new List<SystemTriggerEntry>();
protected readonly List<SystemTriggerEntry> DoneTriggerEntries = new List<SystemTriggerEntry>();
public string Text
{
get
{
return S1Stage.Text;
}
set
{
S1Stage.Text = value;
}
}
internal CallStageEntry(Stage stage)
{
S1Stage = stage;
}
public SystemTriggerEntry AddSystemTrigger(SystemTriggerType triggerType)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_0007: Expected O, but got Unknown
SystemTrigger val = new SystemTrigger();
SystemTriggerEntry systemTriggerEntry = new SystemTriggerEntry(val);
switch (triggerType)
{
case SystemTriggerType.StartTrigger:
S1Stage.OnStartTriggers = S1Stage.OnStartTriggers.AddItemToArray(val);
StartTriggerEntries.Add(systemTriggerEntry);
break;
case SystemTriggerType.DoneTrigger:
S1Stage.OnDoneTriggers = S1Stage.OnDoneTriggers.AddItemToArray(val);
DoneTriggerEntries.Add(systemTriggerEntry);
break;
}
return systemTriggerEntry;
}
}
public abstract class PhoneCallDefinition
{
public CallerDefinition? Caller;
public readonly PhoneCallData S1PhoneCallData;
protected readonly List<CallStageEntry> StageEntries = new List<CallStageEntry>();
protected PhoneCallDefinition(string name, Sprite? profilePicture = null)
{
S1PhoneCallData = ScriptableObject.CreateInstance<PhoneCallData>();
PhoneCallData s1PhoneCallData = S1PhoneCallData;
if (s1PhoneCallData.Stages == null)
{
s1PhoneCallData.Stages = Array.Empty<Stage>();
}
AddCallerID(name, profilePicture);
}
protected PhoneCallDefinition(NPC? npcCallerID)
{
S1PhoneCallData = ScriptableObject.CreateInstance<PhoneCallData>();
PhoneCallData s1PhoneCallData = S1PhoneCallData;
if (s1PhoneCallData.Stages == null)
{
s1PhoneCallData.Stages = Array.Empty<Stage>();
}
AddCallerID(npcCallerID);
}
protected CallerDefinition AddCallerID(string name, Sprite? profilePicture = null)
{
CallerID val = ScriptableObject.CreateInstance<CallerID>();
val.Name = name;
val.ProfilePicture = profilePicture;
S1PhoneCallData.CallerID = val;
Caller = new CallerDefinition(val)
{
Name = name,
ProfilePicture = profilePicture
};
return Caller;
}
protected CallerDefinition AddCallerID(NPC? npc)
{
CallerID val = ScriptableObject.CreateInstance<CallerID>();
val.Name = npc?.FullName ?? "Unknown Caller";
val.ProfilePicture = npc?.Icon;
S1PhoneCallData.CallerID = val;
Caller = new CallerDefinition(val)
{
Name = (npc?.FullName ?? "Unknown Caller"),
ProfilePicture = npc?.Icon
};
return Caller;
}
protected CallStageEntry AddStage(string text)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
//IL_000e: Expected O, but got Unknown
Stage val = new Stage
{
Text = text
};
S1PhoneCallData.Stages = S1PhoneCallData.Stages.AddItemToArray(val);
CallStageEntry callStageEntry = new CallStageEntry(val)
{
Text = text
};
StageEntries.Add(callStageEntry);
return callStageEntry;
}
public void Completed()
{
S1PhoneCallData.Completed();
}
}
}
namespace S1API.PhoneCalls.Constants
{
public enum EvaluationType
{
PassOnTrue,
PassOnFalse
}
public enum SystemTriggerType
{
StartTrigger,
DoneTrigger
}
}
namespace S1API.PhoneApp
{
public abstract class PhoneApp : Registerable
{
protected static readonly Log Logger = new Log("PhoneApp");
private GameObject? _appPanel;
private bool _appCreated;
private 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()
{
PhoneAppRegistry.Register(this);
}
protected override void OnDestroyed()
{
if ((Object)(object)_appPanel != (Object)null)
{
Object.Destroy((Object)(object)_appPanel);
_appPanel = null;
}
_appCreated = false;
_iconModified = false;
}
internal void SpawnUI(HomeScreen homeScreenInstance)
{
Transform obj = ((Component)homeScreenInstance).transform.parent.Find("AppsCanvas");
GameObject val = ((obj != null) ? ((Component)obj).gameObject : null);
if ((Object)(object)val == (Object)null)
{
Logger.Error("AppsCanvas not found.");
return;
}
Transform val2 = val.transform.Find(AppName);
if ((Object)(object)val2 != (Object)null)
{
_appPanel = ((Component)val2).gameObject;
SetupExistingAppPanel(_appPanel);
}
else
{
Transform val3 = val.transform.Find("ProductManagerApp");
if ((Object)(object)val3 == (Object)null)
{
Logger.Error("Template ProductManagerApp not found.");
return;
}
_appPanel = Object.Instantiate<GameObject>(((Component)val3).gameObject, val.transform);
((Object)_appPanel).name = AppName;
Transform val4 = _appPanel.transform.Find("Container");
if ((Object)(object)val4 != (Object)null)
{
GameObject gameObject = ((Component)val4).gameObject;
ClearContainer(gameObject);
OnCreatedUI(gameObject);
}
_appCreated = true;
}
_appPanel.SetActive(true);
}
internal void SpawnIcon(HomeScreen homeScreenInstance)
{
if (_iconModified)
{
return;
}
Transform obj = ((Component)homeScreenInstance).transform.Find("AppIcons");
GameObject val = ((obj != null) ? ((Component)obj).gameObject : null);
if ((Object)(object)val == (Object)null)
{
Logger.Error("AppIcons not found under HomeScreen.");
return;
}
Transform val2 = ((val.transform.childCount > 0) ? val.transform.GetChild(val.transform.childCount - 1) : null);
if ((Object)(object)val2 == (Object)null)
{
Logger.Error("No icons found in AppIcons.");
return;
}
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 = IconLabel;
}
_iconModified = ChangeAppIconImage(gameObject, 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 ChangeAppIconImage(GameObject iconObj, string filename)
{
//IL_0089: Unknown result type (might be due to invalid IL or missing references)
//IL_0090: Expected O, but got Unknown
//IL_00bd: Unknown result type (might be due to invalid IL or missing references)
//IL_00cc: 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)
{
Logger.Error("Image component not found in icon.");
return false;
}
string text = Path.Combine(Paths.PluginPath, filename);
if (!File.Exists(text))
{
Logger.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)
{
Logger.Error("Failed to load image: " + ex.Message);
}
return false;
}
}
}
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);
}
}
public static class Money
{
private static MoneyManager Internal => NetworkSingleton<MoneyManager>.Instance;
public static event Action? OnBalanceChanged;
public static void ChangeCashBalance(float amount, bool visualizeChange = true, bool playCashSound = false)
{
MoneyManager @internal = Internal;
if (@internal != null)
{
@internal.ChangeCashBalance(amount, visualizeChange, playCashSound);
}
Money.OnBalanceChanged?.Invoke();
}
public static void CreateOnlineTransaction(string transactionName, float unitAmount, float quantity, string transactionNote)
{
MoneyManager @internal = Internal;
if (@internal != null)
{
@internal.CreateOnlineTransaction(transactionName, unitAmount, quantity, transactionNote);
}
Money.OnBalanceChanged?.Invoke();
}
public static float GetNetWorth()
{
return ((Object)(object)Internal != (Object)null) ? Internal.GetNetWorth() : 0f;
}
public static float GetCashBalance()
{
return ((Object)(object)Internal != (Object)null) ? Internal.cashBalance : 0f;
}
public static float GetOnlineBalance()
{
return ((Object)(object)Internal != (Object)null) ? Internal.sync___get_value_onlineBalance() : 0f;
}
public static void AddNetworthCalculation(Action<object> callback)
{
if ((Object)(object)Internal != (Object)null)
{
MoneyManager @internal = Internal;
@internal.onNetworthCalculation = (Action<FloatContainer>)Delegate.Combine(@internal.onNetworthCalculation, callback);
}
}
public static void RemoveNetworthCalculation(Action<object> callback)
{
if ((Object)(object)Internal != (Object)null)
{
MoneyManager @internal = Internal;
@internal.onNetworthCalculation = (Action<FloatContainer>)Delegate.Remove(@internal.onNetworthCalculation, callback);
}
}
public static CashInstance CreateCashInstance(float amount)
{
CashDefinition item = Registry.GetItem<CashDefinition>("cash");
ItemInstance itemInstance = CrossType.As<ItemInstance>(((ItemDefinition)item).GetDefaultInstance(1));
CashInstance cashInstance = new CashInstance(itemInstance);
cashInstance.SetQuantity(amount);
return cashInstance;
}
}
}
namespace S1API.Messaging
{
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.Map
{
public enum Region
{
Northtown,
Westville,
Downtown,
Docks,
Suburbia,
Uptown
}
}
namespace S1API.Logging
{
public class Log
{
private readonly ManualLogSource _loggerInstance;
public Log(string sourceName)
{
_loggerInstance = Logger.CreateLogSource(sourceName);
}
public Log(ManualLogSource loggerInstance)
{
_loggerInstance = loggerInstance;
}
public void Msg(string message)
{
_loggerInstance.LogInfo((object)message);
}
public void Warning(string message)
{
_loggerInstance.LogWarning((object)message);
}
public void Error(string message)
{
_loggerInstance.LogError((object)message);
}
public void BigError(string message)
{
_loggerInstance.LogFatal((object)message);
}
}
}
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
{
public static class ArrayExtensions
{
public static T[] AddItemToArray<T>(this T[]? array, T item)
{
if (array == null)
{
array = Array.Empty<T>();
}
Array.Resize(ref array, array.Length + 1);
array[^1] = item;
return array;
}
}
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;
}
}
}
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
{
private static readonly Log _loggerInstance = new Log("ImageUtils");
public static Sprite? LoadImage(string fileName)
{
//IL_0056: Unknown result type (might be due to invalid IL or missing references)
//IL_005d: 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))
{
_loggerInstance.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)
{
_loggerInstance.Error("❌ Failed to load sprite: " + ex);
}
return null;
}
}
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.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.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);
}
}
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") && !assembly.FullName.StartsWith("com.rlabrecque") && !assembly.FullName.StartsWith("__Generated")
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(typeof(HomeScreen), "Start")]
internal static class HomeScreen_Start_Patch
{
private static readonly Log Logger = new Log("PhoneApp");
private static void Postfix(HomeScreen __instance)
{
if ((Object)(object)__instance == (Object)null)
{
return;
}
List<Type> derivedClasses = ReflectionUtils.GetDerivedClasses<global::S1API.PhoneApp.PhoneApp>();
foreach (Type item in derivedClasses)
{
Logger.Msg("Found phone app: " + item.FullName);
if (!(item.GetConstructor(Type.EmptyTypes) == null))
{
try
{
global::S1API.PhoneApp.PhoneApp phoneApp = (global::S1API.PhoneApp.PhoneApp)Activator.CreateInstance(item);
((IRegisterable)phoneApp).CreateInternal();
phoneApp.SpawnUI(__instance);
phoneApp.SpawnIcon(__instance);
}
catch (Exception ex)
{
Logger.Warning("[PhoneApp] Failed to register " + item.FullName + ": " + ex.Message);
}
}
}
}
}
[HarmonyPatch]
internal class NPCPatches
{
[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, nonPublic: true);
if (nPC == null)
{
throw new Exception("Unable to create instance of " + derivedClass.FullName + "!");
}
if (!(derivedClass.Assembly == Assembly.GetExecutingAssembly()))
{
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;
NPC.All.FirstOrDefault((NPC npc) => npc.IsCustomNPC && (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;
NPC.All.FirstOrDefault((NPC npc) => npc.IsCustomNPC && (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;
NPC.All.Remove(NPC.All.First((NPC npc) => (Object)(object)npc.S1NPC == (Object)(object)__instance2));
}
}
internal static class PhoneAppRegistry
{
public static readonly List<global::S1API.PhoneApp.PhoneApp> RegisteredApps = new List<global::S1API.PhoneApp.PhoneApp>();
public static void Register(global::S1API.PhoneApp.PhoneApp app)
{
RegisteredApps.Add(app);
}
}
[HarmonyPatch]
internal class PlayerPatches
{
[HarmonyPatch(typeof(Player), "Awake")]
[HarmonyPostfix]
private static void PlayerAwake(Player __instance)
{
new Player(__instance);
}
[HarmonyPatch(typeof(Player), "OnDestroy")]
[HarmonyPostfix]
private static void PlayerOnDestroy(Player __instance)
{
Player __instance2 = __instance;
Player.All.Remove(Player.All.First((Player player) => (Object)(object)player.S1Player == (Object)(object)__instance2));
}
}
[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_") ?? false
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 struct GameDateTime
{
public int ElapsedDays;
public int Time;
public GameDateTime(int elapsedDays, int time)
{
ElapsedDays = elapsedDays;
Time = time;
}
public GameDateTime(int minSum)
{
ElapsedDays = minSum / 1440;
int num = minSum % 1440;
if (minSum < 0)
{
num = -minSum % 1440;
}
Time = TimeManager.Get24HourTimeFromMinSum(num);
}
public GameDateTime(GameDateTimeData data)
{
ElapsedDays = data.ElapsedDays;
Time = data.Time;
}
public GameDateTime(GameDateTime gameDateTime)
{
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
//IL_000e: Unknown result type (might be due to invalid IL or missing references)
ElapsedDays = gameDateTime.elapsedDays;
Time = gameDateTime.time;
}
public int GetMinSum()
{
return ElapsedDays * 1440 + TimeManager.GetMinSumFrom24HourTime(Time);
}
public GameDateTime AddMinutes(int minutes)
{
return new GameDateTime(GetMinSum() + minutes);
}
public GameDateTime ToS1()
{
//IL_000d: Unknown result type (might be due to invalid IL or missing references)
//IL_0012: Unknown result type (might be due to invalid IL or missing references)
//IL_0015: Unknown result type (might be due to invalid IL or missing references)
return new GameDateTime(ElapsedDays, Time);
}
public string GetFormattedTime()
{
return TimeManager.Get12HourTime((float)Time, true);
}
public bool IsNightTime()
{
return Time < 600 || Time >= 1800;
}
public bool IsSameDay(GameDateTime other)
{
return ElapsedDays == other.ElapsedDays;
}
public bool IsSameTime(GameDateTime other)
{
return ElapsedDays == other.ElapsedDays && Time == other.Time;
}
public override string ToString()
{
return $"Day {ElapsedDays}, {GetFormattedTime()}";
}
public static GameDateTime operator +(GameDateTime a, GameDateTime b)
{
return new GameDateTime(a.GetMinSum() + b.GetMinSum());
}
public static GameDateTime operator -(GameDateTime a, GameDateTime b)
{
return new GameDateTime(a.GetMinSum() - b.GetMinSum());
}
public static bool operator >(GameDateTime a, GameDateTime b)
{
return a.GetMinSum() > b.GetMinSum();
}
public static bool operator <(GameDateTime a, GameDateTime b)
{
return a.GetMinSum() < b.GetMinSum();
}
}
public static class TimeManager
{
public static Action OnDayPass;
public static Action OnWeekPass;
public static Action OnSleepStart;
public static Action<int> OnSleepEnd;
public static Day CurrentDay => (Day)NetworkSingleton<TimeManager>.Instance.CurrentDay;
public static int ElapsedDays => NetworkSingleton<TimeManager>.Instance.ElapsedDays;
public static int CurrentTime => NetworkSingleton<TimeManager>.Instance.CurrentTime;
public static bool IsNight => NetworkSingleton<TimeManager>.Instance.IsNight;
public static bool IsEndOfDay => NetworkSingleton<TimeManager>.Instance.IsEndOfDay;
public static bool SleepInProgress => NetworkSingleton<TimeManager>.Instance.SleepInProgress;
public static bool TimeOverridden => NetworkSingleton<TimeManager>.Instance.TimeOverridden;
public static float NormalizedTime => NetworkSingleton<TimeManager>.Instance.NormalizedTime;
public static float Playtime => NetworkSingleton<TimeManager>.Instance.Playtime;
static TimeManager()
{
OnDayPass = delegate
{
};
OnWeekPass = delegate
{
};
OnSleepStart = delegate
{
};
OnSleepEnd = delegate
{
};
if ((Object)(object)NetworkSingleton<TimeManager>.Instance != (Object)null)
{
TimeManager instance = NetworkSingleton<TimeManager>.Instance;
instance.onDayPass = (Action)Delegate.Combine(instance.onDayPass, (Action)delegate
{
OnDayPass();
});
TimeManager instance2 = NetworkSingleton<TimeManager>.Instance;
instance2.onWeekPass = (Action)Delegate.Combine(instance2.onWeekPass, (Action)delegate
{
OnWeekPass();
});
}
TimeManager.onSleepStart = (Action)Delegate.Combine(TimeManager.onSleepStart, (Action)delegate
{
OnSleepStart();
});
TimeManager.onSleepEnd = (Action<int>)Delegate.Combine(TimeManager.onSleepEnd, (Action<int>)delegate(int minutes)
{
OnSleepEnd(minutes);
});
}
public static void FastForwardToWakeTime()
{
NetworkSingleton<TimeManager>.Instance.FastForwardToWakeTime();
}
public static void SetTime(int time24h, bool local = false)
{
NetworkSingleton<TimeManager>.Instance.SetTime(time24h, local);
}
public static void SetElapsedDays(int days)
{
NetworkSingleton<TimeManager>.Instance.SetElapsedDays(days);
}
public static string GetFormatted12HourTime()
{
return TimeManager.Get12HourTime((float)CurrentTime, true);
}
public static bool IsCurrentTimeWithinRange(int startTime24h, int endTime24h)
{
return NetworkSingleton<TimeManager>.Instance.IsCurrentTimeWithinRange(startTime24h, endTime24h);
}
public static int GetMinutesFrom24HourTime(int time24h)
{
return TimeManager.GetMinSumFrom24HourTime(time24h);
}
public static int Get24HourTimeFromMinutes(int minutes)
{
return TimeManager.Get24HourTimeFromMinSum(minutes);
}
}
}
namespace S1API.Entities
{
public abstract class NPC : Saveable, IEntity, IHealth
{
protected readonly List<Response> Responses = new List<Response>();
public static readonly List<NPC> All = new List<NPC>();
internal readonly NPC S1NPC;
internal readonly bool IsCustomNPC;
private readonly FieldInfo _panicField = AccessTools.Field(typeof(NPC), "PANIC_DURATION");
private readonly FieldInfo _requiresRegionUnlockedField = AccessTools.Field(typeof(NPC), "RequiresRegionUnlocked");
private readonly MethodInfo _unsettleMethod = AccessTools.Method(typeof(NPC), "SetUnsettled", (Type[])null, (Type[])null);
private readonly MethodInfo _removePanicMethod = AccessTools.Method(typeof(NPC), "RemovePanicked", (Type[])null, (Type[])null);
public GameObject gameObject { get; }
public Vector3 Position
{
get
{
//IL_000b: Unknown result type (might be due to invalid IL or missing references)
return gameObject.transform.position;
}
set
{
//IL_000b: Unknown result type (might be due to invalid IL or missing references)
S1NPC.Movement.Warp(value);
}
}
public Transform Transform => gameObject.transform;
public string FirstName
{
get
{
return S1NPC.FirstName;
}
set
{
S1NPC.FirstName = value;
}
}
public string LastName
{
get
{
return S1NPC.LastName;
}
set
{
S1NPC.LastName = value;
}
}
public string FullName => S1NPC.fullName;
public string ID
{
get
{
return S1NPC.ID;
}
protected set
{
S1NPC.ID = value;
}
}
public Sprite Icon
{
get
{
return S1NPC.MugshotSprite;
}
set
{
S1NPC.MugshotSprite = value;
}
}
public bool IsConscious => S1NPC.IsConscious;
public bool IsInBuilding => S1NPC.isInBuilding;
public bool IsInVehicle => S1NPC.IsInVehicle;
public bool IsPanicking => S1NPC.IsPanicked;
public bool IsUnsettled => S1NPC.isUnsettled;
public bool IsVisible => S1NPC.isVisible;
public float Aggressiveness
{
get
{
return S1NPC.Aggression;
}
set
{
S1NPC.Aggression = value;
}
}
public Region Region => (Region)S1NPC.Region;
public float PanicDuration
{
get
{
return (float)_panicField.GetValue(S1NPC);
}
set
{
_panicField.SetValue(S1NPC, value);
}
}
public float Scale
{
get
{
return S1NPC.Scale;
}
set
{
S1NPC.SetScale(value);
}
}
public bool IsKnockedOut => S1NPC.Health.IsKnockedOut;
public bool RequiresRegionUnlocked
{
get
{
return (bool)_requiresRegionUnlockedField.GetValue(S1NPC);
}
set
{
_panicField.SetValue(S1NPC, value);
}
}
public float CurrentHealth => S1NPC.Health.Health;
public float MaxHealth
{
get
{
return S1NPC.Health.MaxHealth;
}
set
{
S1NPC.Health.MaxHealth = value;
}
}
public bool IsDead => S1NPC.Health.IsDead;
public bool IsInvincible
{
get
{
return S1NPC.Health.Invincible;
}
set
{
S1NPC.Health.Invincible = value;
}
}
public event Action OnDeath
{
add
{
EventHelper.AddListener(value, S1NPC.Health.onDie);
}
remove
{
EventHelper.RemoveListener(value, S1NPC.Health.onDie);
}
}
public event Action OnInventoryChanged
{
add
{
EventHelper.AddListener(value, S1NPC.Inventory.onContentsChanged);
}
remove
{
EventHelper.RemoveListener(value, S1NPC.Inventory.onContentsChanged);
}
}
protected NPC(string id, string? firstName, string? lastName, Sprite? icon = null)
{
//IL_0087: Unknown result type (might be due to invalid IL or missing references)
//IL_0091: Expected O, but got Unknown
//IL_0175: Unknown result type (might be due to invalid IL or missing references)
//IL_017f: Expected O, but got Unknown
//IL_018a: Unknown result type (might be due to invalid IL or missing references)
//IL_0194: Expected O, but got Unknown
//IL_01bf: Unknown result type (might be due to invalid IL or missing references)
//IL_01c5: Expected O, but got Unknown
//IL_02b5: Unknown result type (might be due to invalid IL or missing references)
//IL_02bb: Expected O, but got Unknown
//IL_02de: Unknown result type (might be due to invalid IL or missing references)
//IL_02e5: Expected O, but got Unknown
//IL_0306: Unknown result type (might be due to invalid IL or missing references)
//IL_030d: Expected O, but got Unknown
//IL_034a: Unknown result type (might be due to invalid IL or missing references)
//IL_0351: Expected O, but got Unknown
//IL_0385: Unknown result type (might be due to invalid IL or missing references)
//IL_038c: Expected O, but got Unknown
//IL_03b4: Unknown result type (might be due to invalid IL or missing references)
//IL_03b9: Unknown result type (might be due to invalid IL or missing references)
//IL_03bb: Unknown result type (might be due to invalid IL or missing references)
//IL_03c0: Unknown result type (might be due to invalid IL or missing references)
//IL_03d0: Expected O, but got Unknown
//IL_0438: Unknown result type (might be due to invalid IL or missing references)
//IL_0442: Expected O, but got Unknown
IsCustomNPC = true;
gameObject = new GameObject();
gameObject.SetActive(false);
S1NPC = gameObject.AddComponent<NPC>();
S1NPC.FirstName = firstName;
S1NPC.LastName = lastName;
S1NPC.ID = id;
S1NPC.MugshotSprite = icon ?? ((App<ContactsApp>)(object)PlayerSingleton<ContactsApp>.Instance).AppIcon;
S1NPC.BakedGUID = Guid.NewGuid().ToString();
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.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.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.transform.SetParent(gameObject.transform);
S1NPC.awareness.Responses = (NPCResponses)(object)val6.AddComponent<NPCResponses_Civilian>();
GameObject val7 = new GameObject("VisionCone");
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);
All.Add(this);
}
protected virtual void OnResponseLoaded(Response response)
{
}
public void Revive()
{
S1NPC.Health.Revive();
}
public void Damage(int amount)
{
if (amount > 0)
{
S1NPC.Health.TakeDamage((float)amount, true);
}
}
public void Heal(int amount)
{
if (amount > 0)
{
float num = Mathf.Min((float)amount, S1NPC.Health.MaxHealth - S1NPC.Health.Health);
S1NPC.Health.TakeDamage(0f - num, false);
}
}
public void Kill()
{
S1NPC.Health.TakeDamage(S1NPC.Health.MaxHealth, true);
}
public void Unsettle(float duration)
{
_unsettleMethod.Invoke(S1NPC, new object[1] { duration });
}
public void LerpScale(float scale, float lerpTime)
{
S1NPC.SetScale(scale, lerpTime);
}
public void Panic()
{
S1NPC.SetPanicked();
}
public void StopPanicking()
{
_removePanicMethod.Invoke(S1NPC, new object[0]);
}
public void KnockOut()
{
S1NPC.Health.KnockOut();
}
public void Goto(Vector3 position)
{
//IL_000b: Unknown result type (might be due to invalid IL or missing references)
S1NPC.Movement.SetDestination(position);
}
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);
}
}
public static NPC? Get<T>()
{
return All.FirstOrDefault((NPC npc) => npc.GetType() == typeof(T));
}
internal NPC(NPC npc)
{
S1NPC = npc;
gameObject = ((Component)npc).gameObject;
IsCustomNPC = false;
All.Add(this);
}
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 class Player : IEntity, IHealth
{
private const float InvincibleHealth = 1E+09f;
private const float MortalHealth = 100f;
public static readonly List<Player> All = new List<Player>();
internal Player S1Player;
private readonly FieldInfo _maxHealthField = AccessTools.Field(typeof(PlayerHealth), "MAX_HEALTH");
public static Player Local => All.FirstOrDefault((Player player) => player.IsLocal);
public bool IsLocal => S1Player.IsLocalPlayer;
public string Name => S1Player.PlayerName;
GameObject IEntity.gameObject => ((Component)S1Player).gameObject;
public Vector3 Position
{
get
{
//IL_000b: Unknown result type (might be due to invalid IL or missing references)
return ((IEntity)this).gameObject.transform.position;
}
set
{
//IL_000b: Unknown result type (might be due to invalid IL or missing references)
((IEntity)this).gameObject.transform.position = value;
}
}
public Transform Transform => ((IEntity)this).gameObject.transform;
public float Scale
{
get
{
return S1Player.Scale;
}
set
{
S1Player.SetScale(value);
}
}
public float CurrentHealth => S1Player.Health.CurrentHealth;
public float MaxHealth
{
get
{
return (float)_maxHealthField.GetValue(S1Player.Health);
}
set
{
_maxHealthField.SetValue(S1Player.
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.Conditions;
using S1API.Dialogues;
using S1API.Entities;
using S1API.Entities.Interfaces;
using S1API.GameTime;
using S1API.Internal.Abstraction;
using S1API.Internal.Patches;
using S1API.Internal.Utils;
using S1API.Items;
using S1API.Logging;
using S1API.Map;
using S1API.Messaging;
using S1API.Money;
using S1API.PhoneApp;
using S1API.PhoneCalls.Constants;
using S1API.Products;
using S1API.Quests;
using S1API.Quests.Constants;
using S1API.Saveables;
using S1API.Storages;
using ScheduleOne;
using ScheduleOne.AvatarFramework;
using ScheduleOne.Calling;
using ScheduleOne.DevUtilities;
using ScheduleOne.Dialogue;
using ScheduleOne.Economy;
using ScheduleOne.GameTime;
using ScheduleOne.Interaction;
using ScheduleOne.ItemFramework;
using ScheduleOne.Levelling;
using ScheduleOne.Map;
using ScheduleOne.Messaging;
using ScheduleOne.Money;
using ScheduleOne.NPCs;
using ScheduleOne.NPCs.Behaviour;
using ScheduleOne.NPCs.Relation;
using ScheduleOne.NPCs.Responses;
using ScheduleOne.NPCs.Schedules;
using ScheduleOne.Noise;
using ScheduleOne.Persistence.Datas;
using ScheduleOne.Persistence.Loaders;
using ScheduleOne.PlayerScripts;
using ScheduleOne.PlayerScripts.Health;
using ScheduleOne.Product;
using ScheduleOne.Product.Packaging;
using ScheduleOne.Property;
using ScheduleOne.Quests;
using ScheduleOne.ScriptableObjects;
using ScheduleOne.Storage;
using ScheduleOne.UI;
using ScheduleOne.UI.Phone;
using ScheduleOne.UI.Phone.ContactsApp;
using ScheduleOne.UI.WorldspacePopup;
using ScheduleOne.Variables;
using ScheduleOne.Vehicles;
using ScheduleOne.Vision;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.Events;
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.6.2", "KaBooMa", null)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("KaBooMa")]
[assembly: AssemblyConfiguration("MonoMelon")]
[assembly: AssemblyDescription("A Schedule One Mono / Il2Cpp Cross Compatibility Layer")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+d9665e9bd95b76b033fb53d5c1698afa82fe53ac")]
[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 class DialogueInjection
{
public string NpcName;
public string ContainerName;
public string FromNodeGuid;
public string ToNodeGuid;
public string ChoiceLabel;
public string ChoiceText;
public Action OnConfirmed;
public DialogueInjection(string npc, string container, string from, string to, string label, string text, Action onConfirmed)
{
NpcName = npc;
ContainerName = container;
FromNodeGuid = from;
ToNodeGuid = to;
ChoiceLabel = label;
ChoiceText = text;
OnConfirmed = onConfirmed;
}
}
public static class DialogueInjector
{
private static List<DialogueInjection> pendingInjections = new List<DialogueInjection>();
private static bool isHooked = false;
public static void Register(DialogueInjection injection)
{
pendingInjections.Add(injection);
HookUpdateLoop();
}
private static void HookUpdateLoop()
{
if (!isHooked)
{
isHooked = true;
MelonCoroutines.Start(WaitForNPCsAndInject());
}
}
private static IEnumerator WaitForNPCsAndInject()
{
while (pendingInjections.Count > 0)
{
for (int i = pendingInjections.Count - 1; i >= 0; i--)
{
DialogueInjection injection = pendingInjections[i];
NPC[] npcs = Object.FindObjectsOfType<NPC>();
NPC target = null;
for (int j = 0; j < npcs.Length; j++)
{
if ((Object)(object)npcs[j] != (Object)null && ((Object)npcs[j]).name.Contains(injection.NpcName))
{
target = npcs[j];
break;
}
}
if ((Object)(object)target != (Object)null)
{
TryInject(injection, target);
pendingInjections.RemoveAt(i);
}
}
yield return null;
}
}
private static void TryInject(DialogueInjection injection, NPC npc)
{
//IL_00d7: Unknown result type (might be due to invalid IL or missing references)
//IL_00dc: Unknown result type (might be due to invalid IL or missing references)
//IL_00f6: Unknown result type (might be due to invalid IL or missing references)
//IL_0102: Unknown result type (might be due to invalid IL or missing references)
//IL_0110: Expected O, but got Unknown
//IL_014b: Unknown result type (might be due to invalid IL or missing references)
//IL_0150: Unknown result type (might be due to invalid IL or missing references)
//IL_015c: Unknown result type (might be due to invalid IL or missing references)
//IL_0169: Unknown result type (might be due to invalid IL or missing references)
//IL_0177: Expected O, but got Unknown
DialogueHandler component = ((Component)npc).GetComponent<DialogueHandler>();
NPCEvent_LocationDialogue componentInChildren = ((Component)npc).GetComponentInChildren<NPCEvent_LocationDialogue>(true);
if ((Object)(object)componentInChildren == (Object)null || (Object)(object)componentInChildren.DialogueOverride == (Object)null || ((Object)componentInChildren.DialogueOverride).name != injection.ContainerName)
{
return;
}
DialogueContainer dialogueOverride = componentInChildren.DialogueOverride;
if (dialogueOverride.DialogueNodeData == null)
{
return;
}
DialogueNodeData val = null;
for (int i = 0; i < dialogueOverride.DialogueNodeData.Count; i++)
{
DialogueNodeData val2 = dialogueOverride.DialogueNodeData.ToArray()[i];
if (val2 != null && val2.Guid == injection.FromNodeGuid)
{
val = val2;
break;
}
}
if (val != null)
{
DialogueChoiceData val3 = new DialogueChoiceData
{
Guid = Guid.NewGuid().ToString(),
ChoiceLabel = injection.ChoiceLabel,
ChoiceText = injection.ChoiceText
};
List<DialogueChoiceData> list = new List<DialogueChoiceData>();
if (val.choices != null)
{
list.AddRange(val.choices);
}
list.Add(val3);
val.choices = list.ToArray();
NodeLinkData item = new NodeLinkData
{
BaseDialogueOrBranchNodeGuid = injection.FromNodeGuid,
BaseChoiceOrOptionGUID = val3.Guid,
TargetNodeGuid = injection.ToNodeGuid
};
if (dialogueOverride.NodeLinks == null)
{
dialogueOverride.NodeLinks = new List<NodeLinkData>();
}
dialogueOverride.NodeLinks.Add(item);
DialogueChoiceListener.Register(component, injection.ChoiceLabel, injection.OnConfirmed);
}
}
}
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
{
private static Sprite roundedSprite;
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) RoundedButtonWithLabel(string name, string label, Transform parent, Color bgColor, float width, float height, int fontSize, Color textColor)
{
//IL_000c: Unknown result type (might be due to invalid IL or missing references)
//IL_0012: Expected O, but got Unknown
//IL_002c: Unknown result type (might be due to invalid IL or missing references)
//IL_006c: Unknown result type (might be due to invalid IL or missing references)
//IL_0089: Unknown result type (might be due to invalid IL or missing references)
//IL_0090: Expected O, but got Unknown
//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_00c9: Unknown result type (might be due to invalid IL or missing references)
//IL_00d6: Unknown result type (might be due to invalid IL or missing references)
//IL_00ec: Unknown result type (might be due to invalid IL or missing references)
//IL_0121: Unknown result type (might be due to invalid IL or missing references)
//IL_0128: Expected O, but got Unknown
//IL_0148: Unknown result type (might be due to invalid IL or missing references)
//IL_0155: Unknown result type (might be due to invalid IL or missing references)
//IL_0162: Unknown result type (might be due to invalid IL or missing references)
//IL_016f: Unknown result type (might be due to invalid IL or missing references)
//IL_01aa: Unknown result type (might be due to invalid IL or missing references)
GameObject val = new GameObject(name + "_RoundedMask");
val.transform.SetParent(parent, false);
RectTransform val2 = val.AddComponent<RectTransform>();
val2.sizeDelta = new Vector2(width, height);
LayoutElement val3 = val.AddComponent<LayoutElement>();
val3.preferredWidth = width;
val3.preferredHeight = height;
Image val4 = val.AddComponent<Image>();
val4.sprite = GetRoundedSprite();
val4.type = (Type)1;
((Graphic)val4).color = Color.white;
Mask val5 = val.AddComponent<Mask>();
val5.showMaskGraphic = true;
GameObject val6 = new GameObject(name);
val6.transform.SetParent(val.transform, false);
RectTransform val7 = val6.AddComponent<RectTransform>();
val7.anchorMin = Vector2.zero;
val7.anchorMax = Vector2.one;
val7.offsetMin = Vector2.zero;
val7.offsetMax = Vector2.zero;
Image val8 = val6.AddComponent<Image>();
((Graphic)val8).color = bgColor;
val8.sprite = GetRoundedSprite();
val8.type = (Type)1;
Button val9 = val6.AddComponent<Button>();
((Selectable)val9).targetGraphic = (Graphic)(object)val8;
GameObject val10 = new GameObject("Label");
val10.transform.SetParent(val6.transform, false);
RectTransform val11 = val10.AddComponent<RectTransform>();
val11.anchorMin = Vector2.zero;
val11.anchorMax = Vector2.one;
val11.offsetMin = Vector2.zero;
val11.offsetMax = Vector2.zero;
Text val12 = val10.AddComponent<Text>();
val12.text = label;
val12.alignment = (TextAnchor)4;
val12.fontSize = fontSize;
val12.fontStyle = (FontStyle)1;
((Graphic)val12).color = textColor;
val12.font = Resources.GetBuiltinResource<Font>("Arial.ttf");
return (val, val9, val12);
}
private static Sprite GetRoundedSprite()
{
//IL_0025: Unknown result type (might be due to invalid IL or missing references)
//IL_002b: Expected O, but got Unknown
//IL_01df: Unknown result type (might be due to invalid IL or missing references)
//IL_01ee: Unknown result type (might be due to invalid IL or missing references)
//IL_01fa: Unknown result type (might be due to invalid IL or missing references)
//IL_007e: Unknown result type (might be due to invalid IL or missing references)
//IL_0087: Unknown result type (might be due to invalid IL or missing references)
//IL_00b5: Unknown result type (might be due to invalid IL or missing references)
//IL_00c7: Unknown result type (might be due to invalid IL or missing references)
//IL_00f5: Unknown result type (might be due to invalid IL or missing references)
//IL_0107: Unknown result type (might be due to invalid IL or missing references)
//IL_013b: Unknown result type (might be due to invalid IL or missing references)
//IL_0156: Unknown result type (might be due to invalid IL or missing references)
//IL_0178: Unknown result type (might be due to invalid IL or missing references)
//IL_0175: Unknown result type (might be due to invalid IL or missing references)
//IL_0179: Unknown result type (might be due to invalid IL or missing references)
if ((Object)(object)roundedSprite != (Object)null)
{
return roundedSprite;
}
int num = 32;
Texture2D val = new Texture2D(num, num, (TextureFormat)5, false);
Color32 val2 = default(Color32);
((Color32)(ref val2))..ctor((byte)0, (byte)0, (byte)0, (byte)0);
Color32 val3 = default(Color32);
((Color32)(ref val3))..ctor(byte.MaxValue, byte.MaxValue, byte.MaxValue, byte.MaxValue);
float num2 = 6f;
for (int i = 0; i < num; i++)
{
for (int j = 0; j < num; j++)
{
bool flag = ((float)j < num2 && (float)i < num2 && Vector2.Distance(new Vector2((float)j, (float)i), new Vector2(num2, num2)) > num2) || ((float)j > (float)num - num2 - 1f && (float)i < num2 && Vector2.Distance(new Vector2((float)j, (float)i), new Vector2((float)num - num2 - 1f, num2)) > num2) || ((float)j < num2 && (float)i > (float)num - num2 - 1f && Vector2.Distance(new Vector2((float)j, (float)i), new Vector2(num2, (float)num - num2 - 1f)) > num2) || ((float)j > (float)num - num2 - 1f && (float)i > (float)num - num2 - 1f && Vector2.Distance(new Vector2((float)j, (float)i), new Vector2((float)num - num2 - 1f, (float)num - num2 - 1f)) > num2);
val.SetPixel(j, i, Color32.op_Implicit(flag ? val2 : val3));
}
}
val.Apply();
Vector4 val4 = default(Vector4);
((Vector4)(ref val4))..ctor(8f, 8f, 8f, 8f);
roundedSprite = Sprite.Create(val, new Rect(0f, 0f, (float)num, (float)num), new Vector2(0.5f, 0.5f), 100f, 0u, (SpriteMeshType)0, val4);
return roundedSprite;
}
public static GameObject ButtonRow(string name, Transform parent, float spacing = 12f, TextAnchor alignment = 4)
{
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
//IL_0008: Expected O, but got Unknown
//IL_002d: 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>();
HorizontalLayoutGroup val3 = val.AddComponent<HorizontalLayoutGroup>();
((HorizontalOrVerticalLayoutGroup)val3).spacing = spacing;
((LayoutGroup)val3).childAlignment = alignment;
((HorizontalOrVerticalLayoutGroup)val3).childControlWidth = false;
((HorizontalOrVerticalLayoutGroup)val3).childControlHeight = false;
((HorizontalOrVerticalLayoutGroup)val3).childForceExpandWidth = false;
((HorizontalOrVerticalLayoutGroup)val3).childForceExpandHeight = false;
return val;
}
public static (GameObject, Button, Text) ButtonWithLabel(string name, string label, Transform parent, Color bgColor, float Width, float Height)
{
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
//IL_0008: Expected O, but got Unknown
//IL_0022: Unknown result type (might be due to invalid IL or missing references)
//IL_0035: 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)
//IL_0070: Expected O, but got Unknown
//IL_008f: 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_00a9: Unknown result type (might be due to invalid IL or missing references)
//IL_00b6: Unknown result type (might be due to invalid IL or missing references)
//IL_00f1: 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(Height, Width);
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 GameObject TopBar(string name, Transform parent, string title, float topbarSize, int paddingLeft, int paddingRight, int paddingTop, int paddingBottom)
{
//IL_0012: Unknown result type (might be due to invalid IL or missing references)
//IL_001d: 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_0052: Unknown result type (might be due to invalid IL or missing references)
//IL_005c: Expected O, but got Unknown
GameObject val = Panel(name, parent, new Color(0.15f, 0.15f, 0.15f), (Vector2?)new Vector2(0f, topbarSize), (Vector2?)new Vector2(1f, 1f), fullAnchor: false);
HorizontalLayoutGroup val2 = val.AddComponent<HorizontalLayoutGroup>();
((LayoutGroup)val2).padding = new RectOffset(paddingLeft, paddingRight, paddingTop, paddingBottom);
((HorizontalOrVerticalLayoutGroup)val2).spacing = 20f;
((LayoutGroup)val2).childAlignment = (TextAnchor)4;
((HorizontalOrVerticalLayoutGroup)val2).childForceExpandWidth = false;
((HorizontalOrVerticalLayoutGroup)val2).childForceExpandHeight = true;
Text val3 = Text("TopBarTitle", title, val.transform, 26, (TextAnchor)3, (FontStyle)1);
LayoutElement val4 = ((Component)val3).gameObject.AddComponent<LayoutElement>();
val4.minWidth = 300f;
val4.flexibleWidth = 1f;
return val;
}
public static void HorizontalLayoutOnGO(GameObject go, int spacing = 10, int padLeft = 0, int padRight = 0, int padTop = 0, int padBottom = 0, TextAnchor alignment = 4)
{
//IL_0012: 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_003b: Expected O, but got Unknown
HorizontalLayoutGroup val = go.AddComponent<HorizontalLayoutGroup>();
((HorizontalOrVerticalLayoutGroup)val).spacing = spacing;
((LayoutGroup)val).childAlignment = alignment;
((HorizontalOrVerticalLayoutGroup)val).childForceExpandWidth = false;
((HorizontalOrVerticalLayoutGroup)val).childForceExpandHeight = false;
((LayoutGroup)val).padding = new RectOffset(padLeft, padRight, padTop, padBottom);
}
public static void SetLayoutGroupPadding(LayoutGroup layoutGroup, int left, int right, int top, int bottom)
{
//IL_0007: Unknown result type (might be due to invalid IL or missing references)
//IL_0011: Expected O, but got Unknown
layoutGroup.padding = new RectOffset(left, right, top, bottom);
}
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 List<QuestEntry> QuestEntries = new List<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;
protected QuestState QuestState => (QuestState)S1Quest.QuestState;
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_0088: Unknown result type (might be due to invalid IL or missing references)
//IL_0092: Expected O, but got Unknown
//IL_0098: Unknown result type (might be due to invalid IL or missing references)
//IL_00a2: Expected O, but got Unknown
//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
//IL_00b2: Expected O, but got Unknown
//IL_00b8: Unknown result type (might be due to invalid IL or missing references)
//IL_00c2: Expected O, but got Unknown
//IL_0145: Unknown result type (might be due to invalid IL or missing references)
//IL_014b: Expected O, but got Unknown
//IL_01c0: Unknown result type (might be due to invalid IL or missing references)
//IL_01c7: 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_0240: Unknown result type (might be due to invalid IL or missing references)
//IL_0247: Expected O, but got Unknown
//IL_0295: Unknown result type (might be due to invalid IL or missing references)
//IL_02a5: Unknown result type (might be due to invalid IL or missing references)
//IL_02ac: Expected O, but got Unknown
_questData = new QuestData(GetType().Name);
_gameObject = new GameObject("Quest");
S1Quest = _gameObject.AddComponent<Quest>();
S1Quest.StaticGUID = string.Empty;
FieldInfo fieldInfo = AccessTools.Field(typeof(Quest), "title");
fieldInfo.SetValue(S1Quest, Title);
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 fieldInfo2 = AccessTools.Field(typeof(Quest), "autoInitialize");
fieldInfo2.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 fieldInfo3 = AccessTools.Field(typeof(POI), "UIPrefab");
fieldInfo3.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)
};
QuestEntries.Add(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 QuestState State => (QuestState)S1QuestEntry.State;
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);
if (quest == null)
{
throw new Exception("Unable to create quest instance of " + questType.FullName + "!");
}
Quests.Add(quest);
return quest;
}
public static Quest? GetQuestByGuid(string guid)
{
string guid2 = guid;
return Quests.FirstOrDefault((Quest x) => x.S1Quest.StaticGUID == guid2);
}
public static Quest? GetQuestByName(string questName)
{
string questName2 = questName;
return Quests.FirstOrDefault((Quest x) => x.S1Quest.Title == questName2);
}
}
}
namespace S1API.Quests.Constants
{
public enum QuestAction
{
Begin,
Success,
Fail,
Expire,
Cancel
}
public enum QuestState
{
Inactive,
Active,
Completed,
Failed,
Expired,
Cancelled
}
}
namespace S1API.Property
{
public abstract class BaseProperty
{
public abstract string PropertyName { get; }
public abstract string PropertyCode { get; }
public abstract float Price { get; }
public abstract bool IsOwned { get; }
public abstract int EmployeeCapacity { get; set; }
public abstract void SetOwned();
public abstract bool IsPointInside(Vector3 point);
}
public static class PropertyManager
{
public static List<PropertyWrapper> GetAllProperties()
{
List<PropertyWrapper> list = new List<PropertyWrapper>();
foreach (Property property in Property.Properties)
{
list.Add(new PropertyWrapper(property));
}
return list;
}
public static List<PropertyWrapper> GetOwnedProperties()
{
List<PropertyWrapper> list = new List<PropertyWrapper>();
foreach (Property ownedProperty in Property.OwnedProperties)
{
list.Add(new PropertyWrapper(ownedProperty));
}
return list;
}
public static PropertyWrapper FindPropertyByName(string name)
{
foreach (Property property in Property.Properties)
{
if (property.PropertyName == name)
{
return new PropertyWrapper(property);
}
}
return null;
}
}
public class PropertyWrapper : BaseProperty
{
internal readonly Property InnerProperty;
public override string PropertyName => InnerProperty.PropertyName;
public override string PropertyCode => InnerProperty.PropertyCode;
public override float Price => InnerProperty.Price;
public override bool IsOwned => InnerProperty.IsOwned;
public override int EmployeeCapacity
{
get
{
return InnerProperty.EmployeeCapacity;
}
set
{
InnerProperty.EmployeeCapacity = value;
}
}
public PropertyWrapper(Property property)
{
InnerProperty = property;
}
public override void SetOwned()
{
InnerProperty.SetOwned();
}
public override bool IsPointInside(Vector3 point)
{
//IL_0007: Unknown result type (might be due to invalid IL or missing references)
return InnerProperty.DoBoundsContainPoint(point);
}
}
}
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;
public Sprite Icon => ((ItemDefinition)S1ProductDefinition).Icon;
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)));
}
}
internal static class ProductDefinitionWrapper
{
internal 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.PhoneCalls
{
public class CallerDefinition
{
internal readonly CallerID S1CallerIDEntry;
public string Name
{
get
{
return S1CallerIDEntry.Name;
}
set
{
S1CallerIDEntry.Name = value;
}
}
public Sprite? ProfilePicture
{
get
{
return S1CallerIDEntry.ProfilePicture;
}
set
{
S1CallerIDEntry.ProfilePicture = value;
}
}
internal CallerDefinition(CallerID s1CallerID)
{
S1CallerIDEntry = s1CallerID;
}
}
public static class CallManager
{
public static void QueueCall(PhoneCallDefinition phoneCallDefinition)
{
Singleton<CallManager>.Instance.QueueCall(phoneCallDefinition.S1PhoneCallData);
}
}
public class CallStageEntry
{
internal readonly Stage S1Stage;
protected readonly List<SystemTriggerEntry> StartTriggerEntries = new List<SystemTriggerEntry>();
protected readonly List<SystemTriggerEntry> DoneTriggerEntries = new List<SystemTriggerEntry>();
public string Text
{
get
{
return S1Stage.Text;
}
set
{
S1Stage.Text = value;
}
}
internal CallStageEntry(Stage stage)
{
S1Stage = stage;
}
public SystemTriggerEntry AddSystemTrigger(SystemTriggerType triggerType)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_0007: Expected O, but got Unknown
SystemTrigger val = new SystemTrigger();
SystemTriggerEntry systemTriggerEntry = new SystemTriggerEntry(val);
switch (triggerType)
{
case SystemTriggerType.StartTrigger:
S1Stage.OnStartTriggers = S1Stage.OnStartTriggers.AddItemToArray(val);
StartTriggerEntries.Add(systemTriggerEntry);
break;
case SystemTriggerType.DoneTrigger:
S1Stage.OnDoneTriggers = S1Stage.OnDoneTriggers.AddItemToArray(val);
DoneTriggerEntries.Add(systemTriggerEntry);
break;
}
return systemTriggerEntry;
}
}
public abstract class PhoneCallDefinition
{
public CallerDefinition? Caller;
public readonly PhoneCallData S1PhoneCallData;
protected readonly List<CallStageEntry> StageEntries = new List<CallStageEntry>();
protected PhoneCallDefinition(string name, Sprite? profilePicture = null)
{
S1PhoneCallData = ScriptableObject.CreateInstance<PhoneCallData>();
PhoneCallData s1PhoneCallData = S1PhoneCallData;
if (s1PhoneCallData.Stages == null)
{
s1PhoneCallData.Stages = Array.Empty<Stage>();
}
AddCallerID(name, profilePicture);
}
protected PhoneCallDefinition(NPC? npcCallerID)
{
S1PhoneCallData = ScriptableObject.CreateInstance<PhoneCallData>();
PhoneCallData s1PhoneCallData = S1PhoneCallData;
if (s1PhoneCallData.Stages == null)
{
s1PhoneCallData.Stages = Array.Empty<Stage>();
}
AddCallerID(npcCallerID);
}
protected CallerDefinition AddCallerID(string name, Sprite? profilePicture = null)
{
CallerID val = ScriptableObject.CreateInstance<CallerID>();
val.Name = name;
val.ProfilePicture = profilePicture;
S1PhoneCallData.CallerID = val;
Caller = new CallerDefinition(val)
{
Name = name,
ProfilePicture = profilePicture
};
return Caller;
}
protected CallerDefinition AddCallerID(NPC? npc)
{
CallerID val = ScriptableObject.CreateInstance<CallerID>();
val.Name = npc?.FullName ?? "Unknown Caller";
val.ProfilePicture = npc?.Icon;
S1PhoneCallData.CallerID = val;
Caller = new CallerDefinition(val)
{
Name = (npc?.FullName ?? "Unknown Caller"),
ProfilePicture = npc?.Icon
};
return Caller;
}
protected CallStageEntry AddStage(string text)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
//IL_000e: Expected O, but got Unknown
Stage val = new Stage
{
Text = text
};
S1PhoneCallData.Stages = S1PhoneCallData.Stages.AddItemToArray(val);
CallStageEntry callStageEntry = new CallStageEntry(val)
{
Text = text
};
StageEntries.Add(callStageEntry);
return callStageEntry;
}
public void Completed()
{
S1PhoneCallData.Completed();
}
}
}
namespace S1API.PhoneCalls.Constants
{
public enum EvaluationType
{
PassOnTrue,
PassOnFalse
}
public enum SystemTriggerType
{
StartTrigger,
DoneTrigger
}
}
namespace S1API.PhoneApp
{
public abstract class PhoneApp : Registerable
{
protected static readonly Log Logger = new Log("PhoneApp");
private GameObject? _appPanel;
private bool _appCreated;
private 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()
{
PhoneAppRegistry.Register(this);
}
protected override void OnDestroyed()
{
if ((Object)(object)_appPanel != (Object)null)
{
Object.Destroy((Object)(object)_appPanel);
_appPanel = null;
}
_appCreated = false;
_iconModified = false;
}
internal void SpawnUI(HomeScreen homeScreenInstance)
{
Transform obj = ((Component)homeScreenInstance).transform.parent.Find("AppsCanvas");
GameObject val = ((obj != null) ? ((Component)obj).gameObject : null);
if ((Object)(object)val == (Object)null)
{
Logger.Error("AppsCanvas not found.");
return;
}
Transform val2 = val.transform.Find(AppName);
if ((Object)(object)val2 != (Object)null)
{
_appPanel = ((Component)val2).gameObject;
SetupExistingAppPanel(_appPanel);
}
else
{
Transform val3 = val.transform.Find("ProductManagerApp");
if ((Object)(object)val3 == (Object)null)
{
Logger.Error("Template ProductManagerApp not found.");
return;
}
_appPanel = Object.Instantiate<GameObject>(((Component)val3).gameObject, val.transform);
((Object)_appPanel).name = AppName;
Transform val4 = _appPanel.transform.Find("Container");
if ((Object)(object)val4 != (Object)null)
{
GameObject gameObject = ((Component)val4).gameObject;
ClearContainer(gameObject);
OnCreatedUI(gameObject);
}
_appCreated = true;
}
_appPanel.SetActive(true);
}
internal void SpawnIcon(HomeScreen homeScreenInstance)
{
if (_iconModified)
{
return;
}
Transform obj = ((Component)homeScreenInstance).transform.Find("AppIcons");
GameObject val = ((obj != null) ? ((Component)obj).gameObject : null);
if ((Object)(object)val == (Object)null)
{
Logger.Error("AppIcons not found under HomeScreen.");
return;
}
Transform val2 = ((val.transform.childCount > 0) ? val.transform.GetChild(val.transform.childCount - 1) : null);
if ((Object)(object)val2 == (Object)null)
{
Logger.Error("No icons found in AppIcons.");
return;
}
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 = IconLabel;
}
_iconModified = ChangeAppIconImage(gameObject, 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 ChangeAppIconImage(GameObject iconObj, string filename)
{
//IL_0089: Unknown result type (might be due to invalid IL or missing references)
//IL_0090: Expected O, but got Unknown
//IL_00bd: Unknown result type (might be due to invalid IL or missing references)
//IL_00cc: 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)
{
Logger.Error("Image component not found in icon.");
return false;
}
string text = Path.Combine(MelonEnvironment.ModsDirectory, filename);
if (!File.Exists(text))
{
Logger.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)
{
Logger.Error("Failed to load image: " + ex.Message);
}
return false;
}
}
}
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);
}
}
public static class Money
{
private static MoneyManager Internal => NetworkSingleton<MoneyManager>.Instance;
public static event Action? OnBalanceChanged;
public static void ChangeCashBalance(float amount, bool visualizeChange = true, bool playCashSound = false)
{
MoneyManager @internal = Internal;
if (@internal != null)
{
@internal.ChangeCashBalance(amount, visualizeChange, playCashSound);
}
Money.OnBalanceChanged?.Invoke();
}
public static void CreateOnlineTransaction(string transactionName, float unitAmount, float quantity, string transactionNote)
{
MoneyManager @internal = Internal;
if (@internal != null)
{
@internal.CreateOnlineTransaction(transactionName, unitAmount, quantity, transactionNote);
}
Money.OnBalanceChanged?.Invoke();
}
public static float GetNetWorth()
{
return ((Object)(object)Internal != (Object)null) ? Internal.GetNetWorth() : 0f;
}
public static float GetCashBalance()
{
return ((Object)(object)Internal != (Object)null) ? Internal.cashBalance : 0f;
}
public static float GetOnlineBalance()
{
return ((Object)(object)Internal != (Object)null) ? Internal.sync___get_value_onlineBalance() : 0f;
}
public static void AddNetworthCalculation(Action<object> callback)
{
if ((Object)(object)Internal != (Object)null)
{
MoneyManager @internal = Internal;
@internal.onNetworthCalculation = (Action<FloatContainer>)Delegate.Combine(@internal.onNetworthCalculation, callback);
}
}
public static void RemoveNetworthCalculation(Action<object> callback)
{
if ((Object)(object)Internal != (Object)null)
{
MoneyManager @internal = Internal;
@internal.onNetworthCalculation = (Action<FloatContainer>)Delegate.Remove(@internal.onNetworthCalculation, callback);
}
}
public static CashInstance CreateCashInstance(float amount)
{
CashDefinition item = Registry.GetItem<CashDefinition>("cash");
ItemInstance itemInstance = CrossType.As<ItemInstance>(((ItemDefinition)item).GetDefaultInstance(1));
CashInstance cashInstance = new CashInstance(itemInstance);
cashInstance.SetQuantity(amount);
return cashInstance;
}
}
}
namespace S1API.Messaging
{
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.Map
{
public enum Region
{
Northtown,
Westville,
Downtown,
Docks,
Suburbia,
Uptown
}
}
namespace S1API.Logging
{
public class Log
{
private readonly Instance _loggerInstance;
public Log(string sourceName)
{
//IL_000a: Unknown result type (might be due to invalid IL or missing references)
//IL_0014: Expected O, but got Unknown
_loggerInstance = new Instance(sourceName);
}
public void Msg(string message)
{
_loggerInstance.Msg(message);
}
public void Warning(string message)
{
_loggerInstance.Warning(message);
}
public void Error(string message)
{
_loggerInstance.Error(message);
}
public void BigError(string message)
{
_loggerInstance.BigError(message);
}
}
}
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
{
public static class ArrayExtensions
{
public static T[] AddItemToArray<T>(this T[]? array, T item)
{
if (array == null)
{
array = Array.Empty<T>();
}
Array.Resize(ref array, array.Length + 1);
array[^1] = item;
return array;
}
}
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;
}
}
}
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
{
private static readonly Log _loggerInstance = new Log("ImageUtils");
public static Sprite? LoadImage(string fileName)
{
//IL_0056: Unknown result type (might be due to invalid IL or missing references)
//IL_005d: 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))
{
_loggerInstance.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)
{
_loggerInstance.Error("❌ Failed to load sprite: " + ex);
}
return null;
}
}
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.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.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);
}
}
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") && !assembly.FullName.StartsWith("com.rlabrecque") && !assembly.FullName.StartsWith("__Generated")
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(typeof(HomeScreen), "Start")]
internal static class HomeScreen_Start_Patch
{
private static readonly Log Logger = new Log("PhoneApp");
private static void Postfix(HomeScreen __instance)
{
if ((Object)(object)__instance == (Object)null)
{
return;
}
List<Type> derivedClasses = ReflectionUtils.GetDerivedClasses<global::S1API.PhoneApp.PhoneApp>();
foreach (Type item in derivedClasses)
{
Logger.Msg("Found phone app: " + item.FullName);
if (!(item.GetConstructor(Type.EmptyTypes) == null))
{
try
{
global::S1API.PhoneApp.PhoneApp phoneApp = (global::S1API.PhoneApp.PhoneApp)Activator.CreateInstance(item);
((IRegisterable)phoneApp).CreateInternal();
phoneApp.SpawnUI(__instance);
phoneApp.SpawnIcon(__instance);
}
catch (Exception ex)
{
Logger.Warning("[PhoneApp] Failed to register " + item.FullName + ": " + ex.Message);
}
}
}
}
}
[HarmonyPatch]
internal class NPCPatches
{
[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, nonPublic: true);
if (nPC == null)
{
throw new Exception("Unable to create instance of " + derivedClass.FullName + "!");
}
if (!(derivedClass.Assembly == Assembly.GetExecutingAssembly()))
{
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;
NPC.All.FirstOrDefault((NPC npc) => npc.IsCustomNPC && (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;
NPC.All.FirstOrDefault((NPC npc) => npc.IsCustomNPC && (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;
NPC.All.Remove(NPC.All.First((NPC npc) => (Object)(object)npc.S1NPC == (Object)(object)__instance2));
}
}
internal static class PhoneAppRegistry
{
public static readonly List<global::S1API.PhoneApp.PhoneApp> RegisteredApps = new List<global::S1API.PhoneApp.PhoneApp>();
public static void Register(global::S1API.PhoneApp.PhoneApp app)
{
RegisteredApps.Add(app);
}
}
[HarmonyPatch]
internal class PlayerPatches
{
[HarmonyPatch(typeof(Player), "Awake")]
[HarmonyPostfix]
private static void PlayerAwake(Player __instance)
{
new Player(__instance);
}
[HarmonyPatch(typeof(Player), "OnDestroy")]
[HarmonyPostfix]
private static void PlayerOnDestroy(Player __instance)
{
Player __instance2 = __instance;
Player.All.Remove(Player.All.First((Player player) => (Object)(object)player.S1Player == (Object)(object)__instance2));
}
}
[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_") ?? false
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 struct GameDateTime
{
public int ElapsedDays;
public int Time;
public GameDateTime(int elapsedDays, int time)
{
ElapsedDays = elapsedDays;
Time = time;
}
public GameDateTime(int minSum)
{
ElapsedDays = minSum / 1440;
int num = minSum % 1440;
if (minSum < 0)
{
num = -minSum % 1440;
}
Time = TimeManager.Get24HourTimeFromMinSum(num);
}
public GameDateTime(GameDateTimeData data)
{
ElapsedDays = data.ElapsedDays;
Time = data.Time;
}
public GameDateTime(GameDateTime gameDateTime)
{
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
//IL_000e: Unknown result type (might be due to invalid IL or missing references)
ElapsedDays = gameDateTime.elapsedDays;
Time = gameDateTime.time;
}
public int GetMinSum()
{
return ElapsedDays * 1440 + TimeManager.GetMinSumFrom24HourTime(Time);
}
public GameDateTime AddMinutes(int minutes)
{
return new GameDateTime(GetMinSum() + minutes);
}
public GameDateTime ToS1()
{
//IL_000d: Unknown result type (might be due to invalid IL or missing references)
//IL_0012: Unknown result type (might be due to invalid IL or missing references)
//IL_0015: Unknown result type (might be due to invalid IL or missing references)
return new GameDateTime(ElapsedDays, Time);
}
public string GetFormattedTime()
{
return TimeManager.Get12HourTime((float)Time, true);
}
public bool IsNightTime()
{
return Time < 600 || Time >= 1800;
}
public bool IsSameDay(GameDateTime other)
{
return ElapsedDays == other.ElapsedDays;
}
public bool IsSameTime(GameDateTime other)
{
return ElapsedDays == other.ElapsedDays && Time == other.Time;
}
public override string ToString()
{
return $"Day {ElapsedDays}, {GetFormattedTime()}";
}
public static GameDateTime operator +(GameDateTime a, GameDateTime b)
{
return new GameDateTime(a.GetMinSum() + b.GetMinSum());
}
public static GameDateTime operator -(GameDateTime a, GameDateTime b)
{
return new GameDateTime(a.GetMinSum() - b.GetMinSum());
}
public static bool operator >(GameDateTime a, GameDateTime b)
{
return a.GetMinSum() > b.GetMinSum();
}
public static bool operator <(GameDateTime a, GameDateTime b)
{
return a.GetMinSum() < b.GetMinSum();
}
}
public static class TimeManager
{
public static Action OnDayPass;
public static Action OnWeekPass;
public static Action OnSleepStart;
public static Action<int> OnSleepEnd;
public static Day CurrentDay => (Day)NetworkSingleton<TimeManager>.Instance.CurrentDay;
public static int ElapsedDays => NetworkSingleton<TimeManager>.Instance.ElapsedDays;
public static int CurrentTime => NetworkSingleton<TimeManager>.Instance.CurrentTime;
public static bool IsNight => NetworkSingleton<TimeManager>.Instance.IsNight;
public static bool IsEndOfDay => NetworkSingleton<TimeManager>.Instance.IsEndOfDay;
public static bool SleepInProgress => NetworkSingleton<TimeManager>.Instance.SleepInProgress;
public static bool TimeOverridden => NetworkSingleton<TimeManager>.Instance.TimeOverridden;
public static float NormalizedTime => NetworkSingleton<TimeManager>.Instance.NormalizedTime;
public static float Playtime => NetworkSingleton<TimeManager>.Instance.Playtime;
static TimeManager()
{
OnDayPass = delegate
{
};
OnWeekPass = delegate
{
};
OnSleepStart = delegate
{
};
OnSleepEnd = delegate
{
};
if ((Object)(object)NetworkSingleton<TimeManager>.Instance != (Object)null)
{
TimeManager instance = NetworkSingleton<TimeManager>.Instance;
instance.onDayPass = (Action)Delegate.Combine(instance.onDayPass, (Action)delegate
{
OnDayPass();
});
TimeManager instance2 = NetworkSingleton<TimeManager>.Instance;
instance2.onWeekPass = (Action)Delegate.Combine(instance2.onWeekPass, (Action)delegate
{
OnWeekPass();
});
}
TimeManager.onSleepStart = (Action)Delegate.Combine(TimeManager.onSleepStart, (Action)delegate
{
OnSleepStart();
});
TimeManager.onSleepEnd = (Action<int>)Delegate.Combine(TimeManager.onSleepEnd, (Action<int>)delegate(int minutes)
{
OnSleepEnd(minutes);
});
}
public static void FastForwardToWakeTime()
{
NetworkSingleton<TimeManager>.Instance.FastForwardToWakeTime();
}
public static void SetTime(int time24h, bool local = false)
{
NetworkSingleton<TimeManager>.Instance.SetTime(time24h, local);
}
public static void SetElapsedDays(int days)
{
NetworkSingleton<TimeManager>.Instance.SetElapsedDays(days);
}
public static string GetFormatted12HourTime()
{
return TimeManager.Get12HourTime((float)CurrentTime, true);
}
public static bool IsCurrentTimeWithinRange(int startTime24h, int endTime24h)
{
return NetworkSingleton<TimeManager>.Instance.IsCurrentTimeWithinRange(startTime24h, endTime24h);
}
public static int GetMinutesFrom24HourTime(int time24h)
{
return TimeManager.GetMinSumFrom24HourTime(time24h);
}
public static int Get24HourTimeFromMinutes(int minutes)
{
return TimeManager.Get24HourTimeFromMinSum(minutes);
}
}
}
namespace S1API.Entities
{
public abstract class NPC : Saveable, IEntity, IHealth
{
protected readonly List<Response> Responses = new List<Response>();
public static readonly List<NPC> All = new List<NPC>();
internal readonly NPC S1NPC;
internal readonly bool IsCustomNPC;
private readonly FieldInfo _panicField = AccessTools.Field(typeof(NPC), "PANIC_DURATION");
private readonly FieldInfo _requiresRegionUnlockedField = AccessTools.Field(typeof(NPC), "RequiresRegionUnlocked");
private readonly MethodInfo _unsettleMethod = AccessTools.Method(typeof(NPC), "SetUnsettled", (Type[])null, (Type[])null);
private readonly MethodInfo _removePanicMethod = AccessTools.Method(typeof(NPC), "RemovePanicked", (Type[])null, (Type[])null);
public GameObject gameObject { get; }
public Vector3 Position
{
get
{
//IL_000b: Unknown result type (might be due to invalid IL or missing references)
return gameObject.transform.position;
}
set
{
//IL_000b: Unknown result type (might be due to invalid IL or missing references)
S1NPC.Movement.Warp(value);
}
}
public Transform Transform => gameObject.transform;
public string FirstName
{
get
{
return S1NPC.FirstName;
}
set
{
S1NPC.FirstName = value;
}
}
public string LastName
{
get
{
return S1NPC.LastName;
}
set
{
S1NPC.LastName = value;
}
}
public string FullName => S1NPC.fullName;
public string ID
{
get
{
return S1NPC.ID;
}
protected set
{
S1NPC.ID = value;
}
}
public Sprite Icon
{
get
{
return S1NPC.MugshotSprite;
}
set
{
S1NPC.MugshotSprite = value;
}
}
public bool IsConscious => S1NPC.IsConscious;
public bool IsInBuilding => S1NPC.isInBuilding;
public bool IsInVehicle => S1NPC.IsInVehicle;
public bool IsPanicking => S1NPC.IsPanicked;
public bool IsUnsettled => S1NPC.isUnsettled;
public bool IsVisible => S1NPC.isVisible;
public float Aggressiveness
{
get
{
return S1NPC.Aggression;
}
set
{
S1NPC.Aggression = value;
}
}
public Region Region => (Region)S1NPC.Region;
public float PanicDuration
{
get
{
return (float)_panicField.GetValue(S1NPC);
}
set
{
_panicField.SetValue(S1NPC, value);
}
}
public float Scale
{
get
{
return S1NPC.Scale;
}
set
{
S1NPC.SetScale(value);
}
}
public bool IsKnockedOut => S1NPC.Health.IsKnockedOut;
public bool RequiresRegionUnlocked
{
get
{
return (bool)_requiresRegionUnlockedField.GetValue(S1NPC);
}
set
{
_panicField.SetValue(S1NPC, value);
}
}
public float CurrentHealth => S1NPC.Health.Health;
public float MaxHealth
{
get
{
return S1NPC.Health.MaxHealth;
}
set
{
S1NPC.Health.MaxHealth = value;
}
}
public bool IsDead => S1NPC.Health.IsDead;
public bool IsInvincible
{
get
{
return S1NPC.Health.Invincible;
}
set
{
S1NPC.Health.Invincible = value;
}
}
public event Action OnDeath
{
add
{
EventHelper.AddListener(value, S1NPC.Health.onDie);
}
remove
{
EventHelper.RemoveListener(value, S1NPC.Health.onDie);
}
}
public event Action OnInventoryChanged
{
add
{
EventHelper.AddListener(value, S1NPC.Inventory.onContentsChanged);
}
remove
{
EventHelper.RemoveListener(value, S1NPC.Inventory.onContentsChanged);
}
}
protected NPC(string id, string? firstName, string? lastName, Sprite? icon = null)
{
//IL_0087: Unknown result type (might be due to invalid IL or missing references)
//IL_0091: Expected O, but got Unknown
//IL_0175: Unknown result type (might be due to invalid IL or missing references)
//IL_017f: Expected O, but got Unknown
//IL_018a: Unknown result type (might be due to invalid IL or missing references)
//IL_0194: Expected O, but got Unknown
//IL_01bf: Unknown result type (might be due to invalid IL or missing references)
//IL_01c5: Expected O, but got Unknown
//IL_02b5: Unknown result type (might be due to invalid IL or missing references)
//IL_02bb: Expected O, but got Unknown
//IL_02de: Unknown result type (might be due to invalid IL or missing references)
//IL_02e5: Expected O, but got Unknown
//IL_0306: Unknown result type (might be due to invalid IL or missing references)
//IL_030d: Expected O, but got Unknown
//IL_034a: Unknown result type (might be due to invalid IL or missing references)
//IL_0351: Expected O, but got Unknown
//IL_0385: Unknown result type (might be due to invalid IL or missing references)
//IL_038c: Expected O, but got Unknown
//IL_03b4: Unknown result type (might be due to invalid IL or missing references)
//IL_03b9: Unknown result type (might be due to invalid IL or missing references)
//IL_03bb: Unknown result type (might be due to invalid IL or missing references)
//IL_03c0: Unknown result type (might be due to invalid IL or missing references)
//IL_03d0: Expected O, but got Unknown
//IL_0438: Unknown result type (might be due to invalid IL or missing references)
//IL_0442: Expected O, but got Unknown
IsCustomNPC = true;
gameObject = new GameObject();
gameObject.SetActive(false);
S1NPC = gameObject.AddComponent<NPC>();
S1NPC.FirstName = firstName;
S1NPC.LastName = lastName;
S1NPC.ID = id;
S1NPC.MugshotSprite = icon ?? ((App<ContactsApp>)(object)PlayerSingleton<ContactsApp>.Instance).AppIcon;
S1NPC.BakedGUID = Guid.NewGuid().ToString();
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.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.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.transform.SetParent(gameObject.transform);
S1NPC.awareness.Responses = (NPCResponses)(object)val6.AddComponent<NPCResponses_Civilian>();
GameObject val7 = new GameObject("VisionCone");
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);
All.Add(this);
}
protected virtual void OnResponseLoaded(Response response)
{
}
public void Revive()
{
S1NPC.Health.Revive();
}
public void Damage(int amount)
{
if (amount > 0)
{
S1NPC.Health.TakeDamage((float)amount, true);
}
}
public void Heal(int amount)
{
if (amount > 0)
{
float num = Mathf.Min((float)amount, S1NPC.Health.MaxHealth - S1NPC.Health.Health);
S1NPC.Health.TakeDamage(0f - num, false);
}
}
public void Kill()
{
S1NPC.Health.TakeDamage(S1NPC.Health.MaxHealth, true);
}
public void Unsettle(float duration)
{
_unsettleMethod.Invoke(S1NPC, new object[1] { duration });
}
public void LerpScale(float scale, float lerpTime)
{
S1NPC.SetScale(scale, lerpTime);
}
public void Panic()
{
S1NPC.SetPanicked();
}
public void StopPanicking()
{
_removePanicMethod.Invoke(S1NPC, new object[0]);
}
public void KnockOut()
{
S1NPC.Health.KnockOut();
}
public void Goto(Vector3 position)
{
//IL_000b: Unknown result type (might be due to invalid IL or missing references)
S1NPC.Movement.SetDestination(position);
}
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);
}
}
public static NPC? Get<T>()
{
return All.FirstOrDefault((NPC npc) => npc.GetType() == typeof(T));
}
internal NPC(NPC npc)
{
S1NPC = npc;
gameObject = ((Component)npc).gameObject;
IsCustomNPC = false;
All.Add(this);
}
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 class Player : IEntity, IHealth
{
private const float InvincibleHealth = 1E+09f;
private const float MortalHealth = 100f;
public static readonly List<Player> All = new List<Player>();
internal Player S1Player;
private readonly FieldInfo _maxHealthField = AccessTools.Field(typeof(PlayerHealth), "MAX_HEALTH");
public static Player Local => All.FirstOrDefault((Player player) => player.IsLocal);
public bool IsLocal => S1Player.IsLocalPlayer;
public string Name => S1Player.PlayerName;
GameObject IEntity.gameObject => ((Component)S1Player).gameObject;
public Vector3 Position
{
get
{
//IL_000b: Unknown result type (might be due to invalid IL or missing references)
return ((IEntity)this).gameObject.transform.position;
}
set
{
//IL_000b: Unknown result type (might be due to invalid IL or missing references)
((IEntity)this).gameObject.transform.position = value;
}
}
public Transform Transform => ((IEntity)this).gameObject.transform;
public float Scale
{
get
{
return S1Player.Scale;
}
set
{
S1Player.SetScale(value);
}
}
public float CurrentHealth => S1Player.Health.CurrentHealth;
public float MaxHealth
{
get
{
return (float)_maxHealthField.GetValue(S1Player.Health);
}
set
{
_maxHealthField.SetValue(S1Player.Health, value);
}
}
public bool IsDead => !S1Player.Health.IsAlive;
public bool IsInvincible
{
get
{
return MaxHealth == 1E+09f;
}
set
{
MaxHealth = (value ? 1E+09f : 100f);
S1Player.Health.SetHealth(MaxHealth);
}
}
pub
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.Calling;
using Il2CppScheduleOne.DevUtilities;
using Il2CppScheduleOne.Dialogue;
using Il2CppScheduleOne.Economy;
using Il2CppScheduleOne.GameTime;
using Il2CppScheduleOne.Interaction;
using Il2CppScheduleOne.ItemFramework;
using Il2CppScheduleOne.Levelling;
using Il2CppScheduleOne.Map;
using Il2CppScheduleOne.Messaging;
using Il2CppScheduleOne.Money;
using Il2CppScheduleOne.NPCs;
using Il2CppScheduleOne.NPCs.Behaviour;
using Il2CppScheduleOne.NPCs.Relation;
using Il2CppScheduleOne.NPCs.Responses;
using Il2CppScheduleOne.NPCs.Schedules;
using Il2CppScheduleOne.Noise;
using Il2CppScheduleOne.Persistence.Datas;
using Il2CppScheduleOne.Persistence.Loaders;
using Il2CppScheduleOne.PlayerScripts;
using Il2CppScheduleOne.PlayerScripts.Health;
using Il2CppScheduleOne.Product;
using Il2CppScheduleOne.Product.Packaging;
using Il2CppScheduleOne.Property;
using Il2CppScheduleOne.Quests;
using Il2CppScheduleOne.ScriptableObjects;
using Il2CppScheduleOne.Storage;
using Il2CppScheduleOne.UI;
using Il2CppScheduleOne.UI.Phone;
using Il2CppScheduleOne.UI.Phone.ContactsApp;
using Il2CppScheduleOne.UI.WorldspacePopup;
using Il2CppScheduleOne.Variables;
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.Conditions;
using S1API.Dialogues;
using S1API.Entities;
using S1API.Entities.Interfaces;
using S1API.GameTime;
using S1API.Internal.Abstraction;
using S1API.Internal.Patches;
using S1API.Internal.Utils;
using S1API.Items;
using S1API.Logging;
using S1API.Map;
using S1API.Messaging;
using S1API.Money;
using S1API.PhoneApp;
using S1API.PhoneCalls.Constants;
using S1API.Products;
using S1API.Quests;
using S1API.Quests.Constants;
using S1API.Saveables;
using S1API.Storages;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.Events;
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.6.2", "KaBooMa", null)]
[assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")]
[assembly: AssemblyCompany("KaBooMa")]
[assembly: AssemblyConfiguration("Il2CppMelon")]
[assembly: AssemblyDescription("A Schedule One Mono / Il2Cpp Cross Compatibility Layer")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+d9665e9bd95b76b033fb53d5c1698afa82fe53ac")]
[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 class DialogueInjection
{
public string NpcName;
public string ContainerName;
public string FromNodeGuid;
public string ToNodeGuid;
public string ChoiceLabel;
public string ChoiceText;
public Action OnConfirmed;
public DialogueInjection(string npc, string container, string from, string to, string label, string text, Action onConfirmed)
{
NpcName = npc;
ContainerName = container;
FromNodeGuid = from;
ToNodeGuid = to;
ChoiceLabel = label;
ChoiceText = text;
OnConfirmed = onConfirmed;
}
}
public static class DialogueInjector
{
private static List<DialogueInjection> pendingInjections = new List<DialogueInjection>();
private static bool isHooked = false;
public static void Register(DialogueInjection injection)
{
pendingInjections.Add(injection);
HookUpdateLoop();
}
private static void HookUpdateLoop()
{
if (!isHooked)
{
isHooked = true;
MelonCoroutines.Start(WaitForNPCsAndInject());
}
}
private static IEnumerator WaitForNPCsAndInject()
{
while (pendingInjections.Count > 0)
{
for (int i = pendingInjections.Count - 1; i >= 0; i--)
{
DialogueInjection injection = pendingInjections[i];
Il2CppArrayBase<NPC> npcs = Object.FindObjectsOfType<NPC>();
NPC target = null;
for (int j = 0; j < npcs.Length; j++)
{
if ((Object)(object)npcs[j] != (Object)null && ((Object)npcs[j]).name.Contains(injection.NpcName))
{
target = npcs[j];
break;
}
}
if ((Object)(object)target != (Object)null)
{
TryInject(injection, target);
pendingInjections.RemoveAt(i);
}
}
yield return null;
}
}
private static void TryInject(DialogueInjection injection, NPC npc)
{
//IL_00db: Unknown result type (might be due to invalid IL or missing references)
//IL_00e0: Unknown result type (might be due to invalid IL or missing references)
//IL_00fb: Unknown result type (might be due to invalid IL or missing references)
//IL_0108: Unknown result type (might be due to invalid IL or missing references)
//IL_0117: Expected O, but got Unknown
//IL_0158: Unknown result type (might be due to invalid IL or missing references)
//IL_015d: Unknown result type (might be due to invalid IL or missing references)
//IL_016a: Unknown result type (might be due to invalid IL or missing references)
//IL_0178: Unknown result type (might be due to invalid IL or missing references)
//IL_0187: Expected O, but got Unknown
DialogueHandler component = ((Component)npc).GetComponent<DialogueHandler>();
NPCEvent_LocationDialogue componentInChildren = ((Component)npc).GetComponentInChildren<NPCEvent_LocationDialogue>(true);
if ((Object)(object)componentInChildren == (Object)null || (Object)(object)componentInChildren.DialogueOverride == (Object)null || ((Object)componentInChildren.DialogueOverride).name != injection.ContainerName)
{
return;
}
DialogueContainer dialogueOverride = componentInChildren.DialogueOverride;
if (dialogueOverride.DialogueNodeData == null)
{
return;
}
DialogueNodeData val = null;
for (int i = 0; i < dialogueOverride.DialogueNodeData.Count; i++)
{
DialogueNodeData val2 = dialogueOverride.DialogueNodeData.ToArray()[i];
if (val2 != null && val2.Guid == injection.FromNodeGuid)
{
val = val2;
break;
}
}
if (val != null)
{
DialogueChoiceData val3 = new DialogueChoiceData
{
Guid = Guid.NewGuid().ToString(),
ChoiceLabel = injection.ChoiceLabel,
ChoiceText = injection.ChoiceText
};
List<DialogueChoiceData> list = new List<DialogueChoiceData>();
if (val.choices != null)
{
list.AddRange((IEnumerable<DialogueChoiceData>)val.choices);
}
list.Add(val3);
val.choices = Il2CppReferenceArray<DialogueChoiceData>.op_Implicit(list.ToArray());
NodeLinkData val4 = new NodeLinkData
{
BaseDialogueOrBranchNodeGuid = injection.FromNodeGuid,
BaseChoiceOrOptionGUID = val3.Guid,
TargetNodeGuid = injection.ToNodeGuid
};
if (dialogueOverride.NodeLinks == null)
{
dialogueOverride.NodeLinks = new List<NodeLinkData>();
}
dialogueOverride.NodeLinks.Add(val4);
DialogueChoiceListener.Register(component, injection.ChoiceLabel, injection.OnConfirmed);
}
}
}
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
{
private static Sprite roundedSprite;
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) RoundedButtonWithLabel(string name, string label, Transform parent, Color bgColor, float width, float height, int fontSize, Color textColor)
{
//IL_000c: Unknown result type (might be due to invalid IL or missing references)
//IL_0012: Expected O, but got Unknown
//IL_002c: Unknown result type (might be due to invalid IL or missing references)
//IL_006c: Unknown result type (might be due to invalid IL or missing references)
//IL_0089: Unknown result type (might be due to invalid IL or missing references)
//IL_0090: Expected O, but got Unknown
//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_00c9: Unknown result type (might be due to invalid IL or missing references)
//IL_00d6: Unknown result type (might be due to invalid IL or missing references)
//IL_00ec: Unknown result type (might be due to invalid IL or missing references)
//IL_0121: Unknown result type (might be due to invalid IL or missing references)
//IL_0128: Expected O, but got Unknown
//IL_0148: Unknown result type (might be due to invalid IL or missing references)
//IL_0155: Unknown result type (might be due to invalid IL or missing references)
//IL_0162: Unknown result type (might be due to invalid IL or missing references)
//IL_016f: Unknown result type (might be due to invalid IL or missing references)
//IL_01aa: Unknown result type (might be due to invalid IL or missing references)
GameObject val = new GameObject(name + "_RoundedMask");
val.transform.SetParent(parent, false);
RectTransform val2 = val.AddComponent<RectTransform>();
val2.sizeDelta = new Vector2(width, height);
LayoutElement val3 = val.AddComponent<LayoutElement>();
val3.preferredWidth = width;
val3.preferredHeight = height;
Image val4 = val.AddComponent<Image>();
val4.sprite = GetRoundedSprite();
val4.type = (Type)1;
((Graphic)val4).color = Color.white;
Mask val5 = val.AddComponent<Mask>();
val5.showMaskGraphic = true;
GameObject val6 = new GameObject(name);
val6.transform.SetParent(val.transform, false);
RectTransform val7 = val6.AddComponent<RectTransform>();
val7.anchorMin = Vector2.zero;
val7.anchorMax = Vector2.one;
val7.offsetMin = Vector2.zero;
val7.offsetMax = Vector2.zero;
Image val8 = val6.AddComponent<Image>();
((Graphic)val8).color = bgColor;
val8.sprite = GetRoundedSprite();
val8.type = (Type)1;
Button val9 = val6.AddComponent<Button>();
((Selectable)val9).targetGraphic = (Graphic)(object)val8;
GameObject val10 = new GameObject("Label");
val10.transform.SetParent(val6.transform, false);
RectTransform val11 = val10.AddComponent<RectTransform>();
val11.anchorMin = Vector2.zero;
val11.anchorMax = Vector2.one;
val11.offsetMin = Vector2.zero;
val11.offsetMax = Vector2.zero;
Text val12 = val10.AddComponent<Text>();
val12.text = label;
val12.alignment = (TextAnchor)4;
val12.fontSize = fontSize;
val12.fontStyle = (FontStyle)1;
((Graphic)val12).color = textColor;
val12.font = Resources.GetBuiltinResource<Font>("Arial.ttf");
return (val, val9, val12);
}
private static Sprite GetRoundedSprite()
{
//IL_0025: Unknown result type (might be due to invalid IL or missing references)
//IL_002b: Expected O, but got Unknown
//IL_01df: Unknown result type (might be due to invalid IL or missing references)
//IL_01ee: Unknown result type (might be due to invalid IL or missing references)
//IL_01fa: Unknown result type (might be due to invalid IL or missing references)
//IL_007e: Unknown result type (might be due to invalid IL or missing references)
//IL_0087: Unknown result type (might be due to invalid IL or missing references)
//IL_00b5: Unknown result type (might be due to invalid IL or missing references)
//IL_00c7: Unknown result type (might be due to invalid IL or missing references)
//IL_00f5: Unknown result type (might be due to invalid IL or missing references)
//IL_0107: Unknown result type (might be due to invalid IL or missing references)
//IL_013b: Unknown result type (might be due to invalid IL or missing references)
//IL_0156: Unknown result type (might be due to invalid IL or missing references)
//IL_0178: Unknown result type (might be due to invalid IL or missing references)
//IL_0175: Unknown result type (might be due to invalid IL or missing references)
//IL_0179: Unknown result type (might be due to invalid IL or missing references)
if ((Object)(object)roundedSprite != (Object)null)
{
return roundedSprite;
}
int num = 32;
Texture2D val = new Texture2D(num, num, (TextureFormat)5, false);
Color32 val2 = default(Color32);
((Color32)(ref val2))..ctor((byte)0, (byte)0, (byte)0, (byte)0);
Color32 val3 = default(Color32);
((Color32)(ref val3))..ctor(byte.MaxValue, byte.MaxValue, byte.MaxValue, byte.MaxValue);
float num2 = 6f;
for (int i = 0; i < num; i++)
{
for (int j = 0; j < num; j++)
{
bool flag = ((float)j < num2 && (float)i < num2 && Vector2.Distance(new Vector2((float)j, (float)i), new Vector2(num2, num2)) > num2) || ((float)j > (float)num - num2 - 1f && (float)i < num2 && Vector2.Distance(new Vector2((float)j, (float)i), new Vector2((float)num - num2 - 1f, num2)) > num2) || ((float)j < num2 && (float)i > (float)num - num2 - 1f && Vector2.Distance(new Vector2((float)j, (float)i), new Vector2(num2, (float)num - num2 - 1f)) > num2) || ((float)j > (float)num - num2 - 1f && (float)i > (float)num - num2 - 1f && Vector2.Distance(new Vector2((float)j, (float)i), new Vector2((float)num - num2 - 1f, (float)num - num2 - 1f)) > num2);
val.SetPixel(j, i, Color32.op_Implicit(flag ? val2 : val3));
}
}
val.Apply();
Vector4 val4 = default(Vector4);
((Vector4)(ref val4))..ctor(8f, 8f, 8f, 8f);
roundedSprite = Sprite.Create(val, new Rect(0f, 0f, (float)num, (float)num), new Vector2(0.5f, 0.5f), 100f, 0u, (SpriteMeshType)0, val4);
return roundedSprite;
}
public static GameObject ButtonRow(string name, Transform parent, float spacing = 12f, TextAnchor alignment = 4)
{
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
//IL_0008: Expected O, but got Unknown
//IL_002d: 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>();
HorizontalLayoutGroup val3 = val.AddComponent<HorizontalLayoutGroup>();
((HorizontalOrVerticalLayoutGroup)val3).spacing = spacing;
((LayoutGroup)val3).childAlignment = alignment;
((HorizontalOrVerticalLayoutGroup)val3).childControlWidth = false;
((HorizontalOrVerticalLayoutGroup)val3).childControlHeight = false;
((HorizontalOrVerticalLayoutGroup)val3).childForceExpandWidth = false;
((HorizontalOrVerticalLayoutGroup)val3).childForceExpandHeight = false;
return val;
}
public static (GameObject, Button, Text) ButtonWithLabel(string name, string label, Transform parent, Color bgColor, float Width, float Height)
{
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
//IL_0008: Expected O, but got Unknown
//IL_0022: Unknown result type (might be due to invalid IL or missing references)
//IL_0035: 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)
//IL_0070: Expected O, but got Unknown
//IL_008f: 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_00a9: Unknown result type (might be due to invalid IL or missing references)
//IL_00b6: Unknown result type (might be due to invalid IL or missing references)
//IL_00f1: 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(Height, Width);
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 GameObject TopBar(string name, Transform parent, string title, float topbarSize, int paddingLeft, int paddingRight, int paddingTop, int paddingBottom)
{
//IL_0012: Unknown result type (might be due to invalid IL or missing references)
//IL_001d: 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_0052: Unknown result type (might be due to invalid IL or missing references)
//IL_005c: Expected O, but got Unknown
GameObject val = Panel(name, parent, new Color(0.15f, 0.15f, 0.15f), (Vector2?)new Vector2(0f, topbarSize), (Vector2?)new Vector2(1f, 1f), fullAnchor: false);
HorizontalLayoutGroup val2 = val.AddComponent<HorizontalLayoutGroup>();
((LayoutGroup)val2).padding = new RectOffset(paddingLeft, paddingRight, paddingTop, paddingBottom);
((HorizontalOrVerticalLayoutGroup)val2).spacing = 20f;
((LayoutGroup)val2).childAlignment = (TextAnchor)4;
((HorizontalOrVerticalLayoutGroup)val2).childForceExpandWidth = false;
((HorizontalOrVerticalLayoutGroup)val2).childForceExpandHeight = true;
Text val3 = Text("TopBarTitle", title, val.transform, 26, (TextAnchor)3, (FontStyle)1);
LayoutElement val4 = ((Component)val3).gameObject.AddComponent<LayoutElement>();
val4.minWidth = 300f;
val4.flexibleWidth = 1f;
return val;
}
public static void HorizontalLayoutOnGO(GameObject go, int spacing = 10, int padLeft = 0, int padRight = 0, int padTop = 0, int padBottom = 0, TextAnchor alignment = 4)
{
//IL_0012: 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_003b: Expected O, but got Unknown
HorizontalLayoutGroup val = go.AddComponent<HorizontalLayoutGroup>();
((HorizontalOrVerticalLayoutGroup)val).spacing = spacing;
((LayoutGroup)val).childAlignment = alignment;
((HorizontalOrVerticalLayoutGroup)val).childForceExpandWidth = false;
((HorizontalOrVerticalLayoutGroup)val).childForceExpandHeight = false;
((LayoutGroup)val).padding = new RectOffset(padLeft, padRight, padTop, padBottom);
}
public static void SetLayoutGroupPadding(LayoutGroup layoutGroup, int left, int right, int top, int bottom)
{
//IL_0007: Unknown result type (might be due to invalid IL or missing references)
//IL_0011: Expected O, but got Unknown
layoutGroup.padding = new RectOffset(left, right, top, bottom);
}
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 List<QuestEntry> QuestEntries = new List<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;
protected QuestState QuestState => (QuestState)S1Quest.QuestState;
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_0073: Unknown result type (might be due to invalid IL or missing references)
//IL_007d: Expected O, but got Unknown
//IL_0084: Unknown result type (might be due to invalid IL or missing references)
//IL_008e: Expected O, but got Unknown
//IL_0095: Unknown result type (might be due to invalid IL or missing references)
//IL_009f: Expected O, but got Unknown
//IL_00a6: Unknown result type (might be due to invalid IL or missing references)
//IL_00b0: 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_0199: Unknown result type (might be due to invalid IL or missing references)
//IL_019f: Expected O, but got Unknown
//IL_01d9: Unknown result type (might be due to invalid IL or missing references)
//IL_01df: Expected O, but got Unknown
//IL_0214: Unknown result type (might be due to invalid IL or missing references)
//IL_021b: Expected O, but got Unknown
//IL_0268: Unknown result type (might be due to invalid IL or missing references)
//IL_0278: Unknown result type (might be due to invalid IL or missing references)
//IL_027f: Expected O, but got Unknown
_questData = new QuestData(GetType().Name);
_gameObject = new GameObject("Quest");
S1Quest = _gameObject.AddComponent<Quest>();
S1Quest.StaticGUID = string.Empty;
S1Quest.title = Title;
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)
};
QuestEntries.Add(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 QuestState State => (QuestState)S1QuestEntry.State;
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);
if (quest == null)
{
throw new Exception("Unable to create quest instance of " + questType.FullName + "!");
}
Quests.Add(quest);
return quest;
}
public static Quest? GetQuestByGuid(string guid)
{
string guid2 = guid;
return Quests.FirstOrDefault((Quest x) => x.S1Quest.StaticGUID == guid2);
}
public static Quest? GetQuestByName(string questName)
{
string questName2 = questName;
return Quests.FirstOrDefault((Quest x) => x.S1Quest.Title == questName2);
}
}
}
namespace S1API.Quests.Constants
{
public enum QuestAction
{
Begin,
Success,
Fail,
Expire,
Cancel
}
public enum QuestState
{
Inactive,
Active,
Completed,
Failed,
Expired,
Cancelled
}
}
namespace S1API.Property
{
public abstract class BaseProperty
{
public abstract string PropertyName { get; }
public abstract string PropertyCode { get; }
public abstract float Price { get; }
public abstract bool IsOwned { get; }
public abstract int EmployeeCapacity { get; set; }
public abstract void SetOwned();
public abstract bool IsPointInside(Vector3 point);
}
public static class PropertyManager
{
public static List<PropertyWrapper> GetAllProperties()
{
List<PropertyWrapper> list = new List<PropertyWrapper>();
Enumerator<Property> enumerator = Property.Properties.GetEnumerator();
while (enumerator.MoveNext())
{
Property current = enumerator.Current;
list.Add(new PropertyWrapper(current));
}
return list;
}
public static List<PropertyWrapper> GetOwnedProperties()
{
List<PropertyWrapper> list = new List<PropertyWrapper>();
Enumerator<Property> enumerator = Property.OwnedProperties.GetEnumerator();
while (enumerator.MoveNext())
{
Property current = enumerator.Current;
list.Add(new PropertyWrapper(current));
}
return list;
}
public static PropertyWrapper FindPropertyByName(string name)
{
Enumerator<Property> enumerator = Property.Properties.GetEnumerator();
while (enumerator.MoveNext())
{
Property current = enumerator.Current;
if (current.PropertyName == name)
{
return new PropertyWrapper(current);
}
}
return null;
}
}
public class PropertyWrapper : BaseProperty
{
internal readonly Property InnerProperty;
public override string PropertyName => InnerProperty.PropertyName;
public override string PropertyCode => InnerProperty.PropertyCode;
public override float Price => InnerProperty.Price;
public override bool IsOwned => InnerProperty.IsOwned;
public override int EmployeeCapacity
{
get
{
return InnerProperty.EmployeeCapacity;
}
set
{
InnerProperty.EmployeeCapacity = value;
}
}
public PropertyWrapper(Property property)
{
InnerProperty = property;
}
public override void SetOwned()
{
InnerProperty.SetOwned();
}
public override bool IsPointInside(Vector3 point)
{
//IL_0007: Unknown result type (might be due to invalid IL or missing references)
return InnerProperty.DoBoundsContainPoint(point);
}
}
}
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;
public Sprite Icon => ((ItemDefinition)S1ProductDefinition).Icon;
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)));
}
}
internal static class ProductDefinitionWrapper
{
internal 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.PhoneCalls
{
public class CallerDefinition
{
internal readonly CallerID S1CallerIDEntry;
public string Name
{
get
{
return S1CallerIDEntry.Name;
}
set
{
S1CallerIDEntry.Name = value;
}
}
public Sprite? ProfilePicture
{
get
{
return S1CallerIDEntry.ProfilePicture;
}
set
{
S1CallerIDEntry.ProfilePicture = value;
}
}
internal CallerDefinition(CallerID s1CallerID)
{
S1CallerIDEntry = s1CallerID;
}
}
public static class CallManager
{
public static void QueueCall(PhoneCallDefinition phoneCallDefinition)
{
Singleton<CallManager>.Instance.QueueCall(phoneCallDefinition.S1PhoneCallData);
}
}
public class CallStageEntry
{
internal readonly Stage S1Stage;
protected readonly List<SystemTriggerEntry> StartTriggerEntries = new List<SystemTriggerEntry>();
protected readonly List<SystemTriggerEntry> DoneTriggerEntries = new List<SystemTriggerEntry>();
public string Text
{
get
{
return S1Stage.Text;
}
set
{
S1Stage.Text = value;
}
}
internal CallStageEntry(Stage stage)
{
S1Stage = stage;
}
public SystemTriggerEntry AddSystemTrigger(SystemTriggerType triggerType)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_0007: Expected O, but got Unknown
SystemTrigger val = new SystemTrigger();
SystemTriggerEntry systemTriggerEntry = new SystemTriggerEntry(val);
switch (triggerType)
{
case SystemTriggerType.StartTrigger:
S1Stage.OnStartTriggers = S1Stage.OnStartTriggers.AddItemToArray<SystemTrigger>((SystemTrigger[]?)(object)new SystemTrigger[1] { val });
StartTriggerEntries.Add(systemTriggerEntry);
break;
case SystemTriggerType.DoneTrigger:
S1Stage.OnDoneTriggers = S1Stage.OnDoneTriggers.AddItemToArray<SystemTrigger>((SystemTrigger[]?)(object)new SystemTrigger[1] { val });
DoneTriggerEntries.Add(systemTriggerEntry);
break;
}
return systemTriggerEntry;
}
}
public abstract class PhoneCallDefinition
{
public CallerDefinition? Caller;
public readonly PhoneCallData S1PhoneCallData;
protected readonly List<CallStageEntry> StageEntries = new List<CallStageEntry>();
protected PhoneCallDefinition(string name, Sprite? profilePicture = null)
{
S1PhoneCallData = ScriptableObject.CreateInstance<PhoneCallData>();
PhoneCallData s1PhoneCallData = S1PhoneCallData;
if (s1PhoneCallData.Stages == null)
{
Il2CppReferenceArray<Stage> val2 = (s1PhoneCallData.Stages = Il2CppReferenceArray<Stage>.op_Implicit(Array.Empty<Stage>()));
}
AddCallerID(name, profilePicture);
}
protected PhoneCallDefinition(NPC? npcCallerID)
{
S1PhoneCallData = ScriptableObject.CreateInstance<PhoneCallData>();
PhoneCallData s1PhoneCallData = S1PhoneCallData;
if (s1PhoneCallData.Stages == null)
{
Il2CppReferenceArray<Stage> val2 = (s1PhoneCallData.Stages = Il2CppReferenceArray<Stage>.op_Implicit(Array.Empty<Stage>()));
}
AddCallerID(npcCallerID);
}
protected CallerDefinition AddCallerID(string name, Sprite? profilePicture = null)
{
CallerID val = ScriptableObject.CreateInstance<CallerID>();
val.Name = name;
val.ProfilePicture = profilePicture;
S1PhoneCallData.CallerID = val;
Caller = new CallerDefinition(val)
{
Name = name,
ProfilePicture = profilePicture
};
return Caller;
}
protected CallerDefinition AddCallerID(NPC? npc)
{
CallerID val = ScriptableObject.CreateInstance<CallerID>();
val.Name = npc?.FullName ?? "Unknown Caller";
val.ProfilePicture = npc?.Icon;
S1PhoneCallData.CallerID = val;
Caller = new CallerDefinition(val)
{
Name = (npc?.FullName ?? "Unknown Caller"),
ProfilePicture = npc?.Icon
};
return Caller;
}
protected CallStageEntry AddStage(string text)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
//IL_000f: Expected O, but got Unknown
Stage val = new Stage
{
Text = text
};
S1PhoneCallData.Stages = S1PhoneCallData.Stages.AddItemToArray<Stage>((Stage[]?)(object)new Stage[1] { val });
CallStageEntry callStageEntry = new CallStageEntry(val)
{
Text = text
};
StageEntries.Add(callStageEntry);
return callStageEntry;
}
public void Completed()
{
S1PhoneCallData.Completed();
}
}
}
namespace S1API.PhoneCalls.Constants
{
public enum EvaluationType
{
PassOnTrue,
PassOnFalse
}
public enum SystemTriggerType
{
StartTrigger,
DoneTrigger
}
}
namespace S1API.PhoneApp
{
public abstract class PhoneApp : Registerable
{
protected static readonly Log Logger = new Log("PhoneApp");
private GameObject? _appPanel;
private bool _appCreated;
private 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()
{
PhoneAppRegistry.Register(this);
}
protected override void OnDestroyed()
{
if ((Object)(object)_appPanel != (Object)null)
{
Object.Destroy((Object)(object)_appPanel);
_appPanel = null;
}
_appCreated = false;
_iconModified = false;
}
internal void SpawnUI(HomeScreen homeScreenInstance)
{
Transform obj = ((Component)homeScreenInstance).transform.parent.Find("AppsCanvas");
GameObject val = ((obj != null) ? ((Component)obj).gameObject : null);
if ((Object)(object)val == (Object)null)
{
Logger.Error("AppsCanvas not found.");
return;
}
Transform val2 = val.transform.Find(AppName);
if ((Object)(object)val2 != (Object)null)
{
_appPanel = ((Component)val2).gameObject;
SetupExistingAppPanel(_appPanel);
}
else
{
Transform val3 = val.transform.Find("ProductManagerApp");
if ((Object)(object)val3 == (Object)null)
{
Logger.Error("Template ProductManagerApp not found.");
return;
}
_appPanel = Object.Instantiate<GameObject>(((Component)val3).gameObject, val.transform);
((Object)_appPanel).name = AppName;
Transform val4 = _appPanel.transform.Find("Container");
if ((Object)(object)val4 != (Object)null)
{
GameObject gameObject = ((Component)val4).gameObject;
ClearContainer(gameObject);
OnCreatedUI(gameObject);
}
_appCreated = true;
}
_appPanel.SetActive(true);
}
internal void SpawnIcon(HomeScreen homeScreenInstance)
{
if (_iconModified)
{
return;
}
Transform obj = ((Component)homeScreenInstance).transform.Find("AppIcons");
GameObject val = ((obj != null) ? ((Component)obj).gameObject : null);
if ((Object)(object)val == (Object)null)
{
Logger.Error("AppIcons not found under HomeScreen.");
return;
}
Transform val2 = ((val.transform.childCount > 0) ? val.transform.GetChild(val.transform.childCount - 1) : null);
if ((Object)(object)val2 == (Object)null)
{
Logger.Error("No icons found in AppIcons.");
return;
}
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 = IconLabel;
}
_iconModified = ChangeAppIconImage(gameObject, 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 ChangeAppIconImage(GameObject iconObj, string filename)
{
//IL_0089: Unknown result type (might be due to invalid IL or missing references)
//IL_0090: Expected O, but got Unknown
//IL_00c2: Unknown result type (might be due to invalid IL or missing references)
//IL_00d1: 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)
{
Logger.Error("Image component not found in icon.");
return false;
}
string text = Path.Combine(MelonEnvironment.ModsDirectory, filename);
if (!File.Exists(text))
{
Logger.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)
{
Logger.Error("Failed to load image: " + ex.Message);
}
return false;
}
}
}
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);
}
}
public static class Money
{
private static MoneyManager Internal => NetworkSingleton<MoneyManager>.Instance;
public static event Action? OnBalanceChanged;
public static void ChangeCashBalance(float amount, bool visualizeChange = true, bool playCashSound = false)
{
MoneyManager @internal = Internal;
if (@internal != null)
{
@internal.ChangeCashBalance(amount, visualizeChange, playCashSound);
}
Money.OnBalanceChanged?.Invoke();
}
public static void CreateOnlineTransaction(string transactionName, float unitAmount, float quantity, string transactionNote)
{
MoneyManager @internal = Internal;
if (@internal != null)
{
@internal.CreateOnlineTransaction(transactionName, unitAmount, quantity, transactionNote);
}
Money.OnBalanceChanged?.Invoke();
}
public static float GetNetWorth()
{
return ((Object)(object)Internal != (Object)null) ? Internal.GetNetWorth() : 0f;
}
public static float GetCashBalance()
{
return ((Object)(object)Internal != (Object)null) ? Internal.cashBalance : 0f;
}
public static float GetOnlineBalance()
{
return ((Object)(object)Internal != (Object)null) ? Internal.sync___get_value_onlineBalance() : 0f;
}
public static void AddNetworthCalculation(Action<object> callback)
{
if ((Object)(object)Internal != (Object)null)
{
MoneyManager @internal = Internal;
@internal.onNetworthCalculation += Action<FloatContainer>.op_Implicit((Action<FloatContainer>)callback);
}
}
public static void RemoveNetworthCalculation(Action<object> callback)
{
if ((Object)(object)Internal != (Object)null)
{
MoneyManager @internal = Internal;
@internal.onNetworthCalculation -= Action<FloatContainer>.op_Implicit((Action<FloatContainer>)callback);
}
}
public static CashInstance CreateCashInstance(float amount)
{
CashDefinition item = Registry.GetItem<CashDefinition>("cash");
ItemInstance itemInstance = CrossType.As<ItemInstance>((object)((ItemDefinition)item).GetDefaultInstance(1));
CashInstance cashInstance = new CashInstance(itemInstance);
cashInstance.SetQuantity(amount);
return cashInstance;
}
}
}
namespace S1API.Messaging
{
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.Map
{
public enum Region
{
Northtown,
Westville,
Downtown,
Docks,
Suburbia,
Uptown
}
}
namespace S1API.Logging
{
public class Log
{
private readonly Instance _loggerInstance;
public Log(string sourceName)
{
//IL_000a: Unknown result type (might be due to invalid IL or missing references)
//IL_0014: Expected O, but got Unknown
_loggerInstance = new Instance(sourceName);
}
public void Msg(string message)
{
_loggerInstance.Msg(message);
}
public void Warning(string message)
{
_loggerInstance.Warning(message);
}
public void Error(string message)
{
_loggerInstance.Error(message);
}
public void BigError(string message)
{
_loggerInstance.BigError(message);
}
}
}
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
{
public static class ArrayExtensions
{
public static T[] AddItemToArray<T>(this T[]? array, T item)
{
if (array == null)
{
array = Array.Empty<T>();
}
Array.Resize(ref array, array.Length + 1);
array[^1] = item;
return array;
}
public static Il2CppReferenceArray<T> AddItemToArray<T>(this Il2CppReferenceArray<T>? array, params T[]? itemsToAdd) where T : Object
{
int num = ((Il2CppArrayBase<T>)(object)array)?.Length ?? 0;
int num2 = ((itemsToAdd != null) ? itemsToAdd.Length : 0);
int num3 = num + num2;
Il2CppReferenceArray<T> val = new Il2CppReferenceArray<T>((long)num3);
for (int i = 0; i < num; i++)
{
((Il2CppArrayBase<T>)(object)val)[i] = ((Il2CppArrayBase<T>)(object)array)[i];
}
for (int j = 0; j < num2; j++)
{
((Il2CppArrayBase<T>)(object)val)[num + j] = itemsToAdd[j];
}
return val;
}
}
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;
}
}
}
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
{
private static readonly Log _loggerInstance = new Log("ImageUtils");
public static Sprite? LoadImage(string fileName)
{
//IL_0056: Unknown result type (might be due to invalid IL or missing references)
//IL_005d: Expected O, but got Unknown
//IL_008d: 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)
string text = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) ?? string.Empty, fileName);
if (!File.Exists(text))
{
_loggerInstance.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)
{
_loggerInstance.Error("❌ Failed to load sprite: " + ex);
}
return null;
}
}
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.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.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);
}
}
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") && !assembly.FullName.StartsWith("com.rlabrecque") && !assembly.FullName.StartsWith("__Generated")
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(typeof(HomeScreen), "Start")]
internal static class HomeScreen_Start_Patch
{
private static readonly Log Logger = new Log("PhoneApp");
private static void Postfix(HomeScreen __instance)
{
if ((Object)(object)__instance == (Object)null)
{
return;
}
List<Type> derivedClasses = ReflectionUtils.GetDerivedClasses<global::S1API.PhoneApp.PhoneApp>();
foreach (Type item in derivedClasses)
{
Logger.Msg("Found phone app: " + item.FullName);
if (!(item.GetConstructor(Type.EmptyTypes) == null))
{
try
{
global::S1API.PhoneApp.PhoneApp phoneApp = (global::S1API.PhoneApp.PhoneApp)Activator.CreateInstance(item);
((IRegisterable)phoneApp).CreateInternal();
phoneApp.SpawnUI(__instance);
phoneApp.SpawnIcon(__instance);
}
catch (Exception ex)
{
Logger.Warning("[PhoneApp] Failed to register " + item.FullName + ": " + ex.Message);
}
}
}
}
}
[HarmonyPatch]
internal class NPCPatches
{
[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, nonPublic: true);
if (nPC == null)
{
throw new Exception("Unable to create instance of " + derivedClass.FullName + "!");
}
if (!(derivedClass.Assembly == Assembly.GetExecutingAssembly()))
{
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;
NPC.All.FirstOrDefault((NPC npc) => npc.IsCustomNPC && (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;
NPC.All.FirstOrDefault((NPC npc) => npc.IsCustomNPC && (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;
NPC.All.Remove(NPC.All.First((NPC npc) => (Object)(object)npc.S1NPC == (Object)(object)__instance2));
}
}
internal static class PhoneAppRegistry
{
public static readonly List<global::S1API.PhoneApp.PhoneApp> RegisteredApps = new List<global::S1API.PhoneApp.PhoneApp>();
public static void Register(global::S1API.PhoneApp.PhoneApp app)
{
RegisteredApps.Add(app);
}
}
[HarmonyPatch]
internal class PlayerPatches
{
[HarmonyPatch(typeof(Player), "Awake")]
[HarmonyPostfix]
private static void PlayerAwake(Player __instance)
{
new Player(__instance);
}
[HarmonyPatch(typeof(Player), "OnDestroy")]
[HarmonyPostfix]
private static void PlayerOnDestroy(Player __instance)
{
Player __instance2 = __instance;
Player.All.Remove(Player.All.First((Player player) => (Object)(object)player.S1Player == (Object)(object)__instance2));
}
}
[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_") ?? false
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 struct GameDateTime
{
public int ElapsedDays;
public int Time;
public GameDateTime(int elapsedDays, int time)
{
ElapsedDays = elapsedDays;
Time = time;
}
public GameDateTime(int minSum)
{
ElapsedDays = minSum / 1440;
int num = minSum % 1440;
if (minSum < 0)
{
num = -minSum % 1440;
}
Time = TimeManager.Get24HourTimeFromMinSum(num);
}
public GameDateTime(GameDateTimeData data)
{
ElapsedDays = data.ElapsedDays;
Time = data.Time;
}
public GameDateTime(GameDateTime gameDateTime)
{
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
//IL_000e: Unknown result type (might be due to invalid IL or missing references)
ElapsedDays = gameDateTime.elapsedDays;
Time = gameDateTime.time;
}
public int GetMinSum()
{
return ElapsedDays * 1440 + TimeManager.GetMinSumFrom24HourTime(Time);
}
public GameDateTime AddMinutes(int minutes)
{
return new GameDateTime(GetMinSum() + minutes);
}
public GameDateTime ToS1()
{
//IL_000d: Unknown result type (might be due to invalid IL or missing references)
//IL_0012: Unknown result type (might be due to invalid IL or missing references)
//IL_0015: Unknown result type (might be due to invalid IL or missing references)
return new GameDateTime(ElapsedDays, Time);
}
public string GetFormattedTime()
{
return TimeManager.Get12HourTime((float)Time, true);
}
public bool IsNightTime()
{
return Time < 600 || Time >= 1800;
}
public bool IsSameDay(GameDateTime other)
{
return ElapsedDays == other.ElapsedDays;
}
public bool IsSameTime(GameDateTime other)
{
return ElapsedDays == other.ElapsedDays && Time == other.Time;
}
public override string ToString()
{
return $"Day {ElapsedDays}, {GetFormattedTime()}";
}
public static GameDateTime operator +(GameDateTime a, GameDateTime b)
{
return new GameDateTime(a.GetMinSum() + b.GetMinSum());
}
public static GameDateTime operator -(GameDateTime a, GameDateTime b)
{
return new GameDateTime(a.GetMinSum() - b.GetMinSum());
}
public static bool operator >(GameDateTime a, GameDateTime b)
{
return a.GetMinSum() > b.GetMinSum();
}
public static bool operator <(GameDateTime a, GameDateTime b)
{
return a.GetMinSum() < b.GetMinSum();
}
}
public static class TimeManager
{
public static Action OnDayPass;
public static Action OnWeekPass;
public static Action OnSleepStart;
public static Action<int> OnSleepEnd;
public static Day CurrentDay => (Day)NetworkSingleton<TimeManager>.Instance.CurrentDay;
public static int ElapsedDays => NetworkSingleton<TimeManager>.Instance.ElapsedDays;
public static int CurrentTime => NetworkSingleton<TimeManager>.Instance.CurrentTime;
public static bool IsNight => NetworkSingleton<TimeManager>.Instance.IsNight;
public static bool IsEndOfDay => NetworkSingleton<TimeManager>.Instance.IsEndOfDay;
public static bool SleepInProgress => NetworkSingleton<TimeManager>.Instance.SleepInProgress;
public static bool TimeOverridden => NetworkSingleton<TimeManager>.Instance.TimeOverridden;
public static float NormalizedTime => NetworkSingleton<TimeManager>.Instance.NormalizedTime;
public static float Playtime => NetworkSingleton<TimeManager>.Instance.Playtime;
static TimeManager()
{
OnDayPass = delegate
{
};
OnWeekPass = delegate
{
};
OnSleepStart = delegate
{
};
OnSleepEnd = delegate
{
};
if ((Object)(object)NetworkSingleton<TimeManager>.Instance != (Object)null)
{
TimeManager instance = NetworkSingleton<TimeManager>.Instance;
instance.onDayPass += Action.op_Implicit((Action)delegate
{
OnDayPass();
});
TimeManager instance2 = NetworkSingleton<TimeManager>.Instance;
instance2.onWeekPass += Action.op_Implicit((Action)delegate
{
OnWeekPass();
});
}
TimeManager.onSleepStart += Action.op_Implicit((Action)delegate
{
OnSleepStart();
});
TimeManager.onSleepEnd += Action<int>.op_Implicit((Action<int>)delegate(int minutes)
{
OnSleepEnd(minutes);
});
}
public static void FastForwardToWakeTime()
{
NetworkSingleton<TimeManager>.Instance.FastForwardToWakeTime();
}
public static void SetTime(int time24h, bool local = false)
{
NetworkSingleton<TimeManager>.Instance.SetTime(time24h, local);
}
public static void SetElapsedDays(int days)
{
NetworkSingleton<TimeManager>.Instance.SetElapsedDays(days);
}
public static string GetFormatted12HourTime()
{
return TimeManager.Get12HourTime((float)CurrentTime, true);
}
public static bool IsCurrentTimeWithinRange(int startTime24h, int endTime24h)
{
return NetworkSingleton<TimeManager>.Instance.IsCurrentTimeWithinRange(startTime24h, endTime24h);
}
public static int GetMinutesFrom24HourTime(int time24h)
{
return TimeManager.GetMinSumFrom24HourTime(time24h);
}
public static int Get24HourTimeFromMinutes(int minutes)
{
return TimeManager.Get24HourTimeFromMinSum(minutes);
}
}
}
namespace S1API.Entities
{
public abstract class NPC : Saveable, IEntity, IHealth
{
protected readonly List<Response> Responses = new List<Response>();
public static readonly List<NPC> All = new List<NPC>();
internal readonly NPC S1NPC;
internal readonly bool IsCustomNPC;
private readonly FieldInfo _panicField = AccessTools.Field(typeof(NPC), "PANIC_DURATION");
private readonly FieldInfo _requiresRegionUnlockedField = AccessTools.Field(typeof(NPC), "RequiresRegionUnlocked");
private readonly MethodInfo _unsettleMethod = AccessTools.Method(typeof(NPC), "SetUnsettled", (Type[])null, (Type[])null);
private readonly MethodInfo _removePanicMethod = AccessTools.Method(typeof(NPC), "RemovePanicked", (Type[])null, (Type[])null);
public GameObject gameObject { get; }
public Vector3 Position
{
get
{
//IL_000b: Unknown result type (might be due to invalid IL or missing references)
return gameObject.transform.position;
}
set
{
//IL_000b: Unknown result type (might be due to invalid IL or missing references)
S1NPC.Movement.Warp(value);
}
}
public Transform Transform => gameObject.transform;
public string FirstName
{
get
{
return S1NPC.FirstName;
}
set
{
S1NPC.FirstName = value;
}
}
public string LastName
{
get
{
return S1NPC.LastName;
}
set
{
S1NPC.LastName = value;
}
}
public string FullName => S1NPC.fullName;
public string ID
{
get
{
return S1NPC.ID;
}
protected set
{
S1NPC.ID = value;
}
}
public Sprite Icon
{
get
{
return S1NPC.MugshotSprite;
}
set
{
S1NPC.MugshotSprite = value;
}
}
public bool IsConscious => S1NPC.IsConscious;
public bool IsInBuilding => S1NPC.isInBuilding;
public bool IsInVehicle => S1NPC.IsInVehicle;
public bool IsPanicking => S1NPC.IsPanicked;
public bool IsUnsettled => S1NPC.isUnsettled;
public bool IsVisible => S1NPC.isVisible;
public float Aggressiveness
{
get
{
return S1NPC.Aggression;
}
set
{
S1NPC.Aggression = value;
}
}
public Region Region => (Region)S1NPC.Region;
public float PanicDuration
{
get
{
return (float)_panicField.GetValue(S1NPC);
}
set
{
_panicField.SetValue(S1NPC, value);
}
}
public float Scale
{
get
{
return S1NPC.Scale;
}
set
{
S1NPC.SetScale(value);
}
}
public bool IsKnockedOut => S1NPC.Health.IsKnockedOut;
public bool RequiresRegionUnlocked
{
get
{
return (bool)_requiresRegionUnlockedField.GetValue(S1NPC);
}
set
{
_panicField.SetValue(S1NPC, value);
}
}
public float CurrentHealth => S1NPC.Health.Health;
public float MaxHealth
{
get
{
return S1NPC.Health.MaxHealth;
}
set
{
S1NPC.Health.MaxHealth = value;
}
}
public bool IsDead => S1NPC.Health.IsDead;
public bool IsInvincible
{
get
{
return S1NPC.Health.Invincible;
}
set
{
S1NPC.Health.Invincible = value;
}
}
public event Action OnDeath
{
add
{
EventHelper.AddListener(value, S1NPC.Health.onDie);
}
remove
{
EventHelper.RemoveListener(value, S1NPC.Health.onDie);
}
}
public event Action OnInventoryChanged
{
add
{
EventHelper.AddListener(value, S1NPC.Inventory.onContentsChanged);
}
remove
{
EventHelper.RemoveListener(value, S1NPC.Inventory.onContentsChanged);
}
}
protected NPC(string id, string? firstName, string? lastName, Sprite? icon = null)
{
//IL_0087: Unknown result type (might be due to invalid IL or missing references)
//IL_0091: Expected O, but got Unknown
//IL_0163: Unknown result type (might be due to invalid IL or missing references)
//IL_016d: Expected O, but got Unknown
//IL_0179: Unknown result type (might be due to invalid IL or missing references)
//IL_0183: Expected O, but got Unknown
//IL_01b1: Unknown result type (might be due to invalid IL or missing references)
//IL_01b7: Expected O, but got Unknown
//IL_02b1: Unknown result type (might be due to invalid IL or missing references)
//IL_02b7: Expected O, but got Unknown
//IL_02da: Unknown result type (might be due to invalid IL or missing references)
//IL_02e0: Expected O, but got Unknown
//IL_02ff: Unknown result type (might be due to invalid IL or missing references)
//IL_0306: Expected O, but got Unknown
//IL_0346: Unknown result type (might be due to invalid IL or missing references)
//IL_034d: Expected O, but got Unknown
//IL_0382: Unknown result type (might be due to invalid IL or missing references)
//IL_0389: Expected O, but got Unknown
//IL_03b1: Unknown result type (might be due to invalid IL or missing references)
//IL_03b6: Unknown result type (might be due to invalid IL or missing references)
//IL_03be: Unknown result type (might be due to invalid IL or missing references)
//IL_03cf: Expected O, but got Unknown
//IL_0421: Unknown result type (might be due to invalid IL or missing references)
//IL_042b: Expected O, but got Unknown
IsCustomNPC = true;
gameObject = new GameObject();
gameObject.SetActive(false);
S1NPC = gameObject.AddComponent<NPC>();
S1NPC.FirstName = firstName;
S1NPC.LastName = lastName;
S1NPC.ID = id;
S1NPC.MugshotSprite = icon ?? ((App<ContactsApp>)(object)PlayerSingleton<ContactsApp>.Instance).AppIcon;
S1NPC.BakedGUID = Guid.NewGuid().ToString();
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.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.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.transform.SetParent(gameObject.transform);
S1NPC.awareness.Responses = (NPCResponses)(object)val6.AddComponent<NPCResponses_Civilian>();
GameObject val7 = new GameObject("VisionCone");
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);
All.Add(this);
}
protected virtual void OnResponseLoaded(Response response)
{
}
public void Revive()
{
S1NPC.Health.Revive();
}
public void Damage(int amount)
{
if (amount > 0)
{
S1NPC.Health.TakeDamage((float)amount, true);
}
}
public void Heal(int amount)
{
if (amount > 0)
{
float num = Mathf.Min((float)amount, S1NPC.Health.MaxHealth - S1NPC.Health.Health);
S1NPC.Health.TakeDamage(0f - num, false);
}
}
public void Kill()
{
S1NPC.Health.TakeDamage(S1NPC.Health.MaxHealth, true);
}
public void Unsettle(float duration)
{
_unsettleMethod.Invoke(S1NPC, new object[1] { duration });
}
public void LerpScale(float scale, float lerpTime)
{
S1NPC.SetScale(scale, lerpTime);
}
public void Panic()
{
S1NPC.SetPanicked();
}
public void StopPanicking()
{
_removePanicMethod.Invoke(S1NPC, new object[0]);
}
public void KnockOut()
{
S1NPC.Health.KnockOut();
}
public void Goto(Vector3 position)
{
//IL_000b: Unknown result type (might be due to invalid IL or missing references)
S1NPC.Movement.SetDestination(position);
}
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);
}
}
public static NPC? Get<T>()
{
return All.FirstOrDefault((NPC npc
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.6.2", "KaBooMa", null)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("S1APILoader")]
[assembly: AssemblyConfiguration("MonoBepInEx")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+d9665e9bd95b76b033fb53d5c1698afa82fe53ac")]
[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, "../Mods");
string text = (MelonUtils.IsGameIl2Cpp() ? "Il2Cpp" : "Mono");
string text2 = ((!MelonUtils.IsGameIl2Cpp()) ? "Il2Cpp" : "Mono");
MelonLogger.Msg("Loading S1API for " + text + "...");
string text3 = Path.Combine(path, "S1API." + text + ".MelonLoader.dll");
string text4 = Path.Combine(path, "S1API." + text2 + ".MelonLoader.dll");
string path2 = text3 + ".disabled";
if (File.Exists(path2))
{
File.Move(text3 + ".disabled", text3);
}
if (File.Exists(text4))
{
File.Move(text4, text4 + ".disabled");
}
MelonLogger.Msg("Successfully loaded S1API for " + text + "!");
}
}
}
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.6.2", "KaBooMa", null)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("S1APILoader")]
[assembly: AssemblyConfiguration("MonoMelon")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+d9665e9bd95b76b033fb53d5c1698afa82fe53ac")]
[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, "../Mods");
string text = (MelonUtils.IsGameIl2Cpp() ? "Il2Cpp" : "Mono");
string text2 = ((!MelonUtils.IsGameIl2Cpp()) ? "Il2Cpp" : "Mono");
MelonLogger.Msg("Loading S1API for " + text + "...");
string text3 = Path.Combine(path, "S1API." + text + ".MelonLoader.dll");
string text4 = Path.Combine(path, "S1API." + text2 + ".MelonLoader.dll");
string path2 = text3 + ".disabled";
if (File.Exists(path2))
{
File.Move(text3 + ".disabled", text3);
}
if (File.Exists(text4))
{
File.Move(text4, text4 + ".disabled");
}
MelonLogger.Msg("Successfully loaded S1API for " + text + "!");
}
}
}