Decompiled source of RemoteOpAchievementFix v1.0.1

plugins/RemoteOpAchievementFix.dll

Decompiled 5 hours ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Security.Permissions;
using BepInEx;
using On.RoR2.Achievements;
using RoR2;
using RoR2.Achievements;
using RoR2.Achievements.Bandit2;
using RoR2.Achievements.Captain;
using RoR2.Achievements.Commando;
using RoR2.Achievements.Croco;
using RoR2.Achievements.Engi;
using RoR2.Achievements.Huntress;
using RoR2.Achievements.Loader;
using RoR2.Achievements.Mage;
using RoR2.Achievements.Merc;
using RoR2.Achievements.Railgunner;
using RoR2.Achievements.Toolbot;
using RoR2.Achievements.Treebot;
using RoR2.Achievements.VoidSurvivor;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.0.0.0")]
namespace FluxSquido.RemoteOpAchievementFix;

[BepInPlugin("FluxSquido.RemoteOpAchievementFix", "RemoteOpAchievementFix", "1.0.1")]
public sealed class RemoteOpAchievementFixPlugin : BaseUnityPlugin
{
	public const string PluginGuid = "FluxSquido.RemoteOpAchievementFix";

	public const string PluginName = "RemoteOpAchievementFix";

	public const string PluginVersion = "1.0.1";

	private void Awake()
	{
		RemoteOpAchievements.Init();
	}
}
internal static class RemoteOpAchievements
{
	private static readonly Type[] runEventTypes = new Type[22]
	{
		typeof(BasePerSurvivorClearGameMonsoonAchievement),
		typeof(BasePerSurvivorBeatBrotherMaxKarmaAchievement),
		typeof(BasePerSurvivorClearGameHexesAchievement),
		typeof(BasePerSurvivorClearUltimaAchievement),
		typeof(BasePerSurvivorClearChampRushAchievement),
		typeof(BasePerSurvivorPurgeAchievement),
		typeof(BasePerSurvivorDecompileAchievement),
		typeof(CrocoClearGameRestackAchievement),
		typeof(ToolbotBeatArenaLaterAchievement),
		typeof(CommandoMeridianEventTriggerAchievement),
		typeof(HuntressMeridianEventTriggerAchievement),
		typeof(Bandit2MeridianEventTriggerAchievement),
		typeof(ToolbotMeridianEventTriggerAchievement),
		typeof(EngiMeridianEventTriggerAchievement),
		typeof(MageMeridianEventTriggerAchievement),
		typeof(MercMeridianEventTriggerAchievement),
		typeof(TreebotMeridianEventTriggerAchievement),
		typeof(LoaderMeridianEventTriggerAchievement),
		typeof(CrocoMeridianEventTriggerAchievement),
		typeof(CaptainMeridianEventTriggerAchievement),
		typeof(RailgunnerMeridianEventTriggerAchievement),
		typeof(VoidSurvivorMeridianEventTriggerAchievement)
	};

	private static readonly Dictionary<Type, bool> runEventCache = new Dictionary<Type, bool>();

	internal static void Init()
	{
		//IL_0007: Unknown result type (might be due to invalid IL or missing references)
		//IL_0011: Expected O, but got Unknown
		BaseAchievement.HandleBodyChangedForBodyRequirement += new hook_HandleBodyChangedForBodyRequirement(HandleBodyChanged);
	}

	private static void HandleBodyChanged(orig_HandleBodyChangedForBodyRequirement orig, BaseAchievement self)
	{
		if (!IsRemoteOpBody(self.localUser.cachedBody) || !IsRunEvent(((object)self).GetType()))
		{
			orig.Invoke(self);
		}
	}

	private static bool IsRemoteOpBody(CharacterBody body)
	{
		//IL_000b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0010: 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)
		//IL_0016: Unknown result type (might be due to invalid IL or missing references)
		//IL_0018: Invalid comparison between Unknown and I4
		//IL_001a: Unknown result type (might be due to invalid IL or missing references)
		//IL_001b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0021: Unknown result type (might be due to invalid IL or missing references)
		if (!Object.op_Implicit((Object)(object)body))
		{
			return false;
		}
		DroneIndex droneIndexFromBodyIndex = DroneCatalog.GetDroneIndexFromBodyIndex(body.bodyIndex);
		if ((int)droneIndexFromBodyIndex != -1)
		{
			return DroneCatalog.GetRemoteOpBodyIndexFromDroneIndex(droneIndexFromBodyIndex) == body.bodyIndex;
		}
		return false;
	}

	private static bool IsRunEvent(Type type)
	{
		if (!runEventCache.TryGetValue(type, out var value))
		{
			value = (runEventCache[type] = Array.Exists(runEventTypes, (Type t) => t.IsAssignableFrom(type)));
		}
		return value;
	}
}