Decompiled source of ATMDepositLimitMod v1.0.0

Mods/ATMDepositLimitMod.dll

Decompiled a month ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Reflection.Emit;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using ATMDepositLimitMod;
using HarmonyLib;
using MelonLoader;
using MelonLoader.Utils;
using ScheduleOne.Money;
using ScheduleOne.UI.ATM;

[assembly: MelonInfo(typeof(global::ATMDepositLimitMod.ATMDepositLimitMod), "ATM Deposit Limit Mod", "1.1.0", "YourName", null)]
[assembly: MelonGame("ScheduleOne", "ScheduleOne")]
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("Atm25K")]
[assembly: AssemblyDescription("A mod to set the weekly deposit limit of ATMs to 25,000")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("Atm25K")]
[assembly: AssemblyCopyright("Copyright © 2025")]
[assembly: AssemblyTrademark("")]
[assembly: MelonInfo(typeof(global::ATMDepositLimitMod.ATMDepositLimitMod), "Atm25K", "1.0.0", "cathair", null)]
[assembly: MelonGame("TVGS", "Schedule I")]
[assembly: ComVisible(false)]
[assembly: Guid("6ad0c76d-0e06-4420-8d82-c1bee895be9d")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace ATMDepositLimitMod;

public class ATMDepositLimitMod : MelonMod
{
	private const float DEFAULT_LIMIT = 25000f;

	private float _depositLimit = 25000f;

	private float _configLimit = 25000f;

	public override void OnInitializeMelon()
	{
		LoadConfig();
		try
		{
			((MelonBase)this).HarmonyInstance.PatchAll();
			MelonLogger.Msg($"[ATM Deposit Limit Mod] Successfully patched all methods with deposit limit set to {_configLimit}");
		}
		catch (Exception ex)
		{
			MelonLogger.Error("[ATM Deposit Limit Mod] Failed to patch methods: " + ex.Message);
		}
	}

	private void LoadConfig()
	{
		try
		{
			string path = Path.Combine(MelonEnvironment.UserDataDirectory, "Mods", "atmconfig.txt");
			string directoryName = Path.GetDirectoryName(path);
			if (!Directory.Exists(directoryName))
			{
				Directory.CreateDirectory(directoryName);
			}
			if (!File.Exists(path))
			{
				string contents = "DepositLimit=25000";
				File.WriteAllText(path, contents);
				MelonLogger.Msg("[ATM Deposit Limit Mod] Created default config file");
			}
			string[] array = File.ReadAllLines(path);
			string[] array2 = array;
			foreach (string text in array2)
			{
				if (text.StartsWith("DepositLimit="))
				{
					if (float.TryParse(text.Split(new char[1] { '=' })[1], out var result))
					{
						_configLimit = result;
						_depositLimit = result;
					}
					break;
				}
			}
		}
		catch (Exception ex)
		{
			MelonLogger.Error("[ATM Deposit Limit Mod] Error handling config file: " + ex.Message);
		}
	}

	public float GetDepositLimit()
	{
		return _depositLimit;
	}
}
[HarmonyPatch(typeof(ATM))]
[HarmonyPatch(/*Could not decode attribute arguments.*/)]
public static class ATM_Constructor_Patch
{
	[CompilerGenerated]
	private sealed class <Transpiler>d__0 : IEnumerable<CodeInstruction>, IEnumerable, IEnumerator<CodeInstruction>, IDisposable, IEnumerator
	{
		private int <>1__state;

		private CodeInstruction <>2__current;

		private int <>l__initialThreadId;

		private IEnumerable<CodeInstruction> instructions;

		public IEnumerable<CodeInstruction> <>3__instructions;

		private ATMDepositLimitMod <mod>5__1;

		private float <limit>5__2;

		private IEnumerator<CodeInstruction> <>s__3;

		private CodeInstruction <instruction>5__4;

		private float <f>5__5;

		CodeInstruction IEnumerator<CodeInstruction>.Current
		{
			[DebuggerHidden]
			get
			{
				return <>2__current;
			}
		}

		object IEnumerator.Current
		{
			[DebuggerHidden]
			get
			{
				return <>2__current;
			}
		}

		[DebuggerHidden]
		public <Transpiler>d__0(int <>1__state)
		{
			this.<>1__state = <>1__state;
			<>l__initialThreadId = Environment.CurrentManagedThreadId;
		}

		[DebuggerHidden]
		void IDisposable.Dispose()
		{
			int num = <>1__state;
			if (num == -3 || (uint)(num - 1) <= 1u)
			{
				try
				{
				}
				finally
				{
					<>m__Finally1();
				}
			}
			<mod>5__1 = null;
			<>s__3 = null;
			<instruction>5__4 = null;
			<>1__state = -2;
		}

		private bool MoveNext()
		{
			//IL_00e0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ea: Expected O, but got Unknown
			try
			{
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					<mod>5__1 = Melon<ATMDepositLimitMod>.Instance;
					<limit>5__2 = <mod>5__1.GetDepositLimit();
					<>s__3 = instructions.GetEnumerator();
					<>1__state = -3;
					break;
				case 1:
					<>1__state = -3;
					goto IL_0121;
				case 2:
					{
						<>1__state = -3;
						goto IL_0121;
					}
					IL_0121:
					<instruction>5__4 = null;
					break;
				}
				if (<>s__3.MoveNext())
				{
					<instruction>5__4 = <>s__3.Current;
					if (<instruction>5__4.opcode == OpCodes.Ldc_R4)
					{
						object operand = <instruction>5__4.operand;
						if (operand is float)
						{
							<f>5__5 = (float)operand;
							if (<f>5__5 == 10000f)
							{
								<>2__current = new CodeInstruction(OpCodes.Ldc_R4, (object)<limit>5__2);
								<>1__state = 1;
								return true;
							}
						}
					}
					<>2__current = <instruction>5__4;
					<>1__state = 2;
					return true;
				}
				<>m__Finally1();
				<>s__3 = null;
				return false;
			}
			catch
			{
				//try-fault
				((IDisposable)this).Dispose();
				throw;
			}
		}

		bool IEnumerator.MoveNext()
		{
			//ILSpy generated this explicit interface implementation from .override directive in MoveNext
			return this.MoveNext();
		}

		private void <>m__Finally1()
		{
			<>1__state = -1;
			if (<>s__3 != null)
			{
				<>s__3.Dispose();
			}
		}

		[DebuggerHidden]
		void IEnumerator.Reset()
		{
			throw new NotSupportedException();
		}

		[DebuggerHidden]
		IEnumerator<CodeInstruction> IEnumerable<CodeInstruction>.GetEnumerator()
		{
			<Transpiler>d__0 <Transpiler>d__;
			if (<>1__state == -2 && <>l__initialThreadId == Environment.CurrentManagedThreadId)
			{
				<>1__state = 0;
				<Transpiler>d__ = this;
			}
			else
			{
				<Transpiler>d__ = new <Transpiler>d__0(0);
			}
			<Transpiler>d__.instructions = <>3__instructions;
			return <Transpiler>d__;
		}

		[DebuggerHidden]
		IEnumerator IEnumerable.GetEnumerator()
		{
			return ((IEnumerable<CodeInstruction>)this).GetEnumerator();
		}
	}

	[IteratorStateMachine(typeof(<Transpiler>d__0))]
	[HarmonyTranspiler]
	private static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions)
	{
		//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
		return new <Transpiler>d__0(-2)
		{
			<>3__instructions = instructions
		};
	}
}
[HarmonyPatch(typeof(ATMInterface))]
public static class ATMInterface_Patches
{
	[CompilerGenerated]
	private sealed class <ReplaceDepositLimit>d__2 : IEnumerable<CodeInstruction>, IEnumerable, IEnumerator<CodeInstruction>, IDisposable, IEnumerator
	{
		private int <>1__state;

