Decompiled source of DebuggingPlains v1.2.0

DebuggingPlains.dll

Decompiled a month ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Configuration;
using On.RoR2;
using On.RoR2.Networking;
using On.RoR2.UI.MainMenu;
using R2API.Utils;
using RoR2;
using RoR2.CharacterAI;
using RoR2.Networking;
using RoR2.UI;
using RoR2.UI.MainMenu;
using SimpleJSON;
using TMPro;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.Networking;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = "")]
[assembly: AssemblyCompany("DebuggingPlains")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("DebuggingPlains")]
[assembly: AssemblyTitle("DebuggingPlains")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace DebuggingPlains;

[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInPlugin("com.Dragonyck.DebuggingPlains", "DebuggingPlains", "1.2.0")]
[NetworkCompatibility(/*Could not decode attribute arguments.*/)]
public class DebuggingPlains : BaseUnityPlugin
{
	[Serializable]
	[CompilerGenerated]
	private sealed class <>c
	{
		public static readonly <>c <>9 = new <>c();

		public static hook_ShouldUpdateRunStopwatch <>9__2_1;

		public static hook_OnClientConnect <>9__2_2;

		internal bool <Awake>b__2_1(orig_ShouldUpdateRunStopwatch orig, Run self)
		{
			return false;
		}

		internal void <Awake>b__2_2(orig_OnClientConnect self, NetworkManagerSystemSteam user, NetworkConnection t)
		{
		}
	}

	private DPConfig config;

	private ScenesData scenesData;

	public void Awake()
	{
		//IL_003f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0049: Expected O, but got Unknown
		//IL_0084: Unknown result type (might be due to invalid IL or missing references)
		//IL_008e: Expected O, but got Unknown
		//IL_0095: Unknown result type (might be due to invalid IL or missing references)
		//IL_009f: Expected O, but got Unknown
		//IL_00a6: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b0: Expected O, but got Unknown
		//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c1: Expected O, but got Unknown
		//IL_0062: Unknown result type (might be due to invalid IL or missing references)
		//IL_006c: Expected O, but got Unknown
		//IL_010b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0110: Unknown result type (might be due to invalid IL or missing references)
		//IL_0116: Expected O, but got Unknown
		//IL_00e7: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ec: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f2: Expected O, but got Unknown
		//IL_0135: Unknown result type (might be due to invalid IL or missing references)
		//IL_013a: Unknown result type (might be due to invalid IL or missing references)
		//IL_017a: Unknown result type (might be due to invalid IL or missing references)
		//IL_017f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0185: Unknown result type (might be due to invalid IL or missing references)
		//IL_018b: Expected O, but got Unknown
		//IL_018b: Unknown result type (might be due to invalid IL or missing references)
		//IL_019d: Unknown result type (might be due to invalid IL or missing references)
		//IL_01ae: Unknown result type (might be due to invalid IL or missing references)
		//IL_01c4: Unknown result type (might be due to invalid IL or missing references)
		//IL_0209: Unknown result type (might be due to invalid IL or missing references)
		//IL_020e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0214: Unknown result type (might be due to invalid IL or missing references)
		//IL_021b: Expected O, but got Unknown
		//IL_021b: Unknown result type (might be due to invalid IL or missing references)
		//IL_022e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0241: Unknown result type (might be due to invalid IL or missing references)
		//IL_0258: Unknown result type (might be due to invalid IL or missing references)
		//IL_026d: Unknown result type (might be due to invalid IL or missing references)
		//IL_027d: Unknown result type (might be due to invalid IL or missing references)
		//IL_02c3: Unknown result type (might be due to invalid IL or missing references)
		//IL_02c8: Unknown result type (might be due to invalid IL or missing references)
		//IL_02ce: Unknown result type (might be due to invalid IL or missing references)
		//IL_02d5: Expected O, but got Unknown
		//IL_02d5: Unknown result type (might be due to invalid IL or missing references)
		//IL_02e8: Unknown result type (might be due to invalid IL or missing references)
		//IL_02fb: Unknown result type (might be due to invalid IL or missing references)
		//IL_0312: Unknown result type (might be due to invalid IL or missing references)
		//IL_0327: Unknown result type (might be due to invalid IL or missing references)
		//IL_0337: Unknown result type (might be due to invalid IL or missing references)
		config = new DPConfig(((BaseUnityPlugin)this).Config);
		if (!config.CfgEnabled.Value)
		{
			return;
		}
		if (config.CfgEnableMenuSkip.Value)
		{
			MainMenuController.UpdateMenuTransition += new hook_UpdateMenuTransition(MainMenuController_UpdateMenuTransition);
		}
		if (config.CfgSkipLobbyScreen.Value)
		{
			PreGameRuleVoteController.ServerHandleClientVoteUpdate += new hook_ServerHandleClientVoteUpdate(PreGameRuleVoteController_ServerHandleClientVoteUpdate);
		}
		Run.onRunStartGlobal += delegate
		{
			Console.instance.SubmitCmd(NetworkUser.readOnlyLocalPlayersList[0], config.CfgInitCmds.Value, false);
		};
		PreGameRuleVoteController.UpdateGameVotes += new hook_UpdateGameVotes(PreGameRuleVoteController_UpdateGameVotes);
		Run.PickNextStageScene += new hook_PickNextStageScene(Run_PickNextStageScene);
		Stage.RespawnCharacter += new hook_RespawnCharacter(Stage_RespawnCharacter);
		SceneDirector.PopulateScene += new hook_PopulateScene(SceneDirector_PopulateScene);
		if (config.CfgFreezeTimer.Value)
		{
			object obj = <>c.<>9__2_1;
			if (obj == null)
			{
				hook_ShouldUpdateRunStopwatch val = (orig_ShouldUpdateRunStopwatch orig, Run self) => false;
				<>c.<>9__2_1 = val;
				obj = (object)val;
			}
			Run.ShouldUpdateRunStopwatch += (hook_ShouldUpdateRunStopwatch)obj;
		}
		object obj2 = <>c.<>9__2_2;
		if (obj2 == null)
		{
			hook_OnClientConnect val2 = delegate
			{
			};
			<>c.<>9__2_2 = val2;
			obj2 = (object)val2;
		}
		NetworkManagerSystemSteam.OnClientConnect += (hook_OnClientConnect)obj2;
		if (config.CfgEnableTexts.Value)
		{
			GameObject val3 = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/UI/HUDSimple.prefab").WaitForCompletion();
			Transform transform = val3.GetComponent<HUD>().mainUIPanel.transform;
			GameObject val4 = new GameObject("DebugLocation", new Type[2]
			{
				typeof(RectTransform),
				typeof(TextMeshProUGUI)
			});
			RectTransform val5 = (RectTransform)val4.transform;
			val4.transform.SetParent(transform);
			((Component)val5).transform.localScale = Vector3.one;
			TextMeshProUGUI component = val4.GetComponent<TextMeshProUGUI>();
			((Transform)val5).localPosition = Vector3.zero;
			val5.anchoredPosition = config.CfgTextsPosition.Value;
			((TMP_Text)component).fontSize = config.CfgTextsSize.Value;
			GameObject val6 = new GameObject("DebugDirection", new Type[2]
			{
				typeof(RectTransform),
				typeof(TextMeshProUGUI)
			});
			RectTransform val7 = (RectTransform)val6.transform;
			val6.transform.SetParent(transform);
			((Component)val7).transform.localScale = Vector3.one;
			TextMeshProUGUI component2 = val6.GetComponent<TextMeshProUGUI>();
			((Transform)val7).localPosition = Vector3.zero;
			val7.anchoredPosition = new Vector2(config.CfgTextsPosition.Value.x, config.CfgTextsPosition.Value.y + 100f);
			((TMP_Text)component2).fontSize = config.CfgTextsSize.Value;
			GameObject val8 = new GameObject("DebugVelocity", new Type[2]
			{
				typeof(RectTransform),
				typeof(TextMeshProUGUI)
			});
			RectTransform val9 = (RectTransform)val8.transform;
			val8.transform.SetParent(transform);
			((Component)val9).transform.localScale = Vector3.one;
			TextMeshProUGUI component3 = val8.GetComponent<TextMeshProUGUI>();
			((Transform)val9).localPosition = Vector3.zero;
			val9.anchoredPosition = new Vector2(config.CfgTextsPosition.Value.x, config.CfgTextsPosition.Value.y + 200f);
			((TMP_Text)component3).fontSize = config.CfgTextsSize.Value;
			VectorDataBehaviour vectorDataBehaviour = val3.AddComponent<VectorDataBehaviour>();
			vectorDataBehaviour.location = component;
			vectorDataBehaviour.direction = component2;
			vectorDataBehaviour.velocity = component3;
		}
	}

	private void MainMenuController_UpdateMenuTransition(orig_UpdateMenuTransition orig, MainMenuController self)
	{
		//IL_0018: Unknown result type (might be due to invalid IL or missing references)
		orig.Invoke(self);
		if (LocalUserManager.isAnyUserSignedIn)
		{
			Console.instance.SubmitCmd(CmdSender.op_Implicit(LocalUserManager.GetFirstLocalUser()), "transition_command gamemode ClassicRun; host 0;", false);
		}
		else
		{
			Debug.LogWarning((object)"[DebuggingPlains] No profile selected, MainMenu can't be skipped.");
		}
	}

	private void SceneDirector_PopulateScene(orig_PopulateScene orig, SceneDirector self)
	{
		//IL_0079: Unknown result type (might be due to invalid IL or missing references)
		//IL_007e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0080: Unknown result type (might be due to invalid IL or missing references)
		//IL_0085: Unknown result type (might be due to invalid IL or missing references)
		//IL_0087: Unknown result type (might be due to invalid IL or missing references)
		//IL_008c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0093: Unknown result type (might be due to invalid IL or missing references)
		//IL_009d: Expected O, but got Unknown
		//IL_009d: Expected O, but got Unknown
		//IL_0098: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a2: Expected O, but got Unknown
		//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
		//IL_0143: Unknown result type (might be due to invalid IL or missing references)
		//IL_0148: Unknown result type (might be due to invalid IL or missing references)
		//IL_016c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0173: Unknown result type (might be due to invalid IL or missing references)
		//IL_02f7: Unknown result type (might be due to invalid IL or missing references)
		//IL_02fc: Unknown result type (might be due to invalid IL or missing references)
		//IL_0305: Unknown result type (might be due to invalid IL or missing references)
		//IL_030a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0313: Unknown result type (might be due to invalid IL or missing references)
		//IL_0318: Unknown result type (might be due to invalid IL or missing references)
		//IL_031a: Unknown result type (might be due to invalid IL or missing references)
		//IL_031d: Invalid comparison between Unknown and I4
		//IL_0235: Unknown result type (might be due to invalid IL or missing references)
		//IL_023a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0266: Unknown result type (might be due to invalid IL or missing references)
		//IL_026d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0328: Unknown result type (might be due to invalid IL or missing references)
		//IL_032b: Invalid comparison between Unknown and I4
		//IL_031f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0321: Unknown result type (might be due to invalid IL or missing references)
		//IL_0326: Unknown result type (might be due to invalid IL or missing references)
		//IL_0336: Unknown result type (might be due to invalid IL or missing references)
		//IL_033a: Unknown result type (might be due to invalid IL or missing references)
		//IL_034e: Unknown result type (might be due to invalid IL or missing references)
		//IL_032d: Unknown result type (might be due to invalid IL or missing references)
		//IL_032f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0334: Unknown result type (might be due to invalid IL or missing references)
		orig.Invoke(self);
		if (config.CfgDisableTPZones.Value)
		{
			Utils.DisableMapZones();
		}
		SceneData sceneDataBySceneName = config.scenesData.GetSceneDataBySceneName(SceneInfo.instance.sceneDef.baseSceneName);
		if (sceneDataBySceneName != null)
		{
			foreach (ObjectToSpawn objects in sceneDataBySceneName.objectsList.GetObjectsList())
			{
				SpawnCard val = Resources.Load<SpawnCard>(objects.objName);
				if (Object.op_Implicit((Object)(object)val))
				{
					DirectorCore.instance.TrySpawnObject(new DirectorSpawnRequest(val, new DirectorPlacementRule
					{
						placementMode = (PlacementMode)0,
						position = objects.position
					}, new Xoroshiro128Plus(0uL))).transform.rotation = objects.rotation;
				}
				else
				{
					Debug.LogWarning((object)("[DebuggingPlains] No spawn card with name " + objects.objName + " found! ignoring."));
				}
			}
			using (List<DummyToSpawn>.Enumerator enumerator2 = sceneDataBySceneName.dummyList.GetObjectsList().GetEnumerator())
			{
				if (NetworkServer.active)
				{
					while (enumerator2.MoveNext())
					{
						DummyToSpawn current2 = enumerator2.Current;
						GameObject val2 = MasterCatalog.FindMasterPrefab(current2.objName);
						GameObject bodyPrefab = val2.GetComponent<CharacterMaster>().bodyPrefab;
						if (Object.op_Implicit((Object)(object)val2) && Object.op_Implicit((Object)(object)bodyPrefab))
						{
							GameObject obj = Object.Instantiate<GameObject>(val2, current2.position, Quaternion.identity);
							CharacterMaster component = obj.GetComponent<CharacterMaster>();
							NetworkServer.Spawn(obj);
							component.bodyPrefab = bodyPrefab;
							component.SpawnBody(current2.position, current2.rotation);
							component.inventory.GiveItem(Items.BoostHp, 999999999);
							Object.Destroy((Object)(object)((Component)component).GetComponent<BaseAI>());
						}
						else
						{
							Debug.LogWarning((object)("[DebuggingPlains] No master prefab with name " + current2.objName + " found! ignoring."));
						}
					}
				}
			}
			using (List<DummyToSpawn>.Enumerator enumerator3 = sceneDataBySceneName.allyList.GetObjectsList().GetEnumerator())
			{
				if (NetworkServer.active)
				{
					while (enumerator3.MoveNext())
					{
						DummyToSpawn current3 = enumerator3.Current;
						GameObject val3 = MasterCatalog.FindMasterPrefab(current3.objName);
						GameObject bodyPrefab2 = val3.GetComponent<CharacterMaster>().bodyPrefab;
						if (Object.op_Implicit((Object)(object)val3) && Object.op_Implicit((Object)(object)bodyPrefab2))
						{
							GameObject val4 = Object.Instantiate<GameObject>(val3, current3.position, Quaternion.identity);
							CharacterMaster component2 = val4.GetComponent<CharacterMaster>();
							component2.teamIndex = (TeamIndex)1;
							NetworkServer.Spawn(val4);
							component2.bodyPrefab = bodyPrefab2;
							component2.SpawnBody(current3.position, current3.rotation).teamComponent.teamIndex = (TeamIndex)1;
							component2.inventory.GiveItem(Items.BoostHp, 999999999);
							Object.Destroy((Object)(object)((Component)component2).GetComponent<BaseAI>());
						}
						else
						{
							Debug.LogWarning((object)("[DebuggingPlains] No master prefab with name " + current3.objName + " found! ignoring."));
						}
					}
				}
			}
			foreach (PickupToSpawn objects2 in sceneDataBySceneName.pickupList.GetObjectsList())
			{
				PickupIndex val5 = PickupIndex.none;
				EquipmentIndex val6 = EquipmentCatalog.FindEquipmentIndex(objects2.objName);
				ItemIndex val7 = ItemCatalog.FindItemIndex(objects2.objName);
				if ((int)val6 != -1)
				{
					val5 = PickupCatalog.FindPickupIndex(val6);
				}
				if ((int)val7 != -1)
				{
					val5 = PickupCatalog.FindPickupIndex(val7);
				}
				PickupDropletController.CreatePickupDroplet(val5, objects2.position, new Vector3(0f, 5f, 0f));
			}
		}
		Debug.LogWarning((object)("[DebuggingPlains] no scene data for scene " + SceneInfo.instance.sceneDef.baseSceneName + " found!"));
	}

	private void Stage_RespawnCharacter(orig_RespawnCharacter orig, Stage self, CharacterMaster characterMaster)
	{
		//IL_0009: 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)
		//IL_000f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0014: Unknown result type (might be due to invalid IL or missing references)
		//IL_007f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0080: Unknown result type (might be due to invalid IL or missing references)
		//IL_006b: Unknown result type (might be due to invalid IL or missing references)
		//IL_00fa: Unknown result type (might be due to invalid IL or missing references)
		//IL_00fb: Unknown result type (might be due to invalid IL or missing references)
		//IL_009f: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a4: Unknown result type (might be due to invalid IL or missing references)
		//IL_0077: Unknown result type (might be due to invalid IL or missing references)
		//IL_0079: Unknown result type (might be due to invalid IL or missing references)
		//IL_007e: Unknown result type (might be due to invalid IL or missing references)
		//IL_011d: Unknown result type (might be due to invalid IL or missing references)
		//IL_011e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0072: Unknown result type (might be due to invalid IL or missing references)
		if (!Object.op_Implicit((Object)(object)characterMaster))
		{
			return;
		}
		Vector3 val = Vector3.zero;
		Quaternion val2 = Quaternion.identity;
		SceneData sceneDataBySceneName = config.scenesData.GetSceneDataBySceneName(self.sceneDef.baseSceneName);
		if (sceneDataBySceneName != null)
		{
			val = ((sceneDataBySceneName.playerSpawnPosition.x == 0f && sceneDataBySceneName.playerSpawnPosition.y == 0f && sceneDataBySceneName.playerSpawnPosition.z == 0f) ? Vector3.zero : sceneDataBySceneName.playerSpawnPosition);
			val2 = sceneDataBySceneName.playerSpawnRotation;
		}
		if (val == Vector3.zero)
		{
			Transform playerSpawnTransform = self.GetPlayerSpawnTransform();
			if (Object.op_Implicit((Object)(object)playerSpawnTransform))
			{
				val = playerSpawnTransform.position;
			}
		}
		GameObject val3 = BodyCatalog.FindBodyPrefab(config.CfgCharacter.Value);
		if (!Object.op_Implicit((Object)(object)val3))
		{
			Debug.LogWarning((object)("[DebuggingPlains] Body " + config.CfgCharacter.Value + " could not be found!"));
			val3 = BodyCatalog.FindBodyPrefab("CommandoBody");
		}
		characterMaster.bodyPrefab = val3;
		CharacterBody val4 = characterMaster.Respawn(val, val2, false);
		if (config.CfgSpawnWithDropPod.Value)
		{
			Run.instance.HandlePlayerFirstEntryAnimation(val4, val, val2);
		}
	}

	private void Run_PickNextStageScene(orig_PickNextStageScene orig, Run self, WeightedSelection<SceneDef> choices)
	{
		SceneDef sceneDefFromSceneName = SceneCatalog.GetSceneDefFromSceneName(config.CfgStartingStage.Value);
		if (!Object.op_Implicit((Object)(object)sceneDefFromSceneName))
		{
			Debug.LogWarning((object)("[DebuggingPlains] Scene " + config.CfgStartingStage.Value + " not found! going to debugging plains"));
			sceneDefFromSceneName = SceneCatalog.GetSceneDefFromSceneName("golemplains");
		}
		new List<string>();
		sceneDefFromSceneName.nameToken = "Debugging Plains";
		sceneDefFromSceneName.subtitleToken = "Ground 0011010010";
		self.nextStageScene = sceneDefFromSceneName;
	}

	private void PreGameRuleVoteController_UpdateGameVotes(orig_UpdateGameVotes orig)
	{
		orig.Invoke();
		string[] array = config.CfgArtifactsList.Value.Split(new char[1] { ',' });
		foreach (string text in array)
		{
			if (!(text == ""))
			{
				RuleChoiceDef val = RuleCatalog.FindChoiceDef("Artifacts." + text + ".On");
				if (val != null)
				{
					PreGameController.instance.ApplyChoice(val.globalIndex);
				}
				else
				{
					Debug.Log((object)("[DebuggingPlains] Could not find Artifact " + text + "! ignoring"));
				}
			}
		}
		RuleChoiceDef val2 = RuleCatalog.FindChoiceDef("Difficulty." + config.CfgDifficulty.Value);
		if (val2 != null)
		{
			PreGameController.instance.ApplyChoice(val2.globalIndex);
		}
		else
		{
			Debug.LogWarning((object)("[DebuggingPlains] could not find Difficulty " + config.CfgDifficulty.Value + "! ignoring"));
		}
	}

	private void PreGameRuleVoteController_ServerHandleClientVoteUpdate(orig_ServerHandleClientVoteUpdate orig, NetworkMessage netMsg)
	{
		orig.Invoke(netMsg);
		foreach (NetworkUser readOnlyLocalPlayers in NetworkUser.readOnlyLocalPlayersList)
		{
			if (Object.op_Implicit((Object)(object)readOnlyLocalPlayers))
			{
				readOnlyLocalPlayers.CallCmdSubmitVote(((Component)PreGameController.instance).gameObject, 0);
			}
			else
			{
				Debug.Log((object)"[DebuggingPlains] Null network user in readonly local player list!");
			}
		}
	}
}
internal class DPConfig
{
	private readonly ConfigFile config;

	public ConfigEntry<bool> CfgEnabled { get; set; }

	public ConfigEntry<string> CfgScenesConfigPath { get; set; }

	public ConfigEntry<bool> CfgSkipLobbyScreen { get; set; }

	public ConfigEntry<bool> CfgDisableTPZones { get; set; }

	public ConfigEntry<string> CfgInitCmds { get; set; }

	public ConfigEntry<string> CfgCharacter { get; set; }

	public ConfigEntry<bool> CfgSpawnWithDropPod { get; set; }

	public ConfigEntry<string> CfgArtifactsList { get; set; }

	public ConfigEntry<string> CfgDifficulty { get; set; }

	public ConfigEntry<string> CfgStartingStage { get; set; }

	public ConfigEntry<bool> CfgFreezeTimer { get; set; }

	public ScenesData scenesData { get; set; }

	public ConfigEntry<bool> CfgEnableTexts { get; set; }

	public ConfigEntry<bool> CfgEnableMenuSkip { get; set; }

	public ConfigEntry<Vector2> CfgTextsPosition { get; set; }

	public ConfigEntry<float> CfgTextsSize { get; set; }

	public DPConfig(ConfigFile config)
	{
		//IL_0016: Unknown result type (might be due to invalid IL or missing references)
		//IL_001d: Expected O, but got Unknown
		config = new ConfigFile(Paths.ConfigPath + "\\DebuggingPlains\\BaseConfig.cfg", true);
		this.config = config;
		InitConfig();
		LoadScenesDataFromJson();
	}

	private void InitConfig()
	{
		//IL_01e0: Unknown result type (might be due to invalid IL or missing references)
		CfgEnabled = config.Bind<bool>("mod_config", "enabled", true, "change to false if you want to disable the mod hooks and run the classic game");
		CfgScenesConfigPath = config.Bind<string>("mod_config", "scenes_config_path", "scenesConfig.json", "path to the scenes config file containing a json with all the scenes data (if it does not exists, it is created automatically)");
		CfgEnableMenuSkip = config.Bind<bool>("mod_config", "skip_menu", true, "skip main menu screen");
		CfgSkipLobbyScreen = config.Bind<bool>("mod_config", "skip_lobby", true, "skip the character selection screen and head straight to the run");
		CfgDisableTPZones = config.Bind<bool>("mod_config", "disable_tp", true, "disable teleport out of bounds zones");
		CfgInitCmds = config.Bind<string>("run_config", "initial_cmds", "no_enemies; kill_all 2; give_money 999;", "Commands to run at the beginning of the run (must be ConCommands concatenated with ';' as a seperator)");
		CfgCharacter = config.Bind<string>("run_config", "character_body", "CommandoBody", "selected character body to spawn (Must be the bodyprefab name). Works with any bodyprefab, even monsters.");
		CfgSpawnWithDropPod = config.Bind<bool>("run_config", "drop_pod", false, "spawn from a falling drop pod or simply appearing on the map");
		CfgArtifactsList = config.Bind<string>("run_config", "artifacts", "Command", "Artifacts to activate (must be the artifact asset names concatenated with ',' as a seperator) ");
		CfgDifficulty = config.Bind<string>("run_config", "difficulty", "Normal", "Desired difficulty (Easy, Normal, Hard or any other difficulty you got)");
		CfgStartingStage = config.Bind<string>("run_config", "starting_stage", "golemplains", "Starting stage");
		CfgFreezeTimer = config.Bind<bool>("run_config", "freeze_timer", true, "freeze the timer");
		CfgEnableTexts = config.Bind<bool>("run_config", "character_vector_info", true, "Enable character vector informations (Location, Direction and Velocity).");
		CfgTextsPosition = config.Bind<Vector2>("run_config", "character_vector_info_text_position", new Vector2(800f, -300f), "Vector infos text position on screen.");
		CfgTextsSize = config.Bind<float>("run_config", "character_vector_info_text_font_size", 20f, "Vector infos text font size.");
	}

	private void LoadScenesDataFromJson()
	{
		string path = Path.Combine(Path.GetDirectoryName(config.ConfigFilePath), CfgScenesConfigPath.Value);
		string text = "";
		bool flag = true;
		bool flag2 = true;
		if (File.Exists(path))
		{
			text = File.ReadAllText(path);
			try
			{
				JSONNode.Parse(text);
			}
			catch
			{
				Debug.LogWarning((object)"[DebuggingPlains] scene config file malformed! using defaults");
				flag = false;
			}
		}
		else
		{
			Debug.LogWarning((object)"[DebuggingPlains] scene config file not found! using defaults");
			flag = false;
			flag2 = false;
		}
		if (!flag)
		{
			using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("DebuggingPlains.sampleJson.json"))
			{
				text = new StreamReader(stream).ReadToEnd();
			}
			if (!flag2)
			{
				File.WriteAllText(path, text);
			}
		}
		scenesData = new ScenesData(JSONNode.Parse(text));
	}
}
public class PickupLocations
{
	private List<PickupToSpawn> pickupList;

