Decompiled source of RoomInfoOverlay v1.0.0

RoomInfoOverlay.dll

Decompiled 2 months ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using System.Text;
using BepInEx;
using BepInEx.Configuration;
using Microsoft.CodeAnalysis;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: IgnoresAccessChecksTo("")]
[assembly: AssemblyCompany("zabu")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("zabumod")]
[assembly: AssemblyTitle("zabumod")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableAttribute : Attribute
	{
		public readonly byte[] NullableFlags;

		public NullableAttribute(byte P_0)
		{
			NullableFlags = new byte[1] { P_0 };
		}

		public NullableAttribute(byte[] P_0)
		{
			NullableFlags = P_0;
		}
	}
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableContextAttribute : Attribute
	{
		public readonly byte Flag;

		public NullableContextAttribute(byte P_0)
		{
			Flag = P_0;
		}
	}
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.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("REPOJP.RoomInfoOverlay", "RoomInfoOverlay", "1.0.0")]
public sealed class RoomInfoOverlayPlugin : BaseUnityPlugin
{
	private enum OverlayAnchor
	{
		TopLeft,
		TopRight,
		BottomLeft,
		BottomRight,
		Center,
		CenterTop
	}

	private enum SectionKind
	{
		Module,
		Room,
		Player,
		Inventory,
		EconomyRun,
		GameDirector,
		ShopManager,
		ExtractionCart,
		Photon,
		Environment,
		Map,
		Details,
		Debug,
		Deep_PlayerDump,
		Deep_InventoryDump,
		Deep_GameDirectorDump,
		Deep_ShopManagerDump,
		Deep_ExtractionCartDump,
		Deep_PhotonDump,
		Deep_EconomyScan,
		Deep_EconomyDump
	}

	private struct PhotonSnapshot
	{
		public bool Available;

		public bool InRoom;

		public bool IsMasterClient;

		public string RoomName;

		public int PlayerCount;

		public int LocalActorNumber;

		public object CurrentRoomObj;

		public object LocalPlayerObj;
	}

	private sealed class ReferenceEqualityComparer : IEqualityComparer<object>
	{
		public static readonly ReferenceEqualityComparer Instance = new ReferenceEqualityComparer();

		public new bool Equals(object x, object y)
		{
			return x == y;
		}

		public int GetHashCode(object obj)
		{
			return RuntimeHelpers.GetHashCode(obj);
		}
	}

	public const string PluginGuid = "REPOJP.RoomInfoOverlay";

	public const string PluginName = "RoomInfoOverlay";

	public const string PluginVersion = "1.0.0";

	private ConfigEntry<bool> CfgEnableMod;

	private ConfigEntry<float> CfgUpdateIntervalSeconds;

	private ConfigEntry<bool> CfgShowSectionHeaders;

	private ConfigEntry<int> CfgSectionsPerTick;

	private ConfigEntry<OverlayAnchor> CfgAnchor;

	private ConfigEntry<int> CfgOffsetX;

	private ConfigEntry<int> CfgOffsetY;

	private ConfigEntry<int> CfgFontSize;

	private ConfigEntry<int> CfgLineSpacing;

	private ConfigEntry<int> CfgPaddingX;

	private ConfigEntry<int> CfgPaddingY;

	private ConfigEntry<float> CfgBackgroundAlpha;

	private ConfigEntry<float> CfgTextColorR;

	private ConfigEntry<float> CfgTextColorG;

	private ConfigEntry<float> CfgTextColorB;

	private ConfigEntry<float> CfgTextColorA;

	private ConfigEntry<float> CfgBackgroundColorR;

	private ConfigEntry<float> CfgBackgroundColorG;

	private ConfigEntry<float> CfgBackgroundColorB;

	private ConfigEntry<int> CfgMaxListEntries;

	private ConfigEntry<bool> CfgSortDictionaries;

	private ConfigEntry<bool> CfgShowModuleName;

	private ConfigEntry<bool> CfgShowModuleType;

	private ConfigEntry<bool> CfgShowModuleGrid;

	private ConfigEntry<bool> CfgShowModuleConnections;

	private ConfigEntry<bool> CfgShowModuleStateFlags;

	private ConfigEntry<bool> CfgShowRoomName;

	private ConfigEntry<bool> CfgShowRoomFlags;

	private ConfigEntry<bool> CfgShowCurrentRoomsCount;

	private ConfigEntry<bool> CfgShowOverlappedRoomsList;

	private ConfigEntry<bool> CfgShowPlayerName;

	private ConfigEntry<bool> CfgShowPlayerSteamId;

	private ConfigEntry<bool> CfgShowPlayerPosition;

	private ConfigEntry<bool> CfgShowPlayerRotation;

	private ConfigEntry<bool> CfgShowPlayerForward;

	private ConfigEntry<bool> CfgShowPlayerVelocity;

	private ConfigEntry<bool> CfgShowPlayerStateFlags;

	private ConfigEntry<bool> CfgShowPlayerDeepInternals;

	private ConfigEntry<bool> CfgShowPlayerHealthSummary;

	private ConfigEntry<bool> CfgShowPlayerHealthDeepInternals;

	private ConfigEntry<bool> CfgShowPlayerViewInfo;

	private ConfigEntry<bool> CfgShowPlayerDeepDump;

	private ConfigEntry<bool> CfgShowInventory;

	private ConfigEntry<bool> CfgShowInventoryDeepDump;

	private ConfigEntry<bool> CfgShowInventoryHeader;

	private ConfigEntry<bool> CfgShowInventorySpotsCount;

	private ConfigEntry<bool> CfgShowInventorySpotEntries;

	private ConfigEntry<bool> CfgShowInventorySpotIndex;

	private ConfigEntry<bool> CfgShowInventorySpotCurrentItem;

	private ConfigEntry<bool> CfgShowRunStatsCurrency;

	private ConfigEntry<bool> CfgShowRunStatsCore;

	private ConfigEntry<bool> CfgShowRunStatsAll;

	private ConfigEntry<bool> CfgShowItemsPurchasedAll;

	private ConfigEntry<bool> CfgShowItemsUpgradesPurchasedAll;

	private ConfigEntry<bool> CfgShowRunManagerCore;

	private ConfigEntry<bool> CfgShowRunManagerDeepInternals;

	private ConfigEntry<bool> CfgShowRunManagerLevelCurrent;

	private ConfigEntry<bool> CfgShowRunManagerLevelsCompleted;

	private ConfigEntry<bool> CfgShowRunManagerLoadLevel;

	private ConfigEntry<bool> CfgShowRunManagerSaveLevel;

	private ConfigEntry<bool> CfgShowRunManagerRunStarted;

	private ConfigEntry<bool> CfgShowRunManagerRunLives;

	private ConfigEntry<bool> CfgShowRunManagerLevelFailed;

	private ConfigEntry<bool> CfgShowRunManagerRestarting;

	private ConfigEntry<bool> CfgShowRunManagerRestartingDone;

	private ConfigEntry<bool> CfgShowRunManagerLevelsMax;

	private ConfigEntry<bool> CfgShowGameDirector;

	private ConfigEntry<bool> CfgShowGameDirectorDeepDump;

	private ConfigEntry<bool> CfgShowGameDirectorHeader;

	private ConfigEntry<bool> CfgShowGameDirectorState;

	private ConfigEntry<bool> CfgShowGameDirectorTimeScale;

	private ConfigEntry<bool> CfgShowGameDirectorSeed;

	private ConfigEntry<bool> CfgShowShopManager;

	private ConfigEntry<bool> CfgShowShopManagerDeepDump;

	private ConfigEntry<bool> CfgShowShopManagerHeader;

	private ConfigEntry<bool> CfgShowShopManagerTotalCost;

	private ConfigEntry<bool> CfgShowShopManagerTotalCurrency;

	private ConfigEntry<bool> CfgShowShopManagerIsThief;

	private ConfigEntry<bool> CfgShowShopManagerShoppingListCount;

	private ConfigEntry<bool> CfgShowExtractionNearest;

	private ConfigEntry<bool> CfgShowCartNearest;

	private ConfigEntry<bool> CfgShowExtractionCartDeepDump;

	private ConfigEntry<bool> CfgShowExtractionHeader;

	private ConfigEntry<bool> CfgShowExtractionPosDist;

	private ConfigEntry<bool> CfgShowExtractionHaulGoal;

	private ConfigEntry<bool> CfgShowExtractionState;

	private ConfigEntry<bool> CfgShowCartHeader;

	private ConfigEntry<bool> CfgShowCartPosDist;

	private ConfigEntry<bool> CfgShowCartState;

	private ConfigEntry<bool> CfgShowCartHaulCurrent;

	private ConfigEntry<bool> CfgShowCartItemsInCartCount;

	private ConfigEntry<bool> CfgShowPhotonNetwork;

	private ConfigEntry<bool> CfgShowPhotonDeepDump;

	private ConfigEntry<bool> CfgShowPhotonHeader;

	private ConfigEntry<bool> CfgShowPhotonInRoom;

	private ConfigEntry<bool> CfgShowPhotonIsMasterClient;

	private ConfigEntry<bool> CfgShowPhotonRoomName;

	private ConfigEntry<bool> CfgShowPhotonPlayerCount;

	private ConfigEntry<bool> CfgShowPhotonLocalActorNumber;

	private ConfigEntry<bool> CfgShowRoomColor;

	private ConfigEntry<bool> CfgShowReverbPresetName;

	private ConfigEntry<bool> CfgShowRoomAmbienceVolume;

	private ConfigEntry<bool> CfgShowRoomAmbienceOverrideSummary;

	private ConfigEntry<bool> CfgShowMapModuleName;

	private ConfigEntry<bool> CfgShowMapModuleLinkedModuleName;

	private ConfigEntry<bool> CfgShowTransformPosition;

	private ConfigEntry<bool> CfgShowTransformRotationY;

	private ConfigEntry<bool> CfgShowColliderCounts;

	private ConfigEntry<bool> CfgShowRoomVolumeCheckFlags;

	private ConfigEntry<bool> CfgShowRoomVolumeCheckBox;

	private ConfigEntry<bool> CfgShowEconomyScan;

	private ConfigEntry<bool> CfgShowEconomyDeepDump;

	private ConfigEntry<int> CfgDeepDumpMaxDepth;

	private ConfigEntry<int> CfgDeepDumpMaxMembersPerObject;

	private ConfigEntry<bool> CfgDeepDumpIncludePrivate;

	private ConfigEntry<bool> CfgDeepDumpIncludeFields;

	private ConfigEntry<bool> CfgDeepDumpIncludeProperties;

	private ConfigEntry<int> CfgDeepDumpMaxStringLength;

	private ConfigEntry<string> CfgEconomyKeywords;

	private ConfigEntry<int> CfgEconomyMaxTypes;

	private static FieldInfo FiModuleConnectingTop;

	private static FieldInfo FiModuleConnectingRight;

	private static FieldInfo FiModuleConnectingBottom;

	private static FieldInfo FiModuleConnectingLeft;

	private static FieldInfo FiModuleSetupDone;

	private static FieldInfo FiModuleFirst;

	private static FieldInfo FiModuleGridX;

	private static FieldInfo FiModuleGridY;

	private static FieldInfo FiModuleStartRoom;

	private static FieldInfo FiRvcInTruck;

	private static FieldInfo FiRvcInExtractionPoint;

	private static FieldInfo FiPaRb;

	private static FieldInfo FiPaIsLocal;

	private static FieldInfo FiPaIsDisabled;

	private static FieldInfo FiPaSpawned;

	private static FieldInfo FiPaIsCrouching;

	private static FieldInfo FiPaIsSprinting;

	private static FieldInfo FiPaIsCrawling;

	private static FieldInfo FiPaIsSliding;

	private static FieldInfo FiPaIsMoving;

	private static FieldInfo FiPaIsGrounded;

	private static FieldInfo FiPaIsTumbling;

	private static FieldInfo FiPaSpectating;

	private static FieldInfo FiPaClientPositionDelta;

	private static FieldInfo FiPaEnemyVisionFreezeTimer;

	private static FieldInfo FiPhHealth;

	private static FieldInfo FiPhMaxHealth;

	private static FieldInfo FiPhGodMode;

	private static FieldInfo FiPhInvincibleTimer;

	private static FieldInfo FiRmLoadLevel;

	private static FieldInfo FiRmSaveLevel;

	private static FieldInfo FiRmRunStarted;

	private static FieldInfo FiRmRunLives;

	private static FieldInfo FiRmLevelFailed;

	private static FieldInfo FiRmRestarting;

	private static FieldInfo FiRmRestartingDone;

	private static FieldInfo FiRmLevelsMax;

	private GUIStyle _labelStyle;

	private GUIStyle _boxStyle;

	private int _lastStyleKey;

	private readonly Dictionary<SectionKind, string> _sectionCache = new Dictionary<SectionKind, string>();

	private readonly List<SectionKind> _activeOrder = new List<SectionKind>(64);

	private int _activeHash;

	private int _rrIndex;

	private string _snapshotText = "Loading...";

	private float _nextUpdateTime;

	private int _measureKey;

	private float _cachedPanelWidth;

	private float _cachedPanelHeight;

	private void Awake()
	{
		BindConfig();
		CacheReflection();
		_nextUpdateTime = 0f;
	}

	private void Update()
	{
		if (!CfgEnableMod.Value || Time.unscaledTime < _nextUpdateTime)
		{
			return;
		}
		float num = Mathf.Max(0.05f, CfgUpdateIntervalSeconds.Value);
		_nextUpdateTime = Time.unscaledTime + num;
		RebuildActiveOrderIfNeeded();
		int num2 = Mathf.Clamp(CfgSectionsPerTick.Value, 1, 64);
		for (int i = 0; i < num2; i++)
		{
			if (_activeOrder.Count == 0)
			{
				break;
			}
			if (_rrIndex >= _activeOrder.Count)
			{
				_rrIndex = 0;
			}
			SectionKind kind = _activeOrder[_rrIndex];
			_rrIndex++;
			UpdateOneSection(kind);
		}
		RebuildSnapshotText();
		InvalidateMeasureCache();
	}

