Decompiled source of SODMailCourier v1.0.2

SOD.MailCourier.dll

Decompiled 3 days ago
using System;
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 System.Text.Json;
using System.Text.Json.Serialization;
using BepInEx;
using BepInEx.Core.Logging.Interpolation;
using BepInEx.Logging;
using HarmonyLib;
using Il2CppInterop.Runtime.InteropTypes;
using Il2CppSystem.Collections.Generic;
using SOD.Common;
using SOD.Common.BepInEx;
using SOD.Common.BepInEx.Configuration;
using SOD.Common.Custom;
using SOD.Common.Extensions;
using SOD.Common.Helpers;
using SOD.Common.Helpers.SyncDiskObjects;
using SOD.CourierJobs;
using SOD.CourierJobs.Core;
using SOD.MailCourier.Core;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")]
[assembly: AssemblyCompany("SOD.MailCourier")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+84fa49cefc00fb4270fae3c90bd4fbe6711a0f4d")]
[assembly: AssemblyProduct("SOD.MailCourier")]
[assembly: AssemblyTitle("SOD.MailCourier")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace SOD.MailCourier.Patches
{
	internal static class BioScreenControllerPatches
	{
		[HarmonyPatch(typeof(BioScreenController), "UpdateSummary")]
		internal static class BioScreenController_UpdateSummary
		{
			[HarmonyPrefix]
			internal static bool Prefix(BioScreenController __instance)
			{
				if (__instance.hoveredSlot != null && __instance.isOpen)
				{
					Interactable interactable = __instance.hoveredSlot.GetInteractable();
					if (interactable != null && interactable.preset.summaryMessageSource != null && interactable.preset.summaryMessageSource == "mail_courier_job_message")
					{
						CourierJob courierJob = CourierJobGenerator.FindJobBySealedMailId(interactable.id);
						if (courierJob != null)
						{
							__instance.summaryTextToDisplay = "Delivery address: " + courierJob.DeliveryAddressName + " Mailbox";
							return false;
						}
						__instance.summaryTextToDisplay = "This delivery is no longer valid, please discard this item.";
					}
				}
				return true;
			}
		}

		[HarmonyPatch(typeof(BioScreenController), "SelectSlot")]
		internal static class BioScreenController_SelectSlot
		{
			[HarmonyPrefix]
			internal static bool Prefix(BioScreenController __instance, InventorySlot newSlot)
			{
				if (__instance.selectedSlot != null && __instance.isOpen)
				{
					Interactable interactable = __instance.selectedSlot.GetInteractable();
					if (interactable != null && interactable.preset.summaryMessageSource != null && interactable.preset.summaryMessageSource == "mail_courier_job_message")
					{
						if (newSlot.interactableID == -1)
						{
							CourierJobGenerator.SetDestinationRoute(null);
						}
						else if (newSlot.interactableID != interactable.id)
						{
							CourierJob courierJob = CourierJobGenerator.FindJobBySealedMailId(newSlot.interactableID);
							if (courierJob != null)
							{
								CourierJobGenerator.SetDestinationRoute(courierJob.Mailbox);
							}
							else
							{
								CourierJobGenerator.SetDestinationRoute(null);
							}
						}
					}
					else if (newSlot.interactableID != -1)
					{
						CourierJob courierJob2 = CourierJobGenerator.FindJobBySealedMailId(newSlot.interactableID);
						if (courierJob2 != null)
						{
							CourierJobGenerator.SetDestinationRoute(courierJob2.Mailbox);
						}
						else
						{
							CourierJobGenerator.SetDestinationRoute(null);
						}
					}
				}
				return true;
			}
		}
	}
	internal static class FirstPersonItemControllerPatches
	{
		[HarmonyPatch(typeof(FirstPersonItemController), "PickUpItem")]
		internal static class FirstPersonItemController_PickUpItem
		{
			[HarmonyPrefix]
			internal static void Prefix(Interactable pickUpThis)
			{
				if (pickUpThis != null && (SoCustomComparison)(object)pickUpThis.preset != (SoCustomComparison)null && pickUpThis.preset.summaryMessageSource != null && pickUpThis.preset.summaryMessageSource == "mail_courier_job_message" && ShopSelectButtonControllerPatches.ShopSelectButtonController_PurchaseExecute.ComingFromAPurchase)
				{
					MailCourierInteractable = pickUpThis;
				}
			}
		}

		[HarmonyPatch(typeof(FirstPersonItemController), "UpdateCurrentActions")]
		internal static class FirstPersonItemController_UpdateCurrentActions
		{
			[HarmonyPrefix]
			internal static bool Prefix(FirstPersonItemController __instance)
			{
				if (InteractionController.Instance.lookingAtInteractable && (Object)(object)InteractionController.Instance.currentLookingAtInteractable != (Object)null && InteractionController.Instance.currentLookingAtInteractable.interactable != null && BioScreenController.Instance.selectedSlot != null && BioScreenController.Instance.selectedSlot.interactableID > -1 && CourierJobGenerator.FindJobsByMailboxId(InteractionController.Instance.currentLookingAtInteractable.interactable.id).Any((CourierJob job) => job.SealedMailId == BioScreenController.Instance.selectedSlot.interactableID))
				{
					InteractionAction currentAction = __instance.currentActions[(InteractionKey)1].currentAction;
					if (((currentAction != null) ? currentAction.interactionName : null) != "mail_courier_job_message" || !__instance.currentActions[(InteractionKey)1].enabled)
					{
						Enumerator<InteractionKey, InteractableCurrentAction> enumerator = __instance.currentActions.Values.GetEnumerator();
						while (enumerator.MoveNext())
						{
							InteractableCurrentAction current = enumerator.Current;
							current.display = false;
							current.enabled = false;
						}
						InteractableCurrentAction obj = __instance.currentActions[(InteractionKey)1];
						obj.display = true;
						obj.enabled = true;
						obj.currentAction = (InteractionAction)(object)CourierJobGenerator.InsertMailInteractionAction;
					}
					return false;
				}
				return true;
			}
		}

		[HarmonyPatch(typeof(FirstPersonItemController), "OnInteraction")]
		internal static class FirstPersonItemController_OnInteraction
		{
			[HarmonyPrefix]
			internal static bool Prefix(FirstPersonItemController __instance, InteractionKey input)
			{
				//IL_0006: Unknown result type (might be due to invalid IL or missing references)
				InteractableCurrentAction val = default(InteractableCurrentAction);
				if (__instance.currentActions.TryGetValue(input, ref val))
				{
					InteractionAction currentAction = val.currentAction;
					if (((currentAction != null) ? currentAction.interactionName : null) == "mail_courier_job_message" && val.enabled && val.display)
					{
						InsertMailIntoMailbox();
						return false;
					}
				}
				return true;
			}

			private static void InsertMailIntoMailbox()
			{
				if (BioScreenController.Instance.selectedSlot != null && BioScreenController.Instance.selectedSlot.interactableID > -1)
				{
					CourierJob courierJob = CourierJobGenerator.FindJobBySealedMailId(BioScreenController.Instance.selectedSlot.interactableID);
					if (courierJob != null)
					{
						CourierJobGenerator.DestroyCourierJob(courierJob);
						GameplayController.Instance.AddMoney(courierJob.Payment, true, (string)null);
					}
				}
			}
		}

		internal static Interactable MailCourierInteractable;
	}
	internal static class ShopSelectButtonControllerPatches
	{
		[HarmonyPatch(typeof(ShopSelectButtonController), "UpdateTooltip")]
		internal static class ShopSelectButtonController_UpdateTooltip
		{
			[HarmonyPrefix]
			internal static bool Prefix(ShopSelectButtonController __instance)
			{
				if ((SoCustomComparison)(object)__instance.preset == (SoCustomComparison)null || __instance.preset.summaryMessageSource != "mail_courier_job_message")
				{
					return true;
				}
				((ButtonController)__instance).tooltip.mainText = "Generates a random mail delivery mission, should you choose to accept it.";
				return true;
			}
		}

		[HarmonyPatch(typeof(ShopSelectButtonController), "PurchaseExecute")]
		internal static class ShopSelectButtonController_PurchaseExecute
		{
			internal static bool ComingFromAPurchase;

			[HarmonyPrefix]
			internal static void Prefix(ShopSelectButtonController __instance, ref int __state)
			{
				if (!((SoCustomComparison)(object)__instance.preset == (SoCustomComparison)null) && !(__instance.preset.summaryMessageSource != "mail_courier_job_message"))
				{
					__state = GameplayController.Instance.money;
					ComingFromAPurchase = true;
				}
			}

			[HarmonyPostfix]
			internal static void Postfix(ShopSelectButtonController __instance, ref int __state)
			{
				ComingFromAPurchase = false;
				if (!((SoCustomComparison)(object)__instance.preset == (SoCustomComparison)null) && !(__instance.preset.summaryMessageSource != "mail_courier_job_message") && GameplayController.Instance.money != __state && FirstPersonItemControllerPatches.MailCourierInteractable != null)
				{
					CourierJobGenerator.CreateJob(FirstPersonItemControllerPatches.MailCourierInteractable.id);
					FirstPersonItemControllerPatches.MailCourierInteractable = null;
				}
			}
		}
	}
	internal static class ToolboxPatches
	{
		[HarmonyPatch(typeof(Toolbox), "LoadAll")]
		internal static class Toolbox_LoadAll
		{
			[HarmonyPostfix]
			internal static void Postfix()
			{
				CourierJobGenerator.RegisterMailCourierJobs();
			}
		}
	}
}
namespace SOD.MailCourier.Core
{
	internal static class CourierJobGenerator
	{
		private const string SAVEDATA_FILENAME = "mailcourier_savedata.json";

		private static readonly Dictionary<int, CourierJob> _courierJobsBySealedMail = new Dictionary<int, CourierJob>();

		private static readonly Dictionary<int, List<CourierJob>> _courierJobsByMailbox = new Dictionary<int, List<CourierJob>>();

		private static Dictionary<int, Interactable> _mailboxLocations;

		private static List<Interactable> _mailboxList;

		private static readonly Lazy<JsonSerializerOptions> _serializerOptions = new Lazy<JsonSerializerOptions>(() => new JsonSerializerOptions
		{
			WriteIndented = true,
			Converters = 
			{
				(JsonConverter)new Vector3JsonConverter(),
				(JsonConverter)new TimeDataJsonConverter()
			}
		});

		internal static readonly FPSInteractionAction InsertMailInteractionAction = new FPSInteractionAction
		{
			action = new AIActionPreset
			{
				presetName = "mail_courier_job_message",
				onlyAvailableWhenItemSelected = true
			},
			interactionName = "mail_courier_job_message",
			keyOverride = (InteractionKey)1
		};

		internal static void CreateJob(int sealedMailId)
		{
			Interactable val = FindMailbox(null);
			if (val == null)
			{
				PluginController<Plugin, IPluginBindings>.Log.LogError((object)"Unable to create mail courier job, no mailboxes found in the world.");
				return;
			}
			NewAddress val2 = ((Il2CppObjectBase)val.objectRef).TryCast<NewAddress>();
			string deliveryAddressName = val2.residence.GetResidenceString() + " " + ((Object)((NewGameLocation)val2).building).name;
			CourierJob courierJob = new CourierJob(val.id, sealedMailId, deliveryAddressName);
			_courierJobsBySealedMail.Add(sealedMailId, courierJob);
			if (!_courierJobsByMailbox.TryGetValue(val.id, out var value))
			{
				value = (_courierJobsByMailbox[val.id] = new List<CourierJob>());
			}
			value.Add(courierJob);
			SetDestinationRoute(val);
		}

		internal static void SetDestinationRoute(Interactable mailbox)
		{
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			//IL_004b: Unknown result type (might be due to invalid IL or missing references)
			if (MapController.Instance.playerRoute != null)
			{
				if (mailbox == null)
				{
					foreach (CourierJob value in _courierJobsBySealedMail.Values)
					{
						if (MapController.Instance.playerRoute.end.nodeCoord == value.Mailbox.node.nodeCoord)
						{
							MapController.Instance.playerRoute.Remove();
							break;
						}
					}
				}
				if (((PluginController<Plugin, IPluginBindings>)PluginController<Plugin, IPluginBindings>.Instance).Config.OverwriteExistingWaypoint && MapController.Instance.playerRoute != null)
				{
					MapController.Instance.playerRoute.Remove();
				}
			}
			if (mailbox != null)
			{
				MapController.Instance.PlotPlayerRoute(mailbox.node, true, (NewGameLocation)null);
			}
		}

		internal static void CleanupCourierJobs()
		{
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a3: 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_00ad: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
			//IL_0097: Unknown result type (might be due to invalid IL or missing references)
			if (_courierJobsBySealedMail.Count == 0)
			{
				return;
			}
			TimeData currentDateTime = Lib.Time.CurrentDateTime;
			Interactable[] source = default(Interactable[]);
			foreach (CourierJob courierJob in _courierJobsBySealedMail.Values.ToList())
			{
				Interactable sealedMail = courierJob.SealedMail;
				if (sealedMail == null || sealedMail.rem)
				{
					DestroyCourierJob(courierJob);
					continue;
				}
				if (Lib.Gameplay.HasInteractableInInventory("DeliverableMailItemPreset", ref source) && source.Any((Interactable a) => a.id == courierJob.SealedMailId))
				{
					courierJob.LastTimeActive = currentDateTime;
				}
				TimeData lastTimeActive = courierJob.LastTimeActive;
				if (((TimeData)(ref lastTimeActive)).AddHours(4) <= currentDateTime)
				{
					DestroyCourierJob(courierJob);
				}
			}
		}

		internal static void DestroyCourierJob(CourierJob courierJob)
		{
			//IL_0056: Unknown result type (might be due to invalid IL or missing references)
			//IL_0066: Unknown result type (might be due to invalid IL or missing references)
			if (_courierJobsBySealedMail.ContainsKey(courierJob.SealedMailId))
			{
				Interactable val = FindSealedMail(courierJob.SealedMailId);
				if (val != null && val.id > 0 && !val.rem)
				{
					val.Delete();
				}
				if (MapController.Instance.playerRoute != null && MapController.Instance.playerRoute.end.nodeCoord == courierJob.Mailbox.node.nodeCoord)
				{
					MapController.Instance.playerRoute.Remove();
				}
				_courierJobsBySealedMail.Remove(courierJob.SealedMailId);
				List<CourierJob> list = _courierJobsByMailbox[courierJob.MailboxId];
				list.Remove(courierJob);
				if (list.Count == 0)
				{
					_courierJobsByMailbox.Remove(courierJob.MailboxId);
				}
			}
		}

		internal static Interactable FindMailbox(int? mailboxId)
		{
			if (_mailboxLocations == null)
			{
				IEnumerable<IGrouping<int, ResidenceController>> enumerable = from a in EnumerableExtensions.Where<ResidenceController>(CityData.Instance.residenceDirectory, (Func<ResidenceController, bool>)((ResidenceController a) => a.mailbox != null && a.mailbox.integratedInteractables != null && a.mailbox.integratedInteractables.Count > 0))
					group a by a.mailbox.id;
				_mailboxList = new List<Interactable>();
				foreach (IGrouping<int, ResidenceController> item in enumerable)
				{
					ResidenceController val = item.First();
					_mailboxList.AddRange(EnumerableExtensions.Where<Interactable>(val.mailbox.integratedInteractables, (Func<Interactable, bool>)delegate(Interactable a)
					{
						if (a.objectRef == null)
						{
							return false;
						}
						NewAddress val2 = ((Il2CppObjectBase)a.objectRef).TryCast<NewAddress>();
						return !((Object)(object)val2 == (Object)null) && (Object)(object)val2.residence != (Object)null;
					}));
				}
				_mailboxLocations = _mailboxList.ToDictionary((Interactable a) => a.id);
			}
			if (mailboxId.HasValue)
			{
				return _mailboxLocations[mailboxId.Value];
			}
			return _mailboxList[Random.Shared.Next(_mailboxList.Count)];
		}

		internal static Interactable FindSealedMail(int sealedMailId)
		{
			Interactable result = default(Interactable);
			if (!CityData.Instance.savableInteractableDictionary.TryGetValue(sealedMailId, ref result))
			{
				return null;
			}
			return result;
		}

		internal static CourierJob FindJobBySealedMailId(int sealedMailId)
		{
			if (!_courierJobsBySealedMail.TryGetValue(sealedMailId, out var value))
			{
				return null;
			}
			return value;
		}

		internal static IReadOnlyList<CourierJob> FindJobsByMailboxId(int mailboxId)
		{
			if (!_courierJobsByMailbox.TryGetValue(mailboxId, out var value))
			{
				return new List<CourierJob>();
			}
			return value;
		}

		internal static void LoadFromFile(SaveGameArgs saveGameArgs)
		{
			//IL_00c2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c9: Expected O, but got Unknown
			_courierJobsBySealedMail.Clear();
			_courierJobsByMailbox.Clear();
			string path = Path.Combine(Lib.SaveGame.GetSaveGameDataPath(saveGameArgs), "mailcourier_savedata.json");
			if (!File.Exists(path))
			{
				return;
			}
			List<CourierJob> list = JsonSerializer.Deserialize<List<CourierJob>>(File.ReadAllText(path), _serializerOptions.Value);
			foreach (CourierJob item in list)
			{
				_courierJobsBySealedMail.Add(item.SealedMailId, item);
				if (!_courierJobsByMailbox.TryGetValue(item.MailboxId, out var value))
				{
					value = (_courierJobsByMailbox[item.MailboxId] = new List<CourierJob>());
				}
				value.Add(item);
			}
			ManualLogSource log = PluginController<Plugin, IPluginBindings>.Log;
			bool flag = default(bool);
			BepInExInfoLogInterpolatedStringHandler val = new BepInExInfoLogInterpolatedStringHandler(40, 1, ref flag);
			if (flag)
			{
				((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Loaded ");
				((BepInExLogInterpolatedStringHandler)val).AppendFormatted<int>(list.Count);
				((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" active player mail courier jobs.");
			}
			log.LogInfo(val);
		}

		internal static void SaveToFile(SaveGameArgs saveGameArgs)
		{
			//IL_0061: Unknown result type (might be due to invalid IL or missing references)
			//IL_0067: Expected O, but got Unknown
			string path = Path.Combine(Lib.SaveGame.GetSaveGameDataPath(saveGameArgs), "mailcourier_savedata.json");
			if (_courierJobsBySealedMail.Count == 0)
			{
				if (File.Exists(path))
				{
					File.Delete(path);
				}
				return;
			}
			string contents = JsonSerializer.Serialize(_courierJobsBySealedMail.Values.ToList(), _serializerOptions.Value);
			File.WriteAllText(path, contents);
			ManualLogSource log = PluginController<Plugin, IPluginBindings>.Log;
			bool flag = default(bool);
			BepInExInfoLogInterpolatedStringHandler val = new BepInExInfoLogInterpolatedStringHandler(39, 1, ref flag);
			if (flag)
			{
				((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Saved ");
				((BepInExLogInterpolatedStringHandler)val).AppendFormatted<int>(_courierJobsBySealedMail.Count);
				((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" active player mail courier jobs.");
			}
			log.LogInfo(val);
		}

		internal static void RegisterMailCourierJobs()
		{
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_012c: Unknown result type (might be due to invalid IL or missing references)
			_courierJobsBySealedMail.Clear();
			_courierJobsByMailbox.Clear();
			_mailboxLocations = null;
			_mailboxList = null;
			SyncDiskSaleLocation val = (SyncDiskSaleLocation)13;
			string newsStand = ((object)(SyncDiskSaleLocation)(ref val)).ToString();
			IEnumerable<MenuPreset> enumerable = from a in GameExtensions.GetFromResourceCache<MenuPreset>(Toolbox.Instance)
				where ((SoCustomComparison)a).GetPresetName() == newsStand
				select a;
			InteractablePreset interactablePreset = Toolbox.Instance.GetInteractablePreset("SealedEnvelope");
			RetailItemPreset fromResourceCache = GameExtensions.GetFromResourceCache<RetailItemPreset>(Toolbox.Instance, "CleaningSpray");
			InteractablePreset val2 = Object.Instantiate<InteractablePreset>(interactablePreset);
			RetailItemPreset val3 = Object.Instantiate<RetailItemPreset>(fromResourceCache);
			((SoCustomComparison)val2).presetName = "DeliverableMailItemPreset";
			((Object)val2).name = "DeliverableMailItemPreset_ShopText";
			((SoCustomComparison)val3).presetName = "DeliverableMailItemRetailPreset";
			((Object)val3).name = ((SoCustomComparison)val3).presetName;
			Lib.DdsStrings["evidence.names", ((SoCustomComparison)val2).presetName] = "Sealed Mail";
			Lib.DdsStrings["evidence.names", ((Object)val2).name] = "Mail Courier Job";
			Lib.DdsStrings["ui.interaction", "mail_courier_job_message"] = "Insert";
			val2.placeAtHome = false;
			val2.spawnEvidence = null;
			val2.useEvidence = false;
			val2.findEvidence = (FindEvidence)0;
			val2.readingSource = (ReadingModeSource)0;
			val2.value = new Vector2(50f, 50f);
			val2.retailItem = val3;
			val2.summaryMessageSource = "mail_courier_job_message";
			((InteractionAction)InsertMailInteractionAction).action.availableWhenItemsSelected.Add(val2.fpsItem);
			val2.fpsItem.actions.Add(InsertMailInteractionAction);
			val3.itemPreset = val2;
			val3.menuCategory = (MenuCategory)3;
			val3.desireCategory = (CompanyCategory)7;
			val3.isConsumable = false;
			val3.canBeFavourite = false;
			val3.isHot = false;
			GameExtensions.GetResourceCacheCollection<RetailItemPreset>(Toolbox.Instance)[((SoCustomComparison)val3).presetName] = (ScriptableObject)(object)val3;
			Toolbox.Instance.objectPresetDictionary[((SoCustomComparison)val2).presetName] = val2;
			foreach (MenuPreset item in enumerable)
			{
				InteractablePreset val4 = EnumerableExtensions.Where<InteractablePreset>(item.itemsSold, (Func<InteractablePreset, bool>)((InteractablePreset a) => ((SoCustomComparison)a).presetName == "DeliverableMailItemPreset")).FirstOrDefault();
				if ((SoCustomComparison)(object)val4 != (SoCustomComparison)null)
				{
					item.itemsSold.Remove(val4);
					item.itemsSold.Insert(0, val2);
				}
				else
				{
					item.itemsSold.Insert(0, val2);
				}
			}
			PluginController<Plugin, IPluginBindings>.Log.LogInfo((object)"Registered mail courier job in newsstands.");
		}
	}
}
namespace SOD.CourierJobs
{
	public interface IPluginBindings
	{
		[Binding(50, "Initial mail delivery cost. (refunded on completion)", "General.InitialCost")]
		int InitialCost { get; set; }

		[Binding(75, "The minimum reward for a mail delivery.", "General.BaseReward")]
		int BaseReward { get; set; }

		[Binding(0.75f, "The percentage of the distance to travel as a bonus on top of the base reward.", "General.DistanceBonusPercentage")]
		float DistanceBonusPercentage { get; set; }

		[Binding(false, "If you already have a waypoint, should it be overwritten when accepting a new courier job?", "Optional.OverwriteExistingWaypoint")]
		bool OverwriteExistingWaypoint { get; set; }
	}
	[BepInPlugin("Venomaus.SOD.MailCourier", "MailCourier", "1.0.2")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	public class Plugin : PluginController<Plugin, IPluginBindings>
	{
		public const string PLUGIN_GUID = "Venomaus.SOD.MailCourier";

		public const string PLUGIN_NAME = "MailCourier";

		public const string PLUGIN_VERSION = "1.0.2";

		public override void Load()
		{
			base.Harmony.PatchAll(Assembly.GetExecutingAssembly());
			PluginController<Plugin, IPluginBindings>.Log.LogInfo((object)"Plugin is patched.");
			Lib.SaveGame.OnBeforeLoad += SaveGame_OnBeforeLoad;
			Lib.SaveGame.OnBeforeSave += SaveGame_OnBeforeSave;
			Lib.Time.OnHourChanged += Time_OnHourChanged;
		}

		private void Time_OnHourChanged(object sender, TimeChangedArgs e)
		{
			CourierJobGenerator.CleanupCourierJobs();
		}

		private void SaveGame_OnBeforeLoad(object sender, SaveGameArgs e)
		{
			CourierJobGenerator.LoadFromFile(e);
		}

		private void SaveGame_OnBeforeSave(object sender, SaveGameArgs e)
		{
			CourierJobGenerator.SaveToFile(e);
		}
	}
}
namespace SOD.CourierJobs.Core
{
	public sealed class CourierJob
	{
		public int MailboxId { get; set; }

		public int SealedMailId { get; set; }

		public Vector3 PointOfOrigin { get; set; }

		public string DeliveryAddressName { get; set; }

		public TimeData LastTimeActive { get; set; }

		[JsonIgnore]
		internal int Payment
		{
			get
			{
				//IL_0027: Unknown result type (might be due to invalid IL or missing references)
				//IL_002d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0032: Unknown result type (might be due to invalid IL or missing references)
				//IL_0037: Unknown result type (might be due to invalid IL or missing references)
				float num = ((PluginController<Plugin, IPluginBindings>)PluginController<Plugin, IPluginBindings>.Instance).Config.InitialCost + ((PluginController<Plugin, IPluginBindings>)PluginController<Plugin, IPluginBindings>.Instance).Config.BaseReward;
				Vector3 val = Mailbox.GetWorldPosition(true) - PointOfOrigin;
				return (int)Math.Round(num + ((Vector3)(ref val)).magnitude * ((PluginController<Plugin, IPluginBindings>)PluginController<Plugin, IPluginBindings>.Instance).Config.DistanceBonusPercentage);
			}
		}

		[JsonIgnore]
		internal Interactable Mailbox => CourierJobGenerator.FindMailbox(MailboxId);

		[JsonIgnore]
		internal Interactable SealedMail => CourierJobGenerator.FindSealedMail(SealedMailId);

		public CourierJob()
		{
		}

		public CourierJob(int mailboxId, int mailItemId, string deliveryAddressName)
		{
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			MailboxId = mailboxId;
			SealedMailId = mailItemId;
			DeliveryAddressName = deliveryAddressName;
			LastTimeActive = Lib.Time.CurrentDateTime;
		}
	}
}