	public PickupLocations(List<PickupToSpawn> objectsList)
	{
		pickupList = objectsList;
	}

	public PickupLocations()
	{
		pickupList = new List<PickupToSpawn>();
	}

	public List<PickupToSpawn> GetObjectsList()
	{
		return pickupList;
	}

	public void SetObjectsList(List<PickupToSpawn> objectsList)
	{
		pickupList = objectsList;
	}

	public void Add(string objName, Vector3 position)
	{
		//IL_0007: Unknown result type (might be due to invalid IL or missing references)
		pickupList.Add(new PickupToSpawn(objName, position));
	}

	public void Add(PickupToSpawn objectToSpawn)
	{
		pickupList.Add(objectToSpawn);
	}
}
public class AllyLocations : DummyLocations
{
}
public class DummyLocations
{
	private List<DummyToSpawn> dummyList;

	public DummyLocations(List<DummyToSpawn> objectsList)
	{
		dummyList = objectsList;
	}

	public DummyLocations()
	{
		dummyList = new List<DummyToSpawn>();
	}

	public List<DummyToSpawn> GetObjectsList()
	{
		return dummyList;
	}

	public void SetObjectsList(List<DummyToSpawn> objectsList)
	{
		dummyList = objectsList;
	}

	public void Add(string objName, Vector3 position, Quaternion rotation)
	{
		//IL_0007: Unknown result type (might be due to invalid IL or missing references)
		//IL_0008: Unknown result type (might be due to invalid IL or missing references)
		dummyList.Add(new DummyToSpawn(objName, position, rotation));
	}