	private void OnGUI()
	{
		//IL_0041: Unknown result type (might be due to invalid IL or missing references)
		//IL_0046: Unknown result type (might be due to invalid IL or missing references)
		//IL_008e: 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_0095: Unknown result type (might be due to invalid IL or missing references)
		//IL_009d: Unknown result type (might be due to invalid IL or missing references)
		//IL_00af: Unknown result type (might be due to invalid IL or missing references)
		//IL_0112: Unknown result type (might be due to invalid IL or missing references)
		if (CfgEnableMod.Value)
		{
			EnsureGuiStyles();
			string text = _snapshotText ?? string.Empty;
			MeasurePanel(text, out var width, out var height);
			Rect anchoredRect = GetAnchoredRect(width, height);
			Color color = default(Color);
			((Color)(ref color))..ctor(Mathf.Clamp01(CfgBackgroundColorR.Value), Mathf.Clamp01(CfgBackgroundColorG.Value), Mathf.Clamp01(CfgBackgroundColorB.Value), Mathf.Clamp01(CfgBackgroundAlpha.Value));
			Color color2 = GUI.color;
			GUI.color = color;
			GUI.Box(anchoredRect, GUIContent.none, _boxStyle);
			GUI.color = color2;
			Rect val = default(Rect);
			((Rect)(ref val))..ctor(((Rect)(ref anchoredRect)).x + (float)CfgPaddingX.Value, ((Rect)(ref anchoredRect)).y + (float)CfgPaddingY.Value, ((Rect)(ref anchoredRect)).width - (float)(CfgPaddingX.Value * 2), ((Rect)(ref anchoredRect)).height - (float)(CfgPaddingY.Value * 2));
			GUI.Label(val, text, _labelStyle);
		}
	}

	private void BindConfig()
	{
		CfgEnableMod = ((BaseUnityPlugin)this).Config.Bind<bool>("A General", "EnableMod", true, "Enable or disable this mod.このMODの有効無効");
		CfgUpdateIntervalSeconds = ((BaseUnityPlugin)this).Config.Bind<float>("A General", "UpdateIntervalSeconds", 0.5f, "Update interval seconds for rebuilding text.表示文字列再生成の更新間隔秒");
		CfgShowSectionHeaders = ((BaseUnityPlugin)this).Config.Bind<bool>("A General", "ShowSectionHeaders", true, "Show section headers like Module/Room.セクション見出し表示");
		CfgSectionsPerTick = ((BaseUnityPlugin)this).Config.Bind<int>("A General", "SectionsPerTick", 2, "How many sections to refresh per update tick.1回の更新で更新するセクション数");
		CfgAnchor = ((BaseUnityPlugin)this).Config.Bind<OverlayAnchor>("B Appearance", "Anchor", OverlayAnchor.CenterTop, "Anchor position for overlay.表示の基準位置");
		CfgOffsetX = ((BaseUnityPlugin)this).Config.Bind<int>("B Appearance", "OffsetX", 0, "X offset from anchor in pixels.アンカーからのXオフセットpx");
		CfgOffsetY = ((BaseUnityPlugin)this).Config.Bind<int>("B Appearance", "OffsetY", 20, "Y offset from anchor in pixels.アンカーからのYオフセットpx");
		CfgFontSize = ((BaseUnityPlugin)this).Config.Bind<int>("B Appearance", "FontSize", 16, "Font size of overlay text.文字サイズ");
		CfgLineSpacing = ((BaseUnityPlugin)this).Config.Bind<int>("B Appearance", "LineSpacing", 2, "Extra spacing between lines in pixels.行間追加px");
		CfgPaddingX = ((BaseUnityPlugin)this).Config.Bind<int>("B Appearance", "PaddingX", 8, "Horizontal padding inside background in pixels.背景内余白Xpx");
		CfgPaddingY = ((BaseUnityPlugin)this).Config.Bind<int>("B Appearance", "PaddingY", 6, "Vertical padding inside background in pixels.背景内余白Ypx");
		CfgBackgroundAlpha = ((BaseUnityPlugin)this).Config.Bind<float>("B Appearance", "BackgroundAlpha", 0.35f, "Background alpha 0-1.背景透明度0-1");
		CfgTextColorR = ((BaseUnityPlugin)this).Config.Bind<float>("B Appearance", "TextColorR", 1f, "Text color R 0-1.文字色R0-1");
		CfgTextColorG = ((BaseUnityPlugin)this).Config.Bind<float>("B Appearance", "TextColorG", 1f, "Text color G 0-1.文字色G0-1");
		CfgTextColorB = ((BaseUnityPlugin)this).Config.Bind<float>("B Appearance", "TextColorB", 1f, "Text color B 0-1.文字色B0-1");
		CfgTextColorA = ((BaseUnityPlugin)this).Config.Bind<float>("B Appearance", "TextColorA", 1f, "Text color A 0-1.文字色A0-1");
		CfgBackgroundColorR = ((BaseUnityPlugin)this).Config.Bind<float>("B Appearance", "BackgroundColorR", 0f, "Background color R 0-1.背景色R0-1");
		CfgBackgroundColorG = ((BaseUnityPlugin)this).Config.Bind<float>("B Appearance", "BackgroundColorG", 0f, "Background color G 0-1.背景色G0-1");
		CfgBackgroundColorB = ((BaseUnityPlugin)this).Config.Bind<float>("B Appearance", "BackgroundColorB", 0f, "Background color B 0-1.背景色B0-1");
		CfgMaxListEntries = ((BaseUnityPlugin)this).Config.Bind<int>("B2 Deep", "MaxListEntries", 60, "Max entries for dictionaries/lists.辞書/リスト表示の最大件数");
		CfgSortDictionaries = ((BaseUnityPlugin)this).Config.Bind<bool>("B2 Deep", "SortDictionaries", true, "Sort dictionary keys before printing.辞書キーソート有無");
		CfgShowModuleName = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowModuleName", true, "Show Module name.所属Module名表示");
		CfgShowModuleType = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowModuleType", false, "Show Module type if available.所属Module種別表示");
		CfgShowModuleGrid = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowModuleGrid", false, "Show Module grid X/Y.所属Moduleグリッド座標表示");
		CfgShowModuleConnections = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowModuleConnections", false, "Show Module connections T/R/B/L.所属Module接続方向表示");
		CfgShowModuleStateFlags = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowModuleStateFlags", false, "Show Module state flags.所属Module状態フラグ表示");
		CfgShowRoomName = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowRoomName", true, "Show room object name.部屋オブジェクト名表示");
		CfgShowRoomFlags = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowRoomFlags", false, "Show room flags Truck/Extraction.部屋フラグ表示");
		CfgShowCurrentRoomsCount = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowCurrentRoomsCount", false, "Show overlapped room count.重なり部屋数表示");
		CfgShowOverlappedRoomsList = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowOverlappedRoomsList", false, "Show overlapped room names list.重なり部屋名一覧表示");
		CfgShowPlayerName = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowPlayerName", false, "Show local player name.ローカルプレイヤー名表示");
		CfgShowPlayerSteamId = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowPlayerSteamId", false, "Show local player SteamID.ローカルSteamID表示");
		CfgShowPlayerPosition = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowPlayerPosition", false, "Show local player position.ローカル座標表示");
		CfgShowPlayerRotation = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowPlayerRotation", false, "Show local player rotation.ローカル回転表示");
		CfgShowPlayerForward = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowPlayerForward", false, "Show local player forward vector.前方ベクトル表示");
		CfgShowPlayerVelocity = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowPlayerVelocity", false, "Show local player rigidbody velocity.速度表示");
		CfgShowPlayerStateFlags = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowPlayerStateFlags", false, "Show local player movement state flags.移動状態フラグ表示");
		CfgShowPlayerDeepInternals = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowPlayerDeepInternals", false, "Show extra internal fields from PlayerAvatar.追加内部値表示");
		CfgShowPlayerHealthSummary = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowPlayerHealthSummary", false, "Show local player health summary.体力概要表示");
		CfgShowPlayerHealthDeepInternals = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowPlayerHealthDeepInternals", false, "Show extra internal fields from PlayerHealth.体力内部値表示");
		CfgShowPlayerViewInfo = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowPlayerViewInfo", false, "Show player view/camera info.視点/カメラ情報表示");
		CfgShowPlayerDeepDump = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowPlayerDeepDump", false, "Deep dump PlayerAvatar object graph.プレイヤーのディープダンプ表示");
		CfgShowInventory = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowInventory", false, "Show Inventory/InventorySpot info.インベントリ/スロット情報表示");
		CfgShowInventoryDeepDump = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowInventoryDeepDump", false, "Deep dump Inventory and spots.インベントリのディープダンプ表示");
		CfgShowInventoryHeader = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowInventoryHeader", false, "Show Inventory header line.インベントリ見出し行表示");
		CfgShowInventorySpotsCount = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowInventorySpotsCount", false, "Show inventory spots count.スロット数表示");
		CfgShowInventorySpotEntries = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowInventorySpotEntries", false, "Show per-spot lines.スロット行表示");
		CfgShowInventorySpotIndex = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowInventorySpotIndex", false, "Show inventory spot index.スロット番号表示");
		CfgShowInventorySpotCurrentItem = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowInventorySpotCurrentItem", false, "Show current item per spot.スロット内アイテム表示");
		CfgShowRunStatsCurrency = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowRunStatsCurrency", false, "Show run currency.貯金額表示");
		CfgShowRunStatsCore = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowRunStatsCore", false, "Show core runStats keys.主要ラン統計表示");
		CfgShowRunStatsAll = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowRunStatsAll", false, "Show all runStats dictionary.全ラン統計表示");
		CfgShowItemsPurchasedAll = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowItemsPurchasedAll", false, "Show all itemsPurchased dictionary.購入アイテム辞書表示");
		CfgShowItemsUpgradesPurchasedAll = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowItemsUpgradesPurchasedAll", false, "Show all itemsUpgradesPurchased dictionary.購入アップグレ辞書表示");
		CfgShowRunManagerCore = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowRunManagerCore", false, "Show RunManager core values.ラン管理主要値表示");
		CfgShowRunManagerDeepInternals = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowRunManagerDeepInternals", false, "Show RunManager internal values.ラン管理内部値表示");
		CfgShowRunManagerLevelCurrent = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowRunManagerLevelCurrent", false, "Show RunManager levelCurrent.現在レベル表示");
		CfgShowRunManagerLevelsCompleted = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowRunManagerLevelsCompleted", false, "Show RunManager levelsCompleted.クリア済み階層数表示");
		CfgShowRunManagerLoadLevel = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowRunManagerLoadLevel", false, "Show RunManager loadLevel internal.内部loadLevel表示");
		CfgShowRunManagerSaveLevel = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowRunManagerSaveLevel", false, "Show RunManager saveLevel internal.内部saveLevel表示");
		CfgShowRunManagerRunStarted = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowRunManagerRunStarted", false, "Show RunManager runStarted internal.内部runStarted表示");
		CfgShowRunManagerRunLives = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowRunManagerRunLives", false, "Show RunManager runLives internal.内部runLives表示");
		CfgShowRunManagerLevelFailed = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowRunManagerLevelFailed", false, "Show RunManager levelFailed internal.内部levelFailed表示");
		CfgShowRunManagerRestarting = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowRunManagerRestarting", false, "Show RunManager restarting internal.内部restarting表示");
		CfgShowRunManagerRestartingDone = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowRunManagerRestartingDone", false, "Show RunManager restartingDone internal.内部restartingDone表示");
		CfgShowRunManagerLevelsMax = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowRunManagerLevelsMax", false, "Show RunManager levelsMax internal.内部levelsMax表示");
		CfgShowGameDirector = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowGameDirector", false, "Show GameDirector info.ゲームディレクター情報表示");
		CfgShowGameDirectorDeepDump = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowGameDirectorDeepDump", false, "Deep dump GameDirector.ゲームディレクターのディープダンプ表示");
		CfgShowGameDirectorHeader = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowGameDirectorHeader", false, "Show GameDirector header line.ディレクター見出し行表示");
		CfgShowGameDirectorState = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowGameDirectorState", false, "Show GameDirector state.ディレクター状態表示");
		CfgShowGameDirectorTimeScale = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowGameDirectorTimeScale", false, "Show GameDirector time scale.タイムスケール表示");
		CfgShowGameDirectorSeed = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowGameDirectorSeed", false, "Show GameDirector seed.シード表示");
		CfgShowShopManager = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowShopManager", false, "Show ShopManager info.ショップ情報表示");
		CfgShowShopManagerDeepDump = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowShopManagerDeepDump", false, "Deep dump ShopManager.ショップのディープダンプ表示");
		CfgShowShopManagerHeader = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowShopManagerHeader", false, "Show ShopManager header line.ショップ見出し行表示");
		CfgShowShopManagerTotalCost = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowShopManagerTotalCost", false, "Show ShopManager totalCost.合計金額表示");
		CfgShowShopManagerTotalCurrency = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowShopManagerTotalCurrency", false, "Show ShopManager totalCurrency.所持金表示");
		CfgShowShopManagerIsThief = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowShopManagerIsThief", false, "Show ShopManager isThief.盗賊フラグ表示");
		CfgShowShopManagerShoppingListCount = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowShopManagerShoppingListCount", false, "Show shopping list count.購入リスト数表示");
		CfgShowExtractionNearest = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowExtractionNearest", false, "Show nearest ExtractionPoint info.最寄り納品所情報表示");
		CfgShowCartNearest = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowCartNearest", false, "Show nearest cart info.最寄りカート情報表示");
		CfgShowExtractionCartDeepDump = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowExtractionCartDeepDump", false, "Deep dump nearest ExtractionPoint/Cart.最寄り納品所/カートのディープダンプ表示");
		CfgShowExtractionHeader = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowExtractionHeader", false, "Show ExtractionPoint header line.納品所見出し行表示");
		CfgShowExtractionPosDist = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowExtractionPosDist", false, "Show ExtractionPoint position and distance.納品所座標と距離表示");
		CfgShowExtractionHaulGoal = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowExtractionHaulGoal", false, "Show ExtractionPoint haul goal.納品目標表示");
		CfgShowExtractionState = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowExtractionState", false, "Show ExtractionPoint state.納品所状態表示");
		CfgShowCartHeader = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowCartHeader", false, "Show Cart header line.カート見出し行表示");
		CfgShowCartPosDist = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowCartPosDist", false, "Show Cart position and distance.カート座標と距離表示");
		CfgShowCartState = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowCartState", false, "Show Cart state.カート状態表示");
		CfgShowCartHaulCurrent = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowCartHaulCurrent", false, "Show Cart haulCurrent.カート現在金額表示");
		CfgShowCartItemsInCartCount = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowCartItemsInCartCount", false, "Show Cart itemsInCartCount.カート中身数表示");
		CfgShowPhotonNetwork = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowPhotonNetwork", false, "Show Photon network info.Photonネットワーク情報表示");
		CfgShowPhotonDeepDump = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowPhotonDeepDump", false, "Deep dump Photon room/player objects.Photonルーム/プレイヤーのディープダンプ表示");
		CfgShowPhotonHeader = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowPhotonHeader", false, "Show Photon header line.Photon見出し行表示");
		CfgShowPhotonInRoom = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowPhotonInRoom", false, "Show Photon InRoom.ルーム参加中表示");
		CfgShowPhotonIsMasterClient = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowPhotonIsMasterClient", false, "Show Photon IsMasterClient.マスター判定表示");
		CfgShowPhotonRoomName = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowPhotonRoomName", false, "Show Photon room name.ルーム名表示");
		CfgShowPhotonPlayerCount = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowPhotonPlayerCount", false, "Show Photon player count.人数表示");
		CfgShowPhotonLocalActorNumber = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowPhotonLocalActorNumber", false, "Show Photon local actor number.ローカルActor番号表示");
		CfgShowRoomColor = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowRoomColor", false, "Show RoomVolume.Color.部屋色表示");
		CfgShowReverbPresetName = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowReverbPresetName", false, "Show ReverbPreset name.リバーブプリセット名表示");
		CfgShowRoomAmbienceVolume = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowRoomAmbienceVolume", false, "Show RoomAmbience volume.環境音音量表示");
		CfgShowRoomAmbienceOverrideSummary = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowRoomAmbienceOverrideSummary", false, "Show LevelAmbience override summary.環境音上書き概要表示");
		CfgShowMapModuleName = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowMapModuleName", false, "Show MapModule name.マップ表示オブジェクト名表示");
		CfgShowMapModuleLinkedModuleName = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowMapModuleLinkedModuleName", false, "Show MapModule.module name.マップ側紐づきModule名表示");
		CfgShowTransformPosition = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowTransformPosition", false, "Show RoomVolume world position.部屋座標表示");
		CfgShowTransformRotationY = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowTransformRotationY", false, "Show RoomVolume Y rotation.部屋向きY表示");
		CfgShowColliderCounts = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowColliderCounts", false, "Show collider counts under RoomVolume.コライダー数表示");
		CfgShowRoomVolumeCheckFlags = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowRoomVolumeCheckFlags", false, "Show RoomVolumeCheck flags.判定側フラグ表示");
		CfgShowRoomVolumeCheckBox = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowRoomVolumeCheckBox", false, "Show RoomVolumeCheck box params.判定OverlapBox値表示");
		CfgShowEconomyScan = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowEconomyScan", false, "Scan for economy-related values by keywords.経済系キーワードスキャン表示");
		CfgShowEconomyDeepDump = ((BaseUnityPlugin)this).Config.Bind<bool>("C Contents", "ShowEconomyDeepDump", false, "Deep dump economy-related singletons.経済系シングルトンのディープダンプ表示");
		CfgDeepDumpMaxDepth = ((BaseUnityPlugin)this).Config.Bind<int>("D DeepDump", "MaxDepth", 2, "Max recursion depth.最大再帰深度");
		CfgDeepDumpMaxMembersPerObject = ((BaseUnityPlugin)this).Config.Bind<int>("D DeepDump", "MaxMembersPerObject", 40, "Max members per object.オブジェクト毎の最大メンバー数");
		CfgDeepDumpIncludePrivate = ((BaseUnityPlugin)this).Config.Bind<bool>("D DeepDump", "IncludePrivate", true, "Include private members.プライベート含む");
		CfgDeepDumpIncludeFields = ((BaseUnityPlugin)this).Config.Bind<bool>("D DeepDump", "IncludeFields", true, "Include fields.フィールド含む");
		CfgDeepDumpIncludeProperties = ((BaseUnityPlugin)this).Config.Bind<bool>("D DeepDump", "IncludeProperties", true, "Include properties.プロパティ含む");
		CfgDeepDumpMaxStringLength = ((BaseUnityPlugin)this).Config.Bind<int>("D DeepDump", "MaxStringLength", 160, "Max string length in dump.文字列最大長");
		CfgEconomyKeywords = ((BaseUnityPlugin)this).Config.Bind<string>("D DeepDump", "EconomyKeywords", "money,cash,coin,credit,bank,saving,deposit,wealth,gold,meta", "Comma-separated keywords for scan.カンマ区切りキーワード");
		CfgEconomyMaxTypes = ((BaseUnityPlugin)this).Config.Bind<int>("D DeepDump", "EconomyMaxTypes", 20, "Max scanned root types.スキャン対象ルート型の最大数");
	}

