using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using BepInEx; using BepInEx.Configuration; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: AssemblyVersion("0.0.0.0")] namespace YapyapMinimap; [BepInPlugin("com.patty.yapyap.minimap", "YAPYAP Minimap", "2.0.0")] public class MinimapPlugin : BaseUnityPlugin { public const string GUID = "com.patty.yapyap.minimap"; public const string NAME = "YAPYAP Minimap"; public const string VERSION = "2.0.0"; private ConfigEntry _enabled; private ConfigEntry _toggleKey; private ConfigEntry _reloadKey; private ConfigEntry _circular; private ConfigEntry _flipVertical; private ConfigEntry _sizePct; private ConfigEntry _anchor; private ConfigEntry _offsetX; private ConfigEntry _offsetY; private ConfigEntry _borderColorHex; private ConfigEntry _expandKey; private ConfigEntry _expandSizePct; private ConfigEntry _expandRadius; private ConfigEntry _refreshHz; private ConfigEntry _followCamera; private ConfigEntry _orthoSize; private ConfigEntry _cameraHeight; private ConfigEntry _ceilingClear; private ConfigEntry _floorDepth; private ConfigEntry _rotateWithPlayer; private ConfigEntry _refreshInterval; private ConfigEntry _playerTypeName; private ConfigEntry _playerKeywords; private ConfigEntry _requirePlayerControlled; private ConfigEntry _pcMembers; private ConfigEntry _showExtraction; private ConfigEntry _extractionTypeName; private ConfigEntry _extractionKeywords; private ConfigEntry _extractionColorHex; private Camera _mapCam; private RenderTexture _rt; private GameObject _camGo; private Type _playerType; private float _nextScan; private Transform _local; private readonly List _mates = new List(); private Type _extractionType; private Transform _extraction; private Vector3 _viewOrigin; private float _viewYaw; private bool _viewActive; private bool _expanded; private bool _active; private float _nextRenderTick; private Texture2D _bg; private Texture2D _dotMate; private Texture2D _border; private Texture2D _arrow; private Texture2D _arrowWhite; private Texture2D _dotWhite; private GUIStyle _labelStyle; private Texture2D _mapTex; private Texture2D _ring; private Texture2D _disc; private byte[] _alphaMask; private int _maskSize = -1; private Color32 _ringColor; private string _cfgPath; private DateTime _cfgMtime; private float _nextCfgCheck; private bool _humanFlagWarned; private void Awake() { _enabled = ((BaseUnityPlugin)this).Config.Bind("General", "Enabled", true, "Master switch for the minimap."); _toggleKey = ((BaseUnityPlugin)this).Config.Bind("General", "ToggleKey", (KeyCode)109, "Key to show/hide the minimap."); _reloadKey = ((BaseUnityPlugin)this).Config.Bind("General", "ReloadConfigKey", (KeyCode)289, "Press in-game to re-read this config file so position/size/colour tweaks apply WITHOUT restarting."); _circular = ((BaseUnityPlugin)this).Config.Bind("Layout", "Circular", true, "Round minimap (true) or square (false)."); _flipVertical = ((BaseUnityPlugin)this).Config.Bind("Layout", "FlipVertical", false, "Only used for the round map: flip it vertically if the geometry looks mirrored top-to-bottom on your graphics card."); _sizePct = ((BaseUnityPlugin)this).Config.Bind("Layout", "SizePercent", 0.075f, "Map diameter as a fraction of screen HEIGHT (so it's the same relative size at any resolution). ~0.075 roughly matches the compass dial."); _anchor = ((BaseUnityPlugin)this).Config.Bind("Layout", "Anchor", 1, "Screen corner the map is positioned from: 0=TopLeft 1=TopRight 2=BottomLeft 3=BottomRight. The compass is top-right (1)."); _offsetX = ((BaseUnityPlugin)this).Config.Bind("Layout", "OffsetX", 0.139f, "Horizontal distance from the anchor corner to the map CENTRE, as a fraction of screen HEIGHT. Stable across resolutions and aspect ratios."); _offsetY = ((BaseUnityPlugin)this).Config.Bind("Layout", "OffsetY", 0.103f, "Vertical distance from the anchor corner to the map CENTRE, as a fraction of screen HEIGHT."); _borderColorHex = ((BaseUnityPlugin)this).Config.Bind("Layout", "BorderColorHex", "B5B9C2", "Hex RRGGBB colour of the round border ring. Default is moon-grey. Examples: B5B9C2 (grey), CCBF66 (gold)."); _expandKey = ((BaseUnityPlugin)this).Config.Bind("Layout", "ExpandKey", (KeyCode)9, "HOLD this key to temporarily enlarge the map to the screen centre and zoom out. Release to return to normal."); _expandSizePct = ((BaseUnityPlugin)this).Config.Bind("Layout", "ExpandSizePercent", 0.7f, "Diameter of the enlarged map as a fraction of screen height (while holding ExpandKey)."); _expandRadius = ((BaseUnityPlugin)this).Config.Bind("Layout", "ExpandWorldRadius", 45f, "World units shown from centre to edge while enlarged. Bigger = covers more of the level."); _followCamera = ((BaseUnityPlugin)this).Config.Bind("Camera", "FollowMainCamera", true, "Centre and rotate the map using the main game camera (recommended; tracks and turns with the player reliably). If false, follows the detected player object instead."); _orthoSize = ((BaseUnityPlugin)this).Config.Bind("Camera", "WorldRadius", 18f, "World units shown from map centre to edge. Bigger = more zoomed out."); _cameraHeight = ((BaseUnityPlugin)this).Config.Bind("Camera", "Height", 40f, "How far above the player the map camera floats."); _ceilingClear = ((BaseUnityPlugin)this).Config.Bind("Camera", "CeilingClearance", 3f, "Units above the player kept visible. Anything higher (ceilings/roof) is clipped so you can see into rooms."); _floorDepth = ((BaseUnityPlugin)this).Config.Bind("Camera", "FloorDepth", 12f, "Units below the player still drawn (covers stairs/lower floors)."); _rotateWithPlayer = ((BaseUnityPlugin)this).Config.Bind("Camera", "RotateWithPlayer", false, "If true the map rotates so the player always faces up. If false the map is fixed north-up (the player arrow turns instead)."); _refreshInterval = ((BaseUnityPlugin)this).Config.Bind("Players", "RescanInterval", 0.5f, "Seconds between re-scanning the scene for players."); _playerTypeName = ((BaseUnityPlugin)this).Config.Bind("Players", "PlayerTypeName", "Pawn", "Exact name of the player component. For YAPYAP this is 'Pawn'. Blank = auto-discover (but auto can mis-pick Unity types like PlayerInput, so the explicit name is safer)."); _playerKeywords = ((BaseUnityPlugin)this).Config.Bind("Players", "DiscoveryKeywords", "Pawn,PlayerControlled,Player", "Comma-separated name hints used when auto-discovering the player type. Auto-discovery picks the matching type with the most live instances, which is the 'Pawn' base class."); _requirePlayerControlled = ((BaseUnityPlugin)this).Config.Bind("Players", "OnlyHumanControlled", true, "Show dots only for human-controlled pawns (teammates), not AI guardians/monsters. Uses YAPYAP's networked 'IsPlayerControlled' flag. If teammates ever stop showing, set this false."); _pcMembers = ((BaseUnityPlugin)this).Config.Bind("Players", "HumanFlagMembers", "IsPlayerControlled,NetworkisPlayerControlled,isPlayerControlled,_isPlayerControlled", "Candidate bool member names read to tell a human pawn from an AI pawn. First one found on a pawn wins."); _showExtraction = ((BaseUnityPlugin)this).Config.Bind("Extraction", "ShowExtractionMarker", true, "Show a marker on the map that points toward the extraction point. Only appears once an extraction point exists in the level."); _extractionTypeName = ((BaseUnityPlugin)this).Config.Bind("Extraction", "ExtractionTypeName", "TeleportExtractionCircle", "Exact component name of the extraction point. Leave default for YAPYAP; blank to auto-discover via keywords."); _extractionKeywords = ((BaseUnityPlugin)this).Config.Bind("Extraction", "ExtractionKeywords", "ExtractionCircle,Extraction,Extract", "Fallback name hints used to auto-discover the extraction point if the exact name isn't found."); _extractionColorHex = ((BaseUnityPlugin)this).Config.Bind("Extraction", "MarkerColorHex", "FFB432", "Hex RRGGBB colour of the extraction marker. Default is amber."); _refreshHz = ((BaseUnityPlugin)this).Config.Bind("Performance", "MapRefreshHz", 0f, "How many times per second the map image updates (camera render + circular-mask readback — the two costly steps). 0 = every frame (smoothest; matches the original behaviour). On slower machines / macOS Metal, set e.g. 10 to cut redraw cost: the geometry refreshes less often but the markers and overlay stay smooth."); BuildTextures(); _cfgPath = ((BaseUnityPlugin)this).Config.ConfigFilePath; try { _cfgMtime = File.GetLastWriteTimeUtc(_cfgPath); } catch { } ((BaseUnityPlugin)this).Logger.LogInfo((object)("YAPYAP Minimap 2.0.0 loaded at " + Screen.width + "x" + Screen.height + ". Config auto-reloads on file change.")); } private void OnDestroy() { if ((Object)(object)_camGo != (Object)null) { Object.Destroy((Object)(object)_camGo); } if ((Object)(object)_rt != (Object)null) { _rt.Release(); Object.Destroy((Object)(object)_rt); } if ((Object)(object)_mapTex != (Object)null) { Object.Destroy((Object)(object)_mapTex); } if ((Object)(object)_ring != (Object)null) { Object.Destroy((Object)(object)_ring); } if ((Object)(object)_disc != (Object)null) { Object.Destroy((Object)(object)_disc); } } private void Update() { //IL_000c: 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) //IL_0085: Unknown result type (might be due to invalid IL or missing references) MaybeReloadConfig(); if (Input.GetKeyDown(_toggleKey.Value)) { _enabled.Value = !_enabled.Value; } if (Input.GetKeyDown(_reloadKey.Value)) { try { ((BaseUnityPlugin)this).Config.Reload(); ((BaseUnityPlugin)this).Logger.LogInfo((object)"Config reloaded from disk."); } catch (Exception ex) { ((BaseUnityPlugin)this).Logger.LogWarning((object)("Config reload failed: " + ex.Message)); } } try { _expanded = Input.GetKey(_expandKey.Value); } catch { _expanded = false; } _active = _enabled.Value || _expanded; if (!_active) { if ((Object)(object)_mapCam != (Object)null) { ((Behaviour)_mapCam).enabled = false; } return; } if (Time.unscaledTime >= _nextScan) { _nextScan = Time.unscaledTime + Mathf.Max(0.1f, _refreshInterval.Value); ScanPlayers(); } EnsureCamera(CurrentTexSize()); UpdateCameraPose(); } private int CurrentDisplaySize() { float num = (_expanded ? _expandSizePct.Value : _sizePct.Value); return Mathf.Max(64, Mathf.RoundToInt(num * (float)Screen.height)); } private int CurrentTexSize() { return Mathf.Clamp(CurrentDisplaySize(), 64, 512); } private float CurrentRadius() { return Mathf.Max(2f, _expanded ? _expandRadius.Value : _orthoSize.Value); } private void MaybeReloadConfig() { if (Time.unscaledTime < _nextCfgCheck) { return; } _nextCfgCheck = Time.unscaledTime + 1f; if (string.IsNullOrEmpty(_cfgPath)) { return; } try { DateTime lastWriteTimeUtc = File.GetLastWriteTimeUtc(_cfgPath); if (lastWriteTimeUtc != _cfgMtime) { _cfgMtime = lastWriteTimeUtc; ((BaseUnityPlugin)this).Config.Reload(); ((BaseUnityPlugin)this).Logger.LogInfo((object)"Config reloaded (file changed)."); } } catch { } } private Type ResolvePlayerType() { if (_playerType != null) { return _playerType; } if (!string.IsNullOrEmpty(_playerTypeName.Value)) { _playerType = FindTypeByName(_playerTypeName.Value); if (_playerType != null) { ((BaseUnityPlugin)this).Logger.LogInfo((object)("Using configured player type: " + _playerType.FullName)); return _playerType; } ((BaseUnityPlugin)this).Logger.LogWarning((object)("Configured PlayerTypeName '" + _playerTypeName.Value + "' not found; falling back to auto-discovery.")); } string[] source = (from k in _playerKeywords.Value.Split(new char[1] { ',' }) select k.Trim() into k where k.Length > 0 select k).ToArray(); Type type = null; int num = 0; foreach (Type item in EnumerateBehaviourTypes()) { string i = item.Name; if (source.Any((string k) => i.IndexOf(k, StringComparison.OrdinalIgnoreCase) >= 0)) { int num2; try { num2 = Object.FindObjectsOfType(item).Length; } catch { continue; } if (num2 > num) { num = num2; type = item; } } } if (type != null) { _playerType = type; ((BaseUnityPlugin)this).Logger.LogInfo((object)("Auto-discovered player type '" + type.FullName + "' (" + num + " instance(s) in scene).")); } return _playerType; } private void ScanPlayers() { _mates.Clear(); _local = null; Type type = ResolvePlayerType(); if (type == null) { return; } Object[] array = Object.FindObjectsOfType(type); if (array == null || array.Length == 0) { return; } List list = (from c in array.OfType() where (Object)(object)c != (Object)null && c.gameObject.activeInHierarchy select c.transform).ToList(); List list2 = (_requirePlayerControlled.Value ? FilterHumanControlled(list) : list); _local = PickLocalPlayer(list2); foreach (Transform item in list2) { if ((Object)(object)item != (Object)(object)_local) { _mates.Add(item); } } ScanExtraction(); } private void ScanExtraction() { //IL_0055: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_0098: 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_009e: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Unknown result type (might be due to invalid IL or missing references) _extraction = null; if (!_showExtraction.Value) { return; } Type type = ResolveExtractionType(); if (type == null) { return; } Object[] array = Object.FindObjectsOfType(type); if (array == null || array.Length == 0) { return; } Vector3 val = (((Object)(object)Camera.main != (Object)null) ? ((Component)Camera.main).transform.position : _viewOrigin); float num = float.MaxValue; foreach (Component item in array.OfType()) { if (!((Object)(object)item == (Object)null) && item.gameObject.activeInHierarchy) { Vector3 val2 = item.transform.position - val; float sqrMagnitude = ((Vector3)(ref val2)).sqrMagnitude; if (sqrMagnitude < num) { num = sqrMagnitude; _extraction = item.transform; } } } } private Type ResolveExtractionType() { if (_extractionType != null) { return _extractionType; } if (!string.IsNullOrEmpty(_extractionTypeName.Value)) { _extractionType = FindTypeByName(_extractionTypeName.Value); if (_extractionType != null) { return _extractionType; } } string[] source = (from s in _extractionKeywords.Value.Split(new char[1] { ',' }) select s.Trim() into s where s.Length > 0 select s).ToArray(); Type type = null; int num = 0; foreach (Type t in EnumerateBehaviourTypes()) { Func predicate = (string k) => t.Name.IndexOf(k, StringComparison.OrdinalIgnoreCase) >= 0; if (source.Any(predicate)) { int num2; try { num2 = Object.FindObjectsOfType(t).Length; } catch { continue; } if (num2 > num) { num = num2; type = t; } } } if (type != null) { _extractionType = type; ((BaseUnityPlugin)this).Logger.LogInfo((object)("Extraction type: " + type.FullName)); } return _extractionType; } private List FilterHumanControlled(List pawns) { string[] names = (from s in _pcMembers.Value.Split(new char[1] { ',' }) select s.Trim() into s where s.Length > 0 select s).ToArray(); List list = new List(); bool flag = false; foreach (Transform pawn in pawns) { bool found; bool flag2 = ReadBoolAcrossComponents(pawn, names, out found); if (found) { flag = true; if (flag2) { list.Add(pawn); } } } if (!flag) { if (!_humanFlagWarned) { _humanFlagWarned = true; ((BaseUnityPlugin)this).Logger.LogWarning((object)"Could not read an IsPlayerControlled flag on any pawn; showing all pawns (AI included). Adjust Players/HumanFlagMembers if teammate dots look wrong."); } return pawns; } return list; } private Transform PickLocalPlayer(List players) { //IL_00ea: Unknown result type (might be due to invalid IL or missing references) //IL_00f5: Unknown result type (might be due to invalid IL or missing references) //IL_00fa: Unknown result type (might be due to invalid IL or missing references) //IL_00ff: Unknown result type (might be due to invalid IL or missing references) if (players.Count == 0) { return null; } if (players.Count == 1) { return players[0]; } foreach (Transform player in players) { if (HasTruthyMember(player, "isLocalPlayer", "IsOwner", "isOwned", "IsLocalPlayer", "IsMine", "isMine")) { return player; } } Camera main = Camera.main; if ((Object)(object)main != (Object)null) { Transform val = ((Component)main).transform; while ((Object)(object)val != (Object)null) { if (players.Contains(val)) { return val; } val = val.parent; } Transform val2 = null; float num = float.MaxValue; foreach (Transform player2 in players) { Vector3 val3 = player2.position - ((Component)main).transform.position; float sqrMagnitude = ((Vector3)(ref val3)).sqrMagnitude; if (sqrMagnitude < num) { num = sqrMagnitude; val2 = player2; } } if ((Object)(object)val2 != (Object)null) { return val2; } } return players[0]; } private void EnsureCamera(int size) { //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Expected O, but got Unknown //IL_007c: Unknown result type (might be due to invalid IL or missing references) //IL_0117: Unknown result type (might be due to invalid IL or missing references) //IL_011d: Expected O, but got Unknown if ((Object)(object)_mapCam == (Object)null) { _camGo = new GameObject("YapyapMinimapCamera"); Object.DontDestroyOnLoad((Object)(object)_camGo); ((Object)_camGo).hideFlags = (HideFlags)61; _mapCam = _camGo.AddComponent(); _mapCam.orthographic = true; _mapCam.clearFlags = (CameraClearFlags)2; _mapCam.backgroundColor = new Color(0.05f, 0.06f, 0.09f, 1f); _mapCam.cullingMask = -1; _mapCam.depth = -100f; _mapCam.allowHDR = false; _mapCam.allowMSAA = false; ((Behaviour)_mapCam).enabled = false; } if ((Object)(object)_rt == (Object)null || ((Texture)_rt).width != size) { if ((Object)(object)_rt != (Object)null) { _mapCam.targetTexture = null; _rt.Release(); Object.Destroy((Object)(object)_rt); } RenderTexture val = new RenderTexture(size, size, 16); ((Object)val).name = "YapyapMinimapRT"; val.antiAliasing = 1; _rt = val; _rt.Create(); _mapCam.targetTexture = _rt; } } private Transform GetViewTransform() { if (_followCamera.Value) { Camera main = Camera.main; if ((Object)(object)main != (Object)null && (Object)(object)main != (Object)(object)_mapCam) { return ((Component)main).transform; } } return _local; } private void UpdateCameraPose() { //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_003f: 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_00be: Unknown result type (might be due to invalid IL or missing references) //IL_00f9: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)_mapCam == (Object)null)) { Transform viewTransform = GetViewTransform(); _viewActive = (Object)(object)viewTransform != (Object)null; if (!_viewActive) { ((Behaviour)_mapCam).enabled = false; return; } _viewOrigin = viewTransform.position; _viewYaw = viewTransform.eulerAngles.y; ((Behaviour)_mapCam).enabled = _refreshHz.Value <= 0f; _mapCam.orthographicSize = CurrentRadius(); _camGo.transform.position = new Vector3(_viewOrigin.x, _viewOrigin.y + _cameraHeight.Value, _viewOrigin.z); float num = (_rotateWithPlayer.Value ? _viewYaw : 0f); _camGo.transform.rotation = Quaternion.Euler(90f, num, 0f); _mapCam.nearClipPlane = Mathf.Max(0.05f, _cameraHeight.Value - _ceilingClear.Value); _mapCam.farClipPlane = _cameraHeight.Value + Mathf.Max(1f, _floorDepth.Value); } } private void LateUpdate() { if (!_active || (Object)(object)_mapCam == (Object)null || !_viewActive) { return; } float value = _refreshHz.Value; float num = ((value > 0f) ? (1f / value) : 0.033f); if (Time.unscaledTime < _nextRenderTick) { return; } _nextRenderTick = Time.unscaledTime + num; if (value > 0f) { try { _mapCam.Render(); } catch { } } if (_circular.Value) { EnsureMask(CurrentTexSize()); DoMaskedReadback(CurrentTexSize()); } } private void OnGUI() { //IL_0196: Unknown result type (might be due to invalid IL or missing references) //IL_01bf: Unknown result type (might be due to invalid IL or missing references) //IL_01ce: Unknown result type (might be due to invalid IL or missing references) //IL_01ae: Unknown result type (might be due to invalid IL or missing references) //IL_0133: Unknown result type (might be due to invalid IL or missing references) //IL_0142: Unknown result type (might be due to invalid IL or missing references) //IL_0122: Unknown result type (might be due to invalid IL or missing references) //IL_01e2: Unknown result type (might be due to invalid IL or missing references) //IL_0154: Unknown result type (might be due to invalid IL or missing references) //IL_016c: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)_rt == (Object)null || (!_enabled.Value && !_expanded)) { return; } int num = CurrentDisplaySize(); int size = CurrentTexSize(); float num2; float num3; if (_expanded) { num2 = (float)Screen.width * 0.5f; num3 = (float)Screen.height * 0.5f; } else { float num4 = _offsetX.Value * (float)Screen.height; float num5 = _offsetY.Value * (float)Screen.height; bool flag = _anchor.Value == 1 || _anchor.Value == 3; bool flag2 = _anchor.Value == 2 || _anchor.Value == 3; num2 = (flag ? ((float)Screen.width - num4) : num4); num3 = (flag2 ? ((float)Screen.height - num5) : num5); } Rect val = default(Rect); ((Rect)(ref val))..ctor(num2 - (float)num * 0.5f, num3 - (float)num * 0.5f, (float)num, (float)num); if (_circular.Value) { EnsureMask(size); if (_viewActive) { GUI.DrawTexture(val, (Texture)(object)_mapTex, (ScaleMode)0, true); } else { GUI.DrawTexture(val, (Texture)(object)_disc, (ScaleMode)0, true); GUI.Label(val, "\n Locating player...", _labelStyle); } GUI.DrawTexture(val, (Texture)(object)_ring, (ScaleMode)0, true); if (_viewActive) { DrawMarkers(val); } } else { GUI.DrawTexture(new Rect(((Rect)(ref val)).x - 2f, ((Rect)(ref val)).y - 2f, (float)(num + 4), (float)(num + 4)), (Texture)(object)_border); if (_viewActive) { GUI.DrawTexture(val, (Texture)(object)_rt, (ScaleMode)0, false); DrawMarkers(val); } else { GUI.DrawTexture(val, (Texture)(object)_bg, (ScaleMode)0, false); GUI.Label(val, "\n Locating player...", _labelStyle); } } } private void DrawMarkers(Rect rect) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0072: Unknown result type (might be due to invalid IL or missing references) //IL_00b3: Unknown result type (might be due to invalid IL or missing references) //IL_00b8: Unknown result type (might be due to invalid IL or missing references) //IL_00ba: Unknown result type (might be due to invalid IL or missing references) //IL_00bf: Unknown result type (might be due to invalid IL or missing references) //IL_00ed: Unknown result type (might be due to invalid IL or missing references) //IL_00f2: Unknown result type (might be due to invalid IL or missing references) //IL_00f4: Unknown result type (might be due to invalid IL or missing references) //IL_00f7: Unknown result type (might be due to invalid IL or missing references) //IL_00fc: Unknown result type (might be due to invalid IL or missing references) //IL_00fe: 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_0101: Unknown result type (might be due to invalid IL or missing references) //IL_0106: Unknown result type (might be due to invalid IL or missing references) //IL_0143: Unknown result type (might be due to invalid IL or missing references) //IL_0222: Unknown result type (might be due to invalid IL or missing references) //IL_0227: Unknown result type (might be due to invalid IL or missing references) //IL_022c: Unknown result type (might be due to invalid IL or missing references) //IL_0231: Unknown result type (might be due to invalid IL or missing references) //IL_023a: Unknown result type (might be due to invalid IL or missing references) //IL_023f: Unknown result type (might be due to invalid IL or missing references) //IL_0241: Unknown result type (might be due to invalid IL or missing references) //IL_0244: Unknown result type (might be due to invalid IL or missing references) //IL_0249: Unknown result type (might be due to invalid IL or missing references) //IL_024b: Unknown result type (might be due to invalid IL or missing references) //IL_024d: Unknown result type (might be due to invalid IL or missing references) //IL_024e: Unknown result type (might be due to invalid IL or missing references) //IL_0253: Unknown result type (might be due to invalid IL or missing references) //IL_01aa: Unknown result type (might be due to invalid IL or missing references) //IL_0129: Unknown result type (might be due to invalid IL or missing references) //IL_012c: Unknown result type (might be due to invalid IL or missing references) //IL_0133: Unknown result type (might be due to invalid IL or missing references) //IL_0138: Unknown result type (might be due to invalid IL or missing references) //IL_013d: Unknown result type (might be due to invalid IL or missing references) //IL_03e7: Unknown result type (might be due to invalid IL or missing references) //IL_03ec: Unknown result type (might be due to invalid IL or missing references) //IL_03f0: Unknown result type (might be due to invalid IL or missing references) //IL_041a: Unknown result type (might be due to invalid IL or missing references) //IL_042a: Unknown result type (might be due to invalid IL or missing references) //IL_0264: Unknown result type (might be due to invalid IL or missing references) //IL_027d: Unknown result type (might be due to invalid IL or missing references) //IL_0282: Unknown result type (might be due to invalid IL or missing references) //IL_0284: Unknown result type (might be due to invalid IL or missing references) //IL_03a7: Unknown result type (might be due to invalid IL or missing references) //IL_03bb: Unknown result type (might be due to invalid IL or missing references) //IL_02b3: Unknown result type (might be due to invalid IL or missing references) //IL_02aa: Unknown result type (might be due to invalid IL or missing references) //IL_02b8: Unknown result type (might be due to invalid IL or missing references) //IL_02c7: Unknown result type (might be due to invalid IL or missing references) //IL_02c8: Unknown result type (might be due to invalid IL or missing references) //IL_02cc: Unknown result type (might be due to invalid IL or missing references) //IL_02d1: Unknown result type (might be due to invalid IL or missing references) //IL_02d6: Unknown result type (might be due to invalid IL or missing references) //IL_0359: 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_0362: Unknown result type (might be due to invalid IL or missing references) //IL_038d: Unknown result type (might be due to invalid IL or missing references) //IL_039d: Unknown result type (might be due to invalid IL or missing references) Vector2 center = ((Rect)(ref rect)).center; float pxPerUnit = ((Rect)(ref rect)).width / (2f * CurrentRadius()); float num = Mathf.Clamp(((Rect)(ref rect)).width / Mathf.Max(64f, _sizePct.Value * (float)Screen.height), 1f, 3f); float mapYaw = (_rotateWithPlayer.Value ? _viewYaw : 0f); Vector3 viewOrigin = _viewOrigin; float num2 = ((Rect)(ref rect)).width * 0.5f - 8f; foreach (Transform mate in _mates) { if ((Object)(object)mate == (Object)null) { continue; } Vector3 val = mate.position - viewOrigin; if (val.x * val.x + val.z * val.z < 1f) { continue; } Vector2 val2 = ProjectToMap(mate.position, viewOrigin, center, pxPerUnit, mapYaw); Vector2 val3 = val2 - center; bool flag; if (_circular.Value) { flag = ((Vector2)(ref val3)).magnitude > num2; if (flag) { val2 = center + ((Vector2)(ref val3)).normalized * num2; } } else { flag = !((Rect)(ref rect)).Contains(val2); val2.x = Mathf.Clamp(val2.x, ((Rect)(ref rect)).xMin + 8f, ((Rect)(ref rect)).xMax - 8f); val2.y = Mathf.Clamp(val2.y, ((Rect)(ref rect)).yMin + 8f, ((Rect)(ref rect)).yMax - 8f); } DrawDot(val2, _dotMate, (flag ? 9f : 12f) * num); } if (_showExtraction.Value && (Object)(object)_extraction != (Object)null) { Color color = Color32.op_Implicit(ParseHexColor(_extractionColorHex.Value, new Color32(byte.MaxValue, (byte)180, (byte)50, byte.MaxValue))); Vector2 val4 = ProjectToMap(_extraction.position, viewOrigin, center, pxPerUnit, mapYaw); Vector2 val5 = val4 - center; bool flag2 = (_circular.Value ? (((Vector2)(ref val5)).magnitude > num2) : (!((Rect)(ref rect)).Contains(val4))); Color color2 = GUI.color; GUI.color = color; if (flag2) { Vector2 val6 = (Vector2)((((Vector2)(ref val5)).sqrMagnitude > 0.01f) ? ((Vector2)(ref val5)).normalized : new Vector2(0f, -1f)); if (_circular.Value) { val4 = center + val6 * num2; } else { val4.x = Mathf.Clamp(val4.x, ((Rect)(ref rect)).xMin + 8f, ((Rect)(ref rect)).xMax - 8f); val4.y = Mathf.Clamp(val4.y, ((Rect)(ref rect)).yMin + 8f, ((Rect)(ref rect)).yMax - 8f); } float num3 = Mathf.Atan2(val6.x, 0f - val6.y) * 57.29578f; float num4 = 18f * num; Matrix4x4 matrix = GUI.matrix; GUIUtility.RotateAroundPivot(num3, val4); GUI.DrawTexture(new Rect(val4.x - num4 / 2f, val4.y - num4 / 2f, num4, num4), (Texture)(object)_arrowWhite); GUI.matrix = matrix; } else { DrawDot(val4, _dotWhite, 13f * num); } GUI.color = color2; } float num5 = (_rotateWithPlayer.Value ? 0f : _viewYaw); float num6 = 18f * num; Matrix4x4 matrix2 = GUI.matrix; GUIUtility.RotateAroundPivot(num5, center); GUI.DrawTexture(new Rect(center.x - num6 / 2f, center.y - num6 / 2f, num6, num6), (Texture)(object)_arrow); GUI.matrix = matrix2; } private Vector2 ProjectToMap(Vector3 world, Vector3 origin, Vector2 center, float pxPerUnit, float mapYaw) { //IL_0073: Unknown result type (might be due to invalid IL or missing references) float num = world.x - origin.x; float num2 = world.z - origin.z; if (mapYaw != 0f) { float num3 = mapYaw * ((float)Math.PI / 180f); float num4 = Mathf.Cos(num3); float num5 = Mathf.Sin(num3); float num6 = num * num4 - num2 * num5; float num7 = num * num5 + num2 * num4; num = num6; num2 = num7; } return new Vector2(center.x + num * pxPerUnit, center.y - num2 * pxPerUnit); } private void DrawDot(Vector2 p, Texture2D tex, float d) { //IL_0020: Unknown result type (might be due to invalid IL or missing references) GUI.DrawTexture(new Rect(p.x - d / 2f, p.y - d / 2f, d, d), (Texture)(object)tex); } private void EnsureMask(int size) { //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_0205: Unknown result type (might be due to invalid IL or missing references) //IL_0206: 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_00f7: Expected O, but got Unknown //IL_02f4: Unknown result type (might be due to invalid IL or missing references) //IL_02fb: Expected O, but got Unknown //IL_01d6: Unknown result type (might be due to invalid IL or missing references) //IL_01dd: Expected O, but got Unknown //IL_02b3: 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) //IL_0190: Unknown result type (might be due to invalid IL or missing references) //IL_018c: Unknown result type (might be due to invalid IL or missing references) //IL_0282: Unknown result type (might be due to invalid IL or missing references) //IL_0283: Unknown result type (might be due to invalid IL or missing references) //IL_02a1: Unknown result type (might be due to invalid IL or missing references) //IL_02a3: Unknown result type (might be due to invalid IL or missing references) //IL_0192: Unknown result type (might be due to invalid IL or missing references) Color32 val = ParseHexColor(_borderColorHex.Value, new Color32((byte)181, (byte)185, (byte)194, byte.MaxValue)); bool flag = _maskSize != size || (Object)(object)_mapTex == (Object)null; bool flag2 = val.r != _ringColor.r || val.g != _ringColor.g || val.b != _ringColor.b || val.a != _ringColor.a; if (!flag && !flag2) { return; } float num = (float)(size - 1) * 0.5f; float num2 = (float)size * 0.5f - 1f; float num3 = num2 - Mathf.Max(3f, (float)size * 0.045f); Color32 val2 = default(Color32); ((Color32)(ref val2))..ctor((byte)0, (byte)0, (byte)0, (byte)0); if (flag) { _maskSize = size; Texture2D val3 = new Texture2D(size, size, (TextureFormat)4, false); ((Texture)val3).wrapMode = (TextureWrapMode)1; _mapTex = val3; _alphaMask = new byte[size * size]; Color32[] array = (Color32[])(object)new Color32[size * size]; Color32 val4 = default(Color32); ((Color32)(ref val4))..ctor((byte)13, (byte)15, (byte)23, (byte)235); for (int i = 0; i < size; i++) { for (int j = 0; j < size; j++) { int num4 = i * size + j; float num5 = (float)j - num; float num6 = (float)i - num; float num7 = Mathf.Sqrt(num5 * num5 + num6 * num6); _alphaMask[num4] = (byte)(Mathf.Clamp01(num2 - num7) * 255f); array[num4] = ((num7 <= num2) ? val4 : val2); } } _mapTex.Apply(); if ((Object)(object)_disc != (Object)null) { Object.Destroy((Object)(object)_disc); } Texture2D val5 = new Texture2D(size, size, (TextureFormat)4, false); ((Texture)val5).wrapMode = (TextureWrapMode)1; _disc = val5; _disc.SetPixels32(array); _disc.Apply(); } _ringColor = val; Color32[] array2 = (Color32[])(object)new Color32[size * size]; for (int k = 0; k < size; k++) { for (int l = 0; l < size; l++) { int num8 = k * size + l; float num9 = (float)l - num; float num10 = (float)k - num; float num11 = Mathf.Sqrt(num9 * num9 + num10 * num10); if (num11 >= num3 && num11 <= num2 + 0.5f) { float num12 = Mathf.Clamp01(Mathf.Min(num11 - num3 + 1f, num2 - num11 + 1f)); Color32 val6 = val; val6.a = (byte)(num12 * (float)(int)val.a); array2[num8] = val6; } else { array2[num8] = val2; } } } if ((Object)(object)_ring != (Object)null) { Object.Destroy((Object)(object)_ring); } Texture2D val7 = new Texture2D(size, size, (TextureFormat)4, false); ((Texture)val7).wrapMode = (TextureWrapMode)1; _ring = val7; _ring.SetPixels32(array2); _ring.Apply(); } private static Color32 ParseHexColor(string hex, Color32 fallback) { //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_009a: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_009e: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Unknown result type (might be due to invalid IL or missing references) //IL_0094: Unknown result type (might be due to invalid IL or missing references) if (string.IsNullOrEmpty(hex)) { return fallback; } hex = hex.Trim().TrimStart(new char[1] { '#' }); if (hex.Length != 6 && hex.Length != 8) { return fallback; } try { byte b = Convert.ToByte(hex.Substring(0, 2), 16); byte b2 = Convert.ToByte(hex.Substring(2, 2), 16); byte b3 = Convert.ToByte(hex.Substring(4, 2), 16); byte b4 = ((hex.Length == 8) ? Convert.ToByte(hex.Substring(6, 2), 16) : byte.MaxValue); return new Color32(b, b2, b3, b4); } catch { return fallback; } } private void DoMaskedReadback(int size) { //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_00cf: Unknown result type (might be due to invalid IL or missing references) //IL_00d4: 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) if ((Object)(object)_mapTex == (Object)null || _alphaMask == null || (Object)(object)_rt == (Object)null || ((Texture)_rt).width != size) { return; } RenderTexture active = RenderTexture.active; RenderTexture.active = _rt; try { _mapTex.ReadPixels(new Rect(0f, 0f, (float)size, (float)size), 0, 0, false); } finally { RenderTexture.active = active; } Color32[] array = _mapTex.GetPixels32(); if (_flipVertical.Value) { Color32[] array2 = (Color32[])(object)new Color32[array.Length]; for (int i = 0; i < size; i++) { Array.Copy(array, i * size, array2, (size - 1 - i) * size, size); } array = array2; } int num = Mathf.Min(array.Length, _alphaMask.Length); for (int j = 0; j < num; j++) { Color32 val = array[j]; val.a = _alphaMask[j]; array[j] = val; } _mapTex.SetPixels32(array); _mapTex.Apply(false); } private void BuildTextures() { //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_0081: 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_00a5: Unknown result type (might be due to invalid IL or missing references) //IL_00b5: Unknown result type (might be due to invalid IL or missing references) //IL_00bb: Expected O, but got Unknown //IL_00db: Unknown result type (might be due to invalid IL or missing references) _bg = SolidTex(new Color(0.05f, 0.06f, 0.09f, 0.85f)); _border = SolidTex(new Color(0.8f, 0.75f, 0.4f, 1f)); _dotMate = SolidTex(new Color(0.4f, 1f, 0.5f, 1f)); _arrow = ArrowTex(new Color(0.35f, 0.9f, 1f, 1f)); _arrowWhite = ArrowTex(Color.white); _dotWhite = SolidTex(Color.white); GUIStyle val = new GUIStyle(); val.alignment = (TextAnchor)4; val.fontSize = 14; _labelStyle = val; _labelStyle.normal.textColor = Color.white; } private static Texture2D SolidTex(Color c) { //IL_0004: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Expected O, but got Unknown //IL_000d: Unknown result type (might be due to invalid IL or missing references) Texture2D val = new Texture2D(1, 1, (TextureFormat)4, false); val.SetPixel(0, 0, c); val.Apply(); ((Texture)val).wrapMode = (TextureWrapMode)1; return val; } private static Texture2D ArrowTex(Color c, int size = 32) { //IL_0004: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Expected O, but got Unknown //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_0065: Unknown result type (might be due to invalid IL or missing references) Texture2D val = new Texture2D(size, size, (TextureFormat)4, false); Color val2 = default(Color); ((Color)(ref val2))..ctor(0f, 0f, 0f, 0f); for (int i = 0; i < size; i++) { float num = (float)i / (float)(size - 1); float num2 = (float)size * 0.5f * (1f - num); float num3 = (float)size * 0.5f; for (int j = 0; j < size; j++) { val.SetPixel(j, i, (Mathf.Abs((float)j - num3) <= num2) ? c : val2); } } val.Apply(); ((Texture)val).wrapMode = (TextureWrapMode)1; return val; } private static IEnumerable EnumerateBehaviourTypes() { try { Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies(); foreach (Assembly asm in assemblies) { Type[] types; try { types = asm.GetTypes(); } catch (ReflectionTypeLoadException ex) { types = ex.Types.Where((Type t) => t != null).ToArray(); } catch { continue; } try { Type[] array = types; foreach (Type t2 in array) { if (!(t2 == null) && !t2.IsAbstract && typeof(MonoBehaviour).IsAssignableFrom(t2)) { string ns = t2.Namespace ?? ""; if (!ns.StartsWith("UnityEngine") && !ns.StartsWith("Unity.") && !ns.StartsWith("TMPro") && !ns.StartsWith("System") && !ns.StartsWith("BepInEx")) { yield return t2; } } } } finally { } } } finally { } } private static Type FindTypeByName(string name) { Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies(); foreach (Assembly assembly in assemblies) { Type type = assembly.GetType(name, throwOnError: false) ?? assembly.GetTypes().FirstOrDefault((Type x) => x.Name == name || x.FullName == name); if (type != null) { return type; } } return null; } private static bool HasTruthyMember(Transform t, params string[] members) { Component[] components = ((Component)t).GetComponents(); foreach (Component val in components) { if ((Object)(object)val == (Object)null) { continue; } Type type = ((object)val).GetType(); foreach (string name in members) { PropertyInfo property = type.GetProperty(name, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (property != null && property.PropertyType == typeof(bool)) { try { if ((bool)property.GetValue(val, null)) { return true; } } catch { } } FieldInfo field = type.GetField(name, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (!(field != null) || !(field.FieldType == typeof(bool))) { continue; } try { if ((bool)field.GetValue(val)) { return true; } } catch { } } } return false; } private static bool ReadBoolAcrossComponents(Transform t, string[] names, out bool found) { found = false; Component[] components = ((Component)t).GetComponents(); foreach (Component val in components) { if ((Object)(object)val == (Object)null) { continue; } Type type = ((object)val).GetType(); foreach (string name in names) { PropertyInfo property = type.GetProperty(name, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (property != null && property.PropertyType == typeof(bool)) { try { found = true; return (bool)property.GetValue(val, null); } catch { found = false; } } FieldInfo field = type.GetField(name, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (field != null && field.FieldType == typeof(bool)) { try { found = true; return (bool)field.GetValue(val); } catch { found = false; } } } } return false; } }