	public void Add(DummyToSpawn objectToSpawn)
	{
		dummyList.Add(objectToSpawn);
	}
}
public class ObjectsLocations
{
	private List<ObjectToSpawn> objectsList;

	public ObjectsLocations(List<ObjectToSpawn> objectsList)
	{
		this.objectsList = objectsList;
	}

	public ObjectsLocations()
	{
		objectsList = new List<ObjectToSpawn>();
	}

	public List<ObjectToSpawn> GetObjectsList()
	{
		return objectsList;
	}

	public void SetObjectsList(List<ObjectToSpawn> objectsList)
	{
		this.objectsList = objectsList;
	}

	public void Add(string objName, Vector3 position, Quaternion rotation)
	{
		//IL_0007: Unknown result type (might be due to invalid IL or missing references)
		//IL_0008: Unknown result type (might be due to invalid IL or missing references)
		objectsList.Add(new ObjectToSpawn(objName, position, rotation));
	}

	public void Add(ObjectToSpawn objectToSpawn)
	{
		objectsList.Add(objectToSpawn);
	}
}
public class PickupToSpawn
{
	public string objName;

	public Vector3 position;

	public PickupToSpawn(string objName, Vector3 position)
	{
		//IL_000e: Unknown result type (might be due to invalid IL or missing references)
		//IL_000f: Unknown result type (might be due to invalid IL or missing references)
		this.objName = objName;
		this.position = position;
	}
}
public class DummyToSpawn
{
	public string objName;