	private void CacheReflection()
	{
		Type typeFromHandle = typeof(Module);
		FiModuleConnectingTop = GetFieldOrNull(typeFromHandle, "ConnectingTop");
		FiModuleConnectingRight = GetFieldOrNull(typeFromHandle, "ConnectingRight");
		FiModuleConnectingBottom = GetFieldOrNull(typeFromHandle, "ConnectingBottom");
		FiModuleConnectingLeft = GetFieldOrNull(typeFromHandle, "ConnectingLeft");
		FiModuleSetupDone = GetFieldOrNull(typeFromHandle, "SetupDone");
		FiModuleFirst = GetFieldOrNull(typeFromHandle, "First");
		FiModuleGridX = GetFieldOrNull(typeFromHandle, "GridX");
		FiModuleGridY = GetFieldOrNull(typeFromHandle, "GridY");
		FiModuleStartRoom = GetFieldOrNull(typeFromHandle, "StartRoom");
		Type typeFromHandle2 = typeof(RoomVolumeCheck);
		FiRvcInTruck = GetFieldOrNull(typeFromHandle2, "inTruck");
		FiRvcInExtractionPoint = GetFieldOrNull(typeFromHandle2, "inExtractionPoint");
		Type typeFromHandle3 = typeof(PlayerAvatar);
		FiPaRb = GetFieldOrNull(typeFromHandle3, "rb");
		FiPaIsLocal = GetFieldOrNull(typeFromHandle3, "isLocal");
		FiPaIsDisabled = GetFieldOrNull(typeFromHandle3, "isDisabled");
		FiPaSpawned = GetFieldOrNull(typeFromHandle3, "spawned");
		FiPaIsCrouching = GetFieldOrNull(typeFromHandle3, "isCrouching");
		FiPaIsSprinting = GetFieldOrNull(typeFromHandle3, "isSprinting");
		FiPaIsCrawling = GetFieldOrNull(typeFromHandle3, "isCrawling");
		FiPaIsSliding = GetFieldOrNull(typeFromHandle3, "isSliding");
		FiPaIsMoving = GetFieldOrNull(typeFromHandle3, "isMoving");
		FiPaIsGrounded = GetFieldOrNull(typeFromHandle3, "isGrounded");
		FiPaIsTumbling = GetFieldOrNull(typeFromHandle3, "isTumbling");
		FiPaSpectating = GetFieldOrNull(typeFromHandle3, "spectating");
		FiPaClientPositionDelta = GetFieldOrNull(typeFromHandle3, "clientPositionDelta");
		FiPaEnemyVisionFreezeTimer = GetFieldOrNull(typeFromHandle3, "enemyVisionFreezeTimer");
		Type typeFromHandle4 = typeof(PlayerHealth);
		FiPhHealth = GetFieldOrNull(typeFromHandle4, "health");
		FiPhMaxHealth = GetFieldOrNull(typeFromHandle4, "maxHealth");
		FiPhGodMode = GetFieldOrNull(typeFromHandle4, "godMode");
		FiPhInvincibleTimer = GetFieldOrNull(typeFromHandle4, "invincibleTimer");
		Type type = FindTypeByName("RunManager");
		if (type != null)
		{
			FiRmLoadLevel = GetFieldOrNull(type, "loadLevel");
			FiRmSaveLevel = GetFieldOrNull(type, "saveLevel");
			FiRmRunStarted = GetFieldOrNull(type, "runStarted");
			FiRmRunLives = GetFieldOrNull(type, "runLives");
			FiRmLevelFailed = GetFieldOrNull(type, "levelFailed");
			FiRmRestarting = GetFieldOrNull(type, "restarting");
			FiRmRestartingDone = GetFieldOrNull(type, "restartingDone");
			FiRmLevelsMax = GetFieldOrNull(type, "levelsMax");
		}
	}

	private void EnsureGuiStyles()
	{
		//IL_00e7: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f1: Expected O, but got Unknown
		//IL_0173: Unknown result type (might be due to invalid IL or missing references)
		//IL_0189: Unknown result type (might be due to invalid IL or missing references)
		//IL_0193: Expected O, but got Unknown
		int num = 17;
		num = num * 31 + Mathf.Max(8, CfgFontSize.Value);
		num = num * 31 + Mathf.Max(0, CfgLineSpacing.Value);
		num = num * 31 + Mathf.RoundToInt(Mathf.Clamp01(CfgTextColorR.Value) * 1000f);
		num = num * 31 + Mathf.RoundToInt(Mathf.Clamp01(CfgTextColorG.Value) * 1000f);
		num = num * 31 + Mathf.RoundToInt(Mathf.Clamp01(CfgTextColorB.Value) * 1000f);
		num = num * 31 + Mathf.RoundToInt(Mathf.Clamp01(CfgTextColorA.Value) * 1000f);
		if (_labelStyle == null || _boxStyle == null || _lastStyleKey != num)
		{
			_labelStyle = new GUIStyle(GUI.skin.label);
			_labelStyle.richText = false;
			_labelStyle.wordWrap = false;
			_labelStyle.fontSize = Mathf.Max(8, CfgFontSize.Value);
			_labelStyle.normal.textColor = new Color(Mathf.Clamp01(CfgTextColorR.Value), Mathf.Clamp01(CfgTextColorG.Value), Mathf.Clamp01(CfgTextColorB.Value), Mathf.Clamp01(CfgTextColorA.Value));
			_boxStyle = new GUIStyle(GUI.skin.box);
			_lastStyleKey = num;
			InvalidateMeasureCache();
		}
	}

	private void RebuildActiveOrderIfNeeded()
	{
		int num = 23;
		num = num * 31 + BoolHash(AnyModuleEnabled());
		num = num * 31 + BoolHash(AnyRoomEnabled());
		num = num * 31 + BoolHash(AnyPlayerEnabled());
		num = num * 31 + BoolHash(CfgShowPlayerDeepDump.Value);
		num = num * 31 + BoolHash(AnyInventoryEnabled());
		num = num * 31 + BoolHash(CfgShowInventoryDeepDump.Value);
		num = num * 31 + BoolHash(AnyEconomyRunEnabled());
		num = num * 31 + BoolHash(CfgShowEconomyScan.Value);
		num = num * 31 + BoolHash(CfgShowEconomyDeepDump.Value);
		num = num * 31 + BoolHash(AnyGameDirectorEnabled());
		num = num * 31 + BoolHash(CfgShowGameDirectorDeepDump.Value);
		num = num * 31 + BoolHash(AnyShopManagerEnabled());
		num = num * 31 + BoolHash(CfgShowShopManagerDeepDump.Value);
		num = num * 31 + BoolHash(AnyExtractionCartEnabled());
		num = num * 31 + BoolHash(CfgShowExtractionCartDeepDump.Value);
		num = num * 31 + BoolHash(AnyPhotonEnabled());
		num = num * 31 + BoolHash(CfgShowPhotonDeepDump.Value);
		num = num * 31 + BoolHash(AnyEnvironmentEnabled());
		num = num * 31 + BoolHash(AnyMapEnabled());
		num = num * 31 + BoolHash(AnyDetailsEnabled());
		num = num * 31 + BoolHash(AnyDebugEnabled());
		if (_activeHash == num && _activeOrder.Count > 0)
		{
			return;
		}
		_activeHash = num;
		_activeOrder.Clear();
		if (AnyModuleEnabled())
		{
			_activeOrder.Add(SectionKind.Module);
		}
		if (AnyRoomEnabled())
		{
			_activeOrder.Add(SectionKind.Room);
		}
		if (AnyPlayerEnabled())
		{
			_activeOrder.Add(SectionKind.Player);
		}
		if (CfgShowPlayerDeepDump.Value)
		{
			_activeOrder.Add(SectionKind.Deep_PlayerDump);
		}
		if (AnyInventoryEnabled())
		{
			_activeOrder.Add(SectionKind.Inventory);
		}
		if (CfgShowInventoryDeepDump.Value)
		{
			_activeOrder.Add(SectionKind.Deep_InventoryDump);
		}
		if (AnyEconomyRunEnabled())
		{
			_activeOrder.Add(SectionKind.EconomyRun);
		}
		if (CfgShowEconomyScan.Value)
		{
			_activeOrder.Add(SectionKind.Deep_EconomyScan);
		}
		if (CfgShowEconomyDeepDump.Value)
		{
			_activeOrder.Add(SectionKind.Deep_EconomyDump);
		}
		if (AnyGameDirectorEnabled())
		{
			_activeOrder.Add(SectionKind.GameDirector);
		}
		if (CfgShowGameDirectorDeepDump.Value)
		{
			_activeOrder.Add(SectionKind.Deep_GameDirectorDump);
		}
		if (AnyShopManagerEnabled())
		{
			_activeOrder.Add(SectionKind.ShopManager);
		}
		if (CfgShowShopManagerDeepDump.Value)
		{
			_activeOrder.Add(SectionKind.Deep_ShopManagerDump);
		}
		if (AnyExtractionCartEnabled())
		{
			_activeOrder.Add(SectionKind.ExtractionCart);
		}
		if (CfgShowExtractionCartDeepDump.Value)
		{
			_activeOrder.Add(SectionKind.Deep_ExtractionCartDump);
		}
		if (AnyPhotonEnabled())
		{
			_activeOrder.Add(SectionKind.Photon);
		}
		if (CfgShowPhotonDeepDump.Value)
		{
			_activeOrder.Add(SectionKind.Deep_PhotonDump);
		}
		if (AnyEnvironmentEnabled())
		{
			_activeOrder.Add(SectionKind.Environment);
		}
		if (AnyMapEnabled())
		{
			_activeOrder.Add(SectionKind.Map);
		}
		if (AnyDetailsEnabled())
		{
			_activeOrder.Add(SectionKind.Details);
		}
		if (AnyDebugEnabled())
		{
			_activeOrder.Add(SectionKind.Debug);
		}
		HashSet<SectionKind> hashSet = new HashSet<SectionKind>(_activeOrder);
		List<SectionKind> list = _sectionCache.Keys.ToList();
		for (int i = 0; i < list.Count; i++)
		{
			if (!hashSet.Contains(list[i]))
			{
				_sectionCache.Remove(list[i]);
			}
		}
		_rrIndex = 0;
	}

