Decompiled source of AuthoredMapsOnly v1.0.0

BepInEx/plugins/AuthoredMapsOnly.dll

Decompiled 2 days ago
using System;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using Pigeon.Math;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: IgnoresAccessChecksTo("Assembly-CSharp")]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("Sparroh")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("AuthoredMapsOnly")]
[assembly: AssemblyTitle("AuthoredMapsOnly")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[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;
		}
	}
}
[BepInPlugin("sparroh.authoredmapsonly", "AuthoredMapsOnly", "1.0.0")]
[MycoMod(/*Could not decode attribute arguments.*/)]
public class AuthoredMapsOnlyPlugin : BaseUnityPlugin
{
	public const string PluginGUID = "sparroh.authoredmapsonly";

	public const string PluginName = "AuthoredMapsOnly";

	public const string PluginVersion = "1.0.0";

	internal static ManualLogSource Log;

	internal static ConfigEntry<bool> AuthoredMapsOnly;

	private Harmony _harmony;

	internal static bool Enabled
	{
		get
		{
			if (AuthoredMapsOnly != null)
			{
				return AuthoredMapsOnly.Value;
			}
			return true;
		}
	}

	private void Awake()
	{
		//IL_0031: Unknown result type (might be due to invalid IL or missing references)
		//IL_003b: Expected O, but got Unknown
		Log = ((BaseUnityPlugin)this).Logger;
		AuthoredMapsOnly = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "AuthoredMapsOnly", true, "When enabled, missions use hand-authored (designed) maps instead of procedural/uncharted ones whenever authored maps exist for the region.");
		_harmony = new Harmony("sparroh.authoredmapsonly");
		ApplyPatches();
		Log.LogInfo((object)string.Format("{0} v{1} loaded (AuthoredMapsOnly={2})", "AuthoredMapsOnly", "1.0.0", Enabled));
	}

	private void ApplyPatches()
	{
		//IL_0027: Unknown result type (might be due to invalid IL or missing references)
		//IL_0032: Expected O, but got Unknown
		//IL_005a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0064: Expected O, but got Unknown
		//IL_015f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0169: Expected O, but got Unknown
		TryPatch(AccessTools.Method(typeof(Mission), "GetValidMissions", (Type[])null, (Type[])null), new HarmonyMethod(typeof(AuthoredMapsOnlyPatches), "GetValidMissions_Prefix", (Type[])null));
		TryPatch(AccessTools.Method(typeof(Mission), "GetMissionData", (Type[])null, (Type[])null), null, new HarmonyMethod(typeof(AuthoredMapsOnlyPatches), "GetMissionData_Postfix", (Type[])null));
		ConstructorInfo constructorInfo = AccessTools.Constructor(typeof(MissionData), new Type[8]
		{
			typeof(int),
			typeof(Mission),
			typeof(WorldRegion),
			typeof(SceneData),
			typeof(MissionContainer),
			typeof(int),
			typeof(bool),
			typeof(Span<int>)
		}, false);
		if (constructorInfo == null)
		{
			ConstructorInfo[] constructors = typeof(MissionData).GetConstructors(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
			int num = -1;
			ConstructorInfo[] array = constructors;
			foreach (ConstructorInfo constructorInfo2 in array)
			{
				int num2 = constructorInfo2.GetParameters().Length;
				if (num2 > num)
				{
					num = num2;
					constructorInfo = constructorInfo2;
				}
			}
			if (constructorInfo != null)
			{
				Log.LogWarning((object)$"MissionData Span ctor lookup failed; using {num}-param ctor instead.");
			}
		}
		TryPatch(constructorInfo, null, new HarmonyMethod(typeof(AuthoredMapsOnlyPatches), "MissionData_Ctor_Postfix", (Type[])null));
	}

	private void TryPatch(MethodBase original, HarmonyMethod prefix = null, HarmonyMethod postfix = null)
	{
		if (original == null)
		{
			Log.LogError((object)"Failed to find a patch target method.");
			return;
		}
		try
		{
			_harmony.Patch(original, prefix, postfix, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
			Log.LogInfo((object)("Patched " + original.DeclaringType?.Name + "." + original.Name));
		}
		catch (Exception arg)
		{
			Log.LogError((object)$"Failed to patch {original.DeclaringType?.Name}.{original.Name}: {arg}");
		}
	}
}
internal static class AuthoredMapsOnlyUtil
{
	internal static bool IsGameReady()
	{
		Global instance = Global.Instance;
		if (instance != null && instance.Regions != null && instance.Regions.Length != 0)
		{
			return instance.Missions != null;
		}
		return false;
	}

	internal static bool RegionHasAuthoredMaps(WorldRegion region)
	{
		//IL_0006: 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)
		if (region == null)
		{
			return false;
		}
		if ((region.Flags & 0x8000) == 0)
		{
			return false;
		}
		SceneData[] legacyScenes = region.LegacyScenes;
		if (legacyScenes != null)
		{
			return legacyScenes.Length != 0;
		}
		return false;
	}

	internal static bool TryPickAuthoredScene(WorldRegion region, int seed, out SceneData scene)
	{
		//IL_0001: Unknown result type (might be due to invalid IL or missing references)
		//IL_0036: Unknown result type (might be due to invalid IL or missing references)
		//IL_003b: Unknown result type (might be due to invalid IL or missing references)
		scene = default(SceneData);
		if (!RegionHasAuthoredMaps(region))
		{
			return false;
		}
		SceneData[] legacyScenes = region.LegacyScenes;
		Random val = default(Random);
		((Random)(ref val))..ctor(MathUtil.Squirrel3Hash(seed, 168275997));
		scene = legacyScenes[((Random)(ref val)).Next(legacyScenes.Length)];
		return ((SceneData)(ref scene)).IsValid;
	}

	internal static bool IsProceduralMission(ref MissionData missionData, WorldRegion region)
	{
		//IL_0004: Unknown result type (might be due to invalid IL or missing references)
		//IL_000e: Unknown result type (might be due to invalid IL or missing references)
		if (region == null || (region.Flags & 0x8000) == 0)
		{
			return false;
		}
		if (missionData.locationNameID == 0)
		{
			return false;
		}
		WorldProfile[] worldProfiles = region.WorldProfiles;
		if (worldProfiles == null || worldProfiles.Length == 0)
		{
			return false;
		}
		SceneData[] scenes = region.Scenes;
		if (scenes == null)
		{
			return false;
		}
		for (int i = 0; i < scenes.Length; i++)
		{
			if (Global.GetSceneIndex(scenes[i].scene) == missionData.sceneIndex)
			{
				return true;
			}
		}
		return false;
	}

	internal static void ForceAuthoredScene(ref MissionData missionData, WorldRegion region = null, Mission mission = null, int seed = int.MinValue)
	{
		//IL_00b6: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c7: Unknown result type (might be due to invalid IL or missing references)
		if (!AuthoredMapsOnlyPlugin.Enabled || !IsGameReady())
		{
			return;
		}
		if (region == null)
		{
			if (missionData.regionIndex < 0 || missionData.regionIndex >= Global.Instance.Regions.Length)
			{
				return;
			}
			region = Global.Instance.Regions[missionData.regionIndex];
		}
		if (RegionHasAuthoredMaps(region))
		{
			if (mission == null && missionData.missionIndex >= 0 && missionData.missionIndex < Global.Instance.Missions.Length)
			{
				mission = Global.Instance.Missions[missionData.missionIndex];
			}
			if (seed == int.MinValue)
			{
				seed = ((MissionData)(ref missionData)).Seed;
			}
			SceneData val = default(SceneData);
			if ((mission == null || !mission.OverrideScene(ref val, region, seed)) && IsProceduralMission(ref missionData, region) && TryPickAuthoredScene(region, seed, out var scene))
			{
				missionData.sceneIndex = Global.GetSceneIndex(scene.scene);
				((MissionData)(ref missionData)).SetLocation(scene);
			}
		}
	}
}
internal static class AuthoredMapsOnlyPatches
{
	public static void GetValidMissions_Prefix(ref LevelFlags compatibleLevels)
	{
		//IL_0022: Unknown result type (might be due to invalid IL or missing references)
		//IL_003a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0044: Unknown result type (might be due to invalid IL or missing references)
		//IL_0048: 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_0053: Unknown result type (might be due to invalid IL or missing references)
		if (!AuthoredMapsOnlyPlugin.Enabled || !AuthoredMapsOnlyUtil.IsGameReady() || ((uint)compatibleLevels & 0x8000u) == 0)
		{
			return;
		}
		LevelFlags val = (LevelFlags)((int)compatibleLevels & 0x640F0);
		WorldRegion[] regions = Global.Instance.Regions;
		foreach (WorldRegion val2 in regions)
		{
			if (val2 != null && (val2.Flags & 0x8000) != 0 && (LevelFlags)(val2.Flags & 0x640F0) == val && AuthoredMapsOnlyUtil.RegionHasAuthoredMaps(val2))
			{
				compatibleLevels = (LevelFlags)((uint)compatibleLevels & 0xFFFF7FFFu);
				break;
			}
		}
	}

	public static void GetMissionData_Postfix(ref MissionData __result)
	{
		AuthoredMapsOnlyUtil.ForceAuthoredScene(ref __result);
	}

	public static void MissionData_Ctor_Postfix(ref MissionData __instance, int seed, Mission mission, WorldRegion region)
	{
		if (region != null)
		{
			AuthoredMapsOnlyUtil.ForceAuthoredScene(ref __instance, region, mission, seed);
		}
	}
}
namespace AuthoredMapsOnly
{
	public static class MyPluginInfo
	{
		public const string PLUGIN_GUID = "AuthoredMapsOnly";

		public const string PLUGIN_NAME = "AuthoredMapsOnly";

		public const string PLUGIN_VERSION = "1.0.0";
	}
}
namespace System.Runtime.CompilerServices
{
	[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]
	internal sealed class IgnoresAccessChecksToAttribute : Attribute
	{
		public IgnoresAccessChecksToAttribute(string assemblyName)
		{
		}
	}
}