	public Vector3 position;

	public Quaternion rotation;

	public DummyToSpawn(string objName, Vector3 position, Quaternion rotation)
	{
		//IL_000e: Unknown result type (might be due to invalid IL or missing references)
		//IL_000f: 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)
		this.objName = objName;
		this.position = position;
		this.rotation = rotation;
	}
}
public class ObjectToSpawn
{
	public string objName;

	public Vector3 position;

	public Quaternion rotation;

	public ObjectToSpawn(string objName, Vector3 position, Quaternion rotation)
	{
		//IL_000e: Unknown result type (might be due to invalid IL or missing references)
		//IL_000f: 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)
		this.objName = objName;
		this.position = position;
		this.rotation = rotation;
	}
}
public class SceneData
{
	public string sceneName;

	public Vector3 playerSpawnPosition;

	public Quaternion playerSpawnRotation;

	public ObjectsLocations objectsList;

	public DummyLocations dummyList;

	public PickupLocations pickupList;

	public AllyLocations allyList;

	public SceneData(string sceneName, Vector3 playerSpawnPosition, Quaternion playerSpawnRotation, ObjectsLocations objectsList, DummyLocations dummyList, PickupLocations pickupList, AllyLocations allyList)
	{
		//IL_000e: Unknown result type (might be due to invalid IL or missing references)
		//IL_000f: 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)
		this.sceneName = sceneName;
		this.playerSpawnPosition = playerSpawnPosition;
		this.playerSpawnRotation = playerSpawnRotation;
		this.objectsList = objectsList;
		this.dummyList = dummyList;
		this.pickupList = pickupList;
		this.allyList = allyList;
	}