	private int BoolHash(bool b)
	{
		return b ? 1 : 0;
	}

	private void UpdateOneSection(SectionKind kind)
	{
		string value = null;
		switch (kind)
		{
		case SectionKind.Module:
			if (AnyModuleEnabled())
			{
				value = BuildModuleSectionText();
			}
			break;
		case SectionKind.Room:
			if (AnyRoomEnabled())
			{
				value = BuildRoomSectionText();
			}
			break;
		case SectionKind.Player:
			if (AnyPlayerEnabled())
			{
				value = BuildPlayerSectionText();
			}
			break;
		case SectionKind.Inventory:
			if (AnyInventoryEnabled())
			{
				value = BuildInventorySectionText();
			}
			break;
		case SectionKind.EconomyRun:
			if (AnyEconomyRunEnabled())
			{
				value = BuildEconomyRunSectionText();
			}
			break;
		case SectionKind.GameDirector:
			if (AnyGameDirectorEnabled())
			{
				value = BuildGameDirectorSectionText();
			}
			break;
		case SectionKind.ShopManager:
			if (AnyShopManagerEnabled())
			{
				value = BuildShopManagerSectionText();
			}
			break;
		case SectionKind.ExtractionCart:
			if (AnyExtractionCartEnabled())
			{
				value = BuildExtractionCartSectionText();
			}
			break;
		case SectionKind.Photon:
			if (AnyPhotonEnabled())
			{
				value = BuildPhotonSectionText();
			}
			break;
		case SectionKind.Environment:
			if (AnyEnvironmentEnabled())
			{
				value = BuildEnvironmentSectionText();
			}
			break;
		case SectionKind.Map:
			if (AnyMapEnabled())
			{
				value = BuildMapSectionText();
			}
			break;
		case SectionKind.Details:
			if (AnyDetailsEnabled())
			{
				value = BuildDetailsSectionText();
			}
			break;
		case SectionKind.Debug:
			if (AnyDebugEnabled())
			{
				value = BuildDebugSectionText();
			}
			break;
		case SectionKind.Deep_PlayerDump:
			if (CfgShowPlayerDeepDump.Value)
			{
				value = BuildPlayerDeepDumpText();
			}
			break;
		case SectionKind.Deep_InventoryDump:
			if (CfgShowInventoryDeepDump.Value)
			{
				value = BuildInventoryDeepDumpText();
			}
			break;
		case SectionKind.Deep_GameDirectorDump:
			if (CfgShowGameDirectorDeepDump.Value)
			{
				value = BuildGameDirectorDeepDumpText();
			}
			break;
		case SectionKind.Deep_ShopManagerDump:
			if (CfgShowShopManagerDeepDump.Value)
			{
				value = BuildShopManagerDeepDumpText();
			}
			break;
		case SectionKind.Deep_ExtractionCartDump:
			if (CfgShowExtractionCartDeepDump.Value)
			{
				value = BuildExtractionCartDeepDumpText();
			}
			break;
		case SectionKind.Deep_PhotonDump:
			if (CfgShowPhotonDeepDump.Value)
			{
				value = BuildPhotonDeepDumpText();
			}
			break;
		case SectionKind.Deep_EconomyScan:
			if (CfgShowEconomyScan.Value)
			{
				value = BuildEconomyScanText();
			}
			break;
		case SectionKind.Deep_EconomyDump:
			if (CfgShowEconomyDeepDump.Value)
			{
				value = BuildEconomyDeepDumpText();
			}
			break;
		}
		if (string.IsNullOrEmpty(value))
		{
			_sectionCache.Remove(kind);
		}
		else
		{
			_sectionCache[kind] = value;
		}
	}

	private void RebuildSnapshotText()
	{
		StringBuilder stringBuilder = new StringBuilder(65536);
		for (int i = 0; i < _activeOrder.Count; i++)
		{
			SectionKind key = _activeOrder[i];
			if (_sectionCache.TryGetValue(key, out string value) && !string.IsNullOrEmpty(value))
			{
				if (stringBuilder.Length > 0)
				{
					stringBuilder.Append('\n').Append('\n');
				}
				stringBuilder.Append(value);
			}
		}
		string text = stringBuilder.ToString();
		if (text.EndsWith("\n", StringComparison.Ordinal))
		{
			text = text.TrimEnd('\n');
		}
		_snapshotText = ((text.Length > 0) ? text : "No lines enabled");
	}

	private bool AnyModuleEnabled()
	{
		return CfgShowModuleName.Value || CfgShowModuleType.Value || CfgShowModuleGrid.Value || CfgShowModuleConnections.Value || CfgShowModuleStateFlags.Value;
	}

	private bool AnyRoomEnabled()
	{
		return CfgShowRoomName.Value || CfgShowRoomFlags.Value || CfgShowCurrentRoomsCount.Value || CfgShowOverlappedRoomsList.Value;
	}

	private bool AnyPlayerEnabled()
	{
		return CfgShowPlayerName.Value || CfgShowPlayerSteamId.Value || CfgShowPlayerPosition.Value || CfgShowPlayerRotation.Value || CfgShowPlayerForward.Value || CfgShowPlayerVelocity.Value || CfgShowPlayerStateFlags.Value || CfgShowPlayerDeepInternals.Value || CfgShowPlayerHealthSummary.Value || CfgShowPlayerHealthDeepInternals.Value || CfgShowPlayerViewInfo.Value;
	}

	private bool AnyInventoryEnabled()
	{
		if (!CfgShowInventory.Value)
		{
			return false;
		}
		return CfgShowInventoryHeader.Value || CfgShowInventorySpotsCount.Value || CfgShowInventorySpotEntries.Value || CfgShowInventorySpotIndex.Value || CfgShowInventorySpotCurrentItem.Value;
	}

	private bool AnyEconomyRunEnabled()
	{
		return CfgShowRunStatsCurrency.Value || CfgShowRunStatsCore.Value || CfgShowRunStatsAll.Value || CfgShowItemsPurchasedAll.Value || CfgShowItemsUpgradesPurchasedAll.Value || CfgShowRunManagerCore.Value || CfgShowRunManagerDeepInternals.Value;
	}

	private bool AnyGameDirectorEnabled()
	{
		if (!CfgShowGameDirector.Value)
		{
			return false;
		}
		return CfgShowGameDirectorHeader.Value || CfgShowGameDirectorState.Value || CfgShowGameDirectorTimeScale.Value || CfgShowGameDirectorSeed.Value;
	}

	private bool AnyShopManagerEnabled()
	{
		if (!CfgShowShopManager.Value)
		{
			return false;
		}
		return CfgShowShopManagerHeader.Value || CfgShowShopManagerTotalCost.Value || CfgShowShopManagerTotalCurrency.Value || CfgShowShopManagerIsThief.Value || CfgShowShopManagerShoppingListCount.Value;
	}

	private bool AnyExtractionCartEnabled()
	{
		bool flag = CfgShowExtractionNearest.Value && (CfgShowExtractionHeader.Value || CfgShowExtractionPosDist.Value || CfgShowExtractionHaulGoal.Value || CfgShowExtractionState.Value);
		bool flag2 = CfgShowCartNearest.Value && (CfgShowCartHeader.Value || CfgShowCartPosDist.Value || CfgShowCartState.Value || CfgShowCartHaulCurrent.Value || CfgShowCartItemsInCartCount.Value);
		return flag || flag2;
	}

	private bool AnyPhotonEnabled()
	{
		if (!CfgShowPhotonNetwork.Value)
		{
			return false;
		}
		return CfgShowPhotonHeader.Value || CfgShowPhotonInRoom.Value || CfgShowPhotonIsMasterClient.Value || CfgShowPhotonRoomName.Value || CfgShowPhotonPlayerCount.Value || CfgShowPhotonLocalActorNumber.Value;
	}

	private bool AnyEnvironmentEnabled()
	{
		return CfgShowRoomColor.Value || CfgShowReverbPresetName.Value || CfgShowRoomAmbienceVolume.Value || CfgShowRoomAmbienceOverrideSummary.Value;
	}

	private bool AnyMapEnabled()
	{
		return CfgShowMapModuleName.Value || CfgShowMapModuleLinkedModuleName.Value;
	}

	private bool AnyDetailsEnabled()
	{
		return CfgShowTransformPosition.Value || CfgShowTransformRotationY.Value || CfgShowColliderCounts.Value;
	}

	private bool AnyDebugEnabled()
	{
		return CfgShowRoomVolumeCheckFlags.Value || CfgShowRoomVolumeCheckBox.Value;
	}

	private string WrapSection(string title, string body)
	{
		if (!CfgShowSectionHeaders.Value)
		{
			return (body ?? string.Empty).TrimEnd('\n');
		}
		StringBuilder stringBuilder = new StringBuilder((body?.Length ?? 0) + 64);
		stringBuilder.Append(title).Append('\n');
		stringBuilder.Append(body ?? string.Empty);
		return stringBuilder.ToString().TrimEnd('\n');
	}

	private string BuildModuleSectionText()
	{
		PlayerAvatar instance = PlayerAvatar.instance;
		if ((Object)(object)instance == (Object)null)
		{
			return null;
		}
		RoomVolumeCheck roomVolumeCheck = instance.RoomVolumeCheck;
		if ((Object)(object)roomVolumeCheck == (Object)null)
		{
			return null;
		}
		RoomVolume val = null;
		try
		{
			List<RoomVolume> currentRooms = roomVolumeCheck.CurrentRooms;
			if (currentRooms != null && currentRooms.Count > 0)
			{
				val = currentRooms[0];
			}
		}
		catch
		{
		}
		Module val2 = null;
		try
		{
			val2 = (((Object)(object)val != (Object)null) ? val.Module : null);
		}
		catch
		{
		}
		StringBuilder stringBuilder = new StringBuilder(2048);
		bool flag = false;
		if (CfgShowModuleName.Value)
		{
			flag = true;
			stringBuilder.Append("Name: ").Append(((Object)(object)val2 != (Object)null) ? ((Object)val2).name : "None").Append('\n');
		}
		if (CfgShowModuleType.Value)
		{
			flag = true;
			stringBuilder.Append("Type: ").Append(((Object)(object)val2 != (Object)null) ? "Unknown" : "None").Append('\n');
		}
		if (CfgShowModuleGrid.Value)
		{
			flag = true;
			stringBuilder.Append("Grid: ");
			if ((Object)(object)val2 != (Object)null)
			{
				int intField = GetIntField(val2, FiModuleGridX, int.MinValue);
				int intField2 = GetIntField(val2, FiModuleGridY, int.MinValue);
				stringBuilder.Append((intField != int.MinValue && intField2 != int.MinValue) ? (intField + "," + intField2) : "Unknown");
			}
			else
			{
				stringBuilder.Append("None");
			}
			stringBuilder.Append('\n');
		}
		if (CfgShowModuleConnections.Value)
		{
			flag = true;
			stringBuilder.Append("Connect: ");
			if ((Object)(object)val2 != (Object)null)
			{
				bool ok;
				bool boolField = GetBoolField(val2, FiModuleConnectingTop, fallback: false, out ok);
				bool ok2;
				bool boolField2 = GetBoolField(val2, FiModuleConnectingRight, fallback: false, out ok2);
				bool ok3;
				bool boolField3 = GetBoolField(val2, FiModuleConnectingBottom, fallback: false, out ok3);
				bool ok4;
				bool boolField4 = GetBoolField(val2, FiModuleConnectingLeft, fallback: false, out ok4);
				stringBuilder.Append((ok && ok2 && ok3 && ok4) ? $"T={boolField} R={boolField2} B={boolField3} L={boolField4}" : "Unknown");
			}
			else
			{
				stringBuilder.Append("None");
			}
			stringBuilder.Append('\n');
		}
		if (CfgShowModuleStateFlags.Value)
		{
			flag = true;
			stringBuilder.Append("State: ");
			if ((Object)(object)val2 != (Object)null)
			{
				bool ok5;
				bool boolField5 = GetBoolField(val2, FiModuleSetupDone, fallback: false, out ok5);
				bool explored = val2.Explored;
				bool ok6;
				bool boolField6 = GetBoolField(val2, FiModuleStartRoom, fallback: false, out ok6);
				bool ok7;
				bool boolField7 = GetBoolField(val2, FiModuleFirst, fallback: false, out ok7);
				stringBuilder.Append("SetupDone=").Append(ok5 ? boolField5.ToString() : "Unknown");
				stringBuilder.Append(" Explored=").Append(explored);
				stringBuilder.Append(" StartRoom=").Append(ok6 ? boolField6.ToString() : "Unknown");
				stringBuilder.Append(" First=").Append(ok7 ? boolField7.ToString() : "Unknown");
			}
			else
			{
				stringBuilder.Append("None");
			}
			stringBuilder.Append('\n');
		}
		if (!flag)
		{
			return null;
		}
		return WrapSection("Module", stringBuilder.ToString());
	}