		private CodeInstruction <>2__current;

		private int <>l__initialThreadId;

		private IEnumerable<CodeInstruction> instructions;

		public IEnumerable<CodeInstruction> <>3__instructions;

		private ATMDepositLimitMod <mod>5__1;

		private float <limit>5__2;

		private IEnumerator<CodeInstruction> <>s__3;

		private CodeInstruction <instruction>5__4;

		private float <f>5__5;

		CodeInstruction IEnumerator<CodeInstruction>.Current
		{
			[DebuggerHidden]
			get
			{
				return <>2__current;
			}
		}

		object IEnumerator.Current
		{
			[DebuggerHidden]
			get
			{
				return <>2__current;
			}
		}

		[DebuggerHidden]
		public <ReplaceDepositLimit>d__2(int <>1__state)
		{
			this.<>1__state = <>1__state;
			<>l__initialThreadId = Environment.CurrentManagedThreadId;
		}

		[DebuggerHidden]
		void IDisposable.Dispose()
		{
			int num = <>1__state;
			if (num == -3 || (uint)(num - 1) <= 1u)
			{
				try
				{
				}
				finally
				{
					<>m__Finally1();
				}
			}
			<mod>5__1 = null;
			<>s__3 = null;
			<instruction>5__4 = null;
			<>1__state = -2;
		}