	public SceneData()
	{
	}
}
public class ScenesData
{
	private List<SceneData> scenesDataList = new List<SceneData>();

	public SceneData GetSceneDataBySceneName(string sceneName)
	{
		foreach (SceneData scenesData in scenesDataList)
		{
			if (scenesData.sceneName == sceneName)
			{
				return scenesData;
			}
		}
		return null;
	}

	public void AddSceneData(SceneData scene)
	{
		scenesDataList.Add(scene);
	}

	public ScenesData()
	{
	}

	public ScenesData(JSONNode jsonBuffer)
	{
		//IL_0032: Unknown result type (might be due to invalid IL or missing references)
		//IL_0038: Expected O, but got Unknown
		//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
		//IL_0116: Unknown result type (might be due to invalid IL or missing references)
		//IL_011b: Unknown result type (might be due to invalid IL or missing references)
		//IL_016d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0174: Expected O, but got Unknown
		//IL_01dc: Unknown result type (might be due to invalid IL or missing references)
		//IL_0232: Unknown result type (might be due to invalid IL or missing references)
		//IL_027e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0285: Expected O, but got Unknown
		//IL_02ed: Unknown result type (might be due to invalid IL or missing references)
		//IL_0343: Unknown result type (might be due to invalid IL or missing references)
		//IL_038c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0393: Expected O, but got Unknown
		//IL_03fb: Unknown result type (might be due to invalid IL or missing references)
		//IL_0447: Unknown result type (might be due to invalid IL or missing references)
		//IL_044e: Expected O, but got Unknown
		//IL_04b6: Unknown result type (might be due to invalid IL or missing references)
		//IL_050c: Unknown result type (might be due to invalid IL or missing references)
		foreach (JSONNode item in jsonBuffer["scenesData"].AsArray)
		{
			JSONNode val = item;
			SceneData sceneData = new SceneData
			{
				sceneName = JSONNode.op_Implicit(val["sceneName"]),
				playerSpawnPosition = new Vector3(val["playerSpawnPosition"]["x"].AsFloat, val["playerSpawnPosition"]["y"].AsFloat, val["playerSpawnPosition"]["z"].AsFloat),
				playerSpawnRotation = new Quaternion(val["playerSpawnPosition"]["x"].AsFloat, val["playerSpawnPosition"]["y"].AsFloat, val["playerSpawnPosition"]["z"].AsFloat, val["playerSpawnPosition"]["w"].AsFloat),
				objectsList = new ObjectsLocations(),
				dummyList = new DummyLocations(),
				pickupList = new PickupLocations(),
				allyList = new AllyLocations()
			};
			foreach (JSONNode item2 in val["objectsLocations"].AsArray)
			{
				JSONNode val2 = item2;
				sceneData.objectsList.Add(JSONNode.op_Implicit(val2["objName"]), new Vector3(val2["position"]["x"].AsFloat, val2["position"]["y"].AsFloat, val2["position"]["z"].AsFloat), Quaternion.Euler(val2["rotation"]["x"].AsFloat, val2["rotation"]["y"].AsFloat, val2["rotation"]["z"].AsFloat));
			}
			foreach (JSONNode item3 in val["dummyLocations"].AsArray)
			{
				JSONNode val3 = item3;
				sceneData.dummyList.Add(JSONNode.op_Implicit(val3["objName"]), new Vector3(val3["position"]["x"].AsFloat, val3["position"]["y"].AsFloat, val3["position"]["z"].AsFloat), Quaternion.Euler(val3["rotation"]["x"].AsFloat, val3["rotation"]["y"].AsFloat, val3["rotation"]["z"].AsFloat));
			}
			foreach (JSONNode item4 in val["pickupLocations"].AsArray)
			{
				JSONNode val4 = item4;
				sceneData.pickupList.Add(JSONNode.op_Implicit(val4["objName"]), new Vector3(val4["position"]["x"].AsFloat, val4["position"]["y"].AsFloat, val4["position"]["z"].AsFloat));
			}
			foreach (JSONNode item5 in val["allyLocations"].AsArray)
			{
				JSONNode val5 = item5;
				sceneData.allyList.Add(JSONNode.op_Implicit(val5["objName"]), new Vector3(val5["position"]["x"].AsFloat, val5["position"]["y"].AsFloat, val5["position"]["z"].AsFloat), Quaternion.Euler(val5["rotation"]["x"].AsFloat, val5["rotation"]["y"].AsFloat, val5["rotation"]["z"].AsFloat));
			}
			scenesDataList.Add(sceneData);
		}
	}
}
internal class Utils
{
	public static void DisableMapZones()
	{
		MapZone[] array = Object.FindObjectsOfType<MapZone>();
		for (int i = 0; i < array.Length; i++)
		{
			((Component)array[i]).gameObject.SetActive(false);
		}
	}
}
internal class VectorDataBehaviour : MonoBehaviour
{
	private HUD hud;