	private string BuildRoomSectionText()
	{
		PlayerAvatar instance = PlayerAvatar.instance;
		if ((Object)(object)instance == (Object)null)
		{
			return null;
		}
		RoomVolumeCheck roomVolumeCheck = instance.RoomVolumeCheck;
		if ((Object)(object)roomVolumeCheck == (Object)null)
		{
			return null;
		}
		IList list = null;
		RoomVolume val = null;
		int num = 0;
		try
		{
			list = roomVolumeCheck.CurrentRooms;
			if (list != null)
			{
				num = list.Count;
				if (num > 0)
				{
					object? obj = list[0];
					val = (RoomVolume)((obj is RoomVolume) ? obj : null);
				}
			}
		}
		catch
		{
		}
		StringBuilder stringBuilder = new StringBuilder(2048);
		bool flag = false;
		if (CfgShowRoomName.Value)
		{
			flag = true;
			stringBuilder.Append("Name: ").Append(((Object)(object)val != (Object)null) ? ((Object)((Component)val).gameObject).name : "None").Append('\n');
		}
		if (CfgShowRoomFlags.Value)
		{
			flag = true;
			bool value = false;
			bool value2 = false;
			try
			{
				value = (Object)(object)val != (Object)null && val.Truck;
				value2 = (Object)(object)val != (Object)null && val.Extraction;
			}
			catch
			{
			}
			stringBuilder.Append("Flags: Truck=").Append(value).Append(" Extraction=")
				.Append(value2)
				.Append('\n');
		}
		if (CfgShowCurrentRoomsCount.Value)
		{
			flag = true;
			stringBuilder.Append("Overlaps: ").Append(num).Append('\n');
		}
		if (CfgShowOverlappedRoomsList.Value)
		{
			flag = true;
			stringBuilder.Append("Rooms: ");
			if (list == null || num == 0)
			{
				stringBuilder.Append("None");
			}
			else
			{
				int num2 = Mathf.Max(1, CfgMaxListEntries.Value);
				int num3 = Mathf.Min(num, num2);
				for (int i = 0; i < num3; i++)
				{
					if (i > 0)
					{
						stringBuilder.Append(", ");
					}
					object? obj4 = list[i];
					RoomVolume val2 = (RoomVolume)((obj4 is RoomVolume) ? obj4 : null);
					stringBuilder.Append(((Object)(object)val2 != (Object)null) ? ((Object)((Component)val2).gameObject).name : "Null");
				}
				if (num > num3)
				{
					stringBuilder.Append(" ...(+").Append(num - num3).Append(')');
				}
			}
			stringBuilder.Append('\n');
		}
		if (!flag)
		{
			return null;
		}
		return WrapSection("Room", stringBuilder.ToString());
	}

	private string BuildPlayerSectionText()
	{
		//IL_0785: Unknown result type (might be due to invalid IL or missing references)
		//IL_078a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0793: Unknown result type (might be due to invalid IL or missing references)
		//IL_0798: Unknown result type (might be due to invalid IL or missing references)
		//IL_07a1: Unknown result type (might be due to invalid IL or missing references)
		//IL_07a6: 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_0100: Unknown result type (might be due to invalid IL or missing references)
		//IL_0181: Unknown result type (might be due to invalid IL or missing references)
		//IL_0186: Unknown result type (might be due to invalid IL or missing references)
		//IL_0207: Unknown result type (might be due to invalid IL or missing references)
		//IL_020c: Unknown result type (might be due to invalid IL or missing references)
		//IL_02b0: Unknown result type (might be due to invalid IL or missing references)
		//IL_02b5: Unknown result type (might be due to invalid IL or missing references)
		PlayerAvatar instance = PlayerAvatar.instance;
		if ((Object)(object)instance == (Object)null)
		{
			return null;
		}
		StringBuilder stringBuilder = new StringBuilder(8192);
		bool flag = false;
		Transform val = null;
		try
		{
			val = (((Object)(object)instance.playerTransform != (Object)null) ? instance.playerTransform : ((Component)instance).transform);
		}
		catch
		{
			val = ((Component)instance).transform;
		}
		if (CfgShowPlayerName.Value)
		{
			flag = true;
			string value = "Unknown";
			try
			{
				value = SemiFunc.PlayerGetName(instance);
			}
			catch
			{
			}
			stringBuilder.Append("Name: ").Append(value).Append('\n');
		}
		if (CfgShowPlayerSteamId.Value)
		{
			flag = true;
			string value2 = "Unknown";
			try
			{
				value2 = SemiFunc.PlayerGetSteamID(instance);
			}
			catch
			{
			}
			stringBuilder.Append("SteamID: ").Append(value2).Append('\n');
		}
		if (CfgShowPlayerPosition.Value)
		{
			flag = true;
			Vector3 position = val.position;
			stringBuilder.Append("Pos: ").Append(position.x.ToString("0.###")).Append(",")
				.Append(position.y.ToString("0.###"))
				.Append(",")
				.Append(position.z.ToString("0.###"))
				.Append('\n');
		}
		if (CfgShowPlayerRotation.Value)
		{
			flag = true;
			Vector3 eulerAngles = val.eulerAngles;
			stringBuilder.Append("Rot: ").Append(eulerAngles.x.ToString("0.###")).Append(",")
				.Append(eulerAngles.y.ToString("0.###"))
				.Append(",")
				.Append(eulerAngles.z.ToString("0.###"))
				.Append('\n');
		}
		if (CfgShowPlayerForward.Value)
		{
			flag = true;
			Vector3 forward = val.forward;
			stringBuilder.Append("Fwd: ").Append(forward.x.ToString("0.###")).Append(",")
				.Append(forward.y.ToString("0.###"))
				.Append(",")
				.Append(forward.z.ToString("0.###"))
				.Append('\n');
		}
		if (CfgShowPlayerVelocity.Value)
		{
			flag = true;
			Rigidbody objectField = GetObjectField<Rigidbody>(instance, FiPaRb);
			if ((Object)(object)objectField != (Object)null)
			{
				Vector3 velocity = objectField.velocity;
				stringBuilder.Append("Vel: ").Append(velocity.x.ToString("0.###")).Append(",")
					.Append(velocity.y.ToString("0.###"))
					.Append(",")
					.Append(velocity.z.ToString("0.###"));
				stringBuilder.Append(" |Speed=").Append(((Vector3)(ref velocity)).magnitude.ToString("0.###"));
			}
			else
			{
				stringBuilder.Append("Vel: None");
			}
			stringBuilder.Append('\n');
		}
		bool ok;
		if (CfgShowPlayerStateFlags.Value)
		{
			flag = true;
			bool boolField = GetBoolField(instance, FiPaIsLocal, fallback: false, out ok);
			bool boolField2 = GetBoolField(instance, FiPaIsDisabled, fallback: false, out ok);
			bool boolField3 = GetBoolField(instance, FiPaSpawned, fallback: false, out ok);
			bool boolField4 = GetBoolField(instance, FiPaIsCrouching, fallback: false, out ok);
			bool boolField5 = GetBoolField(instance, FiPaIsSprinting, fallback: false, out ok);
			bool boolField6 = GetBoolField(instance, FiPaIsCrawling, fallback: false, out ok);
			bool boolField7 = GetBoolField(instance, FiPaIsSliding, fallback: false, out ok);
			bool boolField8 = GetBoolField(instance, FiPaIsMoving, fallback: false, out ok);
			bool boolField9 = GetBoolField(instance, FiPaIsGrounded, fallback: false, out ok);
			bool boolField10 = GetBoolField(instance, FiPaIsTumbling, fallback: false, out ok);
			bool boolField11 = GetBoolField(instance, FiPaSpectating, fallback: false, out ok);
			stringBuilder.Append("State: ");
			stringBuilder.Append("isLocal=").Append(boolField);
			stringBuilder.Append(" isDisabled=").Append(boolField2);
			stringBuilder.Append(" spawned=").Append(boolField3);
			stringBuilder.Append(" grounded=").Append(boolField9);
			stringBuilder.Append(" moving=").Append(boolField8);
			stringBuilder.Append(" sprinting=").Append(boolField5);
			stringBuilder.Append(" crouching=").Append(boolField4);
			stringBuilder.Append(" crawling=").Append(boolField6);
			stringBuilder.Append(" sliding=").Append(boolField7);
			stringBuilder.Append(" tumbling=").Append(boolField10);
			stringBuilder.Append(" spectating=").Append(boolField11);
			stringBuilder.Append('\n');
		}
		if (CfgShowPlayerDeepInternals.Value)
		{
			flag = true;
			float floatField = GetFloatField(instance, FiPaClientPositionDelta, float.NaN);
			float floatField2 = GetFloatField(instance, FiPaEnemyVisionFreezeTimer, float.NaN);
			stringBuilder.Append("Internals: ");
			stringBuilder.Append("clientPositionDelta=").Append(float.IsNaN(floatField) ? "Unknown" : floatField.ToString("0.###"));
			stringBuilder.Append(" enemyVisionFreezeTimer=").Append(float.IsNaN(floatField2) ? "Unknown" : floatField2.ToString("0.###"));
			stringBuilder.Append('\n');
		}
		if (CfgShowPlayerHealthSummary.Value || CfgShowPlayerHealthDeepInternals.Value)
		{
			flag = true;
			int num = int.MinValue;
			int num2 = int.MinValue;
			bool value3 = false;
			float f = float.NaN;
			try
			{
				if ((Object)(object)instance.playerHealth != (Object)null)
				{
					num = GetIntField(instance.playerHealth, FiPhHealth, int.MinValue);
					num2 = GetIntField(instance.playerHealth, FiPhMaxHealth, int.MinValue);
					value3 = GetBoolField(instance.playerHealth, FiPhGodMode, fallback: false, out ok);
					f = GetFloatField(instance.playerHealth, FiPhInvincibleTimer, float.NaN);
				}
			}
			catch
			{
			}
			if (CfgShowPlayerHealthSummary.Value)
			{
				stringBuilder.Append("HP: ");
				stringBuilder.Append((num != int.MinValue) ? num.ToString() : "Unknown");
				stringBuilder.Append("/");
				stringBuilder.Append((num2 != int.MinValue) ? num2.ToString() : "Unknown");
				stringBuilder.Append('\n');
			}
			if (CfgShowPlayerHealthDeepInternals.Value)
			{
				stringBuilder.Append("HP Internals: ");
				stringBuilder.Append("godMode=").Append(value3);
				stringBuilder.Append(" invincibleTimer=").Append(float.IsNaN(f) ? "Unknown" : f.ToString("0.###"));
				stringBuilder.Append('\n');
			}
		}
		if (CfgShowPlayerViewInfo.Value)
		{
			flag = true;
			Camera val2 = null;
			try
			{
				val2 = Camera.main;
			}
			catch
			{
			}
			if ((Object)(object)val2 != (Object)null)
			{
				Vector3 position2 = ((Component)val2).transform.position;
				Vector3 eulerAngles2 = ((Component)val2).transform.eulerAngles;
				Vector3 forward2 = ((Component)val2).transform.forward;
				stringBuilder.Append("View: ");
				stringBuilder.Append("Cam=").Append(((Object)val2).name);
				stringBuilder.Append(" Pos=").Append(position2.x.ToString("0.###")).Append(",")
					.Append(position2.y.ToString("0.###"))
					.Append(",")
					.Append(position2.z.ToString("0.###"));
				stringBuilder.Append(" Rot=").Append(eulerAngles2.x.ToString("0.###")).Append(",")
					.Append(eulerAngles2.y.ToString("0.###"))
					.Append(",")
					.Append(eulerAngles2.z.ToString("0.###"));
				stringBuilder.Append('\n');
				stringBuilder.Append("ViewFwd: ").Append(forward2.x.ToString("0.###")).Append(",")
					.Append(forward2.y.ToString("0.###"))
					.Append(",")
					.Append(forward2.z.ToString("0.###"))
					.Append('\n');
				stringBuilder.Append("FOV: ").Append(val2.fieldOfView.ToString("0.###")).Append(" Near=")
					.Append(val2.nearClipPlane.ToString("0.###"))
					.Append(" Far=")
					.Append(val2.farClipPlane.ToString("0.###"))
					.Append('\n');
			}
			else
			{
				stringBuilder.Append("View: Camera.main=None").Append('\n');
			}
		}
		if (!flag)
		{
			return null;
		}
		return WrapSection("Player", stringBuilder.ToString());
	}