		private bool MoveNext()
		{
			//IL_00e0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ea: Expected O, but got Unknown
			try
			{
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					<mod>5__1 = Melon<ATMDepositLimitMod>.Instance;
					<limit>5__2 = <mod>5__1.GetDepositLimit();
					<>s__3 = instructions.GetEnumerator();
					<>1__state = -3;
					break;
				case 1:
					<>1__state = -3;
					goto IL_0121;
				case 2:
					{
						<>1__state = -3;
						goto IL_0121;
					}
					IL_0121:
					<instruction>5__4 = null;
					break;
				}
				if (<>s__3.MoveNext())
				{
					<instruction>5__4 = <>s__3.Current;
					if (<instruction>5__4.opcode == OpCodes.Ldc_R4)
					{
						object operand = <instruction>5__4.operand;
						if (operand is float)
						{
							<f>5__5 = (float)operand;
							if (<f>5__5 == 10000f)
							{
								<>2__current = new CodeInstruction(OpCodes.Ldc_R4, (object)<limit>5__2);
								<>1__state = 1;
								return true;
							}
						}
					}
					<>2__current = <instruction>5__4;
					<>1__state = 2;
					return true;
				}
				<>m__Finally1();
				<>s__3 = null;
				return false;
			}
			catch
			{
				//try-fault
				((IDisposable)this).Dispose();
				throw;
			}
		}

		bool IEnumerator.MoveNext()
		{
			//ILSpy generated this explicit interface implementation from .override directive in MoveNext
			return this.MoveNext();
		}

		private void <>m__Finally1()
		{
			<>1__state = -1;
			if (<>s__3 != null)
			{
				<>s__3.Dispose();
			}
		}

		[DebuggerHidden]
		void IEnumerator.Reset()
		{
			throw new NotSupportedException();
		}

		[DebuggerHidden]
		IEnumerator<CodeInstruction> IEnumerable<CodeInstruction>.GetEnumerator()
		{
			<ReplaceDepositLimit>d__2 <ReplaceDepositLimit>d__;
			if (<>1__state == -2 && <>l__initialThreadId == Environment.CurrentManagedThreadId)
			{
				<>1__state = 0;
				<ReplaceDepositLimit>d__ = this;
			}
			else
			{
				<ReplaceDepositLimit>d__ = new <ReplaceDepositLimit>d__2(0);
			}
			<ReplaceDepositLimit>d__.instructions = <>3__instructions;
			return <ReplaceDepositLimit>d__;
		}

		[DebuggerHidden]
		IEnumerator IEnumerable.GetEnumerator()
		{
			return ((IEnumerable<CodeInstruction>)this).GetEnumerator();
		}
	}

	[HarmonyPatch("get_remainingAllowedDeposit")]
	[HarmonyTranspiler]
	private static IEnumerable<CodeInstruction> Transpiler_RemainingAllowedDeposit(IEnumerable<CodeInstruction> instructions)
	{
		return ReplaceDepositLimit(instructions);
	}

	[HarmonyPatch("Update")]
	[HarmonyTranspiler]
	private static IEnumerable<CodeInstruction> Transpiler_Update(IEnumerable<CodeInstruction> instructions)
	{
		return ReplaceDepositLimit(instructions);
	}

	[IteratorStateMachine(typeof(<ReplaceDepositLimit>d__2))]
	private static IEnumerable<CodeInstruction> ReplaceDepositLimit(IEnumerable<CodeInstruction> instructions)
	{
		//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
		return new <ReplaceDepositLimit>d__2(-2)
		{
			<>3__instructions = instructions
		};
	}
}