	private CharacterBody body;

	private RigidbodyDirection rigidDirection;

	public TextMeshProUGUI location;

	public TextMeshProUGUI direction;

	public TextMeshProUGUI velocity;

	private void Awake()
	{
		hud = ((Component)this).GetComponent<HUD>();
	}

	private void Update()
	{
		//IL_007b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0080: Unknown result type (might be due to invalid IL or missing references)
		//IL_0120: Unknown result type (might be due to invalid IL or missing references)
		//IL_014c: Unknown result type (might be due to invalid IL or missing references)
		//IL_013f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0151: Unknown result type (might be due to invalid IL or missing references)
		//IL_01fe: Unknown result type (might be due to invalid IL or missing references)
		//IL_01ec: Unknown result type (might be due to invalid IL or missing references)
		//IL_0203: Unknown result type (might be due to invalid IL or missing references)
		if (!Object.op_Implicit((Object)(object)body) && Object.op_Implicit((Object)(object)hud.targetBodyObject))
		{
			body = hud.targetBodyObject.GetComponent<CharacterBody>();
		}
		if (Object.op_Implicit((Object)(object)body) && Object.op_Implicit((Object)(object)location) && Object.op_Implicit((Object)(object)direction) && Object.op_Implicit((Object)(object)velocity))
		{
			Vector3 footPosition = body.footPosition;
			((TMP_Text)location).text = "Position:" + Environment.NewLine + "X: " + footPosition.x + Environment.NewLine + "Y: " + footPosition.y + Environment.NewLine + "Z: " + footPosition.z;
			Vector3 val = ((!Object.op_Implicit((Object)(object)body.characterDirection)) ? ((Component)body).gameObject.transform.forward : (Object.op_Implicit((Object)(object)rigidDirection) ? rigidDirection.aimDirection : body.characterDirection.forward));
			((TMP_Text)direction).text = "Direction:" + Environment.NewLine + "X: " + val.x + Environment.NewLine + "Y: " + val.y + Environment.NewLine + "Z: " + val.z;
			Vector3 val2 = (Object.op_Implicit((Object)(object)body.characterMotor) ? body.characterMotor.velocity : body.rigidbody.velocity);
			((TMP_Text)velocity).text = "Velocity:" + Environment.NewLine + "X: " + val2.x + Environment.NewLine + "Y: " + val2.y + Environment.NewLine + "Z: " + val2.z;
		}
	}
}