	private string BuildInventorySectionText()
	{
		if (!CfgShowInventory.Value)
		{
			return null;
		}
		object singletonByTypeName = GetSingletonByTypeName("Inventory");
		StringBuilder stringBuilder = new StringBuilder(8192);
		bool flag = false;
		if (CfgShowInventoryHeader.Value)
		{
			flag = true;
			stringBuilder.Append("Inventory: ").Append((singletonByTypeName != null) ? FormatObjectShort(singletonByTypeName) : "None").Append('\n');
		}
		if (singletonByTypeName == null)
		{
			if (CfgShowInventorySpotsCount.Value || CfgShowInventorySpotEntries.Value)
			{
				flag = true;
				stringBuilder.Append("Spots: None").Append('\n');
			}
		}
		else if (CfgShowInventorySpotsCount.Value || CfgShowInventorySpotEntries.Value)
		{
			IEnumerable enumerable = GetMemberValue(singletonByTypeName, "inventorySpots") as IEnumerable;
			if (enumerable == null)
			{
				enumerable = GetMemberValue(singletonByTypeName, "InventorySpots") as IEnumerable;
			}
			if (enumerable == null)
			{
				flag = true;
				stringBuilder.Append("Spots: None").Append('\n');
			}
			else
			{
				List<object> list = new List<object>(32);
				foreach (object item in enumerable)
				{
					if (item != null)
					{
						list.Add(item);
					}
				}
				if (CfgShowInventorySpotsCount.Value)
				{
					flag = true;
					stringBuilder.Append("SpotsCount: ").Append(list.Count).Append('\n');
				}
				if (CfgShowInventorySpotEntries.Value)
				{
					flag = true;
					int num = Mathf.Clamp(CfgMaxListEntries.Value, 1, 500);
					int num2 = Mathf.Min(list.Count, num);
					for (int i = 0; i < num2; i++)
					{
						object instance = list[i];
						stringBuilder.Append("  [").Append(i).Append("] ");
						if (CfgShowInventorySpotIndex.Value)
						{
							int intMember = GetIntMember(instance, "inventorySpotIndex", int.MinValue);
							if (intMember == int.MinValue)
							{
								intMember = GetIntMember(instance, "Index", int.MinValue);
							}
							stringBuilder.Append("idx=").Append((intMember != int.MinValue) ? intMember.ToString() : "Unknown").Append(' ');
						}
						if (CfgShowInventorySpotCurrentItem.Value)
						{
							object obj = GetMemberValue(instance, "CurrentItem") ?? GetMemberValue(instance, "currentItem");
							stringBuilder.Append("item=").Append((obj != null) ? FormatObjectShort(obj) : "None").Append(' ');
						}
						stringBuilder.Append('\n');
					}
					if (list.Count > num2)
					{
						stringBuilder.Append("  ...(+").Append(list.Count - num2).Append(')')
							.Append('\n');
					}
				}
			}
		}
		if (!flag)
		{
			return null;
		}
		return WrapSection("Inventory", stringBuilder.ToString());
	}

	private string BuildEconomyRunSectionText()
	{
		StringBuilder stringBuilder = new StringBuilder(16384);
		bool flag = false;
		StatsManager val = null;
		if (CfgShowRunStatsCurrency.Value || CfgShowRunStatsCore.Value || CfgShowRunStatsAll.Value || CfgShowItemsPurchasedAll.Value || CfgShowItemsUpgradesPurchasedAll.Value)
		{
			val = StatsManager.instance;
			if ((Object)(object)val == (Object)null)
			{
				flag = true;
				stringBuilder.Append("StatsManager: None").Append('\n');
			}
		}
		if ((Object)(object)val != (Object)null)
		{
			if (CfgShowRunStatsCurrency.Value)
			{
				flag = true;
				int dictInt = GetDictInt(val.runStats, "currency", int.MinValue);
				stringBuilder.Append("Currency: ").Append((dictInt != int.MinValue) ? dictInt.ToString() : "Unknown").Append('\n');
			}
			if (CfgShowRunStatsCore.Value)
			{
				flag = true;
				int dictInt2 = GetDictInt(val.runStats, "level", int.MinValue);
				int dictInt3 = GetDictInt(val.runStats, "lives", int.MinValue);
				int dictInt4 = GetDictInt(val.runStats, "totalHaul", int.MinValue);
				int dictInt5 = GetDictInt(val.runStats, "chargingStationCharge", int.MinValue);
				int dictInt6 = GetDictInt(val.runStats, "chargingStationChargeTotal", int.MinValue);
				stringBuilder.Append("RunStatsCore: ");
				stringBuilder.Append("level=").Append((dictInt2 != int.MinValue) ? dictInt2.ToString() : "Unknown");
				stringBuilder.Append(" lives=").Append((dictInt3 != int.MinValue) ? dictInt3.ToString() : "Unknown");
				stringBuilder.Append(" totalHaul=").Append((dictInt4 != int.MinValue) ? dictInt4.ToString() : "Unknown");
				stringBuilder.Append(" charge=").Append((dictInt5 != int.MinValue) ? dictInt5.ToString() : "Unknown");
				stringBuilder.Append("/").Append((dictInt6 != int.MinValue) ? dictInt6.ToString() : "Unknown");
				stringBuilder.Append('\n');
			}
			if (CfgShowRunStatsAll.Value)
			{
				flag = true;
				AppendDictionarySection(stringBuilder, "runStats", val.runStats);
			}
			if (CfgShowItemsPurchasedAll.Value)
			{
				flag = true;
				AppendDictionarySection(stringBuilder, "itemsPurchased", val.itemsPurchased);
			}
			if (CfgShowItemsUpgradesPurchasedAll.Value)
			{
				flag = true;
				AppendDictionarySection(stringBuilder, "itemsUpgradesPurchased", val.itemsUpgradesPurchased);
			}
		}
		if (CfgShowRunManagerCore.Value || CfgShowRunManagerDeepInternals.Value)
		{
			object singletonByTypeName = GetSingletonByTypeName("RunManager");
			flag = true;
			if (singletonByTypeName == null)
			{
				stringBuilder.Append("RunManager: None").Append('\n');
			}
			else
			{
				if (CfgShowRunManagerCore.Value)
				{
					if (CfgShowRunManagerLevelCurrent.Value)
					{
						string value = "Unknown";
						object memberValue = GetMemberValue(singletonByTypeName, "levelCurrent");
						Object val2 = (Object)((memberValue is Object) ? memberValue : null);
						if (val2 != null && val2 != (Object)null)
						{
							value = val2.name;
						}
						else if (memberValue != null)
						{
							value = memberValue.ToString();
						}
						stringBuilder.Append("Run.levelCurrent: ").Append(value).Append('\n');
					}
					if (CfgShowRunManagerLevelsCompleted.Value)
					{
						int intMember = GetIntMember(singletonByTypeName, "levelsCompleted", int.MinValue);
						stringBuilder.Append("Run.levelsCompleted: ").Append((intMember != int.MinValue) ? intMember.ToString() : "Unknown").Append('\n');
					}
				}
				if (CfgShowRunManagerDeepInternals.Value)
				{
					if (CfgShowRunManagerLoadLevel.Value)
					{
						int intMemberByField = GetIntMemberByField(singletonByTypeName, FiRmLoadLevel, int.MinValue);
						stringBuilder.Append("Run.loadLevel: ").Append((intMemberByField != int.MinValue) ? intMemberByField.ToString() : "Unknown").Append('\n');
					}
					if (CfgShowRunManagerSaveLevel.Value)
					{
						int intMemberByField2 = GetIntMemberByField(singletonByTypeName, FiRmSaveLevel, int.MinValue);
						stringBuilder.Append("Run.saveLevel: ").Append((intMemberByField2 != int.MinValue) ? intMemberByField2.ToString() : "Unknown").Append('\n');
					}
					if (CfgShowRunManagerRunStarted.Value)
					{
						bool boolMemberByField = GetBoolMemberByField(singletonByTypeName, FiRmRunStarted, fallback: false);
						stringBuilder.Append("Run.runStarted: ").Append(boolMemberByField).Append('\n');
					}
					if (CfgShowRunManagerRunLives.Value)
					{
						int intMemberByField3 = GetIntMemberByField(singletonByTypeName, FiRmRunLives, int.MinValue);
						stringBuilder.Append("Run.runLives: ").Append((intMemberByField3 != int.MinValue) ? intMemberByField3.ToString() : "Unknown").Append('\n');
					}
					if (CfgShowRunManagerLevelFailed.Value)
					{
						bool boolMemberByField2 = GetBoolMemberByField(singletonByTypeName, FiRmLevelFailed, fallback: false);
						stringBuilder.Append("Run.levelFailed: ").Append(boolMemberByField2).Append('\n');
					}
					if (CfgShowRunManagerRestarting.Value)
					{
						bool boolMemberByField3 = GetBoolMemberByField(singletonByTypeName, FiRmRestarting, fallback: false);
						stringBuilder.Append("Run.restarting: ").Append(boolMemberByField3).Append('\n');
					}
					if (CfgShowRunManagerRestartingDone.Value)
					{
						bool boolMemberByField4 = GetBoolMemberByField(singletonByTypeName, FiRmRestartingDone, fallback: false);
						stringBuilder.Append("Run.restartingDone: ").Append(boolMemberByField4).Append('\n');
					}
					if (CfgShowRunManagerLevelsMax.Value)
					{
						int intMemberByField4 = GetIntMemberByField(singletonByTypeName, FiRmLevelsMax, int.MinValue);
						stringBuilder.Append("Run.levelsMax: ").Append((intMemberByField4 != int.MinValue) ? intMemberByField4.ToString() : "Unknown").Append('\n');
					}
				}
			}
		}
		if (!flag)
		{
			return null;
		}
		return WrapSection("Economy/Run", stringBuilder.ToString());
	}

	private string BuildGameDirectorSectionText()
	{
		if (!CfgShowGameDirector.Value)
		{
			return null;
		}
		object singletonByTypeName = GetSingletonByTypeName("GameDirector");
		StringBuilder stringBuilder = new StringBuilder(4096);
		bool flag = false;
		if (CfgShowGameDirectorHeader.Value)
		{
			flag = true;
			stringBuilder.Append("GameDirector: ").Append((singletonByTypeName != null) ? FormatObjectShort(singletonByTypeName) : "None").Append('\n');
		}
		if (singletonByTypeName != null)
		{
			if (CfgShowGameDirectorState.Value)
			{
				flag = true;
				object obj = GetMemberValue(singletonByTypeName, "currentState") ?? GetMemberValue(singletonByTypeName, "CurrentState");
				stringBuilder.Append("State: ").Append((obj != null) ? ValueToString(obj, CfgDeepDumpMaxStringLength.Value) : "Unknown").Append('\n');
			}
			if (CfgShowGameDirectorTimeScale.Value)
			{
				flag = true;
				object obj2 = GetMemberValue(singletonByTypeName, "TimeScale") ?? GetMemberValue(singletonByTypeName, "timeScale");
				stringBuilder.Append("TimeScale: ").Append((obj2 != null) ? ValueToString(obj2, CfgDeepDumpMaxStringLength.Value) : "Unknown").Append('\n');
			}
			if (CfgShowGameDirectorSeed.Value)
			{
				flag = true;
				object obj3 = GetMemberValue(singletonByTypeName, "RandomSeed") ?? GetMemberValue(singletonByTypeName, "Seed");
				stringBuilder.Append("Seed: ").Append((obj3 != null) ? ValueToString(obj3, CfgDeepDumpMaxStringLength.Value) : "Unknown").Append('\n');
			}
		}
		if (!flag)
		{
			return null;
		}
		return WrapSection("GameDirector", stringBuilder.ToString());
	}

	private string BuildShopManagerSectionText()
	{
		if (!CfgShowShopManager.Value)
		{
			return null;
		}
		object singletonByTypeName = GetSingletonByTypeName("ShopManager");
		StringBuilder stringBuilder = new StringBuilder(4096);
		bool flag = false;
		if (CfgShowShopManagerHeader.Value)
		{
			flag = true;
			stringBuilder.Append("ShopManager: ").Append((singletonByTypeName != null) ? FormatObjectShort(singletonByTypeName) : "None").Append('\n');
		}
		if (singletonByTypeName != null)
		{
			if (CfgShowShopManagerTotalCost.Value)
			{
				flag = true;
				object obj = GetMemberValue(singletonByTypeName, "totalCost") ?? GetMemberValue(singletonByTypeName, "TotalCost");
				stringBuilder.Append("TotalCost: ").Append((obj != null) ? ValueToString(obj, CfgDeepDumpMaxStringLength.Value) : "Unknown").Append('\n');
			}
			if (CfgShowShopManagerTotalCurrency.Value)
			{
				flag = true;
				object obj2 = GetMemberValue(singletonByTypeName, "totalCurrency") ?? GetMemberValue(singletonByTypeName, "TotalCurrency");
				stringBuilder.Append("TotalCurrency: ").Append((obj2 != null) ? ValueToString(obj2, CfgDeepDumpMaxStringLength.Value) : "Unknown").Append('\n');
			}
			if (CfgShowShopManagerIsThief.Value)
			{
				flag = true;
				object obj3 = GetMemberValue(singletonByTypeName, "isThief") ?? GetMemberValue(singletonByTypeName, "IsThief");
				stringBuilder.Append("IsThief: ").Append((obj3 != null) ? ValueToString(obj3, CfgDeepDumpMaxStringLength.Value) : "Unknown").Append('\n');
			}
			if (CfgShowShopManagerShoppingListCount.Value)
			{
				flag = true;
				object memberValue = GetMemberValue(singletonByTypeName, "shoppingList");
				if (memberValue is IEnumerable e && !(memberValue is string))
				{
					int value = CountEnumerable(e, 2000);
					stringBuilder.Append("ShoppingListCount: ").Append(value).Append('\n');
				}
				else
				{
					stringBuilder.Append("ShoppingListCount: Unknown").Append('\n');
				}
			}
		}
		if (!flag)
		{
			return null;
		}
		return WrapSection("ShopManager", stringBuilder.ToString());
	}

