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 BepInEx; using BepInEx.Unity.Mono; using HarmonyLib; using Microsoft.CodeAnalysis; using Shooterlatro.Core; using Shooterlatro.Game; using Shooterlatro.Gameplay; using Shooterlatro.Player; using Shooterlatro.Progression; using Shooterlatro.Score; using Shooterlatro.Shop; using Shooterlatro.UI; using Shooterlatro.Upgrades; using Shooterlatro.Upgrades.Mechanics; using Shooterlatro.Weapons; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("MoreHolos")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyDescription("Lucky Shot More Holos Mod")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("MoreHolos")] [assembly: AssemblyTitle("MoreHolos")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace MoreHolos { [BepInPlugin("com.example.moreholos", "MoreHolos", "1.3.2")] public class MoreHolosPlugin : BaseUnityPlugin { private Harmony harmony; public static HoloItemData rewindHoloData; public static HoloItemData chronoHoloData; public static HoloItemData midasHoloData; public static HoloItemData magnetHoloData; public static HoloItemData ultimateRewindHoloData; private static float chronoSlowdownTimer; private static float chronoVisualTimer; private static bool chronoTriggeredThisRound; private static bool wasRoundActive; private void Awake() { //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Expected O, but got Unknown CreateHoloInstances(); harmony = new Harmony("com.example.moreholos"); harmony.PatchAll(); ((BaseUnityPlugin)this).Logger.LogInfo((object)"MoreHolos loaded successfully! Added Rewind, Chrono, Midas, Magnet, and Ultimate Rewind Holos."); } public static void CreateHoloInstances() { //IL_00a4: Unknown result type (might be due to invalid IL or missing references) //IL_00aa: Expected O, but got Unknown //IL_00ac: 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_016e: Unknown result type (might be due to invalid IL or missing references) //IL_0175: Expected O, but got Unknown //IL_0178: Unknown result type (might be due to invalid IL or missing references) //IL_0180: Unknown result type (might be due to invalid IL or missing references) //IL_0243: Unknown result type (might be due to invalid IL or missing references) //IL_024a: Expected O, but got Unknown //IL_024d: Unknown result type (might be due to invalid IL or missing references) //IL_0255: Unknown result type (might be due to invalid IL or missing references) //IL_0318: Unknown result type (might be due to invalid IL or missing references) //IL_031f: Expected O, but got Unknown //IL_0322: Unknown result type (might be due to invalid IL or missing references) //IL_032a: Unknown result type (might be due to invalid IL or missing references) //IL_03ed: Unknown result type (might be due to invalid IL or missing references) //IL_03f4: Expected O, but got Unknown //IL_03f7: Unknown result type (might be due to invalid IL or missing references) //IL_03ff: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)rewindHoloData != (Object)null)) { rewindHoloData = ScriptableObject.CreateInstance(); rewindHoloData.catalogId = "rewind_holo"; rewindHoloData.includeInShopSync = true; rewindHoloData.includeInCrateSync = true; rewindHoloData.isPhysical = true; rewindHoloData.titleKey = "Rewind Holo"; rewindHoloData.descriptionKey = "If you miss a shot, rewinds 5 seconds back [10 second cooldown]"; RewindHoloMechanic rewindHoloMechanic = ScriptableObject.CreateInstance(); FieldInfo field = typeof(HoloMechanic).GetField("hudProcEnabled", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (field != null) { field.SetValue(rewindHoloMechanic, true); } rewindHoloData.mechanic = (HoloMechanic)(object)rewindHoloMechanic; ShopItemData val = new ShopItemData(); val.type = (ShopItemType)0; val.rarity = (ItemRarity)2; val.cost = 7f; val.sellValue = 3f; val.nameKey = "Rewind Holo"; val.descriptionKey = "If you miss a shot, rewinds 5 seconds back [10 second cooldown]"; rewindHoloData.shopItem = val; chronoHoloData = ScriptableObject.CreateInstance(); chronoHoloData.catalogId = "chrono_holo"; chronoHoloData.includeInShopSync = true; chronoHoloData.includeInCrateSync = true; chronoHoloData.isPhysical = true; chronoHoloData.titleKey = "Chrono Holo"; chronoHoloData.descriptionKey = "On first x10 multiplier in a round, triggers a 5s time slowdown"; GenericHoloMechanic genericHoloMechanic = ScriptableObject.CreateInstance(); if (field != null) { field.SetValue(genericHoloMechanic, true); } chronoHoloData.mechanic = (HoloMechanic)(object)genericHoloMechanic; ShopItemData val2 = new ShopItemData(); val2.type = (ShopItemType)0; val2.rarity = (ItemRarity)2; val2.cost = 7f; val2.sellValue = 3f; val2.nameKey = "Chrono Holo"; val2.descriptionKey = "On first x10 multiplier in a round, triggers a 5s time slowdown"; chronoHoloData.shopItem = val2; midasHoloData = ScriptableObject.CreateInstance(); midasHoloData.catalogId = "midas_holo"; midasHoloData.includeInShopSync = true; midasHoloData.includeInCrateSync = true; midasHoloData.isPhysical = true; midasHoloData.titleKey = "Midas Holo"; midasHoloData.descriptionKey = "Hit targets have 30% chance to turn gold (+50% health, awards +2 currency on kill)"; GenericHoloMechanic genericHoloMechanic2 = ScriptableObject.CreateInstance(); if (field != null) { field.SetValue(genericHoloMechanic2, true); } midasHoloData.mechanic = (HoloMechanic)(object)genericHoloMechanic2; ShopItemData val3 = new ShopItemData(); val3.type = (ShopItemType)0; val3.rarity = (ItemRarity)2; val3.cost = 7f; val3.sellValue = 3f; val3.nameKey = "Midas Holo"; val3.descriptionKey = "Hit targets have 30% chance to turn gold (+50% health, awards +2 currency on kill)"; midasHoloData.shopItem = val3; magnetHoloData = ScriptableObject.CreateInstance(); magnetHoloData.catalogId = "magnet_holo"; magnetHoloData.includeInShopSync = true; magnetHoloData.includeInCrateSync = true; magnetHoloData.isPhysical = true; magnetHoloData.titleKey = "Magnet Holo"; magnetHoloData.descriptionKey = "Slowly pulls active targets closer to the center of your screen"; GenericHoloMechanic genericHoloMechanic3 = ScriptableObject.CreateInstance(); if (field != null) { field.SetValue(genericHoloMechanic3, true); } magnetHoloData.mechanic = (HoloMechanic)(object)genericHoloMechanic3; ShopItemData val4 = new ShopItemData(); val4.type = (ShopItemType)0; val4.rarity = (ItemRarity)2; val4.cost = 7f; val4.sellValue = 3f; val4.nameKey = "Magnet Holo"; val4.descriptionKey = "Slowly pulls active targets closer to the center of your screen"; magnetHoloData.shopItem = val4; ultimateRewindHoloData = ScriptableObject.CreateInstance(); ultimateRewindHoloData.catalogId = "ultimate_rewind_holo"; ultimateRewindHoloData.includeInShopSync = true; ultimateRewindHoloData.includeInCrateSync = true; ultimateRewindHoloData.isPhysical = true; ultimateRewindHoloData.titleKey = "Ultimate Rewind Holo"; ultimateRewindHoloData.descriptionKey = "If you miss, rewinds 10s back [15s cooldown]. Pulls crosshair slightly to targets."; RewindHoloMechanic rewindHoloMechanic2 = ScriptableObject.CreateInstance(); if (field != null) { field.SetValue(rewindHoloMechanic2, true); } ultimateRewindHoloData.mechanic = (HoloMechanic)(object)rewindHoloMechanic2; ShopItemData val5 = new ShopItemData(); val5.type = (ShopItemType)0; val5.rarity = (ItemRarity)4; val5.cost = 10f; val5.sellValue = 5f; val5.nameKey = "Ultimate Rewind Holo"; val5.descriptionKey = "If you miss, rewinds 10s back [15s cooldown]. Pulls crosshair slightly to targets."; ultimateRewindHoloData.shopItem = val5; } } private void Update() { //IL_01c8: Unknown result type (might be due to invalid IL or missing references) //IL_01cd: Unknown result type (might be due to invalid IL or missing references) //IL_01d3: Unknown result type (might be due to invalid IL or missing references) //IL_01d8: Unknown result type (might be due to invalid IL or missing references) //IL_020a: Unknown result type (might be due to invalid IL or missing references) //IL_020f: Unknown result type (might be due to invalid IL or missing references) //IL_0210: Unknown result type (might be due to invalid IL or missing references) //IL_0215: Unknown result type (might be due to invalid IL or missing references) //IL_0216: Unknown result type (might be due to invalid IL or missing references) //IL_021b: Unknown result type (might be due to invalid IL or missing references) //IL_021d: Unknown result type (might be due to invalid IL or missing references) //IL_021e: Unknown result type (might be due to invalid IL or missing references) //IL_0220: Unknown result type (might be due to invalid IL or missing references) //IL_0225: 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_0230: Unknown result type (might be due to invalid IL or missing references) //IL_0235: Unknown result type (might be due to invalid IL or missing references) //IL_023a: Unknown result type (might be due to invalid IL or missing references) //IL_0258: Unknown result type (might be due to invalid IL or missing references) //IL_025d: Unknown result type (might be due to invalid IL or missing references) //IL_026a: Unknown result type (might be due to invalid IL or missing references) //IL_0321: Unknown result type (might be due to invalid IL or missing references) //IL_032d: Unknown result type (might be due to invalid IL or missing references) //IL_0332: Unknown result type (might be due to invalid IL or missing references) //IL_0337: Unknown result type (might be due to invalid IL or missing references) //IL_033b: Unknown result type (might be due to invalid IL or missing references) //IL_0340: Unknown result type (might be due to invalid IL or missing references) //IL_0349: Unknown result type (might be due to invalid IL or missing references) //IL_034e: Unknown result type (might be due to invalid IL or missing references) //IL_03b5: Unknown result type (might be due to invalid IL or missing references) //IL_03ba: Unknown result type (might be due to invalid IL or missing references) //IL_03c8: Unknown result type (might be due to invalid IL or missing references) //IL_03e5: Unknown result type (might be due to invalid IL or missing references) //IL_03ea: 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_03f5: Unknown result type (might be due to invalid IL or missing references) //IL_0532: Unknown result type (might be due to invalid IL or missing references) //IL_0537: Unknown result type (might be due to invalid IL or missing references) //IL_059e: Unknown result type (might be due to invalid IL or missing references) //IL_05a3: Unknown result type (might be due to invalid IL or missing references) //IL_05a8: Unknown result type (might be due to invalid IL or missing references) //IL_05ac: Unknown result type (might be due to invalid IL or missing references) //IL_05b1: Unknown result type (might be due to invalid IL or missing references) //IL_05b6: Unknown result type (might be due to invalid IL or missing references) //IL_05bf: Unknown result type (might be due to invalid IL or missing references) //IL_05c1: Unknown result type (might be due to invalid IL or missing references) //IL_05c3: Unknown result type (might be due to invalid IL or missing references) //IL_05c8: Unknown result type (might be due to invalid IL or missing references) //IL_05ca: Unknown result type (might be due to invalid IL or missing references) bool flag = (Object)(object)GameManager.Instance != (Object)null && GameManager.Instance.IsRoundActive; if (flag && !wasRoundActive) { chronoTriggeredThisRound = false; chronoSlowdownTimer = 0f; chronoVisualTimer = 0f; } wasRoundActive = flag; if (flag && (IsRewindHoloEquipped() || IsHoloEquipped("ultimate_rewind_holo"))) { if (Time.unscaledTime - RewindHoloMechanic.lastSnapshotTime >= 0.1f) { RewindHoloMechanic.lastSnapshotTime = Time.unscaledTime; RewindHoloMechanic.RecordSnapshot(); } } else if (RewindHoloMechanic.snapshots.Count > 0) { RewindHoloMechanic.snapshots.Clear(); } if (flag && IsHoloEquipped("chrono_holo") && !chronoTriggeredThisRound && (Object)(object)ScoreManager.Instance != (Object)null && ScoreManager.Instance.StreakBonus >= 10f) { chronoTriggeredThisRound = true; chronoSlowdownTimer = 5f; chronoVisualTimer = 5f; Time.timeScale = 0.4f; ((BaseUnityPlugin)this).Logger.LogInfo((object)"Chrono Holo triggered! Time slowed down to 0.4x."); } if (chronoSlowdownTimer > 0f) { if (flag) { if (Time.timeScale > 0f) { Time.timeScale = 0.4f; chronoSlowdownTimer -= Time.unscaledDeltaTime; if (chronoSlowdownTimer <= 0f) { Time.timeScale = 1f; ((BaseUnityPlugin)this).Logger.LogInfo((object)"Chrono Holo slowdown ended."); } } } else { chronoSlowdownTimer = 0f; chronoVisualTimer = 0f; if (Time.timeScale > 0f) { Time.timeScale = 1f; } } } Target[] array; if (flag && IsHoloEquipped("magnet_holo")) { Weapon instance = Weapon.Instance; if ((Object)(object)instance != (Object)null && (Object)(object)instance.AimCamera != (Object)null) { Camera aimCamera = instance.AimCamera; Vector3 position = ((Component)aimCamera).transform.position; Vector3 forward = ((Component)aimCamera).transform.forward; array = Object.FindObjectsByType((FindObjectsSortMode)0); foreach (Target val in array) { if ((Object)(object)val != (Object)null && val.IsAlive) { Vector3 val2 = Vector3.Project(((Component)val).transform.position - position, forward); Vector3 val3 = position + val2; Vector3 val4 = val3 - ((Component)val).transform.position; if (((Vector3)(ref val4)).magnitude > 0.01f) { ((Component)val).transform.position = Vector3.Lerp(((Component)val).transform.position, val3, 1f * Time.deltaTime); } } } } } if (!flag || !IsHoloEquipped("ultimate_rewind_holo")) { return; } PlayerCameraController val5 = Object.FindAnyObjectByType(); Weapon instance2 = Weapon.Instance; if (!((Object)(object)val5 != (Object)null) || !((Object)(object)instance2 != (Object)null) || !((Object)(object)instance2.AimCamera != (Object)null) || !((Behaviour)val5).isActiveAndEnabled) { return; } Camera aimCamera2 = instance2.AimCamera; Target[] array2 = Object.FindObjectsByType((FindObjectsSortMode)0); Target val6 = null; float num = float.MaxValue; array = array2; foreach (Target val7 in array) { if ((Object)(object)val7 != (Object)null && val7.IsAlive) { Vector3 val8 = ((Component)val7).transform.position - ((Component)aimCamera2).transform.position; Vector3 normalized = ((Vector3)(ref val8)).normalized; float num2 = Vector3.Angle(((Component)aimCamera2).transform.forward, normalized); if (num2 < num && num2 < 25f) { num = num2; val6 = val7; } } } if (!((Object)(object)val6 != (Object)null)) { return; } MethodInfo method = typeof(PlayerCameraController).GetMethod("GetAimAngleToWorldPoint", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (!(method != null)) { return; } Vector3 position2 = ((Component)val6).transform.position; if (!(method.Invoke(val5, new object[1] { position2 }) is Vector2 val9)) { return; } float x = val9.x; float y = val9.y; FieldInfo field = typeof(PlayerCameraController).GetField("_yaw", BindingFlags.Instance | BindingFlags.NonPublic); FieldInfo field2 = typeof(PlayerCameraController).GetField("_pitch", BindingFlags.Instance | BindingFlags.NonPublic); if (field != null && field2 != null) { float num3 = (float)field.GetValue(val5); float num4 = (float)field2.GetValue(val5); float num5 = 4f * Time.deltaTime; float num6 = Mathf.LerpAngle(num3, x, num5); float num7 = Mathf.Lerp(num4, y, num5); field.SetValue(val5, num6); field2.SetValue(val5, num7); bool num8 = (bool)typeof(PlayerCameraController).GetField("limitRotation", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic).GetValue(val5); float num9 = (float)typeof(PlayerCameraController).GetField("maxYawDegrees", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic).GetValue(val5); float num10 = (float)typeof(PlayerCameraController).GetField("maxPitchDegrees", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic).GetValue(val5); Quaternion val10 = (Quaternion)typeof(PlayerCameraController).GetField("_startRotation", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(val5); if (num8) { num6 = Mathf.Clamp(num6, 0f - num9, num9); num7 = Mathf.Clamp(num7, 0f - num10, num10); field.SetValue(val5, num6); field2.SetValue(val5, num7); } else { num7 = Mathf.Clamp(num7, -89f, 89f); field2.SetValue(val5, num7); } Quaternion val11 = Quaternion.AngleAxis(num6, Vector3.up); Quaternion val12 = Quaternion.AngleAxis(num7, Vector3.right); ((Component)val5).transform.localRotation = val10 * val11 * val12; } } public static bool IsHoloEquipped(string catalogId) { if ((Object)(object)HoloItemManager.Instance == (Object)null) { return false; } try { FieldInfo field = typeof(HoloItemManager).GetField("_equipped", BindingFlags.Instance | BindingFlags.NonPublic); if (field != null && field.GetValue(HoloItemManager.Instance) is IEnumerable enumerable) { foreach (object item in enumerable) { if (item == null) { continue; } FieldInfo field2 = item.GetType().GetField("Data", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (field2 != null) { object? value = field2.GetValue(item); HoloItemData val = (HoloItemData)((value is HoloItemData) ? value : null); if ((Object)(object)val != (Object)null && val.catalogId == catalogId) { return true; } } } } } catch (Exception ex) { Debug.LogError((object)("[MoreHolos] Error checking equipped holos: " + ex.Message)); } return false; } public static bool IsRewindHoloEquipped() { return IsHoloEquipped("rewind_holo"); } private void OnGUI() { //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_02b6: Unknown result type (might be due to invalid IL or missing references) //IL_02db: Unknown result type (might be due to invalid IL or missing references) //IL_02fb: Unknown result type (might be due to invalid IL or missing references) //IL_0319: Unknown result type (might be due to invalid IL or missing references) //IL_0320: Expected O, but got Unknown //IL_035a: Unknown result type (might be due to invalid IL or missing references) //IL_0366: Unknown result type (might be due to invalid IL or missing references) //IL_036d: Expected O, but got Unknown //IL_0394: Unknown result type (might be due to invalid IL or missing references) //IL_03dc: Unknown result type (might be due to invalid IL or missing references) //IL_03f3: 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_005f: Unknown result type (might be due to invalid IL or missing references) //IL_009b: 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_0180: Unknown result type (might be due to invalid IL or missing references) //IL_0186: Expected O, but got Unknown //IL_013b: Unknown result type (might be due to invalid IL or missing references) //IL_0119: Unknown result type (might be due to invalid IL or missing references) //IL_0202: Unknown result type (might be due to invalid IL or missing references) //IL_01e0: 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_020d: Unknown result type (might be due to invalid IL or missing references) //IL_0214: Expected O, but got Unknown //IL_0231: Unknown result type (might be due to invalid IL or missing references) //IL_0266: Unknown result type (might be due to invalid IL or missing references) //IL_028a: Unknown result type (might be due to invalid IL or missing references) if (RewindHoloMechanic.rewindVisualTimer > 0f) { float num = RewindHoloMechanic.rewindVisualTimer / 2.5f; Color color = GUI.color; float num2 = Mathf.PingPong(RewindHoloMechanic.rewindVisualTimer * 4f, 1f); float num3 = 0.2f * num + 0.1f * num2 * num; if (RewindHoloMechanic.isUltimateRewindActive) { GUI.color = new Color(1f, 0f, 0.15f, num3); } else { GUI.color = new Color(0f, 0.75f, 1f, num3); } GUI.DrawTexture(new Rect(0f, 0f, (float)Screen.width, (float)Screen.height), (Texture)(object)Texture2D.whiteTexture); GUI.color = color; for (int i = 0; i < 3; i++) { float num4 = (Mathf.Sin(RewindHoloMechanic.rewindVisualTimer * 12f + (float)i * 2f) * 0.5f + 0.5f) * (float)Screen.height; float num5 = Random.Range(3f, 12f); Color color2 = GUI.color; if (RewindHoloMechanic.isUltimateRewindActive) { GUI.color = new Color(1f, 0.1f, 0.1f, num * 0.15f); } else { GUI.color = new Color(0f, 0.8f, 1f, num * 0.12f); } GUI.DrawTexture(new Rect(0f, num4, (float)Screen.width, num5), (Texture)(object)Texture2D.whiteTexture); GUI.color = color2; } GUIStyle val = new GUIStyle(GUI.skin.label); val.alignment = (TextAnchor)4; int num6 = 36; float num7 = 1f + Mathf.Sin(RewindHoloMechanic.rewindVisualTimer * 10f) * 0.15f; val.fontSize = (int)((float)num6 * num7); val.fontStyle = (FontStyle)1; if (RewindHoloMechanic.isUltimateRewindActive) { val.normal.textColor = new Color(1f, 0.2f, 0.2f, num); } else { val.normal.textColor = new Color(1f, 1f, 1f, num); } GUIStyle val2 = new GUIStyle(val); val2.normal.textColor = new Color(0f, 0f, 0f, num * 0.7f); string text = (RewindHoloMechanic.isUltimateRewindActive ? "<< ULTIMATE TEMPORAL REWIND >>" : "<< REWINDING TIME >>"); GUI.Label(new Rect(2f, 2f, (float)Screen.width, (float)Screen.height), text, val2); GUI.Label(new Rect(0f, 0f, (float)Screen.width, (float)Screen.height), text, val); RewindHoloMechanic.rewindVisualTimer -= Time.unscaledDeltaTime; } if (chronoVisualTimer > 0f) { Color color3 = GUI.color; GUI.color = new Color(0.5f, 0f, 1f, chronoVisualTimer / 5f * 0.2f); GUI.DrawTexture(new Rect(0f, 0f, (float)Screen.width, (float)Screen.height), (Texture)(object)Texture2D.whiteTexture); GUI.color = color3; GUIStyle val3 = new GUIStyle(GUI.skin.label); val3.alignment = (TextAnchor)4; val3.fontSize = 28; val3.fontStyle = (FontStyle)0; val3.normal.textColor = new Color(0.7f, 0.3f, 1f, chronoVisualTimer / 5f); GUIStyle val4 = new GUIStyle(val3); val4.normal.textColor = new Color(0f, 0f, 0f, chronoVisualTimer / 5f * 0.7f); float num8 = 300f; float num9 = 50f; float num10 = ((float)Screen.width - num8) / 2f; float num11 = (float)Screen.height - 100f; GUI.Label(new Rect(num10 + 2f, num11 + 2f, num8, num9), "slowdown..", val4); GUI.Label(new Rect(num10, num11, num8, num9), "slowdown..", val3); if (Time.timeScale > 0f) { chronoVisualTimer -= Time.unscaledDeltaTime; } } } private void OnDestroy() { if (harmony != null) { harmony.UnpatchSelf(); } } } public class MidasGoldComponent : MonoBehaviour { private SpriteRenderer sr; private void Start() { //IL_0034: Unknown result type (might be due to invalid IL or missing references) sr = ((Component)this).GetComponentInChildren(); if ((Object)(object)sr != (Object)null) { sr.color = new Color(1f, 0.85f, 0f, 1f); } } private void Update() { //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)sr != (Object)null && sr.color != new Color(1f, 0.85f, 0f, 1f)) { sr.color = new Color(1f, 0.85f, 0f, 1f); } } private void OnDisable() { //IL_0014: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)sr != (Object)null) { sr.color = Color.white; } Object.Destroy((Object)(object)this); } } [HarmonyPatch(typeof(HoloCatalogDatabase), "LoadDefault")] internal class HoloCatalogDatabasePatch { private static void Postfix(HoloCatalogDatabase __result) { if (!((Object)(object)__result != (Object)null)) { return; } MoreHolosPlugin.CreateHoloInstances(); List obj = new List { MoreHolosPlugin.rewindHoloData, MoreHolosPlugin.chronoHoloData, MoreHolosPlugin.midasHoloData, MoreHolosPlugin.magnetHoloData, MoreHolosPlugin.ultimateRewindHoloData }; List list = new List(__result.Holos); bool flag = false; foreach (HoloItemData holo in obj) { if ((Object)(object)holo == (Object)null || list.Any((HoloItemData h) => (Object)(object)h != (Object)null && h.catalogId == holo.catalogId)) { continue; } if (__result.Holos.Count > 0) { HoloItemData val = __result.Holos[0]; if (val.shopItem != null && holo.shopItem != null) { holo.shopItem.icon = val.shopItem.icon; holo.shopItem.animationProfile = val.shopItem.animationProfile; } holo.physicalPrefab = val.physicalPrefab; holo.equipVFX = val.equipVFX; holo.activateVFX = val.activateVFX; holo.deactivateVFX = val.deactivateVFX; } list.Add(holo); flag = true; Debug.Log((object)("[MoreHolos] Successfully injected " + holo.catalogId + " into catalog database!")); } if (flag) { __result.SetHolos(list); } } } [HarmonyPatch(typeof(ShopManager), "RebuildRuntimeItems")] internal class ShopManagerRebuildRuntimeItemsPatch { private static void Prefix(ShopManager __instance) { if (!((Object)(object)__instance != (Object)null)) { return; } MoreHolosPlugin.CreateHoloInstances(); FieldInfo field = typeof(ShopManager).GetField("shopItemAssets", BindingFlags.Instance | BindingFlags.NonPublic); if (!(field != null) || !(field.GetValue(__instance) is List list)) { return; } List list2 = new List { MoreHolosPlugin.rewindHoloData, MoreHolosPlugin.chronoHoloData, MoreHolosPlugin.midasHoloData, MoreHolosPlugin.magnetHoloData, MoreHolosPlugin.ultimateRewindHoloData }; HoloItemData val = null; foreach (ScriptableObject item in list) { HoloItemData val2 = (HoloItemData)(object)((item is HoloItemData) ? item : null); if ((Object)(object)val2 != (Object)null && val2.shopItem != null) { val = val2; break; } } if ((Object)(object)val == (Object)null) { HoloItemData[] array = Resources.FindObjectsOfTypeAll(); foreach (HoloItemData val3 in array) { if ((Object)(object)val3 != (Object)null && val3.shopItem != null) { val = val3; break; } } } foreach (HoloItemData item2 in list2) { if ((Object)(object)item2 != (Object)null) { if ((Object)(object)val != (Object)null && item2.shopItem != null && (Object)(object)item2.shopItem.icon == (Object)null) { item2.shopItem.icon = val.shopItem.icon; item2.shopItem.animationProfile = val.shopItem.animationProfile; item2.physicalPrefab = val.physicalPrefab; item2.equipVFX = val.equipVFX; item2.activateVFX = val.activateVFX; item2.deactivateVFX = val.deactivateVFX; } if (!list.Contains((ScriptableObject)(object)item2)) { list.Add((ScriptableObject)(object)item2); Debug.Log((object)("[MoreHolos] Injected " + item2.catalogId + " into shopItemAssets!")); } } } } } [HarmonyPatch(typeof(CrateManager), "OpenCrate", new Type[] { typeof(CrateItemData), typeof(bool), typeof(bool), typeof(bool) })] internal class CrateManagerOpenCratePatch { private static void Prefix(CrateItemData crateData) { if (!((Object)(object)crateData != (Object)null) || crateData.candidateHolos == null) { return; } MoreHolosPlugin.CreateHoloInstances(); foreach (HoloItemData item in new List { MoreHolosPlugin.rewindHoloData, MoreHolosPlugin.chronoHoloData, MoreHolosPlugin.midasHoloData, MoreHolosPlugin.magnetHoloData, MoreHolosPlugin.ultimateRewindHoloData }) { if ((Object)(object)item != (Object)null && !crateData.candidateHolos.Contains(item)) { crateData.candidateHolos.Add(item); Debug.Log((object)("[MoreHolos] Dynamically injected " + item.catalogId + " into crate candidate pool!")); } } } } [HarmonyPatch(typeof(ShopEntryView), "ResolveHoloRarityColor")] internal class ResolveHoloRarityColorPatch { private static bool Prefix(ItemRarity rarity, ref Color __result) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Invalid comparison between Unknown and I4 //IL_0019: 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) if ((int)rarity == 4) { __result = new Color(1f, 0.08f, 0.08f, 1f); return false; } return true; } } [HarmonyPatch(typeof(CrateOpeningUI), "ResolveRarityColor")] internal class CrateResolveRarityColorPatch { private static bool Prefix(ItemRarity rarity, ref Color __result) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Invalid comparison between Unknown and I4 //IL_0019: 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) if ((int)rarity == 4) { __result = new Color(1f, 0.08f, 0.08f, 1f); return false; } return true; } } [HarmonyPatch(typeof(ShopPresentation), "GetDisplayRarity")] internal class GetDisplayRarityPatch { private static bool Prefix(ItemRarity rarity, ref string __result) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Invalid comparison between Unknown and I4 if ((int)rarity == 4) { __result = "Mythic"; return false; } return true; } } [HarmonyPatch(typeof(ShopEntryView), "ResolveHoloMaterial")] internal class ResolveHoloMaterialPatch { private static bool Prefix(ShopEntryView __instance, ItemRarity rarity, ref Material __result) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Invalid comparison between Unknown and I4 if ((int)rarity == 4 && (Object)(object)__instance != (Object)null) { FieldInfo field = typeof(ShopEntryView).GetField("legendaryHoloIconMaterial", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (field != null) { object? value = field.GetValue(__instance); __result = (Material)((value is Material) ? value : null); return false; } } return true; } } [HarmonyPatch(typeof(RarityMaterialPalette), "Resolve")] internal class PaletteResolvePatch { private static bool Prefix(RarityMaterialPalette __instance, ItemRarity rarity, ref Material __result) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Invalid comparison between Unknown and I4 if ((int)rarity == 4 && (Object)(object)__instance != (Object)null) { FieldInfo field = typeof(RarityMaterialPalette).GetField("legendary", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (field != null) { object? value = field.GetValue(__instance); __result = (Material)((value is Material) ? value : null); return false; } } return true; } } [HarmonyPatch(typeof(Weapon), "OnBulletMissRegistered")] internal class BulletMissPatch { private static void Postfix() { if (MoreHolosPlugin.IsRewindHoloEquipped() || MoreHolosPlugin.IsHoloEquipped("ultimate_rewind_holo")) { RewindHoloMechanic.TriggerRewind(); } } } [HarmonyPatch(typeof(Target), "OnShotHit")] internal class TargetOnShotHitPatch { private static void Postfix(Target __instance, ShotHitContext context) { if ((Object)(object)__instance == (Object)null || !__instance.IsAlive || !MoreHolosPlugin.IsHoloEquipped("midas_holo") || !((Object)(object)((Component)__instance).GetComponent() == (Object)null) || !(Random.value < 0.3f)) { return; } ((Component)__instance).gameObject.AddComponent(); FieldInfo field = typeof(Target).GetField("_lifetime", BindingFlags.Instance | BindingFlags.NonPublic); if (!(field != null)) { return; } object? value = field.GetValue(__instance); TargetLifetime val = (TargetLifetime)((value is TargetLifetime) ? value : null); if ((Object)(object)val != (Object)null) { FieldInfo field2 = typeof(TargetLifetime).GetField("_hp", BindingFlags.Instance | BindingFlags.NonPublic); if (field2 != null) { float num = (float)field2.GetValue(val); field2.SetValue(val, num * 1.5f); Debug.Log((object)$"[MoreHolos] Midas Holo: Target turned gold! HP increased to {num * 1.5f}"); } } } } [HarmonyPatch(typeof(TargetManager), "HandleTargetKilled")] internal class TargetManagerHandleTargetKilledPatch { private static void Prefix(TargetKilledContext context) { if (context == null || (Object)(object)context.Target == (Object)null) { return; } Target component = context.Target.GetComponent(); if ((Object)(object)component != (Object)null && (Object)(object)((Component)component).GetComponent() != (Object)null) { if ((Object)(object)ScoreManager.Instance != (Object)null) { ScoreManager.Instance.AddCurrency(2); Debug.Log((object)"[MoreHolos] Midas Holo: Gold target destroyed! Awarded +2 currency."); } FieldInfo field = typeof(Target).GetField("_isShiny", BindingFlags.Instance | BindingFlags.NonPublic); if (field != null) { field.SetValue(component, false); } } } } public class GenericHoloMechanic : HoloMechanic { } public struct TargetSnapshot { public int instanceId; public Vector3 position; public float hp; public float lifetimeTimer; } public struct Snapshot { public float timestamp; public float remainingSeconds; public float yaw; public float pitch; public double score; public float multiplier; public int currency; public int consecutiveMisses; public int ppm_roundShotsMissed; public int ppm_roundTargetsDestroyed; public int ppm_roundNormalShotsFired; public int ppm_roundNormalShotsMissed; public int ppm_roundSpecialShotsFired; public int ppm_roundSpecialShotsMissed; public List magazine; public List targets; } public class RewindHoloMechanic : HoloMechanic, IHoloShotMissed { public static List snapshots = new List(); public static float lastSnapshotTime = 0f; public static float lastRewindTime = -99f; public static float rewindVisualTimer = 0f; public static bool isUltimateRewindActive = false; public void OnShotMissed(ShotMissedContext ctx) { TriggerRewind(); } public static void RecordSnapshot() { //IL_0242: Unknown result type (might be due to invalid IL or missing references) //IL_0247: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)GameManager.Instance == (Object)null || !GameManager.Instance.IsRoundActive) { return; } Weapon instance = Weapon.Instance; PlayerCameraController val = Object.FindAnyObjectByType(); ScoreManager instance2 = ScoreManager.Instance; PlayerProgressManager instance3 = PlayerProgressManager.Instance; FairTargetSpawner val2 = Object.FindAnyObjectByType(); if ((Object)(object)instance == (Object)null || (Object)(object)val == (Object)null || (Object)(object)instance2 == (Object)null || (Object)(object)instance3 == (Object)null || (Object)(object)val2 == (Object)null) { return; } float yaw = 0f; float pitch = 0f; FieldInfo field = typeof(PlayerCameraController).GetField("_yaw", BindingFlags.Instance | BindingFlags.NonPublic); FieldInfo field2 = typeof(PlayerCameraController).GetField("_pitch", BindingFlags.Instance | BindingFlags.NonPublic); if (field != null) { yaw = (float)field.GetValue(val); } if (field2 != null) { pitch = (float)field2.GetValue(val); } int progressField = GetProgressField(instance3, "_roundShotsMissed"); int progressField2 = GetProgressField(instance3, "_roundTargetsDestroyed"); int progressField3 = GetProgressField(instance3, "_roundNormalShotsFired"); int progressField4 = GetProgressField(instance3, "_roundNormalShotsMissed"); int progressField5 = GetProgressField(instance3, "_roundSpecialShotsFired"); int progressField6 = GetProgressField(instance3, "_roundSpecialShotsMissed"); List list = new List(); Target[] array = Object.FindObjectsByType((FindObjectsSortMode)0); foreach (Target val3 in array) { if (!((Object)(object)val3 != (Object)null) || !((Component)val3).gameObject.activeInHierarchy || !val3.IsAlive) { continue; } float hp = 1f; float lifetimeTimer = 0f; FieldInfo field3 = typeof(Target).GetField("_lifetime", BindingFlags.Instance | BindingFlags.NonPublic); if (field3 != null) { object? value = field3.GetValue(val3); TargetLifetime val4 = (TargetLifetime)((value is TargetLifetime) ? value : null); if ((Object)(object)val4 != (Object)null) { FieldInfo field4 = typeof(TargetLifetime).GetField("_hp", BindingFlags.Instance | BindingFlags.NonPublic); FieldInfo field5 = typeof(TargetLifetime).GetField("_timer", BindingFlags.Instance | BindingFlags.NonPublic); if (field4 != null) { hp = (float)field4.GetValue(val4); } if (field5 != null) { lifetimeTimer = (float)field5.GetValue(val4); } } } list.Add(new TargetSnapshot { instanceId = ((Object)((Component)val3).gameObject).GetInstanceID(), position = ((Component)val3).transform.position, hp = hp, lifetimeTimer = lifetimeTimer }); } List list2 = new List(); if (instance.BulletMagazine != null) { list2.AddRange(instance.BulletMagazine); } float num = 60f; FieldInfo field6 = typeof(FairTargetSpawner).GetField("roundDurationSeconds", BindingFlags.Instance | BindingFlags.NonPublic); if (field6 != null) { num = (float)field6.GetValue(val2); } float remainingSeconds = num; FieldInfo field7 = typeof(FairTargetSpawner).GetField("_roundTimer", BindingFlags.Instance | BindingFlags.NonPublic); if (field7 != null) { float num2 = (float)field7.GetValue(val2); remainingSeconds = Mathf.Max(0f, num - num2); } int consecutiveMisses = 0; FieldInfo field8 = typeof(ScoreManager).GetField("_consecutiveMisses", BindingFlags.Instance | BindingFlags.NonPublic); if (field8 != null) { consecutiveMisses = (int)field8.GetValue(instance2); } Snapshot item = new Snapshot { timestamp = Time.unscaledTime, remainingSeconds = remainingSeconds, yaw = yaw, pitch = pitch, score = instance2.CurrentScore, multiplier = instance2.StreakBonus, currency = instance2.Currency, consecutiveMisses = consecutiveMisses, ppm_roundShotsMissed = progressField, ppm_roundTargetsDestroyed = progressField2, ppm_roundNormalShotsFired = progressField3, ppm_roundNormalShotsMissed = progressField4, ppm_roundSpecialShotsFired = progressField5, ppm_roundSpecialShotsMissed = progressField6, magazine = list2, targets = list }; snapshots.Add(item); float num3 = (MoreHolosPlugin.IsHoloEquipped("ultimate_rewind_holo") ? 10f : 5f); while (snapshots.Count > 0 && Time.unscaledTime - snapshots[0].timestamp > num3) { snapshots.RemoveAt(0); } } public static void TriggerRewind() { //IL_045f: Unknown result type (might be due to invalid IL or missing references) bool flag = MoreHolosPlugin.IsHoloEquipped("ultimate_rewind_holo"); float num = (flag ? 15f : 10f); if (Time.unscaledTime - lastRewindTime < num || snapshots.Count == 0) { return; } lastRewindTime = Time.unscaledTime; rewindVisualTimer = 2.5f; isUltimateRewindActive = flag; Snapshot snapshot = snapshots[0]; snapshots.Clear(); Weapon instance = Weapon.Instance; PlayerCameraController val = Object.FindAnyObjectByType(); ScoreManager instance2 = ScoreManager.Instance; PlayerProgressManager instance3 = PlayerProgressManager.Instance; FairTargetSpawner val2 = Object.FindAnyObjectByType(); if ((Object)(object)val != (Object)null) { FieldInfo field = typeof(PlayerCameraController).GetField("_yaw", BindingFlags.Instance | BindingFlags.NonPublic); FieldInfo field2 = typeof(PlayerCameraController).GetField("_pitch", BindingFlags.Instance | BindingFlags.NonPublic); if (field != null) { field.SetValue(val, snapshot.yaw); } if (field2 != null) { field2.SetValue(val, snapshot.pitch); } } if ((Object)(object)val2 != (Object)null) { FieldInfo field3 = typeof(FairTargetSpawner).GetField("_roundTimer", BindingFlags.Instance | BindingFlags.NonPublic); if (field3 != null) { float num2 = 60f; FieldInfo field4 = typeof(FairTargetSpawner).GetField("roundDurationSeconds", BindingFlags.Instance | BindingFlags.NonPublic); if (field4 != null) { num2 = (float)field4.GetValue(val2); } float num3 = Mathf.Max(0f, num2 - snapshot.remainingSeconds); field3.SetValue(val2, num3); } } if ((Object)(object)instance != (Object)null) { FieldInfo field5 = typeof(Weapon).GetField("_bulletMagazine", BindingFlags.Instance | BindingFlags.NonPublic); if (field5 != null) { field5.SetValue(instance, new List(snapshot.magazine)); } MethodInfo method = typeof(Weapon).GetMethod("PublishAmmoChanged", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (method != null) { method.Invoke(instance, null); } } if ((Object)(object)instance2 != (Object)null) { FieldInfo field6 = typeof(ScoreManager).GetField("currentScore", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); FieldInfo field7 = typeof(ScoreManager).GetField("streakBonus", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); FieldInfo field8 = typeof(ScoreManager).GetField("currency", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); FieldInfo field9 = typeof(ScoreManager).GetField("_consecutiveMisses", BindingFlags.Instance | BindingFlags.NonPublic); if (field6 != null) { field6.SetValue(instance2, snapshot.score); } if (field7 != null) { field7.SetValue(instance2, snapshot.multiplier); } if (field8 != null) { field8.SetValue(instance2, snapshot.currency); } if (field9 != null) { field9.SetValue(instance2, snapshot.consecutiveMisses); } MethodInfo method2 = typeof(ScoreManager).GetMethod("UpdateDecoys", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); MethodInfo method3 = typeof(ScoreManager).GetMethod("RefreshIntegrityStamp", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (method2 != null) { method2.Invoke(instance2, null); } if (method3 != null) { method3.Invoke(instance2, null); } } if ((Object)(object)instance3 != (Object)null) { SetProgressField(instance3, "_roundShotsMissed", snapshot.ppm_roundShotsMissed); SetProgressField(instance3, "_roundTargetsDestroyed", snapshot.ppm_roundTargetsDestroyed); SetProgressField(instance3, "_roundNormalShotsFired", snapshot.ppm_roundNormalShotsFired); SetProgressField(instance3, "_roundNormalShotsMissed", snapshot.ppm_roundNormalShotsMissed); SetProgressField(instance3, "_roundSpecialShotsFired", snapshot.ppm_roundSpecialShotsFired); SetProgressField(instance3, "_roundSpecialShotsMissed", snapshot.ppm_roundSpecialShotsMissed); } Target[] array = Object.FindObjectsByType((FindObjectsSortMode)0); Dictionary dictionary = new Dictionary(); foreach (TargetSnapshot target in snapshot.targets) { dictionary[target.instanceId] = target; } Target[] array2 = array; foreach (Target val3 in array2) { if (!((Object)(object)val3 != (Object)null) || !((Component)val3).gameObject.activeInHierarchy || !val3.IsAlive) { continue; } int instanceID = ((Object)((Component)val3).gameObject).GetInstanceID(); if (!dictionary.TryGetValue(instanceID, out var value)) { continue; } ((Component)val3).transform.position = value.position; FieldInfo field10 = typeof(Target).GetField("_lifetime", BindingFlags.Instance | BindingFlags.NonPublic); if (!(field10 != null)) { continue; } object? value2 = field10.GetValue(val3); TargetLifetime val4 = (TargetLifetime)((value2 is TargetLifetime) ? value2 : null); if ((Object)(object)val4 != (Object)null) { FieldInfo field11 = typeof(TargetLifetime).GetField("_hp", BindingFlags.Instance | BindingFlags.NonPublic); FieldInfo field12 = typeof(TargetLifetime).GetField("_timer", BindingFlags.Instance | BindingFlags.NonPublic); if (field11 != null) { field11.SetValue(val4, value.hp); } if (field12 != null) { field12.SetValue(val4, value.lifetimeTimer); } } } Debug.Log((object)$"[MoreHolos] Rewind Holo triggered! Restored state from {(flag ? 10f : 5f)} seconds ago."); } private static int GetProgressField(PlayerProgressManager ppm, string fieldName) { FieldInfo field = typeof(PlayerProgressManager).GetField(fieldName, BindingFlags.Instance | BindingFlags.NonPublic); if (field != null) { return (int)field.GetValue(ppm); } return 0; } private static void SetProgressField(PlayerProgressManager ppm, string fieldName, int value) { FieldInfo field = typeof(PlayerProgressManager).GetField(fieldName, BindingFlags.Instance | BindingFlags.NonPublic); if (field != null) { field.SetValue(ppm, value); } } } }