Decompiled source of TFAOneClickUnlocker v0.1.0

TFAOneClickUnlocker.dll

Decompiled a day ago
using System;
using System.Collections;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using BepInEx;
using Microsoft.CodeAnalysis;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyCompany("TFAOneClickUnlocker")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("TFAOneClickUnlocker")]
[assembly: AssemblyTitle("TFAOneClickUnlocker")]
[assembly: AssemblyVersion("1.0.0.0")]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace TFAOneClickUnlocker
{
	[BepInPlugin("com.chatgpt.peak.tfaoneclickunlocker", "TFA One-Click Unlocker", "0.1.0")]
	public sealed class Plugin : BaseUnityPlugin
	{
		private void Update()
		{
			if (Input.GetKeyDown((KeyCode)289))
			{
				try
				{
					UnlockAttempt();
				}
				catch (Exception ex)
				{
					((BaseUnityPlugin)this).Logger.LogError((object)("Unlock attempt failed: " + ex));
				}
			}
		}

		private void UnlockAttempt()
		{
			Assembly assembly = AppDomain.CurrentDomain.GetAssemblies().FirstOrDefault((Assembly a) => string.Equals(a.GetName().Name, "TrueFinalAscent", StringComparison.OrdinalIgnoreCase));
			if (assembly == null)
			{
				((BaseUnityPlugin)this).Logger.LogError((object)"TrueFinalAscent assembly is not loaded.");
				return;
			}
			Type type = assembly.GetType("FinalAscentBadges", throwOnError: false) ?? GetTypesSafely(assembly).FirstOrDefault((Type t) => t != null && t.Name == "FinalAscentBadges");
			if (type == null)
			{
				((BaseUnityPlugin)this).Logger.LogError((object)"Could not find TFA type FinalAscentBadges.");
				return;
			}
			FieldInfo field = type.GetField("All", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic);
			MethodInfo method = type.GetMethod("Earn", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic, null, new Type[1] { typeof(string) }, null);
			MethodInfo methodInfo = type.GetMethods(BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic).FirstOrDefault(delegate(MethodInfo m)
			{
				if (m.Name != "Owned")
				{
					return false;
				}
				ParameterInfo[] parameters = m.GetParameters();
				return parameters.Length == 1 && parameters[0].ParameterType.Name == "FinalAscentBadge";
			});
			if (field == null || method == null || methodInfo == null)
			{
				((BaseUnityPlugin)this).Logger.LogError((object)"TFA adapter failed. All, Earn(string), or Owned(FinalAscentBadge) is missing.");
				return;
			}
			if (!(field.GetValue(null) is IEnumerable enumerable))
			{
				((BaseUnityPlugin)this).Logger.LogError((object)"TFA FinalAscentBadges.All is unavailable.");
				return;
			}
			int num = 0;
			int num2 = 0;
			int num3 = 0;
			int num4 = 0;
			int num5 = 0;
			int num6 = 0;
			((BaseUnityPlugin)this).Logger.LogInfo((object)"Starting TFA native badge unlock.");
			foreach (object item in enumerable)
			{
				if (item == null)
				{
					continue;
				}
				Type type2 = item.GetType();
				string text = null;
				bool flag = false;
				try
				{
					FieldInfo field2 = type2.GetField("Key", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
					PropertyInfo property = type2.GetProperty("Key", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
					FieldInfo field3 = type2.GetField("Special", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
					PropertyInfo property2 = type2.GetProperty("Special", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
					if (field2 != null)
					{
						text = field2.GetValue(item) as string;
					}
					else if (property != null)
					{
						text = property.GetValue(item, null) as string;
					}
					if (field3 != null)
					{
						flag = Convert.ToBoolean(field3.GetValue(item));
					}
					else if (property2 != null)
					{
						flag = Convert.ToBoolean(property2.GetValue(item, null));
					}
				}
				catch (Exception ex)
				{
					num6++;
					((BaseUnityPlugin)this).Logger.LogWarning((object)("Could not read badge metadata: " + ex.Message));
					continue;
				}
				if (string.IsNullOrEmpty(text))
				{
					num6++;
					((BaseUnityPlugin)this).Logger.LogWarning((object)"Skipped badge with unreadable Key.");
					continue;
				}
				if (flag)
				{
					num5++;
					((BaseUnityPlugin)this).Logger.LogInfo((object)("Skipped special badge: " + text));
					continue;
				}
				num++;
				try
				{
					if (Convert.ToBoolean(methodInfo.Invoke(null, new object[1] { item })))
					{
						num3++;
						((BaseUnityPlugin)this).Logger.LogInfo((object)("Already unlocked: " + text));
						continue;
					}
					method.Invoke(null, new object[1] { text });
					if (Convert.ToBoolean(methodInfo.Invoke(null, new object[1] { item })))
					{
						num2++;
						((BaseUnityPlugin)this).Logger.LogInfo((object)("Unlock confirmed: " + text));
					}
					else
					{
						num4++;
						((BaseUnityPlugin)this).Logger.LogWarning((object)("Earn was called, but ownership was not confirmed: " + text + ". TFA may be blocking achievements or manual mode may be active."));
					}
				}
				catch (TargetInvocationException ex2)
				{
					num6++;
					((BaseUnityPlugin)this).Logger.LogError((object)("TFA threw an exception for " + text + ": " + (ex2.InnerException ?? ex2)));
				}
				catch (Exception ex3)
				{
					num6++;
					((BaseUnityPlugin)this).Logger.LogError((object)("Failed to process " + text + ": " + ex3));
				}
			}
			((BaseUnityPlugin)this).Logger.LogInfo((object)("TFA unlock finished. Confirmed unlocked=" + num2 + ", already owned=" + num3 + ", unconfirmed=" + num4 + ", skipped special=" + num5 + ", errors=" + num6 + ", attempted=" + num + "."));
		}

		private static Type[] GetTypesSafely(Assembly assembly)
		{
			try
			{
				return assembly.GetTypes();
			}
			catch (ReflectionTypeLoadException ex)
			{
				return ex.Types.Where((Type t) => t != null).ToArray();
			}
		}
	}
}