Decompiled source of Alex Vance Bulk Order Mod v1.1.0

Mods/BulkBuyerMod.dll

Decompiled 2 weeks ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using MelonLoader;
using Microsoft.CodeAnalysis;
using S1API.Console;
using S1API.DeadDrops;
using S1API.Entities;
using S1API.GameTime;
using S1API.Internal.Abstraction;
using S1API.Items;
using S1API.Leveling;
using S1API.Messaging;
using S1API.Money;
using S1API.Products;
using S1API.Quests;
using S1API.Quests.Constants;
using S1API.Saveables;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: MelonInfo(typeof(BulkBuyerMod), "Alex Vance Bulk Order Mod", "1.0.0", "AlexumYT", null)]
[assembly: MelonGame("TVGS", "Schedule I")]
[assembly: MelonColor(255, 191, 255, 0)]
[assembly: AssemblyTitle("BulkBuyerMod")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("BulkBuyerMod")]
[assembly: AssemblyCopyright("Copyright ©  2026")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("229bf8fb-1ecb-4270-9bcb-b33cc7231d4b")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[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 BulkBuyerMod : MelonMod
{
	public override void OnInitializeMelon()
	{
		MelonLogger.Msg("[BulkBuyer] Mod loaded");
	}
}
public class AlexVance : NPC
{
	public static AlexVance Instance;

	private const int ProductPerLevel = 8;

	private const int ProductVariation = 10;

	private const float ProductPriceMultiplier = 1.2f;

	private const int MinDaysAllowed = 1;

	private const int MaxDaysAllowed = 3;

	[SaveableField("Order")]
	private OrderData _orderData;

	[SaveableField("Intro")]
	private readonly IntroData _introData = new IntroData();

	[SaveableField("Friendliness")]
	private int _friendliness = 0;

	[SaveableField("FriendlinessRank")]
	private string _friendlinessRank = "Stranger";

	private static readonly (string message, string response)[] IntroTexts = new(string, string)[3]
	{
		("Yo, your uncle said you might could help me with supply. I'm running low.", "Where you wanna meet?"),
		("I can't meet up. I'm over in Belland, like 300 miles out dawg.", "What about a dead drop?"),
		("That works. I'll text you when I need a drop. Peace.", "")
	};

	private readonly Dictionary<int, string> FriendlinessRanks = new Dictionary<int, string>
	{
		{ 0, "Stranger" },
		{ 250, "Moderate Dealer" },
		{ 750, "Good Dealer" },
		{ 1500, "Great Connection" },
		{ 3000, "Absolute Mastermind" }
	};

	private static readonly string[] RandomRequestTexts = new string[6] { "Yo, I need {amount} {product} by {day}. I've got {price} with your name on it. Can you make that happen?", "My people are fienin. Got {amount} {product}?? Need it by {day} if you can. I'll drop {price} for it.", "Ayo, can you hit me with {amount} {product} by {day} for me? You know I need it, and I'll pay {price} for that.", "{amount} {product} by {day} - you got me?? I got you {price} waiting.", "I'm runnin' low on {product}. Can you push {amount} to me by {day}? I'll pay {price} for it.", "Bro, I'm out here scrambling. Can you get {amount} {product} by {day}? I'm desperate, I'll toss {price} your way." };

	private static readonly string[] RandomAcceptResponses = new string[3] { "No doubt, send me a pin.", "Say no more, I gotchu.", "Aight, let's run it." };

	private static readonly string[] RandomDenyResponses = new string[3] { "Nah, ain't got it right now.", "Can't do it at the moment.", "Nah, I can't make this week." };

	private static readonly string[] RandomNegativeTexts = new string[3] { "Damn, aight... guess that's it then.", "Cool, I guess... catch you later.", "Shit, no no. Ok, i'll hit you up later tho." };

	private static readonly string[] RandomPositiveTexts = new string[3] { "Hell yeah bro, thanks.", "Solid, I'll drop you the cash when I pull up.", "You a real one, fam. Appreciate you." };

	private bool IntroCompleted => _introData != null && _introData.Progress >= IntroTexts.Length - 1;

	private string GetCurrentRank()
	{
		string result = "Stranger";
		foreach (KeyValuePair<int, string> friendlinessRank in FriendlinessRanks)
		{
			if (_friendliness >= friendlinessRank.Key)
			{
				result = friendlinessRank.Value;
			}
		}
		return result;
	}

	private void CheckForRankUp()
	{
		string currentRank = GetCurrentRank();
		if (currentRank != _friendlinessRank)
		{
			_friendlinessRank = currentRank;
			((NPC)this).SendTextMessage("Yo... you've earned a new connection rank: <color=#00FF99>" + currentRank + "</color>.", (Response[])null, 1.5f, true);
			TriggerRankReward(currentRank);
		}
	}

	protected override void ConfigurePrefab(NPCPrefabBuilder builder)
	{
		builder.WithIdentity("alex_vance", "Alex", "Vance").WithAppearanceDefaults((Action<AvatarDefaultsBuilder>)delegate(AvatarDefaultsBuilder av)
		{
			//IL_003b: 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_006f: Unknown result type (might be due to invalid IL or missing references)
			av.Gender = 0f;
			av.Height = 1f;
			av.Weight = 0.35f;
			Color32 skinColor = default(Color32);
			((Color32)(ref skinColor))..ctor((byte)150, (byte)120, (byte)95, byte.MaxValue);
			av.SkinColor = skinColor;
			av.HairColor = new Color(0.1f, 0.1f, 0.1f);
			av.HairPath = "Avatar/Hair/messybob/MessyBob";
			av.WithFaceLayer("Avatar/Layers/Face/FacialHair_Goatee", Color.black);
		});
	}

	protected override void OnCreated()
	{
		Instance = this;
		TimeManager.OnDayPass = (Action)Delegate.Combine(TimeManager.OnDayPass, new Action(OnDayPass));
		((NPC)this).Appearance.Build();
	}

	protected override void OnResponseLoaded(Response response)
	{
		MelonLogger.Msg(response.Label);
		switch (response.Label)
		{
		case "ACCEPT":
			response.OnTriggered = AcceptOrder;
			break;
		case "DENY":
			response.OnTriggered = DenyOrder;
			break;
		case "PROGRESS_INTRO":
			response.OnTriggered = ProgressIntro;
			break;
		}
	}

	private void TriggerRankReward(string rank)
	{
		switch (rank)
		{
		case "Moderate Dealer":
			((NPC)this).SendTextMessage("I can trust you now. I'll start sending slightly bigger requests.", (Response[])null, 1.5f, true);
			break;
		case "Good Dealer":
			((NPC)this).SendTextMessage("You reliable as hell. I'll pay better for rush jobs now.", (Response[])null, 1.5f, true);
			break;
		case "Great Connection":
			((NPC)this).SendTextMessage("You got serious pull now. I'm opening premium routes for you.", (Response[])null, 1.5f, true);
			break;
		case "Absolute Mastermind":
			((NPC)this).SendTextMessage("Nobody moves product like you. You're basically untouchable.", (Response[])null, 1.5f, true);
			break;
		}
	}

	private void OnDayPass()
	{
		//IL_0009: Unknown result type (might be due to invalid IL or missing references)
		//IL_000f: Invalid comparison between Unknown and I4
		//IL_003e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0044: Invalid comparison between Unknown and I4
		if (!IntroCompleted && (int)LevelManager.Rank >= 3)
		{
			ProgressIntro();
		}
		else if (_orderData != null)
		{
			DenyOrder();
		}
		else if ((int)TimeManager.CurrentDay == 1)
		{
			SendRandomText();
		}
	}

	public void AddFriendliness(int amount)
	{
		_friendliness += amount;
		((NPC)this).SendTextMessage($"<color=#00FF99>Friendliness +{amount}</color>\nCurrent Reputation: {_friendliness} ({GetCurrentRank()})", (Response[])null, 1.5f, true);
		CheckForRankUp();
	}

	private void SendRandomText()
	{
		//IL_016c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0172: Unknown result type (might be due to invalid IL or missing references)
		//IL_0254: Unknown result type (might be due to invalid IL or missing references)
		//IL_025b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0270: Unknown result type (might be due to invalid IL or missing references)
		//IL_0273: Expected I4, but got Unknown
		//IL_0275: Unknown result type (might be due to invalid IL or missing references)
		//IL_02e5: Unknown result type (might be due to invalid IL or missing references)
		//IL_0351: Unknown result type (might be due to invalid IL or missing references)
		//IL_0356: Unknown result type (might be due to invalid IL or missing references)
		//IL_0362: Unknown result type (might be due to invalid IL or missing references)
		//IL_036b: Unknown result type (might be due to invalid IL or missing references)
		//IL_037f: Expected O, but got Unknown
		//IL_0381: Unknown result type (might be due to invalid IL or missing references)
		//IL_0386: Unknown result type (might be due to invalid IL or missing references)
		//IL_0392: Unknown result type (might be due to invalid IL or missing references)
		//IL_039b: Unknown result type (might be due to invalid IL or missing references)
		//IL_03af: Expected O, but got Unknown
		if (ProductManager.DiscoveredProducts.Length == 0)
		{
			return;
		}
		List<ProductDefinition> list = ProductManager.FavouritedProducts.Where((ProductDefinition p) => (ItemDefinition)(object)p != (ItemDefinition)null).ToList();
		List<ProductDefinition> list2 = new List<ProductDefinition>(ProductManager.DiscoveredProducts);
		MelonLogger.Msg($"[AlexVance] Favorites found: {list.Count}");
		ProductDefinition val = null;
		if (list.Count >= 3)
		{
			val = list[Random.Range(0, list.Count)];
			MelonLogger.Msg("[AlexVance] Using FAVORITE product pool.");
		}
		else
		{
			val = list2[Random.Range(0, list2.Count)];
			MelonLogger.Msg("[AlexVance] Not enough favorites, using fallback pool.");
		}
		if ((ItemDefinition)(object)val == (ItemDefinition)null)
		{
			MelonLogger.Warning("[AlexVance] No product selected.");
			return;
		}
		_orderData = new OrderData
		{
			Product = val
		};
		float num = 1f;
		if (_friendliness >= 3000)
		{
			num = 2.5f;
		}
		else if (_friendliness >= 1500)
		{
			num = 2f;
		}
		else if (_friendliness >= 750)
		{
			num = 1.6f;
		}
		else if (_friendliness >= 250)
		{
			num = 1.3f;
		}
		int num2 = Mathf.RoundToInt((float)(LevelManager.Rank * 8) * num);
		int num3 = Random.Range(-10, 11);
		_orderData.Amount = Mathf.Max(1, num2 + num3);
		float num4 = 1f;
		if (_friendliness >= 3000)
		{
			num4 = 1.8f;
		}
		else if (_friendliness >= 1500)
		{
			num4 = 1.5f;
		}
		else if (_friendliness >= 750)
		{
			num4 = 1.3f;
		}
		else if (_friendliness >= 250)
		{
			num4 = 1.15f;
		}
		_orderData.Price = Mathf.RoundToInt(val.Price * (float)_orderData.Amount * 1.2f * num4);
		int num5 = Random.Range(1, 4);
		int num6 = (TimeManager.CurrentDay + num5) % Enum.GetValues(typeof(Day)).Length;
		Day val2 = (Day)num6;
		string text = RandomRequestTexts[Random.Range(0, RandomRequestTexts.Length)];
		string text2 = text.Replace("{product}", "<color=#3399FF>" + ((ItemDefinition)_orderData.Product).Name + "</color>").Replace("{amount}", $"{_orderData.Amount}x").Replace("{day}", $"<color=#FF6600>{val2}</color>")
			.Replace("{price}", $"<color=#00CC00>${_orderData.Price:N0}</color>");
		string text3 = RandomDenyResponses[Random.Range(0, RandomDenyResponses.Length)];
		string text4 = RandomAcceptResponses[Random.Range(0, RandomAcceptResponses.Length)];
		((NPC)this).SendTextMessage(text2, (Response[])(object)new Response[2]
		{
			new Response
			{
				Label = "ACCEPT",
				Text = text4,
				OnTriggered = AcceptOrder
			},
			new Response
			{
				Label = "DENY",
				Text = text3,
				OnTriggered = DenyOrder
			}
		}, 1.5f, true);
	}

	private void DenyOrder()
	{
		string text = RandomNegativeTexts[Random.Range(0, RandomNegativeTexts.Length)];
		((NPC)this).SendTextMessage(text, (Response[])null, 1.5f, true);
		ClearPendingOrder();
	}

	private void AcceptOrder()
	{
		//IL_0014: Unknown result type (might be due to invalid IL or missing references)
		//IL_001f: Expected O, but got Unknown
		if (_orderData == null || (ItemDefinition)_orderData.Product == (ItemDefinition)null)
		{
			throw new Exception("No pending product assigned in BulkBuyer!");
		}
		string text = RandomPositiveTexts[Random.Range(0, RandomPositiveTexts.Length)];
		((NPC)this).SendTextMessage(text, (Response[])null, 1.5f, true);
		QuestAlexOrder questAlexOrder = (QuestAlexOrder)(object)QuestManager.CreateQuest<QuestAlexOrder>((string)null);
		questAlexOrder.SetupAsNew(_orderData);
		((Quest)questAlexOrder).Begin();
		ClearPendingOrder();
	}

	private void ClearPendingOrder()
	{
		_orderData = null;
	}

	private void ProgressIntro()
	{
		//IL_002f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0034: Unknown result type (might be due to invalid IL or missing references)
		//IL_0040: Unknown result type (might be due to invalid IL or missing references)
		//IL_0061: Unknown result type (might be due to invalid IL or missing references)
		//IL_0079: Expected O, but got Unknown
		if (_introData == null)
		{
			throw new Exception("No intro data assigned in BulkBuyer!");
		}
		List<Response> list = new List<Response>();
		if (!IntroCompleted)
		{
			list.Add(new Response
			{
				Label = "PROGRESS_INTRO",
				Text = IntroTexts[_introData.Progress].response,
				OnTriggered = ProgressIntro
			});
		}
		((NPC)this).SendTextMessage(IntroTexts[_introData.Progress].message, list.ToArray(), 1.5f, true);
		_introData.Progress++;
	}
}
internal class QuestAlexOrder : Quest
{
	[SaveableField("Order")]
	private OrderData _orderData = new OrderData();

	[SaveableField("DeadDrop")]
	private readonly DeadDropData _deadDropData = new DeadDropData();

	private CashInstance _cashReward;

	private bool _rewardSpawned = false;

	private QuestEntry _deliveryQuestEntry;

	private QuestEntry _collectionQuestEntry;

	protected override string Title => "Alex Needs Product!";

	protected override string Description => $"Deliver Alex his product and he'll drop you <color=#00CC00>${_orderData.Price:N0}</color> off.";

	protected override void OnCreated()
	{
		((Registerable)this).OnCreated();
		MelonLogger.Msg("[AlexQuest] Quest created.");
	}

	protected override void OnLoaded()
	{
		((Saveable)this).OnLoaded();
		MelonLogger.Msg("[AlexQuest] Quest loaded from save.");
		if (_deadDropData?.DeliveryDeadDrop != null)
		{
			_deadDropData.DeliveryDeadDrop.Storage.OnClosed -= TryForDelivery;
			_deadDropData.DeliveryDeadDrop.Storage.OnClosed += TryForDelivery;
			MelonLogger.Msg("[AlexQuest] Re-hooked delivery drop.");
		}
		else
		{
			MelonLogger.Warning("[AlexQuest] Delivery drop missing on load.");
		}
		if (_deadDropData?.CollectionDeadDrop != null)
		{
			_deadDropData.CollectionDeadDrop.Storage.OnOpened -= TryForCollection;
			_deadDropData.CollectionDeadDrop.Storage.OnOpened += TryForCollection;
			MelonLogger.Msg("[AlexQuest] Re-hooked collection drop.");
		}
		else
		{
			MelonLogger.Warning("[AlexQuest] Collection drop missing on load.");
		}
	}

	public void SetupAsNew(OrderData pendingOrderData)
	{
		//IL_00e6: 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)
		MelonLogger.Msg("[AlexQuest] Setting up new order...");
		_orderData = pendingOrderData;
		_deadDropData.DeliveryDeadDrop = DeadDropManager.All[Random.Range(0, DeadDropManager.All.Length)];
		_deadDropData.CollectionDeadDrop = DeadDropManager.All[Random.Range(0, DeadDropManager.All.Length)];
		DeadDropInstance deliveryDeadDrop = _deadDropData.DeliveryDeadDrop;
		MelonLogger.Msg("[AlexQuest] Delivery Drop: " + ((deliveryDeadDrop != null) ? deliveryDeadDrop.Name : null));
		DeadDropInstance collectionDeadDrop = _deadDropData.CollectionDeadDrop;
		MelonLogger.Msg("[AlexQuest] Collection Drop: " + ((collectionDeadDrop != null) ? collectionDeadDrop.Name : null));
		ProductDefinition product = _orderData.Product;
		string arg = ((product != null) ? ((ItemDefinition)product).Name : null) ?? "NULL_PRODUCT";
		_deliveryQuestEntry = ((Quest)this).AddEntry($"Drop off {_orderData.Amount}x <color=#3399FF>{arg}</color> at the dead drop.", (Vector3?)_deadDropData.DeliveryDeadDrop.Position);
		_collectionQuestEntry = ((Quest)this).AddEntry($"Pick up <color=#00CC00>${_orderData.Price:N0}</color> at the dead drop.", (Vector3?)_deadDropData.CollectionDeadDrop.Position);
		_deadDropData.DeliveryDeadDrop.Storage.OnClosed += TryForDelivery;
		_deadDropData.CollectionDeadDrop.Storage.OnOpened += TryForCollection;
		MelonLogger.Msg("[AlexQuest] Event hooks attached.");
	}

	private void TryForDelivery()
	{
		//IL_0131: Unknown result type (might be due to invalid IL or missing references)
		//IL_01f0: Unknown result type (might be due to invalid IL or missing references)
		//IL_01f7: Expected O, but got Unknown
		//IL_0200: Unknown result type (might be due to invalid IL or missing references)
		//IL_020a: Expected O, but got Unknown
		MelonLogger.Msg("[AlexQuest] Checking delivery...");
		DeadDropInstance deliveryDeadDrop = _deadDropData.DeliveryDeadDrop;
		if (deliveryDeadDrop == null)
		{
			MelonLogger.Error("[AlexQuest] Delivery dead drop is NULL.");
			return;
		}
		ItemSlotInstance[] slots = deliveryDeadDrop.Storage.Slots;
		ItemSlotInstance[] array = slots;
		foreach (ItemSlotInstance val in array)
		{
			if (val.ItemInstance == null)
			{
			}
		}
		List<ItemSlotInstance> list = slots.Where(delegate(ItemSlotInstance slot)
		{
			ItemInstance itemInstance = slot.ItemInstance;
			ProductInstance val3 = (ProductInstance)(object)((itemInstance is ProductInstance) ? itemInstance : null);
			if (val3 == null || !val3.IsPackaged)
			{
				return false;
			}
			ProductDefinition definition = val3.Definition;
			string text = ((definition != null) ? ((ItemDefinition)definition).Name : null);
			ProductDefinition product = _orderData.Product;
			string text2 = ((product != null) ? ((ItemDefinition)product).Name : null);
			return text == text2;
		}).ToList();
		if (list.Count == 0)
		{
			return;
		}
		int num = list.Sum((ItemSlotInstance slot) => slot.Quantity * ((ProductInstance)slot.ItemInstance).AppliedPackaging.Quantity);
		MelonLogger.Msg($"[AlexQuest] Total: {num} / Required: {_orderData.Amount}");
		if (num < _orderData.Amount)
		{
			return;
		}
		int num2 = _orderData.Amount;
		foreach (ItemSlotInstance item in list)
		{
			int quantity = ((ProductInstance)item.ItemInstance).AppliedPackaging.Quantity;
			int num3 = Mathf.Min(item.Quantity * quantity, num2);
			int num4 = Mathf.CeilToInt((float)num3 / (float)quantity);
			item.AddQuantity(-num4);
			num2 -= num3;
			MelonLogger.Msg($"[AlexQuest] Removed {num3}, Remaining: {num2}");
			if (num2 <= 0)
			{
				break;
			}
		}
		QuestEntry deliveryQuestEntry = _deliveryQuestEntry;
		if (deliveryQuestEntry != null)
		{
			deliveryQuestEntry.Complete();
		}
		QuestEntry collectionQuestEntry = _collectionQuestEntry;
		if (collectionQuestEntry != null)
		{
			collectionQuestEntry.SetState((QuestState)1);
		}
		CashDefinition val2 = (CashDefinition)ItemManager.GetItemDefinition("cash");
		_cashReward = (CashInstance)((ItemDefinition)val2).CreateInstance(1);
		_cashReward.SetQuantity((float)_orderData.Price);
		deliveryDeadDrop.Storage.OnClosed -= TryForDelivery;
		MelonLogger.Msg("Delivery COMPLETE.");
	}

	private void TryForCollection()
	{
		if (_rewardSpawned || _orderData == null || _deadDropData.CollectionDeadDrop == null)
		{
			return;
		}
		if (_deadDropData.CollectionDeadDrop.Storage.CanItemFit((ItemInstance)(object)_cashReward, 1))
		{
			_deadDropData.CollectionDeadDrop.Storage.AddItem((ItemInstance)(object)_cashReward);
			_rewardSpawned = true;
			MelonLogger.Msg($"Paid ${_orderData.Price}");
			QuestEntry collectionQuestEntry = _collectionQuestEntry;
			if (collectionQuestEntry != null)
			{
				collectionQuestEntry.Complete();
			}
			if (AlexVance.Instance != null)
			{
				AlexVance.Instance.AddFriendliness(Random.Range(15, 35));
			}
			_deadDropData.CollectionDeadDrop.Storage.OnOpened -= TryForCollection;
		}
		else
		{
			MelonLogger.Warning("Not enough space for reward.");
		}
	}
}
public class AlexFriendlinessAddCommand : BaseConsoleCommand
{
	public override string CommandWord => "addfriendlinessalex";

	public override string CommandDescription => "Adds friendliness to Alex Vance";

	public override string ExampleUsage => "addfriendlinessalex 50";

	public override void ExecuteCommand(List<string> args)
	{
		if (args == null || args.Count == 0)
		{
			MelonLogger.Msg("Usage: " + ((BaseConsoleCommand)this).ExampleUsage);
			return;
		}
		if (!int.TryParse(args[0], out var result))
		{
			MelonLogger.Msg("Invalid number.");
			return;
		}
		if (AlexVance.Instance == null)
		{
			MelonLogger.Warning("AlexVance instance not found.");
			return;
		}
		AlexVance.Instance.AddFriendliness(result);
		MelonLogger.Msg($"Added {result} friendliness to Alex.");
	}
}
public class DeadDropData
{
	public DeadDropInstance DeliveryDeadDrop;

	public DeadDropInstance CollectionDeadDrop;
}
public class IntroData
{
	public int Progress;

	public IntroData(int progress = 0)
	{
		Progress = progress;
	}
}
public class OrderData
{
	public ProductDefinition Product;

	public int Amount;

	public int Price;
}