	private string BuildExtractionCartSectionText()
	{
		//IL_001e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0023: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d2: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e9: Unknown result type (might be due to invalid IL or missing references)
		//IL_015c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0161: Unknown result type (might be due to invalid IL or missing references)
		//IL_033f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0344: Unknown result type (might be due to invalid IL or missing references)
		//IL_017b: Unknown result type (might be due to invalid IL or missing references)
		//IL_017c: Unknown result type (might be due to invalid IL or missing references)
		//IL_035e: Unknown result type (might be due to invalid IL or missing references)
		//IL_035f: Unknown result type (might be due to invalid IL or missing references)
		PlayerAvatar instance = PlayerAvatar.instance;
		if ((Object)(object)instance == (Object)null)
		{
			return null;
		}
		Vector3 playerPositionSafe = GetPlayerPositionSafe(instance);
		object obj = null;
		object obj2 = null;
		bool flag = CfgShowExtractionNearest.Value && (CfgShowExtractionHeader.Value || CfgShowExtractionPosDist.Value || CfgShowExtractionHaulGoal.Value || CfgShowExtractionState.Value);
		bool flag2 = CfgShowCartNearest.Value && (CfgShowCartHeader.Value || CfgShowCartPosDist.Value || CfgShowCartState.Value || CfgShowCartHaulCurrent.Value || CfgShowCartItemsInCartCount.Value);
		if (flag)
		{
			obj = FindNearestObjectByTypeName("ExtractionPoint", playerPositionSafe);
		}
		if (flag2)
		{
			obj2 = FindNearestObjectByTypeName("PhysGrabCart", playerPositionSafe);
		}
		StringBuilder stringBuilder = new StringBuilder(8192);
		bool flag3 = false;
		if (flag)
		{
			if (CfgShowExtractionHeader.Value)
			{
				flag3 = true;
				stringBuilder.Append("NearestExtraction: ").Append((obj != null) ? FormatObjectShort(obj) : "None").Append('\n');
			}
			if (obj != null)
			{
				Vector3 transformPosition = GetTransformPosition(obj);
				if (CfgShowExtractionPosDist.Value)
				{
					flag3 = true;
					float num = Vector3.Distance(playerPositionSafe, transformPosition);
					stringBuilder.Append("PosDist: ").Append(transformPosition.x.ToString("0.###")).Append(",")
						.Append(transformPosition.y.ToString("0.###"))
						.Append(",")
						.Append(transformPosition.z.ToString("0.###"))
						.Append(" Dist=")
						.Append(num.ToString("0.###"))
						.Append('\n');
				}
				if (CfgShowExtractionHaulGoal.Value)
				{
					flag3 = true;
					object obj3 = GetMemberValue(obj, "haulGoal") ?? GetMemberValue(obj, "HaulGoal");
					stringBuilder.Append("HaulGoal: ").Append((obj3 != null) ? ValueToString(obj3, CfgDeepDumpMaxStringLength.Value) : "Unknown").Append('\n');
				}
				if (CfgShowExtractionState.Value)
				{
					flag3 = true;
					object obj4 = GetMemberValue(obj, "currentState") ?? GetMemberValue(obj, "CurrentState");
					stringBuilder.Append("State: ").Append((obj4 != null) ? ValueToString(obj4, CfgDeepDumpMaxStringLength.Value) : "Unknown").Append('\n');
				}
			}
		}
		if (flag2)
		{
			if (CfgShowCartHeader.Value)
			{
				flag3 = true;
				stringBuilder.Append("NearestCart: ").Append((obj2 != null) ? FormatObjectShort(obj2) : "None").Append('\n');
			}
			if (obj2 != null)
			{
				Vector3 transformPosition2 = GetTransformPosition(obj2);
				if (CfgShowCartPosDist.Value)
				{
					flag3 = true;
					float num2 = Vector3.Distance(playerPositionSafe, transformPosition2);
					stringBuilder.Append("PosDist: ").Append(transformPosition2.x.ToString("0.###")).Append(",")
						.Append(transformPosition2.y.ToString("0.###"))
						.Append(",")
						.Append(transformPosition2.z.ToString("0.###"))
						.Append(" Dist=")
						.Append(num2.ToString("0.###"))
						.Append('\n');
				}
				if (CfgShowCartState.Value)
				{
					flag3 = true;
					object obj5 = GetMemberValue(obj2, "currentState") ?? GetMemberValue(obj2, "CurrentState");
					stringBuilder.Append("State: ").Append((obj5 != null) ? ValueToString(obj5, CfgDeepDumpMaxStringLength.Value) : "Unknown").Append('\n');
				}
				if (CfgShowCartHaulCurrent.Value)
				{
					flag3 = true;
					object obj6 = GetMemberValue(obj2, "haulCurrent") ?? GetMemberValue(obj2, "HaulCurrent");
					stringBuilder.Append("HaulCurrent: ").Append((obj6 != null) ? ValueToString(obj6, CfgDeepDumpMaxStringLength.Value) : "Unknown").Append('\n');
				}
				if (CfgShowCartItemsInCartCount.Value)
				{
					flag3 = true;
					object obj7 = GetMemberValue(obj2, "itemsInCartCount") ?? GetMemberValue(obj2, "ItemsInCartCount");
					stringBuilder.Append("ItemsInCartCount: ").Append((obj7 != null) ? ValueToString(obj7, CfgDeepDumpMaxStringLength.Value) : "Unknown").Append('\n');
				}
			}
		}
		if (!flag3)
		{
			return null;
		}
		return WrapSection("Extraction/Cart", stringBuilder.ToString());
	}

	private string BuildPhotonSectionText()
	{
		PhotonSnapshot photonSnapshot = GetPhotonSnapshot();
		StringBuilder stringBuilder = new StringBuilder(4096);
		bool flag = false;
		if (CfgShowPhotonHeader.Value)
		{
			flag = true;
			stringBuilder.Append("Photon: ").Append(photonSnapshot.Available ? "Available" : "NotAvailable").Append('\n');
		}
		if (!photonSnapshot.Available)
		{
			if (CfgShowPhotonInRoom.Value || CfgShowPhotonIsMasterClient.Value || CfgShowPhotonRoomName.Value || CfgShowPhotonPlayerCount.Value || CfgShowPhotonLocalActorNumber.Value)
			{
				flag = true;
				stringBuilder.Append("Photon: NotAvailable").Append('\n');
			}
		}
		else
		{
			if (CfgShowPhotonInRoom.Value)
			{
				flag = true;
				stringBuilder.Append("InRoom: ").Append(photonSnapshot.InRoom).Append('\n');
			}
			if (CfgShowPhotonIsMasterClient.Value)
			{
				flag = true;
				stringBuilder.Append("IsMasterClient: ").Append(photonSnapshot.IsMasterClient).Append('\n');
			}
			if (CfgShowPhotonRoomName.Value)
			{
				flag = true;
				stringBuilder.Append("RoomName: ").Append(string.IsNullOrEmpty(photonSnapshot.RoomName) ? "None" : photonSnapshot.RoomName).Append('\n');
			}
			if (CfgShowPhotonPlayerCount.Value)
			{
				flag = true;
				stringBuilder.Append("PlayerCount: ").Append((photonSnapshot.PlayerCount >= 0) ? photonSnapshot.PlayerCount.ToString() : "Unknown").Append('\n');
			}
			if (CfgShowPhotonLocalActorNumber.Value)
			{
				flag = true;
				stringBuilder.Append("LocalActor: ").Append((photonSnapshot.LocalActorNumber >= 0) ? photonSnapshot.LocalActorNumber.ToString() : "Unknown").Append('\n');
			}
		}
		if (!flag)
		{
			return null;
		}
		return WrapSection("Photon", stringBuilder.ToString());
	}

	private string BuildEnvironmentSectionText()
	{
		//IL_00af: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
		PlayerAvatar instance = PlayerAvatar.instance;
		if ((Object)(object)instance == (Object)null)
		{
			return null;
		}
		RoomVolumeCheck roomVolumeCheck = instance.RoomVolumeCheck;
		if ((Object)(object)roomVolumeCheck == (Object)null)
		{
			return null;
		}
		RoomVolume val = null;
		try
		{
			List<RoomVolume> currentRooms = roomVolumeCheck.CurrentRooms;
			if (currentRooms != null && currentRooms.Count > 0)
			{
				val = currentRooms[0];
			}
		}
		catch
		{
		}
		StringBuilder stringBuilder = new StringBuilder(4096);
		bool flag = false;
		if (CfgShowRoomColor.Value)
		{
			flag = true;
			stringBuilder.Append("Color: ");
			if ((Object)(object)val != (Object)null)
			{
				Color color = val.Color;
				stringBuilder.Append(color.r.ToString("0.###")).Append(",").Append(color.g.ToString("0.###"))
					.Append(",")
					.Append(color.b.ToString("0.###"))
					.Append(",")
					.Append(color.a.ToString("0.###"));
			}
			else
			{
				stringBuilder.Append("None");
			}
			stringBuilder.Append('\n');
		}
		if (CfgShowReverbPresetName.Value)
		{
			flag = true;
			stringBuilder.Append("Reverb: ").Append(((Object)(object)val != (Object)null && (Object)(object)val.ReverbPreset != (Object)null) ? ((Object)val.ReverbPreset).name : "None").Append('\n');
		}
		if (CfgShowRoomAmbienceVolume.Value)
		{
			flag = true;
			stringBuilder.Append("AmbienceVol: ").Append(((Object)(object)val != (Object)null && (Object)(object)val.RoomAmbience != (Object)null) ? val.RoomAmbience.volume.ToString("0.###") : "None").Append('\n');
		}
		if (CfgShowRoomAmbienceOverrideSummary.Value)
		{
			flag = true;
			stringBuilder.Append("Override: ");
			if ((Object)(object)val != (Object)null && (Object)(object)val.RoomAmbienceOverride != (Object)null)
			{
				LevelAmbience roomAmbienceOverride = val.RoomAmbienceOverride;
				string value = (((Object)(object)roomAmbienceOverride.loopClip != (Object)null) ? ((Object)roomAmbienceOverride.loopClip).name : "None");
				int value2 = ((roomAmbienceOverride.breakers != null) ? roomAmbienceOverride.breakers.Count : 0);
				stringBuilder.Append("Clip=").Append(value);
				stringBuilder.Append(" Vol=").Append(roomAmbienceOverride.loopVolume.ToString("0.###"));
				stringBuilder.Append(" Breakers=").Append(value2);
			}
			else
			{
				stringBuilder.Append("None");
			}
			stringBuilder.Append('\n');
		}
		if (!flag)
		{
			return null;
		}
		return WrapSection("Environment", stringBuilder.ToString());
	}

	private string BuildMapSectionText()
	{
		PlayerAvatar instance = PlayerAvatar.instance;
		if ((Object)(object)instance == (Object)null)
		{
			return null;
		}
		RoomVolumeCheck roomVolumeCheck = instance.RoomVolumeCheck;
		if ((Object)(object)roomVolumeCheck == (Object)null)
		{
			return null;
		}
		RoomVolume val = null;
		try
		{
			List<RoomVolume> currentRooms = roomVolumeCheck.CurrentRooms;
			if (currentRooms != null && currentRooms.Count > 0)
			{
				val = currentRooms[0];
			}
		}
		catch
		{
		}
		MapModule val2 = null;
		try
		{
			val2 = (((Object)(object)val != (Object)null) ? val.MapModule : null);
		}
		catch
		{
		}
		StringBuilder stringBuilder = new StringBuilder(2048);
		bool flag = false;
		if (CfgShowMapModuleName.Value)
		{
			flag = true;
			stringBuilder.Append("MapModule: ").Append(((Object)(object)val2 != (Object)null) ? ((Object)val2).name : "None").Append('\n');
		}
		if (CfgShowMapModuleLinkedModuleName.Value)
		{
			flag = true;
			stringBuilder.Append("LinkedModule: ").Append(((Object)(object)val2 != (Object)null && (Object)(object)val2.module != (Object)null) ? ((Object)val2.module).name : "None").Append('\n');
		}
		if (!flag)
		{
			return null;
		}
		return WrapSection("Map", stringBuilder.ToString());
	}

	private string BuildDetailsSectionText()
	{
		//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b6: Unknown result type (might be due to invalid IL or missing references)
		//IL_0161: Unknown result type (might be due to invalid IL or missing references)
		//IL_0166: Unknown result type (might be due to invalid IL or missing references)
		PlayerAvatar instance = PlayerAvatar.instance;
		if ((Object)(object)instance == (Object)null)
		{
			return null;
		}
		RoomVolumeCheck roomVolumeCheck = instance.RoomVolumeCheck;
		if ((Object)(object)roomVolumeCheck == (Object)null)
		{
			return null;
		}
		RoomVolume val = null;
		try
		{
			List<RoomVolume> currentRooms = roomVolumeCheck.CurrentRooms;
			if (currentRooms != null && currentRooms.Count > 0)
			{
				val = currentRooms[0];
			}
		}
		catch
		{
		}
		StringBuilder stringBuilder = new StringBuilder(2048);
		bool flag = false;
		if (CfgShowTransformPosition.Value)
		{
			flag = true;
			stringBuilder.Append("Room Pos: ");
			if ((Object)(object)val != (Object)null)
			{
				Vector3 position = ((Component)val).transform.position;
				stringBuilder.Append(position.x.ToString("0.###")).Append(",").Append(position.y.ToString("0.###"))
					.Append(",")
					.Append(position.z.ToString("0.###"));
			}
			else
			{
				stringBuilder.Append("None");
			}
			stringBuilder.Append('\n');
		}
		if (CfgShowTransformRotationY.Value)
		{
			flag = true;
			stringBuilder.Append("Room RotY: ").Append(((Object)(object)val != (Object)null) ? ((Component)val).transform.eulerAngles.y.ToString("0.###") : "None").Append('\n');
		}
		if (CfgShowColliderCounts.Value)
		{
			flag = true;
			stringBuilder.Append("Colliders: ");
			if ((Object)(object)val != (Object)null)
			{
				int value = ((Component)val).GetComponentsInChildren<BoxCollider>(true).Length;
				int value2 = ((Component)val).GetComponentsInChildren<MeshCollider>(true).Length;
				stringBuilder.Append("Box=").Append(value).Append(" Mesh=")
					.Append(value2);
			}
			else
			{
				stringBuilder.Append("None");
			}
			stringBuilder.Append('\n');
		}
		if (!flag)
		{
			return null;
		}
		return WrapSection("Details", stringBuilder.ToString());
	}

