using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Text.RegularExpressions; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using BepInEx.Unity.IL2CPP; using CellMenu; using GameData; using Gear; using HarmonyLib; using Il2CppInterop.Runtime.Injection; using Il2CppInterop.Runtime.InteropTypes; using Microsoft.CodeAnalysis; using Player; using TMPro; using UnityEngine; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = "")] [assembly: AssemblyCompany("Zose_ReloadTimer")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("Zose_ReloadTimer")] [assembly: AssemblyTitle("Zose_ReloadTimer")] [assembly: AssemblyVersion("1.0.0.0")] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } } namespace Zose_ReloadTimer { public static class PluginData { public const string GUID = "Zose_ReloadTimer"; public const string Name = "Zose_ReloadTimer"; public const string Version = "1.5.0"; } [BepInPlugin("Zose_ReloadTimer", "Zose_ReloadTimer", "1.5.0")] public class EntryPoint : BasePlugin { public static EntryPoint? Instance; public static ConfigEntry? ConfigOffset; public static ConfigEntry? ConfigChargeColor; public static ConfigEntry? ConfigLowAmmoThreshold; public static ConfigEntry? ConfigLowAmmoColor; public static Color ParsedChargeColor = new Color(0f, 1f, 0f, 0.8f); public static Color ParsedLowAmmoColor = new Color(1f, 0f, 0f, 0.8f); public static bool NeedsConfigReload = false; private static Harmony? harmony; private static FileSystemWatcher? _configWatcher; public override void Load() { //IL_0196: Unknown result type (might be due to invalid IL or missing references) //IL_01a0: Expected O, but got Unknown Instance = this; ClassInjector.RegisterTypeInIl2Cpp(); ConfigOffset = ((BasePlugin)this).Config.Bind("Settings", "TextOffset", 85f, "The vertical offset of the reload text from the crosshair."); ConfigOffset.SettingChanged += delegate { Zose_ReloadTimer.Instance?.UpdateUIPosition(); }; ConfigChargeColor = ((BasePlugin)this).Config.Bind("Settings", "ChargeColor", "#00FF0080", "The color of the reload charge circle in Hex format (#RRGGBBAA)."); ConfigLowAmmoThreshold = ((BasePlugin)this).Config.Bind("AmmoWarning", "LowAmmoThreshold", 0.35f, "The ammo threshold (percentage 0.0-1.0) for large weapons (>20 clip size)."); ConfigOffset = ((BasePlugin)this).Config.Bind("Settings", "TextOffset", 85f, "Vertical offset of the reload text from the crosshair."); ConfigOffset.SettingChanged += delegate { Zose_ReloadTimer.Instance?.UpdateUIPosition(); }; ConfigChargeColor = ((BasePlugin)this).Config.Bind("Settings", "ChargeColor", "#00FF0080", "Color of the reload charge circle in Hex format (#RRGGBBAA)."); ConfigLowAmmoThreshold = ((BasePlugin)this).Config.Bind("AmmoWarning", "LowAmmoThreshold", 0.35f, "Ammo threshold (0.0-1.0) for warning."); ConfigLowAmmoColor = ((BasePlugin)this).Config.Bind("AmmoWarning", "LowAmmoColor", "#FF000080", "Color of the 'RELOAD' warning text in Hex format (#RRGGBBAA)."); UpdateParsedColor(); ConfigChargeColor.SettingChanged += delegate { UpdateParsedColor(); }; ConfigLowAmmoColor.SettingChanged += delegate { UpdateParsedColor(); }; SetupConfigWatcher(); harmony = new Harmony("Zose_ReloadTimer"); harmony.PatchAll(); Zose_ReloadTimer.LoadCache(); Logger.Info("Zose_ReloadTimer 1.5.0 loaded."); } public void ReloadConfig() { ((BasePlugin)this).Config.Reload(); UpdateParsedColor(); Logger.Info("Config reloaded from disk."); } private void UpdateParsedColor() { //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Unknown result type (might be due to invalid IL or missing references) Color parsedChargeColor = default(Color); if (ConfigChargeColor != null && ColorUtility.TryParseHtmlString(ConfigChargeColor.Value, ref parsedChargeColor)) { ParsedChargeColor = parsedChargeColor; } Color parsedLowAmmoColor = default(Color); if (ConfigLowAmmoColor != null && ColorUtility.TryParseHtmlString(ConfigLowAmmoColor.Value, ref parsedLowAmmoColor)) { ParsedLowAmmoColor = parsedLowAmmoColor; } } private void SetupConfigWatcher() { try { _configWatcher = new FileSystemWatcher(Path.GetDirectoryName(((BasePlugin)this).Config.ConfigFilePath), Path.GetFileName(((BasePlugin)this).Config.ConfigFilePath)); _configWatcher.NotifyFilter = NotifyFilters.LastWrite; _configWatcher.Changed += delegate { NeedsConfigReload = true; }; _configWatcher.EnableRaisingEvents = true; } catch (Exception ex) { Logger.Error("Failed to setup ConfigWatcher: " + ex.Message); } } } internal static class Logger { private static readonly ManualLogSource _Logger; static Logger() { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Expected O, but got Unknown _Logger = new ManualLogSource("Zose_ReloadTimer"); Logger.Sources.Add((ILogSource)(object)_Logger); } public static void Info(string str) { _Logger.LogMessage((object)str); } public static void Info(object data) { _Logger.LogMessage((object)data?.ToString()); } public static void Debug(string str) { _Logger.LogDebug((object)str); } public static void Debug(object data) { _Logger.LogDebug((object)data?.ToString()); } public static void Error(string str) { _Logger.LogError((object)str); } public static void Error(object data) { _Logger.LogError((object)data?.ToString()); } public static void Fatal(string str) { _Logger.LogFatal((object)str); } public static void Fatal(object data) { _Logger.LogFatal((object)data?.ToString()); } public static void Warn(string str) { _Logger.LogWarning((object)str); } public static void Warn(object data) { _Logger.LogWarning((object)data?.ToString()); } } public class Zose_ReloadTimer : MonoBehaviour { private TextMeshProUGUI _textMesh; private TextMeshProUGUI _glitchTextMesh2; private GameObject _uiRoot; public static Zose_ReloadTimer Instance; private bool _isReloading; private float _reloadStartTime; private float _lastReloadDuration; private string _currentWeaponName = ""; private float _lastFireTime = -10f; private int _lastClipCount = -1; private static Dictionary _persistentRatioMap = new Dictionary(); private string _currFingerprint = ""; private bool _ammoFilledThisReload; private bool _isStutteringDuringReload; private float _readyEffectStartTime = -1f; private bool _hasTriggeredReadyEffect; private bool _isAnimatingReady; private bool _waitingForNativeReloadToEnd; private bool _isChargeWeapon; private float _lastGlitchTime; private string _currGlitchedText = ""; private const string GLITCH_CHARS = "#@&!$%01X?"; private bool _chargeShown; private static bool _reflectionChecked = false; private Color _originalChargeColor; private static MethodInfo? _setChargeUpVisibleAndProgressMethod; private static Il2CppObjectBase? _circleTarget; private static MethodInfo? _setChargeMethod; private static MethodInfo? _showChargeMethod; private static MethodInfo? _setChargeColorMethod; private static FieldInfo? _chargeUpColOrgField; private static FieldInfo? _ammoField; private static FieldInfo? _isAimingField; private IntPtr _lastWieldPointer = IntPtr.Zero; private BulletWeapon? _cachedBulletWeapon; private static MethodInfo? _getIdentifierMethod; private PlayerAgent? _localPlayer; private const float MAX_SWAY_OFFSET = 12f; private const float SWAY_SENSITIVITY = 1.2f; private const float SWAY_SMOOTHING = 0.12f; private const float ADS_SWAY_MULTIPLIER = 0.25f; private Vector2 _currentSwayOffset = Vector2.zero; private Vector2 _swayVelocity = Vector2.zero; private bool _isFirstSwayFrame = true; private static string _cachePath = Path.Combine(Paths.ConfigPath, "Zose_ReloadTimer_Cache.txt"); private static bool _cacheLoaded = false; private static string _cachedRundownInfo = ""; private Vector3 _lastCamForward = Vector3.one; public void Awake() { //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Expected O, but got Unknown //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_0070: Expected O, but got Unknown //IL_009e: Unknown result type (might be due to invalid IL or missing references) //IL_00b2: Unknown result type (might be due to invalid IL or missing references) //IL_00b7: Unknown result type (might be due to invalid IL or missing references) //IL_00d9: 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_00e6: Expected O, but got Unknown //IL_0114: Unknown result type (might be due to invalid IL or missing references) Instance = this; Logger.Info("Zose_ReloadTimer INITIALIZED."); if (!_cacheLoaded) { LoadCache(); } _uiRoot = new GameObject("ReloadTimer") { layer = 5 }; _uiRoot.transform.SetParent(((Component)GuiManager.CrosshairLayer.m_circleCrosshair).transform.parent, false); UpdateUIPosition(); GameObject val = new GameObject("MainText") { layer = 5 }; val.transform.SetParent(_uiRoot.transform, false); _textMesh = SetupTextMesh(val, new Color(1f, 1f, 1f, 1f)); new GameObject("GlitchR") { layer = 5 }.transform.SetParent(_uiRoot.transform, false); GameObject val2 = new GameObject("GlitchC") { layer = 5 }; val2.transform.SetParent(_uiRoot.transform, false); _glitchTextMesh2 = SetupTextMesh(val2, new Color(1f, 1f, 1f, 0f)); } public string GetWeaponFingerprint(BulletWeapon weapon) { if ((Object)(object)weapon == (Object)null) { return ""; } if (string.IsNullOrEmpty(_cachedRundownInfo) || _cachedRundownInfo == "RD_UNK") { _cachedRundownInfo = ""; try { Type typeFromHandle = typeof(RundownManager); BindingFlags bindingAttr = BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic; string[] array = new string[3] { "CurrentlySelectedRundownKey", "ActiveRundownData", "m_activeRundownKey" }; foreach (string name in array) { try { PropertyInfo property = typeFromHandle.GetProperty(name, bindingAttr); FieldInfo field = typeFromHandle.GetField(name, bindingAttr); object obj = property?.GetValue(null) ?? field?.GetValue(null); if (obj != null) { string text2 = ((obj is string text) ? text : obj.ToString()); if (!string.IsNullOrEmpty(text2) && text2 != "0" && !text2.Contains("DataBlock")) { _cachedRundownInfo = "RD_" + text2; break; } } } catch { } } if (string.IsNullOrEmpty(_cachedRundownInfo)) { try { Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies(); foreach (Assembly assembly in assemblies) { string fullName = assembly.FullName; if (fullName.Contains("System") || fullName.Contains("Unity") || fullName.Contains("mscorlib") || fullName.Contains("BepInEx")) { continue; } Type[] types = assembly.GetTypes(); foreach (Type type in types) { if (type.Name.Contains("Config") || type.Name.Contains("Rundown") || type.Name.Contains("Archive") || type.Name.Contains("Global")) { PropertyInfo[] properties = type.GetProperties(bindingAttr); foreach (PropertyInfo propertyInfo in properties) { if (!(propertyInfo.PropertyType == typeof(string)) || (!propertyInfo.Name.Contains("Rundown") && !propertyInfo.Name.Contains("SelectedKey"))) { continue; } try { string text3 = propertyInfo.GetValue(null)?.ToString(); if (!string.IsNullOrEmpty(text3) && text3.Length > 2 && !text3.Contains(" ") && !text3.Contains("/")) { _cachedRundownInfo = text3; break; } } catch { } } if (!string.IsNullOrEmpty(_cachedRundownInfo)) { break; } FieldInfo[] fields = type.GetFields(bindingAttr); foreach (FieldInfo fieldInfo in fields) { if (!(fieldInfo.FieldType == typeof(string)) || (!fieldInfo.Name.Contains("Rundown") && !fieldInfo.Name.Contains("ActiveKey"))) { continue; } try { string text4 = fieldInfo.GetValue(null)?.ToString(); if (!string.IsNullOrEmpty(text4) && text4.Length > 2 && !text4.Contains(" ")) { _cachedRundownInfo = text4; break; } } catch { } } } if (!string.IsNullOrEmpty(_cachedRundownInfo)) { break; } } if (!string.IsNullOrEmpty(_cachedRundownInfo)) { break; } } } catch { } } if (string.IsNullOrEmpty(_cachedRundownInfo)) { try { object obj6 = typeFromHandle.GetMethod("GetActiveRundownData", bindingAttr)?.Invoke(null, null); if (obj6 != null) { _cachedRundownInfo = (obj6.GetType().GetProperty("name") ?? obj6.GetType().GetProperty("Key"))?.GetValue(obj6)?.ToString() ?? "RD_UNK"; } } catch { } } if (string.IsNullOrEmpty(_cachedRundownInfo)) { _cachedRundownInfo = "RD_UNK"; } if (_cachedRundownInfo != "RD_UNK") { _cachedRundownInfo = Regex.Replace(_cachedRundownInfo, "[^a-zA-Z0-9_-]", ""); Logger.Info("Rundown Identified: " + _cachedRundownInfo); } } catch (Exception ex) { Logger.Error("Rundown Scan Error: " + ex.Message); } } return $"{_cachedRundownInfo}_{((GameDataBlockBase)(object)((ItemEquippable)weapon).ArchetypeData).persistentID}_{((Item)weapon).PublicName}_{((ItemEquippable)weapon).ArchetypeData.DefaultReloadTime:F2}_{((ItemEquippable)weapon).ClipSize}"; } public static void LoadCache() { if (string.IsNullOrEmpty(_cachePath)) { return; } try { if (!File.Exists(_cachePath)) { Logger.Info("No existing calibration cache found. Starting fresh."); _cacheLoaded = true; return; } string[] array = File.ReadAllLines(_cachePath); foreach (string text in array) { if (!string.IsNullOrWhiteSpace(text)) { string[] array2 = text.Split('='); if (array2.Length == 2 && float.TryParse(array2[1], out var result)) { _persistentRatioMap[array2[0]] = result; } } } _cacheLoaded = true; Logger.Info($"SUCCESS: Loaded {_persistentRatioMap.Count} calibrated weapon profiles from disk."); } catch (Exception ex) { Logger.Error("Cache Load Error: " + ex.Message); } } private static void SaveCache() { try { List list = new List(); foreach (KeyValuePair item in _persistentRatioMap) { list.Add($"{item.Key}={item.Value:F4}"); } File.WriteAllLines(_cachePath, list); } catch (Exception ex) { Logger.Error("Cache Save Error: " + ex.Message); } } private TextMeshProUGUI SetupTextMesh(GameObject go, Color col) { //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Unknown result type (might be due to invalid IL or missing references) TextMeshProUGUI obj = go.AddComponent(); ((TMP_Text)obj).alignment = (TextAlignmentOptions)514; ((Component)obj).GetComponent().sizeDelta = new Vector2(400f, 100f); ((TMP_Text)obj).fontSize = 20f; ((TMP_Text)obj).font = ((TMP_Text)GuiManager.PlayerLayer.m_playerStatus.m_healthText).font; ((Graphic)obj).color = col; ((TMP_Text)obj).characterSpacing = 0f; ((TMP_Text)obj).richText = true; return obj; } public void OnAmmoRefreshed() { if (!_isReloading || _ammoFilledThisReload) { return; } _ammoFilledThisReload = true; if (_isStutteringDuringReload) { Logger.Info("Stutter detected during reload, skipping calibration to maintain accuracy."); } else { float num = Time.time - _reloadStartTime; if (_lastReloadDuration > 0f && !string.IsNullOrEmpty(_currFingerprint)) { float num2 = Mathf.Clamp(num / _lastReloadDuration, 0.3f, 0.98f); if (!_persistentRatioMap.ContainsKey(_currFingerprint)) { _persistentRatioMap[_currFingerprint] = num2; SaveCache(); } else { float num3 = _persistentRatioMap[_currFingerprint]; if (Mathf.Abs(num2 - num3) > 0.01f) { float value = (num3 * 4f + num2) / 5f; _persistentRatioMap[_currFingerprint] = value; SaveCache(); } } } } if (!_hasTriggeredReadyEffect) { _readyEffectStartTime = Time.time; _hasTriggeredReadyEffect = true; _isAnimatingReady = true; } } private void Update() { //IL_01d1: Unknown result type (might be due to invalid IL or missing references) //IL_01d6: Unknown result type (might be due to invalid IL or missing references) //IL_01f3: Unknown result type (might be due to invalid IL or missing references) //IL_0214: Unknown result type (might be due to invalid IL or missing references) if (EntryPoint.NeedsConfigReload) { EntryPoint.NeedsConfigReload = false; EntryPoint.Instance?.ReloadConfig(); UpdateUIPosition(); } if ((Object)(object)_localPlayer == (Object)null) { _localPlayer = PlayerManager.GetLocalPlayerAgent(); if ((Object)(object)_localPlayer == (Object)null) { return; } } PlayerInventoryBase inventory = _localPlayer.Inventory; ItemEquippable val = ((inventory != null) ? inventory.WieldedItem : null); if ((Object)(object)val == (Object)null) { return; } if (((Il2CppObjectBase)val).Pointer != _lastWieldPointer) { _lastWieldPointer = ((Il2CppObjectBase)val).Pointer; _cachedBulletWeapon = ((Il2CppObjectBase)val).TryCast(); ResetReloadState(); if ((Object)(object)_cachedBulletWeapon != (Object)null) { _currentWeaponName = ((Item)_cachedBulletWeapon).PublicName; _currFingerprint = GetWeaponFingerprint(_cachedBulletWeapon); _lastReloadDuration = ((ItemEquippable)_cachedBulletWeapon).ArchetypeData.DefaultReloadTime * GetWeaponMultiplier(_cachedBulletWeapon); _isChargeWeapon = DetectIsChargeWeapon(_cachedBulletWeapon); } UpdateUIPosition(); } if ((Object)(object)_cachedBulletWeapon == (Object)null) { return; } if (!_reflectionChecked && GuiManager.CrosshairLayer != null) { InitializeReflection(); } bool isReloading = ((ItemEquippable)_cachedBulletWeapon).IsReloading; if (isReloading && !_isReloading && !_waitingForNativeReloadToEnd) { _isReloading = true; _ammoFilledThisReload = false; _reloadStartTime = Time.time; _currGlitchedText = string.Empty; _lastReloadDuration = ((ItemEquippable)_cachedBulletWeapon).ArchetypeData.DefaultReloadTime * GetWeaponMultiplier(_cachedBulletWeapon); if (!_chargeShown && _circleTarget != null) { if (_chargeUpColOrgField != null) { _originalChargeColor = (Color)_chargeUpColOrgField.GetValue(_circleTarget); } _setChargeColorMethod?.Invoke(_circleTarget, new object[1] { EntryPoint.ParsedChargeColor }); _chargeUpColOrgField?.SetValue(_circleTarget, EntryPoint.ParsedChargeColor); _setChargeUpVisibleAndProgressMethod?.Invoke(GuiManager.CrosshairLayer, new object[2] { true, 0f }); _showChargeMethod?.Invoke(_circleTarget, new object[1] { true }); _chargeShown = true; } _isStutteringDuringReload = false; } if (_isReloading && !_ammoFilledThisReload && Time.deltaTime > 0.1f) { _isStutteringDuringReload = true; } else if (!isReloading) { _waitingForNativeReloadToEnd = false; if (_isReloading) { if (!_isAnimatingReady) { ResetReloadState(); } else { _isReloading = false; } } } if (_isAnimatingReady && Time.time - _readyEffectStartTime >= 0.5f) { ResetReloadState(); } if (isReloading || _isAnimatingReady) { return; } int clip = _cachedBulletWeapon.m_clip; int clipSize = ((ItemEquippable)_cachedBulletWeapon).ClipSize; if (clip < _lastClipCount && clip >= 0) { _lastFireTime = Time.time; } _lastClipCount = clip; if (isReloading || _isAnimatingReady) { return; } float num = ((clipSize <= 20) ? 0.5f : (EntryPoint.ConfigLowAmmoThreshold?.Value ?? 0.35f)); if ((float)clip <= (float)clipSize * num) { if (Time.time - _lastGlitchTime > 0.08f) { _lastGlitchTime = Time.time; bool flag = clip == 0; string original = "RELOAD"; _currGlitchedText = GetGlitchedText(original, flag ? 0.4f : 0.25f); } } else { _currGlitchedText = string.Empty; } } private void LateUpdate() { //IL_0339: Unknown result type (might be due to invalid IL or missing references) //IL_00ec: Unknown result type (might be due to invalid IL or missing references) //IL_0475: Unknown result type (might be due to invalid IL or missing references) //IL_0413: Unknown result type (might be due to invalid IL or missing references) //IL_0428: Unknown result type (might be due to invalid IL or missing references) //IL_04a3: Unknown result type (might be due to invalid IL or missing references) //IL_0389: Unknown result type (might be due to invalid IL or missing references) //IL_038e: Unknown result type (might be due to invalid IL or missing references) //IL_039f: Unknown result type (might be due to invalid IL or missing references) //IL_0401: Unknown result type (might be due to invalid IL or missing references) //IL_056b: Unknown result type (might be due to invalid IL or missing references) //IL_02f0: Unknown result type (might be due to invalid IL or missing references) //IL_0623: Unknown result type (might be due to invalid IL or missing references) //IL_0646: Unknown result type (might be due to invalid IL or missing references) //IL_0667: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)_cachedBulletWeapon == (Object)null || (Object)(object)_localPlayer == (Object)null) { return; } ApplyHUDSway(); bool isReloading = ((ItemEquippable)_cachedBulletWeapon).IsReloading; bool flag = _isAnimatingReady && Time.time - _readyEffectStartTime < 0.5f; bool flag2 = isReloading && !_ammoFilledThisReload; if (flag2 || flag || !string.IsNullOrEmpty(_currGlitchedText)) { string text = ""; if (flag) { text = "0.00s"; if (_circleTarget != null) { float num = Mathf.Clamp01((Time.time - _readyEffectStartTime) / 0.5f); float num2 = Mathf.Lerp(1.25f, 1f, num); GameObject gameObject = _circleTarget.Cast().gameObject; if ((Object)(object)gameObject != (Object)null) { gameObject.transform.localScale = new Vector3(num2, num2, 1f); } _showChargeMethod?.Invoke(_circleTarget, new object[1] { true }); _setChargeMethod?.Invoke(_circleTarget, new object[1] { 1f }); _setChargeUpVisibleAndProgressMethod?.Invoke(GuiManager.CrosshairLayer, new object[2] { true, 1f }); } } else if (flag2) { float num3 = Time.time - _reloadStartTime; float num4 = 0.9f; if (!string.IsNullOrEmpty(_currFingerprint) && _persistentRatioMap.ContainsKey(_currFingerprint)) { num4 = _persistentRatioMap[_currFingerprint]; } else if (((ItemEquippable)_cachedBulletWeapon).ArchetypeData.DefaultClipSize > 10) { num4 = 0.6f; } float num5 = _lastReloadDuration * num4; float num6 = Mathf.Clamp01(num3 / num5); float num7 = Mathf.Max(0f, num5 - num3); text = ((num7 > 0f) ? $"{num7:0.00}s" : ""); if (_circleTarget != null) { _showChargeMethod?.Invoke(_circleTarget, new object[1] { true }); _setChargeMethod?.Invoke(_circleTarget, new object[1] { num6 }); _setChargeUpVisibleAndProgressMethod?.Invoke(GuiManager.CrosshairLayer, new object[2] { true, num6 }); GameObject gameObject2 = _circleTarget.Cast().gameObject; if ((Object)(object)gameObject2 != (Object)null) { gameObject2.transform.localScale = Vector3.one; } } } else if (!string.IsNullOrEmpty(_currGlitchedText)) { text = _currGlitchedText; } ((TMP_Text)_textMesh).text = text; if (flag) { ((Graphic)_textMesh).color = new Color(0f, 1f, 0f, 0.8f); } else if (!string.IsNullOrEmpty(_currGlitchedText) && !isReloading) { float a = ((Mathf.Floor(Time.time * 5f) % 2f == 0f) ? 0.85f : 0.75f); Color parsedLowAmmoColor = EntryPoint.ParsedLowAmmoColor; parsedLowAmmoColor.a = a; ((Graphic)_textMesh).color = parsedLowAmmoColor; float value = Random.value; float num8 = 0f; if (value < 0.04f) { num8 = Random.Range(-6f, 6f); } else if (value < 0.05f) { num8 = Random.Range(-12f, 12f); } ((Transform)((TMP_Text)_textMesh).rectTransform).localPosition = new Vector3(num8, 0f, 0f); } else { ((Graphic)_textMesh).color = Color.white; ((Transform)((TMP_Text)_textMesh).rectTransform).localPosition = Vector3.zero; } } else { ((TMP_Text)_textMesh).text = string.Empty; } ClearGlitchLayers(); if (_circleTarget == null) { return; } if (flag) { _setChargeColorMethod?.Invoke(_circleTarget, new object[1] { ((Graphic)_textMesh).color }); } else if (flag2) { _setChargeColorMethod?.Invoke(_circleTarget, new object[1] { EntryPoint.ParsedChargeColor }); } if (flag2 || flag) { return; } if (isReloading) { _setChargeUpVisibleAndProgressMethod?.Invoke(GuiManager.CrosshairLayer, new object[2] { false, 0f }); _showChargeMethod?.Invoke(_circleTarget, new object[1] { false }); _setChargeMethod?.Invoke(_circleTarget, new object[1] { 0f }); GameObject gameObject3 = _circleTarget.Cast().gameObject; if ((Object)(object)gameObject3 != (Object)null) { gameObject3.transform.localScale = Vector3.one; } } else if (!_isChargeWeapon) { _setChargeUpVisibleAndProgressMethod?.Invoke(GuiManager.CrosshairLayer, new object[2] { false, 0f }); _showChargeMethod?.Invoke(_circleTarget, new object[1] { false }); _setChargeMethod?.Invoke(_circleTarget, new object[1] { 0f }); GameObject gameObject4 = _circleTarget.Cast().gameObject; if ((Object)(object)gameObject4 != (Object)null) { gameObject4.transform.localScale = Vector3.one; } _setChargeColorMethod?.Invoke(_circleTarget, new object[1] { _originalChargeColor }); _chargeUpColOrgField?.SetValue(_circleTarget, _originalChargeColor); } } private void ClearGlitchLayers() { //IL_0038: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)_glitchTextMesh2 != (Object)null) { ((TMP_Text)_glitchTextMesh2).text = ""; ((Graphic)_glitchTextMesh2).color = new Color(0f, 0f, 0f, 0f); } } private void UpdateGlitchArt(Color baseColor) { //IL_007d: Unknown result type (might be due to invalid IL or missing references) //IL_008a: Unknown result type (might be due to invalid IL or missing references) //IL_00a9: Unknown result type (might be due to invalid IL or missing references) //IL_00aa: 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_00ec: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)_glitchTextMesh2 == (Object)null) && Time.frameCount % 4 == 0) { ((TMP_Text)_glitchTextMesh2).text = GetGlitchedText(((TMP_Text)_textMesh).text, 0.04f); float num = Time.time * 15f; float num2 = Mathf.Sin(num) * 0.4f; float num3 = Mathf.Cos(num * 0.8f) * 0.3f; float num4 = ((Random.value > 0.01f) ? 1f : 0.5f); float num5 = ((baseColor.r > 0.5f && baseColor.g < 0.5f) ? 0.35f : 0.12f); Color color = baseColor; color.a = num5 * 0.7f * num4; ((Transform)((TMP_Text)_glitchTextMesh2).rectTransform).localPosition = new Vector3((0f - num2) * 0.4f, (0f - num3) * 0.4f, 0f); ((Graphic)_glitchTextMesh2).color = color; } } private string GetGlitchedText(string original, float intensity) { if (string.IsNullOrEmpty(original) || Random.value > intensity) { return original; } char[] array = original.ToCharArray(); int num = Random.Range(0, array.Length); if (array[num] != ' ' && array[num] != '[' && array[num] != ']' && array[num] != '[' && array[num] != ']') { array[num] = "#@&!$%01X?"[Random.Range(0, "#@&!$%01X?".Length)]; } return new string(array); } private void ResetReloadState() { //IL_010f: Unknown result type (might be due to invalid IL or missing references) //IL_0131: Unknown result type (might be due to invalid IL or missing references) //IL_015f: Unknown result type (might be due to invalid IL or missing references) _isReloading = false; _isAnimatingReady = false; _hasTriggeredReadyEffect = false; _readyEffectStartTime = -1f; ((TMP_Text)_textMesh).text = string.Empty; _currGlitchedText = string.Empty; _lastClipCount = -1; _waitingForNativeReloadToEnd = (Object)(object)_cachedBulletWeapon != (Object)null && ((ItemEquippable)_cachedBulletWeapon).IsReloading; if (_circleTarget != null) { _showChargeMethod?.Invoke(_circleTarget, new object[1] { false }); _setChargeMethod?.Invoke(_circleTarget, new object[1] { 0f }); _setChargeUpVisibleAndProgressMethod?.Invoke(GuiManager.CrosshairLayer, new object[2] { false, 0f }); if (_chargeShown) { _setChargeColorMethod?.Invoke(_circleTarget, new object[1] { _originalChargeColor }); _chargeUpColOrgField?.SetValue(_circleTarget, _originalChargeColor); GameObject gameObject = _circleTarget.Cast().gameObject; if ((Object)(object)gameObject != (Object)null) { gameObject.transform.localScale = Vector3.one; } _chargeShown = false; } } ClearGlitchLayers(); } private void ApplyHUDSway() { //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_003f: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_0052: 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) //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_002c: 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_00ae: 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_00e3: 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_00f5: 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_00d5: Unknown result type (might be due to invalid IL or missing references) //IL_00da: Unknown result type (might be due to invalid IL or missing references) //IL_0185: Unknown result type (might be due to invalid IL or missing references) FPSCamera fPSCamera = _localPlayer.FPSCamera; if ((Object)(object)fPSCamera == (Object)null) { return; } Vector3 forward = ((Component)fPSCamera).transform.forward; if (_isFirstSwayFrame) { _lastCamForward = forward; _isFirstSwayFrame = false; return; } Vector3 val = ((Component)fPSCamera).transform.InverseTransformDirection(forward - _lastCamForward); _lastCamForward = forward; float num = 1800.0001f; bool flag = false; try { if (_isAimingField != null) { flag = (bool)_isAimingField.GetValue(_cachedBulletWeapon); } } catch { } if ((Object)(object)_cachedBulletWeapon != (Object)null && flag) { num *= 0.25f; } Vector2 val2 = default(Vector2); ((Vector2)(ref val2))..ctor((0f - val.x) * num, val.y * num); if (((Vector2)(ref val2)).magnitude > 12f) { val2 = ((Vector2)(ref val2)).normalized * 12f; } _currentSwayOffset = Vector2.SmoothDamp(_currentSwayOffset, val2, ref _swayVelocity, 0.12f); _currentSwayOffset.x = Mathf.Clamp(_currentSwayOffset.x, -12f, 12f); _currentSwayOffset.y = Mathf.Clamp(_currentSwayOffset.y, -12f, 12f); float num2 = EntryPoint.ConfigOffset?.Value ?? 85f; _uiRoot.transform.localPosition = new Vector3(_currentSwayOffset.x, 0f - num2 + _currentSwayOffset.y, 0f); } public void UpdateUIPosition() { //IL_003c: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)_uiRoot == (Object)null)) { float num = EntryPoint.ConfigOffset?.Value ?? 85f; _uiRoot.transform.localPosition = new Vector3(0f, 0f - num, 0f); } } private float GetWeaponMultiplier(BulletWeapon weapon) { try { GearIDRange gearIDRange = ((ItemEquippable)weapon).GearIDRange; if (gearIDRange == null) { return 1f; } if (_getIdentifierMethod == null) { _getIdentifierMethod = ((object)gearIDRange).GetType().GetMethod("GetIdentifier"); } if (_getIdentifierMethod == null) { return 1f; } for (int i = 0; i < 64; i++) { try { uint num = (uint)_getIdentifierMethod.Invoke(gearIDRange, new object[1] { (object)(InventorySlot)(byte)i }); if (num != 0) { GearMagPartDataBlock block = GameDataBlockBase.GetBlock(num); if (block != null) { return block.ReloadTimeMultiplier; } } } catch { } } } catch { } return 1f; } private void InitializeReflection() { _reflectionChecked = true; if (GuiManager.CrosshairLayer != null) { _setChargeUpVisibleAndProgressMethod = ((object)GuiManager.CrosshairLayer).GetType().GetMethod("SetChargeUpVisibleAndProgress"); CircleCrosshair circleCrosshair = GuiManager.CrosshairLayer.m_circleCrosshair; if ((Object)(object)circleCrosshair != (Object)null) { _circleTarget = (Il2CppObjectBase?)(object)circleCrosshair; Type type = ((object)circleCrosshair).GetType(); _setChargeMethod = type.GetMethod("SetCharge"); _showChargeMethod = type.GetMethod("ShowCharge"); _setChargeColorMethod = type.GetMethod("SetChargeUpColor"); _chargeUpColOrgField = type.GetField("m_chargeUpColOrg", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); } Type typeFromHandle = typeof(BulletWeapon); if ((object)_ammoField == null) { _ammoField = typeFromHandle.GetField("m_ammo", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); } Type typeFromHandle2 = typeof(ItemEquippable); if ((object)_isAimingField == null) { _isAimingField = typeFromHandle2.GetField("m_isAiming", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); } } } private bool DetectIsChargeWeapon(BulletWeapon weapon) { if (((weapon != null) ? ((ItemEquippable)weapon).ArchetypeData : null) == null) { return false; } try { ArchetypeDataBlock archetypeData = ((ItemEquippable)weapon).ArchetypeData; Type type = ((object)archetypeData).GetType(); BindingFlags bindingAttr = BindingFlags.IgnoreCase | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy; PropertyInfo[] properties = type.GetProperties(bindingAttr); foreach (PropertyInfo propertyInfo in properties) { if (propertyInfo.PropertyType == typeof(float) && propertyInfo.Name.IndexOf("charge", StringComparison.OrdinalIgnoreCase) >= 0 && ((float?)propertyInfo.GetValue(archetypeData)).GetValueOrDefault() > 0.001f) { return true; } } FieldInfo[] fields = type.GetFields(bindingAttr); foreach (FieldInfo fieldInfo in fields) { if (fieldInfo.FieldType == typeof(float) && fieldInfo.Name.IndexOf("charge", StringComparison.OrdinalIgnoreCase) >= 0 && ((float?)fieldInfo.GetValue(archetypeData)).GetValueOrDefault() > 0.001f) { return true; } } } catch { } return false; } } [HarmonyPatch(typeof(PlayerInventoryLocal), "DoReload")] internal static class ReloadDonePatch { public static void Postfix() { if ((Object)(object)Zose_ReloadTimer.Instance != (Object)null) { Zose_ReloadTimer.Instance.OnAmmoRefreshed(); } } } } namespace Zose_ReloadTimer.Patches { [HarmonyPatch(typeof(CM_PageRundown_New), "PlaceRundown")] internal static class CM_PageRundown_New_PlaceRundown { private static bool _injected; private static void Postfix() { //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Expected O, but got Unknown if (!_injected) { _injected = true; GameObject val = new GameObject("RT_CompInject"); val.AddComponent(); Object.DontDestroyOnLoad((Object)val); } } } }