Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of MapUpgrade v1.0.0
MapUpgrade.dll
Decompiled a day agousing System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using DarkSpider.MapTracker.Patches; using HarmonyLib; 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: AssemblyVersion("0.0.0.0")] [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.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace DarkSpider.MapTracker { internal enum ArrowColorPreset { Red, Orange, Yellow, Green, Cyan, Blue, Purple, Pink, White, Black, Gray, CustomHex } internal enum PlayerArrowColorMode { PlayerHeadColor, Red, Orange, Yellow, Green, Cyan, Blue, Purple, Pink, White, Black, Gray, CustomHex } internal enum MapZoomInputMode { MouseWheel, Keyboard, MouseWheelAndKeyboard, Disabled } internal sealed class PluginConfig { internal ConfigEntry<bool> ModEnabled { get; } internal ConfigEntry<bool> ShowEnemies { get; } internal ConfigEntry<ArrowColorPreset> EnemyColor { get; } internal ConfigEntry<string> EnemyCustomHex { get; } internal ConfigEntry<float> EnemyArrowScale { get; } internal ConfigEntry<bool> ShowPlayers { get; } internal ConfigEntry<PlayerArrowColorMode> PlayerColor { get; } internal ConfigEntry<string> PlayerCustomHex { get; } internal ConfigEntry<float> PlayerArrowScale { get; } internal ConfigEntry<bool> OutlineEnabled { get; } internal ConfigEntry<ArrowColorPreset> OutlineColor { get; } internal ConfigEntry<string> OutlineCustomHex { get; } internal ConfigEntry<float> OutlineScale { get; } internal ConfigEntry<float> MapZoomMultiplier { get; } internal ConfigEntry<MapZoomInputMode> ZoomInputMode { get; } internal ConfigEntry<string> ZoomInKey { get; } internal ConfigEntry<string> ZoomOutKey { get; } internal ConfigEntry<float> ZoomStep { get; } internal PluginConfig(ConfigFile config) { //IL_00a6: Unknown result type (might be due to invalid IL or missing references) //IL_00b0: Expected O, but got Unknown //IL_0137: Unknown result type (might be due to invalid IL or missing references) //IL_0141: Expected O, but got Unknown //IL_01c9: Unknown result type (might be due to invalid IL or missing references) //IL_01d3: Expected O, but got Unknown //IL_0202: Unknown result type (might be due to invalid IL or missing references) //IL_020c: Expected O, but got Unknown //IL_0297: Unknown result type (might be due to invalid IL or missing references) //IL_02a1: Expected O, but got Unknown ModEnabled = config.Bind<bool>("General", "ModEnabled", true, "Enable or disable the whole map tracker mod."); ShowEnemies = config.Bind<bool>("Enemies", "ShowEnemyArrows", true, "Show enemy arrows on the map."); EnemyColor = config.Bind<ArrowColorPreset>("Enemies", "EnemyArrowColor", ArrowColorPreset.Red, "Enemy arrow color. Select CustomHex to use EnemyCustomHex."); EnemyCustomHex = config.Bind<string>("Enemies", "EnemyCustomHex", "#FF0000", "Custom enemy arrow color used when EnemyArrowColor is CustomHex."); EnemyArrowScale = config.Bind<float>("Enemies", "EnemyArrowScale", 0.25f, new ConfigDescription("Enemy arrow size. 0.25 is the original small triangle size.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0.25f, 3f), Array.Empty<object>())); ShowPlayers = config.Bind<bool>("Players", "ShowPlayerArrows", true, "Show player arrows on the map."); PlayerColor = config.Bind<PlayerArrowColorMode>("Players", "PlayerArrowColor", PlayerArrowColorMode.PlayerHeadColor, "Player arrow color. PlayerHeadColor uses HeadTopMesh color. Select CustomHex to use PlayerCustomHex."); PlayerCustomHex = config.Bind<string>("Players", "PlayerCustomHex", "#00FFFF", "Custom player arrow color used when PlayerArrowColor is CustomHex."); PlayerArrowScale = config.Bind<float>("Players", "PlayerArrowScale", 0.25f, new ConfigDescription("Player arrow size. 0.25 is the original small triangle size.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0.25f, 3f), Array.Empty<object>())); OutlineEnabled = config.Bind<bool>("Outline", "OutlineEnabled", true, "Draw an outline behind map arrows. Useful for white/gray player colors."); OutlineColor = config.Bind<ArrowColorPreset>("Outline", "OutlineColor", ArrowColorPreset.Black, "Outline color. Select CustomHex to use OutlineCustomHex."); OutlineCustomHex = config.Bind<string>("Outline", "OutlineCustomHex", "#000000", "Custom outline color used when OutlineColor is CustomHex."); OutlineScale = config.Bind<float>("Outline", "OutlineScale", 1.35f, new ConfigDescription("Outline size relative to the main arrow.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(1f, 2f), Array.Empty<object>())); MapZoomMultiplier = config.Bind<float>("Map Zoom", "MapZoomMultiplier", 1f, new ConfigDescription("1.0 = vanilla. Bigger values zoom out, smaller values zoom in.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0.25f, 5f), Array.Empty<object>())); ZoomInputMode = config.Bind<MapZoomInputMode>("Map Zoom", "ZoomInputMode", MapZoomInputMode.MouseWheel, "How map zoom is controlled while the map is open."); ZoomInKey = config.Bind<string>("Map Zoom", "ZoomInKey", "Equals", "Keyboard zoom-in key while the map is open. Examples: Equals, KeypadPlus, PageUp."); ZoomOutKey = config.Bind<string>("Map Zoom", "ZoomOutKey", "Minus", "Keyboard zoom-out key while the map is open. Examples: Minus, KeypadMinus, PageDown."); ZoomStep = config.Bind<float>("Map Zoom", "ZoomStep", 0.1f, new ConfigDescription("How much each mouse-wheel notch or hotkey press changes MapZoomMultiplier.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0.05f, 1f), Array.Empty<object>())); } internal Color GetEnemyColor() { //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Unknown result type (might be due to invalid IL or missing references) return ColorTools.ResolvePreset(EnemyColor.Value, EnemyCustomHex.Value, Color.red); } internal Color GetOutlineColor() { //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Unknown result type (might be due to invalid IL or missing references) return ColorTools.ResolvePreset(OutlineColor.Value, OutlineCustomHex.Value, Color.black); } } internal static class ColorTools { internal static Color ResolvePreset(ArrowColorPreset preset, string customHex, Color fallback) { //IL_0040: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0064: Unknown result type (might be due to invalid IL or missing references) //IL_006a: Unknown result type (might be due to invalid IL or missing references) //IL_006f: Unknown result type (might be due to invalid IL or missing references) //IL_0075: Unknown result type (might be due to invalid IL or missing references) //IL_007a: 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) //IL_0099: 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_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_00eb: 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_00f3: Unknown result type (might be due to invalid IL or missing references) //IL_00f8: 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_0117: Unknown result type (might be due to invalid IL or missing references) //IL_011c: Unknown result type (might be due to invalid IL or missing references) //IL_0120: Unknown result type (might be due to invalid IL or missing references) //IL_0121: Unknown result type (might be due to invalid IL or missing references) //IL_0126: Unknown result type (might be due to invalid IL or missing references) //IL_012d: 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_012a: Unknown result type (might be due to invalid IL or missing references) return (Color)(preset switch { ArrowColorPreset.Red => Color.red, ArrowColorPreset.Orange => new Color(1f, 0.5f, 0f, 1f), ArrowColorPreset.Yellow => Color.yellow, ArrowColorPreset.Green => Color.green, ArrowColorPreset.Cyan => new Color(0f, 0.85f, 1f, 1f), ArrowColorPreset.Blue => new Color(0.05f, 0.2f, 1f, 1f), ArrowColorPreset.Purple => new Color(0.55f, 0f, 1f, 1f), ArrowColorPreset.Pink => new Color(1f, 0.1f, 0.65f, 1f), ArrowColorPreset.White => Color.white, ArrowColorPreset.Black => Color.black, ArrowColorPreset.Gray => new Color(0.28f, 0.28f, 0.28f, 1f), ArrowColorPreset.CustomHex => ParseHex(customHex, fallback), _ => fallback, }); } internal static Color ResolvePlayerColor(PlayerArrowColorMode mode, string customHex, PlayerAvatar playerAvatar) { //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_0044: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_001c: 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_0077: Unknown result type (might be due to invalid IL or missing references) //IL_0064: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_007b: 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) switch (mode) { case PlayerArrowColorMode.PlayerHeadColor: return (Color)(((??)ReflectionCache.TryReadPlayerHeadTopColor(playerAvatar)) ?? Color.cyan); case PlayerArrowColorMode.CustomHex: return ParseHex(customHex, Color.cyan); default: { if (Enum.TryParse<ArrowColorPreset>(mode.ToString(), out var result)) { return ResolvePreset(result, customHex, Color.cyan); } return Color.cyan; } } } private static Color ParseHex(string htmlColor, Color fallback) { //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Unknown result type (might be due to invalid IL or missing references) Color result = default(Color); if (!string.IsNullOrWhiteSpace(htmlColor) && ColorUtility.TryParseHtmlString(htmlColor.Trim(), ref result)) { return result; } return fallback; } } internal sealed class MapTrackerController { private readonly PluginConfig _config; private readonly List<TrackedMapEntity> _enemyTrackers = new List<TrackedMapEntity>(); private readonly List<TrackedMapEntity> _playerTrackers = new List<TrackedMapEntity>(); private readonly Sprite _arrowSprite; private Map _lastMap; internal MapTrackerController(PluginConfig config) { _config = config; _arrowSprite = TriangleSpriteFactory.Create("DarkSpiderMapTracker.Triangle", 64); } internal void OnMapAwake(Map map) { if (!((Object)(object)map == (Object)null)) { _lastMap = map; Clear(); } } internal void Tick(Map map) { if (!((Object)(object)map == (Object)null) && !((Object)(object)Map.Instance == (Object)null)) { if ((Object)(object)_lastMap != (Object)(object)map) { OnMapAwake(map); } UpdateTrackers(_enemyTrackers, isPlayerTracker: false); UpdateTrackers(_playerTrackers, isPlayerTracker: true); } } internal void Register(object source) { if (source == null || (Object)(object)Map.Instance == (Object)null || (Object)(object)Map.Instance.CustomObject == (Object)null || (Object)(object)Map.Instance.OverLayerParent == (Object)null) { return; } bool flag = source is EnemyParent; bool flag2 = source is PlayerAvatar; if (!flag && !flag2) { return; } if (flag2) { object obj = source; PlayerAvatar playerAvatar = (PlayerAvatar)((obj is PlayerAvatar) ? obj : null); if (IsLocalPlayer(playerAvatar)) { return; } } List<TrackedMapEntity> list = (flag2 ? _playerTrackers : _enemyTrackers); if (list.Any((TrackedMapEntity entry) => entry.Source == source)) { return; } GameObject visualObject = GetVisualObject(source); if ((Object)(object)visualObject == (Object)null) { return; } GameObject val = Object.Instantiate<GameObject>(Map.Instance.CustomObject, Map.Instance.OverLayerParent); ((Object)val).name = "DarkSpider Map Tracker - " + ((Object)visualObject).name; MapCustomEntity component = val.GetComponent<MapCustomEntity>(); if ((Object)(object)component == (Object)null) { Object.Destroy((Object)(object)val); return; } SpriteRenderer val2 = (((Object)(object)component.spriteRenderer != (Object)null) ? component.spriteRenderer : val.GetComponentInChildren<SpriteRenderer>(true)); if ((Object)(object)val2 == (Object)null) { Object.Destroy((Object)(object)val); return; } component.Parent = visualObject.transform; val2.sprite = _arrowSprite; ((Renderer)val2).enabled = false; ((Renderer)val2).sortingOrder = ((Renderer)val2).sortingOrder + 10; SpriteRenderer outlineRenderer = CreateOutlineRenderer(((Component)component).transform, val2); list.Add(new TrackedMapEntity { Source = source, MapEntity = component, ArrowRenderer = val2, OutlineRenderer = outlineRenderer, Visible = false, IsPlayer = flag2 }); } internal void Show(object source) { TrackedMapEntity trackedMapEntity = Find(source); if (trackedMapEntity == null) { return; } if (trackedMapEntity.IsPlayer) { PlayerAvatar val = (PlayerAvatar)((source is PlayerAvatar) ? source : null); if (val != null && IsPlayerDead(val)) { return; } } trackedMapEntity.Visible = true; } internal void Hide(object source) { TrackedMapEntity trackedMapEntity = Find(source); if (trackedMapEntity != null) { trackedMapEntity.Visible = false; } } internal void SetAllVisible(bool visible) { SetTrackersVisible(_enemyTrackers, visible); SetTrackersVisible(_playerTrackers, visible); } internal void Clear() { DestroyTrackers(_enemyTrackers); DestroyTrackers(_playerTrackers); _enemyTrackers.Clear(); _playerTrackers.Clear(); } private void UpdateTrackers(List<TrackedMapEntity> trackers, bool isPlayerTracker) { //IL_0175: 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_017a: Unknown result type (might be due to invalid IL or missing references) //IL_01b9: Unknown result type (might be due to invalid IL or missing references) //IL_01c7: Unknown result type (might be due to invalid IL or missing references) bool flag = (isPlayerTracker ? _config.ShowPlayers.Value : _config.ShowEnemies.Value); for (int num = trackers.Count - 1; num >= 0; num--) { TrackedMapEntity trackedMapEntity = trackers[num]; if (!IsValid(trackedMapEntity)) { DestroyTracker(trackedMapEntity); trackers.RemoveAt(num); continue; } Transform parent = trackedMapEntity.MapEntity.Parent; if ((Object)(object)parent == (Object)null) { SetRendererPairEnabled(trackedMapEntity, visible: false); continue; } if (isPlayerTracker) { object source = trackedMapEntity.Source; PlayerAvatar val = (PlayerAvatar)((source is PlayerAvatar) ? source : null); if (val != null && IsLocalPlayer(val)) { DestroyTracker(trackedMapEntity); trackers.RemoveAt(num); continue; } } if (Map.Instance.Active) { Map.Instance.CustomPositionSet(((Component)trackedMapEntity.MapEntity).transform, parent); } int num2; if (!isPlayerTracker) { object source2 = trackedMapEntity.Source; EnemyParent val2 = (EnemyParent)((source2 is EnemyParent) ? source2 : null); num2 = ((val2 != null && IsEnemyActive(val2)) ? 1 : 0); } else { object source3 = trackedMapEntity.Source; PlayerAvatar val3 = (PlayerAvatar)((source3 is PlayerAvatar) ? source3 : null); num2 = ((val3 == null || !IsPlayerDead(val3)) ? 1 : 0); } bool flag2 = (byte)num2 != 0; bool flag3 = flag && trackedMapEntity.Visible && flag2; Color val4 = (isPlayerTracker ? ColorTools.ResolvePlayerColor(_config.PlayerColor.Value, _config.PlayerCustomHex.Value, (PlayerAvatar)/*isinst with value type is only supported in some contexts*/) : _config.GetEnemyColor()); float num3 = Mathf.Clamp(isPlayerTracker ? _config.PlayerArrowScale.Value : _config.EnemyArrowScale.Value, 0.25f, 3f); ApplyRenderer(trackedMapEntity.ArrowRenderer, val4, num3, flag3); ApplyOutline(trackedMapEntity, val4.a, num3, flag3); } } private void ApplyRenderer(SpriteRenderer renderer, Color color, float scale, bool visible) { //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Unknown result type (might be due to invalid IL or missing references) color.a = 1f; renderer.sprite = _arrowSprite; renderer.color = color; ((Component)renderer).transform.localScale = Vector3.one * scale; ((Renderer)renderer).enabled = visible; } private void ApplyOutline(TrackedMapEntity entry, float alpha, float mainScale, bool mainVisible) { //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_00a6: Unknown result type (might be due to invalid IL or missing references) //IL_00ad: Unknown result type (might be due to invalid IL or missing references) SpriteRenderer outlineRenderer = entry.OutlineRenderer; if (!((Object)(object)outlineRenderer == (Object)null)) { Color outlineColor = _config.GetOutlineColor(); outlineColor.a = Mathf.Clamp01(alpha); float num = Mathf.Clamp(_config.OutlineScale.Value, 1f, 2f); float num2 = (((Object)(object)entry.ArrowRenderer != (Object)null && (Object)(object)((Component)outlineRenderer).transform.parent == (Object)(object)((Component)entry.ArrowRenderer).transform) ? num : (mainScale * num)); outlineRenderer.sprite = _arrowSprite; outlineRenderer.color = outlineColor; ((Component)outlineRenderer).transform.localScale = Vector3.one * num2; ((Renderer)outlineRenderer).enabled = _config.OutlineEnabled.Value && mainVisible; } } private SpriteRenderer CreateOutlineRenderer(Transform mapEntityTransform, SpriteRenderer arrowRenderer) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Expected O, but got Unknown //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Unknown result type (might be due to invalid IL or missing references) GameObject val = new GameObject("DarkSpider Map Tracker Outline"); val.transform.SetParent(mapEntityTransform, false); val.transform.localPosition = ((Component)arrowRenderer).transform.localPosition; val.transform.localRotation = ((Component)arrowRenderer).transform.localRotation; val.transform.localScale = Vector3.one; SpriteRenderer val2 = val.AddComponent<SpriteRenderer>(); val2.sprite = _arrowSprite; val2.color = _config.GetOutlineColor(); ((Renderer)val2).sortingLayerID = ((Renderer)arrowRenderer).sortingLayerID; ((Renderer)val2).sortingOrder = ((Renderer)arrowRenderer).sortingOrder - 1; ((Renderer)val2).enabled = false; return val2; } private static GameObject GetVisualObject(object source) { PlayerAvatar val = (PlayerAvatar)((source is PlayerAvatar) ? source : null); if (val != null) { return ((Object)(object)val.playerAvatarVisuals != (Object)null) ? ((Component)val.playerAvatarVisuals).gameObject : ((Component)val).gameObject; } EnemyParent val2 = (EnemyParent)((source is EnemyParent) ? source : null); if (val2 == null) { return null; } Enemy enemy = ReflectionCache.GetEnemy(val2); if ((Object)(object)enemy == (Object)null) { return null; } GameObject val3 = null; if (val2.enemyName != "Bella") { val3 = TryGetVisionObject(enemy); if ((Object)(object)val3 == (Object)null) { val3 = TryGetAnimatorObject(val2.EnableObject); } } else { val3 = TryGetTricycleTargetObject(enemy); } return ((Object)(object)val3 != (Object)null) ? val3 : ((Component)enemy).gameObject; } private static GameObject TryGetVisionObject(Enemy enemy) { try { EnemyVision componentInChildren = ((Component)enemy).GetComponentInChildren<EnemyVision>(); return ((Object)(object)componentInChildren?.VisionTransform != (Object)null) ? ((Component)componentInChildren.VisionTransform).gameObject : null; } catch (Exception ex) { ManualLogSource log = Plugin.Log; if (log != null) { log.LogDebug((object)("Failed to read enemy vision transform: " + ex.Message)); } return null; } } private static GameObject TryGetTricycleTargetObject(Enemy enemy) { try { EnemyTricycle componentInChildren = ((Component)enemy).GetComponentInChildren<EnemyTricycle>(); return ((Object)(object)componentInChildren?.followTargetTransform != (Object)null) ? ((Component)componentInChildren.followTargetTransform).gameObject : null; } catch (Exception ex) { ManualLogSource log = Plugin.Log; if (log != null) { log.LogDebug((object)("Failed to read EnemyTricycle target: " + ex.Message)); } return null; } } private static GameObject TryGetAnimatorObject(GameObject rootObject) { if ((Object)(object)rootObject == (Object)null) { return null; } Component[] componentsInChildren = rootObject.GetComponentsInChildren<Component>(true); Component[] array = componentsInChildren; foreach (Component val in array) { if (!((Object)(object)val == (Object)null)) { Type type = ((object)val).GetType(); if (type.FullName == "UnityEngine.Animator" || type.Name == "Animator") { return val.gameObject; } } } return null; } private static bool IsLocalPlayer(PlayerAvatar playerAvatar) { return (Object)(object)playerAvatar != (Object)null && (ReflectionCache.IsPlayerLocal(playerAvatar) || (Object)(object)playerAvatar == (Object)(object)PlayerAvatar.instance || (Object)(object)playerAvatar == (Object)(object)PlayerController.instance?.playerAvatarScript); } private static bool IsEnemyActive(EnemyParent enemyParent) { return (Object)(object)enemyParent != (Object)null && (Object)(object)enemyParent.EnableObject != (Object)null && enemyParent.EnableObject.activeInHierarchy; } private static bool IsPlayerDead(PlayerAvatar playerAvatar) { return (Object)(object)playerAvatar == (Object)null || ReflectionCache.IsPlayerDisabled(playerAvatar); } private TrackedMapEntity Find(object source) { if (source == null) { return null; } return _enemyTrackers.FirstOrDefault((TrackedMapEntity entry) => entry.Source == source) ?? _playerTrackers.FirstOrDefault((TrackedMapEntity entry) => entry.Source == source); } private static bool IsValid(TrackedMapEntity entry) { return entry != null && entry.Source != null && (Object)(object)entry.MapEntity != (Object)null && (Object)(object)entry.ArrowRenderer != (Object)null; } private static void SetTrackersVisible(List<TrackedMapEntity> trackers, bool visible) { foreach (TrackedMapEntity tracker in trackers) { SetRendererPairEnabled(tracker, visible); } } private static void SetRendererPairEnabled(TrackedMapEntity entry, bool visible) { if ((Object)(object)entry?.ArrowRenderer != (Object)null) { ((Renderer)entry.ArrowRenderer).enabled = visible; } if ((Object)(object)entry?.OutlineRenderer != (Object)null) { ((Renderer)entry.OutlineRenderer).enabled = visible; } } private static void DestroyTrackers(List<TrackedMapEntity> trackers) { foreach (TrackedMapEntity tracker in trackers) { DestroyTracker(tracker); } } private static void DestroyTracker(TrackedMapEntity entry) { if ((Object)(object)entry?.MapEntity != (Object)null) { Object.Destroy((Object)(object)((Component)entry.MapEntity).gameObject); } } } internal sealed class MapZoomController { private readonly PluginConfig _config; internal MapZoomController(PluginConfig config) { _config = config; } internal void CaptureDefaultZoom() { if ((Object)(object)MapPatch.MapCamera != (Object)null && MapPatch.DefaultMapZoom <= 0f) { MapPatch.DefaultMapZoom = MapPatch.MapCamera.orthographicSize; } } internal void Tick() { HandleZoomInput(); ApplyZoom(); } internal void ResetZoom() { if (!((Object)(object)MapPatch.MapCamera == (Object)null) && !(MapPatch.DefaultMapZoom <= 0f)) { MapPatch.MapCamera.orthographicSize = MapPatch.DefaultMapZoom; } } private void ApplyZoom() { if (!((Object)(object)MapPatch.MapCamera == (Object)null) && !(MapPatch.DefaultMapZoom <= 0f)) { MapPatch.MapCamera.orthographicSize = MapPatch.DefaultMapZoom * Mathf.Clamp(_config.MapZoomMultiplier.Value, 0.25f, 5f); } } private void HandleZoomInput() { if (!IsMapOpen()) { return; } MapZoomInputMode value = _config.ZoomInputMode.Value; if (value == MapZoomInputMode.Disabled) { return; } float num = _config.MapZoomMultiplier.Value; float num2 = Mathf.Clamp(_config.ZoomStep.Value, 0.05f, 1f); bool flag = false; if (value == MapZoomInputMode.MouseWheel || value == MapZoomInputMode.MouseWheelAndKeyboard) { float mouseWheelDelta = GetMouseWheelDelta(); if (Mathf.Abs(mouseWheelDelta) > 0.01f) { num -= mouseWheelDelta * num2; flag = true; } } if (value == MapZoomInputMode.Keyboard || value == MapZoomInputMode.MouseWheelAndKeyboard) { if (IsConfiguredKeyDown(_config.ZoomInKey.Value)) { num -= num2; flag = true; } if (IsConfiguredKeyDown(_config.ZoomOutKey.Value)) { num += num2; flag = true; } } if (flag) { _config.MapZoomMultiplier.Value = Mathf.Clamp(num, 0.25f, 5f); } } private static bool IsMapOpen() { if ((Object)(object)Map.Instance != (Object)null && Map.Instance.Active) { return true; } Camera mapCamera = MapPatch.MapCamera; return (Object)(object)mapCamera != (Object)null && ((Component)mapCamera).gameObject.activeInHierarchy && ((Behaviour)mapCamera).enabled; } private static float GetMouseWheelDelta() { //IL_0001: Unknown result type (might be due to invalid IL or missing references) return Input.mouseScrollDelta.y; } private static bool IsConfiguredKeyDown(string keyName) { //IL_002c: Unknown result type (might be due to invalid IL or missing references) if (string.IsNullOrWhiteSpace(keyName)) { return false; } string value = NormalizeKeyName(keyName); if (!Enum.TryParse<KeyCode>(value, ignoreCase: true, out KeyCode result)) { return false; } return Input.GetKeyDown(result); } private static string NormalizeKeyName(string keyName) { string text = keyName.Trim(); if (text == "+" || text == "=") { return "Equals"; } if (text == "-" || text == "_") { return "Minus"; } if (text.Equals("Plus", StringComparison.OrdinalIgnoreCase)) { return "Equals"; } return text; } } internal static class ReflectionCache { private static readonly FieldInfo EnemyParentEnemyField = AccessTools.Field(typeof(EnemyParent), "Enemy"); private static readonly FieldInfo EnemyEnemyParentField = AccessTools.Field(typeof(Enemy), "EnemyParent"); private static readonly FieldInfo PlayerLocalField = AccessTools.Field(typeof(PlayerAvatar), "isLocal"); private static readonly FieldInfo PlayerDisabledField = AccessTools.Field(typeof(PlayerAvatar), "isDisabled"); private static readonly FieldInfo PlayerCosmeticsField = AccessTools.Field(typeof(PlayerAvatar), "playerCosmetics"); private static readonly FieldInfo PlayerCosmeticsColorsField = AccessTools.Field(typeof(PlayerCosmetics), "colorsEquipped"); private static readonly FieldInfo MetaManagerInstanceField = AccessTools.Field(typeof(MetaManager), "instance"); private static readonly FieldInfo MetaManagerColorsField = AccessTools.Field(typeof(MetaManager), "colors"); private static readonly FieldInfo SemiColorColorField = AccessTools.Field(typeof(SemiColor), "color"); internal static Enemy GetEnemy(EnemyParent enemyParent) { if ((Object)(object)enemyParent == (Object)null) { return null; } try { object? obj = EnemyParentEnemyField?.GetValue(enemyParent); return (Enemy)((obj is Enemy) ? obj : null); } catch (Exception ex) { ManualLogSource log = Plugin.Log; if (log != null) { log.LogDebug((object)("Failed to read EnemyParent.Enemy: " + ex.Message)); } return null; } } internal static EnemyParent GetEnemyParent(Enemy enemy) { if ((Object)(object)enemy == (Object)null) { return null; } try { object? obj = EnemyEnemyParentField?.GetValue(enemy); return (EnemyParent)((obj is EnemyParent) ? obj : null); } catch (Exception ex) { ManualLogSource log = Plugin.Log; if (log != null) { log.LogDebug((object)("Failed to read Enemy.EnemyParent: " + ex.Message)); } return null; } } internal static bool IsPlayerDisabled(PlayerAvatar playerAvatar) { if ((Object)(object)playerAvatar == (Object)null) { return true; } try { object obj = PlayerDisabledField?.GetValue(playerAvatar); bool flag = default(bool); int num; if (obj is bool) { flag = (bool)obj; num = 1; } else { num = 0; } return (byte)((uint)num & (flag ? 1u : 0u)) != 0; } catch (Exception ex) { ManualLogSource log = Plugin.Log; if (log != null) { log.LogDebug((object)("Failed to read PlayerAvatar.isDisabled: " + ex.Message)); } return false; } } internal static bool IsPlayerLocal(PlayerAvatar playerAvatar) { if ((Object)(object)playerAvatar == (Object)null) { return false; } try { object obj = PlayerLocalField?.GetValue(playerAvatar); bool flag = default(bool); int num; if (obj is bool) { flag = (bool)obj; num = 1; } else { num = 0; } return (byte)((uint)num & (flag ? 1u : 0u)) != 0; } catch (Exception ex) { ManualLogSource log = Plugin.Log; if (log != null) { log.LogDebug((object)("Failed to read PlayerAvatar.isLocal: " + ex.Message)); } return false; } } internal static Color? TryReadPlayerHeadTopColor(PlayerAvatar playerAvatar) { //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_0108: Unknown result type (might be due to invalid IL or missing references) try { object? obj = PlayerCosmeticsField?.GetValue(playerAvatar); PlayerCosmetics obj2 = (PlayerCosmetics)((obj is PlayerCosmetics) ? obj : null); if (!(PlayerCosmeticsColorsField?.GetValue(obj2) is int[] array) || array.Length <= 5) { return null; } int num = array[5]; object? obj3 = MetaManagerInstanceField?.GetValue(null); MetaManager obj4 = (MetaManager)((obj3 is MetaManager) ? obj3 : null); if (!(MetaManagerColorsField?.GetValue(obj4) is List<SemiColor> list) || list.Count == 0) { return null; } if (num < 0 || num >= list.Count) { num = 0; } object obj5 = SemiColorColorField?.GetValue(list[num]); if (obj5 is Color) { Color value = (Color)obj5; if (true) { return value; } } } catch (Exception ex) { ManualLogSource log = Plugin.Log; if (log != null) { log.LogDebug((object)("Failed to read player HeadTopMesh color: " + ex.Message)); } } return null; } } internal sealed class TrackedMapEntity { internal object Source; internal MapCustomEntity MapEntity; internal SpriteRenderer ArrowRenderer; internal SpriteRenderer OutlineRenderer; internal bool Visible; internal bool IsPlayer; } [BepInPlugin("DarkSpider90.MapTracker", "DarkSpider Map Tracker", "0.3.1")] internal sealed class Plugin : BaseUnityPlugin { private const string ModGuid = "DarkSpider90.MapTracker"; private const string ModName = "DarkSpider Map Tracker"; private const string ModVersion = "0.3.1"; private Harmony _harmony; private PluginConfig _config; private MapZoomController _zoomController; private MapTrackerController _trackerController; internal static Plugin Instance { get; private set; } internal static ManualLogSource Log { get; private set; } private void Awake() { //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Expected O, but got Unknown Instance = this; Log = ((BaseUnityPlugin)this).Logger; _config = new PluginConfig(((BaseUnityPlugin)this).Config); _zoomController = new MapZoomController(_config); _trackerController = new MapTrackerController(_config); _harmony = new Harmony("DarkSpider90.MapTracker"); _harmony.PatchAll(Assembly.GetExecutingAssembly()); ((BaseUnityPlugin)this).Logger.LogInfo((object)"DarkSpider Map Tracker 0.3.1 loaded."); } private void OnDestroy() { _zoomController?.ResetZoom(); _trackerController?.Clear(); Harmony harmony = _harmony; if (harmony != null) { harmony.UnpatchSelf(); } } internal void OnMapAwake(Map map) { _trackerController?.OnMapAwake(map); _zoomController?.CaptureDefaultZoom(); } internal void TickMap(Map map) { if (!((Object)(object)map == (Object)null) && !((Object)(object)Map.Instance == (Object)null)) { if (!IsLevelReady() || !_config.ModEnabled.Value) { _trackerController?.SetAllVisible(visible: false); _zoomController?.ResetZoom(); } else { _zoomController?.Tick(); _trackerController?.Tick(map); } } } internal void RegisterToMap(object source) { _trackerController?.Register(source); } internal void ShowToMap(object source) { _trackerController?.Show(source); } internal void HideFromMap(object source) { _trackerController?.Hide(source); } private static bool IsLevelReady() { try { return SemiFunc.RunIsLevel(); } catch { return false; } } } internal static class TriangleSpriteFactory { internal static Sprite Create(string name, int size) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Expected O, but got Unknown //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_00cb: Unknown result type (might be due to invalid IL or missing references) //IL_00cc: Unknown result type (might be due to invalid IL or missing references) //IL_00d3: Unknown result type (might be due to invalid IL or missing references) //IL_00d5: Unknown result type (might be due to invalid IL or missing references) //IL_00dc: Unknown result type (might be due to invalid IL or missing references) //IL_00de: Unknown result type (might be due to invalid IL or missing references) //IL_0054: 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_0170: Unknown result type (might be due to invalid IL or missing references) //IL_010a: Unknown result type (might be due to invalid IL or missing references) //IL_011e: Unknown result type (might be due to invalid IL or missing references) Texture2D val = new Texture2D(size, size, (TextureFormat)5, false); ((Object)val).name = name; ((Texture)val).wrapMode = (TextureWrapMode)1; ((Texture)val).filterMode = (FilterMode)1; Color val2 = default(Color); ((Color)(ref val2))..ctor(1f, 1f, 1f, 0f); Color white = Color.white; for (int i = 0; i < size; i++) { for (int j = 0; j < size; j++) { val.SetPixel(j, i, val2); } } Vector2 val3 = default(Vector2); ((Vector2)(ref val3))..ctor((float)size * 0.5f, (float)size * 0.88f); Vector2 val4 = default(Vector2); ((Vector2)(ref val4))..ctor((float)size * 0.18f, (float)size * 0.18f); Vector2 val5 = default(Vector2); ((Vector2)(ref val5))..ctor((float)size * 0.82f, (float)size * 0.18f); Vector2[] polygon = (Vector2[])(object)new Vector2[3] { val3, val5, val4 }; Vector2 point = default(Vector2); for (int k = 0; k < size; k++) { for (int l = 0; l < size; l++) { ((Vector2)(ref point))..ctor((float)l + 0.5f, (float)k + 0.5f); if (IsInsidePolygon(point, polygon)) { val.SetPixel(l, k, white); } } } val.Apply(false, true); return Sprite.Create(val, new Rect(0f, 0f, (float)size, (float)size), new Vector2(0.5f, 0.5f), (float)size); } private static bool IsInsidePolygon(Vector2 point, Vector2[] polygon) { //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_0060: 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) bool flag = false; int num = polygon.Length - 1; for (int i = 0; i < polygon.Length; i++) { if (polygon[i].y > point.y != polygon[num].y > point.y) { float num2 = (polygon[num].x - polygon[i].x) * (point.y - polygon[i].y) / (polygon[num].y - polygon[i].y) + polygon[i].x; if (point.x < num2) { flag = !flag; } } num = i; } return flag; } } } namespace DarkSpider.MapTracker.Patches { [HarmonyPatch(typeof(EnemyDirector))] internal static class EnemyDirectorPatch { [HarmonyPatch("FirstSpawnPointAdd")] [HarmonyPostfix] private static void FirstSpawnPointAdd(EnemyParent _enemyParent) { if (!((Object)(object)_enemyParent == (Object)null)) { Plugin.Instance?.RegisterToMap(_enemyParent); Plugin.Instance?.ShowToMap(_enemyParent); } } } [HarmonyPatch(typeof(EnemyHealth))] internal static class EnemyHealthPatch { [HarmonyPatch("DeathRPC")] [HarmonyPostfix] private static void DeathRPC(Enemy ___enemy) { EnemyParent enemyParent = ReflectionCache.GetEnemyParent(___enemy); if ((Object)(object)enemyParent != (Object)null) { Plugin.Instance?.HideFromMap(enemyParent); } } } [HarmonyPatch(typeof(EnemyParent))] internal static class EnemyParentPatch { [HarmonyPatch("Setup")] [HarmonyPostfix] private static void Setup(EnemyParent __instance) { Plugin.Instance?.RegisterToMap(__instance); } [HarmonyPatch("Spawn")] [HarmonyPostfix] private static void Spawn(EnemyParent __instance) { Plugin.Instance?.RegisterToMap(__instance); Plugin.Instance?.ShowToMap(__instance); } [HarmonyPatch("SpawnRPC")] [HarmonyPostfix] private static void SpawnRPC(EnemyParent __instance) { Plugin.Instance?.RegisterToMap(__instance); Plugin.Instance?.ShowToMap(__instance); } [HarmonyPatch("DespawnRPC")] [HarmonyPostfix] private static void DespawnRPC(EnemyParent __instance) { Plugin.Instance?.HideFromMap(__instance); } } [HarmonyPatch(typeof(Map))] internal static class MapPatch { internal static Camera MapCamera; internal static float DefaultMapZoom; [HarmonyPatch("Awake")] [HarmonyPostfix] private static void Awake(Map __instance, ref Transform ___playerTransformTarget) { if ((Object)(object)___playerTransformTarget != (Object)null) { MapCamera = ((Component)___playerTransformTarget).GetComponentInChildren<Camera>(); if ((Object)(object)MapCamera != (Object)null) { DefaultMapZoom = MapCamera.orthographicSize; } } Plugin.Instance?.OnMapAwake(__instance); } [HarmonyPatch("Update")] [HarmonyPostfix] private static void Update(Map __instance) { Plugin.Instance?.TickMap(__instance); } } [HarmonyPatch(typeof(PlayerAvatar))] internal static class PlayerAvatarPatch { [HarmonyPatch("LateStart")] [HarmonyPostfix] private static void LateStart(PlayerAvatar __instance) { if (!((Object)(object)__instance == (Object)null) && !((Object)(object)__instance == (Object)(object)PlayerController.instance?.playerAvatarScript)) { Plugin.Instance?.RegisterToMap(__instance); Plugin.Instance?.ShowToMap(__instance); } } [HarmonyPatch("ReviveRPC")] [HarmonyPostfix] private static void ReviveRPC(PlayerAvatar __instance) { if (!((Object)(object)__instance == (Object)null) && !((Object)(object)__instance == (Object)(object)PlayerController.instance?.playerAvatarScript)) { Plugin.Instance?.RegisterToMap(__instance); Plugin.Instance?.ShowToMap(__instance); } } [HarmonyPatch("PlayerDeathRPC")] [HarmonyPostfix] private static void PlayerDeathRPC(PlayerAvatar __instance) { Plugin.Instance?.HideFromMap(__instance); } } [HarmonyPatch(typeof(EnemySlowMouth))] internal static class SpewerAttachmentPatch { [HarmonyPatch("UpdateStateRPC")] [HarmonyPostfix] private static void UpdateStateRPC(EnemySlowMouth __instance, Enemy ___enemy) { //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Invalid comparison between Unknown and I4 //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Invalid comparison between Unknown and I4 if ((Object)(object)__instance == (Object)null || (Object)(object)___enemy == (Object)null) { return; } EnemyParent enemyParent = ReflectionCache.GetEnemyParent(___enemy); if (!((Object)(object)enemyParent == (Object)null)) { if ((int)__instance.currentState == 9) { Plugin.Instance?.HideFromMap(enemyParent); } else if ((int)__instance.currentState == 11) { Plugin.Instance?.ShowToMap(enemyParent); } } } } }