	private string BuildDebugSectionText()
	{
		PlayerAvatar instance = PlayerAvatar.instance;
		if ((Object)(object)instance == (Object)null)
		{
			return null;
		}
		RoomVolumeCheck roomVolumeCheck = instance.RoomVolumeCheck;
		if ((Object)(object)roomVolumeCheck == (Object)null)
		{
			return null;
		}
		StringBuilder stringBuilder = new StringBuilder(2048);
		bool flag = false;
		if (CfgShowRoomVolumeCheckFlags.Value)
		{
			flag = true;
			stringBuilder.Append("RVC Flags: ");
			bool ok;
			bool boolField = GetBoolField(roomVolumeCheck, FiRvcInTruck, fallback: false, out ok);
			bool ok2;
			bool boolField2 = GetBoolField(roomVolumeCheck, FiRvcInExtractionPoint, fallback: false, out ok2);
			stringBuilder.Append("inTruck=").Append(ok ? boolField.ToString() : "Unknown");
			stringBuilder.Append(" inExtraction=").Append(ok2 ? boolField2.ToString() : "Unknown");
			stringBuilder.Append('\n');
		}
		if (CfgShowRoomVolumeCheckBox.Value)
		{
			flag = true;
			stringBuilder.Append("RVC Box: ");
			stringBuilder.Append("pos=").Append(roomVolumeCheck.CheckPosition.x.ToString("0.###")).Append(",")
				.Append(roomVolumeCheck.CheckPosition.y.ToString("0.###"))
				.Append(",")
				.Append(roomVolumeCheck.CheckPosition.z.ToString("0.###"));
			stringBuilder.Append(" size=").Append(roomVolumeCheck.currentSize.x.ToString("0.###")).Append(",")
				.Append(roomVolumeCheck.currentSize.y.ToString("0.###"))
				.Append(",")
				.Append(roomVolumeCheck.currentSize.z.ToString("0.###"));
			stringBuilder.Append('\n');
		}
		if (!flag)
		{
			return null;
		}
		return WrapSection("Debug", stringBuilder.ToString());
	}

	private string BuildPlayerDeepDumpText()
	{
		PlayerAvatar instance = PlayerAvatar.instance;
		if ((Object)(object)instance == (Object)null)
		{
			return null;
		}
		StringBuilder stringBuilder = new StringBuilder(16384);
		stringBuilder.Append("PlayerDeepDump:").Append('\n');
		AppendDeepDump(stringBuilder, instance, "PlayerAvatar");
		return WrapSection("DeepDump.Player", stringBuilder.ToString());
	}

	private string BuildInventoryDeepDumpText()
	{
		object singletonByTypeName = GetSingletonByTypeName("Inventory");
		StringBuilder stringBuilder = new StringBuilder(16384);
		stringBuilder.Append("InventoryDeepDump:").Append('\n');
		if (singletonByTypeName != null)
		{
			AppendDeepDump(stringBuilder, singletonByTypeName, "Inventory");
			IEnumerable enumerable = (GetMemberValue(singletonByTypeName, "inventorySpots") as IEnumerable) ?? (GetMemberValue(singletonByTypeName, "InventorySpots") as IEnumerable);
			if (enumerable != null)
			{
				int num = Mathf.Clamp(CfgMaxListEntries.Value, 1, 200);
				int num2 = 0;
				foreach (object item in enumerable)
				{
					num2++;
					if (num2 > num)
					{
						stringBuilder.Append("  ...(+more spots)").Append('\n');
						break;
					}
					if (item != null)
					{
						stringBuilder.Append("  Spot[").Append(num2 - 1).Append("]: ")
							.Append(FormatObjectShort(item))
							.Append('\n');
						AppendDeepDump(stringBuilder, item, "InventorySpot");
					}
				}
			}
		}
		else
		{
			stringBuilder.Append("  Inventory=None").Append('\n');
		}
		return WrapSection("DeepDump.Inventory", stringBuilder.ToString());
	}

	private string BuildGameDirectorDeepDumpText()
	{
		object singletonByTypeName = GetSingletonByTypeName("GameDirector");
		StringBuilder stringBuilder = new StringBuilder(16384);
		stringBuilder.Append("GameDirectorDeepDump:").Append('\n');
		if (singletonByTypeName != null)
		{
			AppendDeepDump(stringBuilder, singletonByTypeName, "GameDirector");
		}
		else
		{
			stringBuilder.Append("  GameDirector=None").Append('\n');
		}
		return WrapSection("DeepDump.GameDirector", stringBuilder.ToString());
	}

	private string BuildShopManagerDeepDumpText()
	{
		object singletonByTypeName = GetSingletonByTypeName("ShopManager");
		StringBuilder stringBuilder = new StringBuilder(16384);
		stringBuilder.Append("ShopManagerDeepDump:").Append('\n');
		if (singletonByTypeName != null)
		{
			AppendDeepDump(stringBuilder, singletonByTypeName, "ShopManager");
		}
		else
		{
			stringBuilder.Append("  ShopManager=None").Append('\n');
		}
		return WrapSection("DeepDump.ShopManager", stringBuilder.ToString());
	}

	private string BuildExtractionCartDeepDumpText()
	{
		//IL_001e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0023: Unknown result type (might be due to invalid IL or missing references)
		//IL_002a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0037: Unknown result type (might be due to invalid IL or missing references)
		PlayerAvatar instance = PlayerAvatar.instance;
		if ((Object)(object)instance == (Object)null)
		{
			return null;
		}
		Vector3 playerPositionSafe = GetPlayerPositionSafe(instance);
		object obj = FindNearestObjectByTypeName("ExtractionPoint", playerPositionSafe);
		object obj2 = FindNearestObjectByTypeName("PhysGrabCart", playerPositionSafe);
		StringBuilder stringBuilder = new StringBuilder(16384);
		stringBuilder.Append("ExtractionCartDeepDump:").Append('\n');
		if (obj != null)
		{
			stringBuilder.Append("  Extraction: ").Append(FormatObjectShort(obj)).Append('\n');
			AppendDeepDump(stringBuilder, obj, "ExtractionPoint");
		}
		else
		{
			stringBuilder.Append("  Extraction=None").Append('\n');
		}
		if (obj2 != null)
		{
			stringBuilder.Append("  Cart: ").Append(FormatObjectShort(obj2)).Append('\n');
			AppendDeepDump(stringBuilder, obj2, "PhysGrabCart");
		}
		else
		{
			stringBuilder.Append("  Cart=None").Append('\n');
		}
		return WrapSection("DeepDump.ExtractionCart", stringBuilder.ToString());
	}

	private string BuildPhotonDeepDumpText()
	{
		PhotonSnapshot photonSnapshot = GetPhotonSnapshot();
		StringBuilder stringBuilder = new StringBuilder(16384);
		stringBuilder.Append("PhotonDeepDump:").Append('\n');
		if (!photonSnapshot.Available)
		{
			stringBuilder.Append("  PhotonNetwork=None").Append('\n');
			return WrapSection("DeepDump.Photon", stringBuilder.ToString());
		}
		if (photonSnapshot.CurrentRoomObj != null)
		{
			stringBuilder.Append("  CurrentRoom: ").Append(FormatObjectShort(photonSnapshot.CurrentRoomObj)).Append('\n');
			AppendDeepDump(stringBuilder, photonSnapshot.CurrentRoomObj, "CurrentRoom");
		}
		else
		{
			stringBuilder.Append("  CurrentRoom=None").Append('\n');
		}
		if (photonSnapshot.LocalPlayerObj != null)
		{
			stringBuilder.Append("  LocalPlayer: ").Append(FormatObjectShort(photonSnapshot.LocalPlayerObj)).Append('\n');
			AppendDeepDump(stringBuilder, photonSnapshot.LocalPlayerObj, "LocalPlayer");
		}
		else
		{
			stringBuilder.Append("  LocalPlayer=None").Append('\n');
		}
		return WrapSection("DeepDump.Photon", stringBuilder.ToString());
	}

	private string BuildEconomyScanText()
	{
		StringBuilder stringBuilder = new StringBuilder(16384);
		stringBuilder.Append("EconomyScan:").Append('\n');
		AppendEconomyScan(stringBuilder);
		return WrapSection("DeepScan.Economy", stringBuilder.ToString());
	}

	private string BuildEconomyDeepDumpText()
	{
		StringBuilder stringBuilder = new StringBuilder(16384);
		stringBuilder.Append("EconomyDeepDump:").Append('\n');
		StatsManager instance = StatsManager.instance;
		object singletonByTypeName = GetSingletonByTypeName("RunManager");
		object singletonByTypeName2 = GetSingletonByTypeName("ShopManager");
		object singletonByTypeName3 = GetSingletonByTypeName("GameDirector");
		object singletonByTypeName4 = GetSingletonByTypeName("Inventory");
		if ((Object)(object)instance != (Object)null)
		{
			stringBuilder.Append("  StatsManager:").Append('\n');
			AppendDeepDump(stringBuilder, instance, "StatsManager");
		}
		else
		{
			stringBuilder.Append("  StatsManager=None").Append('\n');
		}
		if (singletonByTypeName != null)
		{
			stringBuilder.Append("  RunManager:").Append('\n');
			AppendDeepDump(stringBuilder, singletonByTypeName, "RunManager");
		}
		else
		{
			stringBuilder.Append("  RunManager=None").Append('\n');
		}
		if (singletonByTypeName2 != null)
		{
			stringBuilder.Append("  ShopManager:").Append('\n');
			AppendDeepDump(stringBuilder, singletonByTypeName2, "ShopManager");
		}
		if (singletonByTypeName3 != null)
		{
			stringBuilder.Append("  GameDirector:").Append('\n');
			AppendDeepDump(stringBuilder, singletonByTypeName3, "GameDirector");
		}
		if (singletonByTypeName4 != null)
		{
			stringBuilder.Append("  Inventory:").Append('\n');
			AppendDeepDump(stringBuilder, singletonByTypeName4, "Inventory");
		}
		return WrapSection("DeepDump.Economy", stringBuilder.ToString());
	}

	private void MeasurePanel(string text, out float width, out float height)
	{
		//IL_00e4: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ee: Expected O, but got Unknown
		//IL_00e9: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ee: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f0: Unknown result type (might be due to invalid IL or missing references)
		//IL_0100: Unknown result type (might be due to invalid IL or missing references)
		int num = 23;
		num = num * 31 + (text?.GetHashCode() ?? 0);
		num = num * 31 + Mathf.Max(8, CfgFontSize.Value);
		num = num * 31 + Mathf.Max(0, CfgLineSpacing.Value);
		num = num * 31 + CfgPaddingX.Value;
		num = num * 31 + CfgPaddingY.Value;
		if (_measureKey == num && _cachedPanelWidth > 0f && _cachedPanelHeight > 0f)
		{
			width = _cachedPanelWidth;
			height = _cachedPanelHeight;
			return;
		}
		string[] array = (text ?? string.Empty).Split('\n');
		int num2 = Mathf.Max(1, array.Length);
		float num3 = 0f;
		for (int i = 0; i < array.Length; i++)
		{
			Vector2 val = _labelStyle.CalcSize(new GUIContent(array[i] ?? string.Empty));
			if (val.x > num3)
			{
				num3 = val.x;
			}
		}
		float num4 = Mathf.Max(1f, _labelStyle.lineHeight);
		float num5 = (float)num2 * num4 + (float)((num2 - 1) * Mathf.Max(0, CfgLineSpacing.Value));
		width = num3 + (float)(CfgPaddingX.Value * 2);
		height = num5 + (float)(CfgPaddingY.Value * 2);
		_measureKey = num;
		_cachedPanelWidth = width;
		_cachedPanelHeight = height;
	}

	private void InvalidateMeasureCache()
	{
		_measureKey = 0;
		_cachedPanelWidth = 0f;
		_cachedPanelHeight = 0f;
	}

	private Rect GetAnchoredRect(float width, float height)
	{
		//IL_00df: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e4: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e8: Unknown result type (might be due to invalid IL or missing references)
		float num = 0f;
		float num2 = 0f;
		int value = CfgOffsetX.Value;
		int value2 = CfgOffsetY.Value;
		switch (CfgAnchor.Value)
		{
		case OverlayAnchor.TopLeft:
			num = value;
			num2 = value2;
			break;
		case OverlayAnchor.TopRight:
			num = (float)Screen.width - width - (float)value;
			num2 = value2;
			break;
		case OverlayAnchor.BottomLeft:
			num = value;
			num2 = (float)Screen.height - height - (float)value2;
			break;
		case OverlayAnchor.BottomRight:
			num = (float)Screen.width - width - (float)value;
			num2 = (float)Screen.height - height - (float)value2;
			break;
		case OverlayAnchor.Center:
			num = ((float)Screen.width - width) * 0.5f + (float)value;
			num2 = ((float)Screen.height - height) * 0.5f + (float)value2;
			break;
		case OverlayAnchor.CenterTop:
			num = ((float)Screen.width - width) * 0.5f + (float)value;
			num2 = value2;
			break;
		}
		return new Rect(num, num2, width, height);
	}

	private PhotonSnapshot GetPhotonSnapshot()
	{
		PhotonSnapshot photonSnapshot = default(PhotonSnapshot);
		photonSnapshot.Available = false;
		photonSnapshot.InRoom = false;
		photonSnapshot.IsMasterClient = false;
		photonSnapshot.RoomName = null;
		photonSnapshot.PlayerCount = -1;
		photonSnapshot.LocalActorNumber = -1;
		photonSnapshot.CurrentRoomObj = null;
		photonSnapshot.LocalPlayerObj = null;
		PhotonSnapshot result = photonSnapshot;
		Type type = Type.GetType("Photon.Pun.PhotonNetwork, PhotonUnityNetworking");
		if (type == null)
		{
			type = FindTypeByFullName("Photon.Pun.PhotonNetwork");
		}
		if (type == null)
		{
			return result;
		}
		result.Available = true;
		try
		{
			result.InRoom = GetStaticBool(type, "InRoom", fallback: false);
			result.IsMasterClient = GetStaticBool(type, "IsMasterClient", fallback: false);
			object obj = (result.CurrentRoomObj = GetStaticValue(type, "CurrentRoom"));
			if (obj != null)
			{
				string text = GetMemberValue(obj, "Name") as string;
				if (string.IsNullOrEmpty(text))
				{
					text = GetMemberValue(obj, "name") as strin