using System; using System.Collections.Generic; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using ComputerysModdingUtilities; using Microsoft.CodeAnalysis; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: StraftatMod(true)] [assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] [assembly: AssemblyVersion("0.0.0.0")] [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 MovementTrainer { [BepInPlugin("landa.straftat.movementtrainer", "Movement Trainer", "1.3.1")] public class Plugin : BaseUnityPlugin { internal static ManualLogSource Log; internal static ConfigEntry ShowWallPip; internal static ConfigEntry ShowHopJudge; internal static ConfigEntry ShowSlideGrader; internal static ConfigEntry ShowAirMeter; internal static ConfigEntry ShowMomentum; internal static ConfigEntry ShowCarveMeter; internal static ConfigEntry PanelX; internal static ConfigEntry PanelY; internal static ConfigEntry Scale; internal static ConfigEntry CleanHopMs; private void Awake() { //IL_00f9: Unknown result type (might be due to invalid IL or missing references) //IL_0103: Expected O, but got Unknown //IL_0136: Unknown result type (might be due to invalid IL or missing references) //IL_0140: Expected O, but got Unknown //IL_0173: Unknown result type (might be due to invalid IL or missing references) //IL_017d: Expected O, but got Unknown //IL_01ab: Unknown result type (might be due to invalid IL or missing references) //IL_01b0: Unknown result type (might be due to invalid IL or missing references) //IL_01b6: Expected O, but got Unknown //IL_01b6: Unknown result type (might be due to invalid IL or missing references) Log = ((BaseUnityPlugin)this).Logger; ShowWallPip = ((BaseUnityPlugin)this).Config.Bind("MovementTrainer.Widgets", "WallJumpPip", true, "Wall jump status: bright green pip = armed or stored right now, dim pip = available but needs wall contact, dark pip = spent for this airtime."); ShowHopJudge = ((BaseUnityPlugin)this).Config.Bind("MovementTrainer.Widgets", "HopJudge", true, "Streak of clean buffered hops; a slow landing resets it."); ShowSlideGrader = ((BaseUnityPlugin)this).Config.Bind("MovementTrainer.Widgets", "SlideJumpGrader", true, "Times each slide-to-jump exit in milliseconds and grades the rep."); ShowAirMeter = ((BaseUnityPlugin)this).Config.Bind("MovementTrainer.Widgets", "AirtimeMeter", true, "Rolling share of time spent airborne (about a 15 second window)."); ShowMomentum = ((BaseUnityPlugin)this).Config.Bind("MovementTrainer.Widgets", "MomentumXray", true, "Live speed channels: IN = steerable input speed (flashes when weapon fire slowdown is active), BURST = slide impulse plus the single boost slot, labelled by what fired it (WALL/VAULT/KICK/BOOST)."); ShowCarveMeter = ((BaseUnityPlugin)this).Config.Bind("MovementTrainer.Widgets", "CarveMeter", true, "Turn efficiency: how much of your requested input speed is actually delivered. 100% = lossless carve; dips mean the turn is faster than your velocity can follow (the flick tax)."); PanelX = ((BaseUnityPlugin)this).Config.Bind("MovementTrainer.Panel", "X", 0.015f, new ConfigDescription("Panel left edge as a fraction of screen width.", (AcceptableValueBase)(object)new AcceptableValueRange(0f, 0.9f), Array.Empty())); PanelY = ((BaseUnityPlugin)this).Config.Bind("MovementTrainer.Panel", "Y", 0.62f, new ConfigDescription("Panel top edge as a fraction of screen height.", (AcceptableValueBase)(object)new AcceptableValueRange(0.05f, 0.95f), Array.Empty())); Scale = ((BaseUnityPlugin)this).Config.Bind("MovementTrainer.Panel", "Scale", 1f, new ConfigDescription("Panel scale.", (AcceptableValueBase)(object)new AcceptableValueRange(0.6f, 2f), Array.Empty())); CleanHopMs = ((BaseUnityPlugin)this).Config.Bind("MovementTrainer.Tuning", "CleanHopMs", 80f, "Maximum ground-contact time in milliseconds for a landing to count as a clean buffered hop."); GameObject val = new GameObject("MovementTrainer"); Object.DontDestroyOnLoad((Object)val); ((Object)val).hideFlags = (HideFlags)61; val.AddComponent(); ((BaseUnityPlugin)this).Logger.LogInfo((object)"Movement Trainer loaded."); } } internal class TrainerBehaviour : MonoBehaviour { private Type _fpcType; private FieldInfo _canWallJump; private FieldInfo _wallJumpsCount; private FieldInfo _maxWallJumps; private FieldInfo _isSliding; private FieldInfo _isTouching; private FieldInfo _vaultTimer; private FieldInfo _moveDirection; private FieldInfo _currentInput; private FieldInfo _forceAdded; private FieldInfo _bforcefinal; private FieldInfo _bfactor; private FieldInfo _setSpeedTimer; private PropertyInfo _isOwner; private Type _phType; private PropertyInfo _healthProp; private Component _player; private Component _playerHealth; private CharacterController _cc; private float _nextScan; private bool _warnedNoOwner; private bool _wasDead; private bool _wasGrounded; private float _groundedAt; private int _streak; private int _bestStreak; private bool _wasSliding; private float _slideStart = -1f; private float _slideEndAt = -1f; private bool _slideJudged = true; private float _lastSlideMs = -1f; private string _lastVerdict = ""; private readonly Queue _slideReps = new Queue(); private float _airEma; private string _bOwner = "BOOST"; private float _lastBf; private int _lastWallJumps; private float _lastVault; private bool _slideRepFrame; private bool _slideStartFrame; private float _carveEma = 1f; private bool _carveActive; private Texture2D _tex; private GUIStyle _style; private static readonly Color Cream = new Color(0.96f, 0.93f, 0.84f, 0.92f); private static readonly Color CreamDim = new Color(0.96f, 0.93f, 0.84f, 0.45f); private static readonly Color Green = new Color(0.3f, 1f, 0.45f, 0.95f); private static readonly Color GreenDim = new Color(0.3f, 1f, 0.45f, 0.4f); private static readonly Color Dark = new Color(0.25f, 0.25f, 0.27f, 0.85f); private static readonly Color Smoke = new Color(0.07f, 0.07f, 0.08f, 0.38f); private static readonly Color Warn = new Color(1f, 0.55f, 0.35f, 0.95f); private void Awake() { //IL_020e: Unknown result type (might be due to invalid IL or missing references) //IL_0218: Expected O, but got Unknown //IL_0220: Unknown result type (might be due to invalid IL or missing references) _fpcType = Type.GetType("FirstPersonController, Assembly-CSharp"); if (_fpcType == null) { Plugin.Log.LogError((object)"FirstPersonController not found - the game may have updated. Trainer disabled."); ((Behaviour)this).enabled = false; return; } _canWallJump = F("CanWallJump"); _wallJumpsCount = F("wallJumpsCount"); _maxWallJumps = F("maxWallJumps"); _isSliding = F("isSliding"); _isTouching = F("isTouchingAnything"); _vaultTimer = F("aftervaultjumpTimer"); _moveDirection = F("moveDirection"); _currentInput = F("currentInput"); _forceAdded = F("forceAdded"); _bforcefinal = F("bforcefinal"); _bfactor = F("bfactor"); _setSpeedTimer = F("setSpeedTimer"); if (_currentInput == null || _forceAdded == null || _bforcefinal == null) { Plugin.Log.LogWarning((object)"Momentum fields not found - momentum X-ray disabled."); } _isOwner = _fpcType.GetProperty("IsOwner"); if (_canWallJump == null) { Plugin.Log.LogWarning((object)"CanWallJump not found - wall pip disabled."); } if (_isSliding == null || _moveDirection == null) { Plugin.Log.LogWarning((object)"isSliding/moveDirection not found - slide grader disabled."); } if (_vaultTimer == null) { Plugin.Log.LogWarning((object)"aftervaultjumpTimer not found - double-jump countdown disabled."); } _phType = Type.GetType("PlayerHealth, Assembly-CSharp"); _healthProp = ((_phType != null) ? _phType.GetProperty("SyncAccessor_health") : null); if (_healthProp == null) { Plugin.Log.LogWarning((object)"PlayerHealth.SyncAccessor_health not found - trainer will not auto-hide on death."); } _tex = new Texture2D(1, 1, (TextureFormat)4, false); _tex.SetPixel(0, 0, Color.white); _tex.Apply(); Plugin.Log.LogInfo((object)"Trainer behaviour alive."); } private FieldInfo F(string name) { return _fpcType.GetField(name, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); } private void Update() { //IL_0414: Unknown result type (might be due to invalid IL or missing references) //IL_0419: Unknown result type (might be due to invalid IL or missing references) //IL_0431: Unknown result type (might be due to invalid IL or missing references) //IL_0438: Unknown result type (might be due to invalid IL or missing references) //IL_043f: Unknown result type (might be due to invalid IL or missing references) //IL_0444: Unknown result type (might be due to invalid IL or missing references) //IL_03d5: Unknown result type (might be due to invalid IL or missing references) //IL_03da: 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_03f2: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)_player == (Object)null) { if (Time.unscaledTime >= _nextScan) { Rescan(); } return; } bool flag = (Object)(object)_cc != (Object)null && _cc.isGrounded; if (IsDead()) { if (!_wasDead) { _streak = 0; _slideJudged = true; _wasDead = true; } return; } if (_wasDead) { _wasDead = false; _wasGrounded = flag; _wasSliding = false; } float unscaledTime = Time.unscaledTime; if (flag && !_wasGrounded) { _groundedAt = unscaledTime; } if (!flag && _wasGrounded) { if ((unscaledTime - _groundedAt) * 1000f <= Plugin.CleanHopMs.Value) { _streak++; if (_streak > _bestStreak) { _bestStreak = _streak; } } else { _streak = 0; } } if (_isSliding != null && _moveDirection != null) { bool flag2 = (bool)_isSliding.GetValue(_player); if (flag2 && !_wasSliding) { _slideStart = unscaledTime; _slideJudged = false; _slideStartFrame = true; } if (!flag2 && _wasSliding) { _slideEndAt = unscaledTime; } if (!_slideJudged && _slideStart >= 0f) { float num = 0f; try { num = ((Vector3)_moveDirection.GetValue(_player)).y; } catch { } if (num > 2f) { _lastSlideMs = (unscaledTime - _slideStart) * 1000f; _lastVerdict = ((_lastSlideMs <= 150f) ? "PERFECT" : ((_lastSlideMs <= 300f) ? "GOOD" : "LATE")); _slideReps.Enqueue(_lastSlideMs); while (_slideReps.Count > 10) { _slideReps.Dequeue(); } _slideJudged = true; _slideRepFrame = true; } else if (!flag2 && unscaledTime - _slideEndAt > 0.25f) { _lastSlideMs = -1f; _lastVerdict = "NO JUMP"; _slideJudged = true; } } _wasSliding = flag2; } _airEma = Mathf.Lerp(_airEma, flag ? 0f : 1f, Mathf.Clamp01(Time.deltaTime / 15f)); if (_bfactor != null) { float num2 = 0f; int num3 = _lastWallJumps; float num4 = _lastVault; try { num2 = (float)_bfactor.GetValue(_player); } catch { } try { if (_wallJumpsCount != null) { num3 = (int)_wallJumpsCount.GetValue(_player); } } catch { } try { if (_vaultTimer != null) { num4 = (float)_vaultTimer.GetValue(_player); } } catch { } if (num2 > _lastBf + 0.3f) { if (num3 > _lastWallJumps) { _bOwner = "WALL"; } else if (num4 > _lastVault + 0.2f) { _bOwner = "VAULT"; } else if (_slideRepFrame) { _bOwner = "KICK"; } else { _bOwner = "BOOST"; } } _lastBf = num2; _lastWallJumps = num3; _lastVault = num4; } if (_currentInput != null && _moveDirection != null) { float num5 = 0f; Vector3 val = Vector3.zero; Vector2 val2; try { val2 = (Vector2)_currentInput.GetValue(_player); num5 = ((Vector2)(ref val2)).magnitude; } catch { } try { val = (Vector3)_moveDirection.GetValue(_player); } catch { } if (num5 > 2f && !_slideStartFrame) { val2 = new Vector2(val.x, val.z); float num6 = Mathf.Clamp01(((Vector2)(ref val2)).magnitude / num5); _carveEma = Mathf.Lerp(_carveEma, num6, Mathf.Clamp01(Time.deltaTime / 0.12f)); _carveActive = true; } else if (num5 <= 2f) { _carveActive = false; _carveEma = 1f; } } _slideRepFrame = false; _slideStartFrame = false; _wasGrounded = flag; } private void Rescan() { //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Expected O, but got Unknown //IL_00b8: Unknown result type (might be due to invalid IL or missing references) //IL_00c7: Expected O, but got Unknown _nextScan = Time.unscaledTime + 1f; Camera main = Camera.main; if ((Object)(object)main != (Object)null) { Component componentInParent = ((Component)main).GetComponentInParent(_fpcType); if ((Object)(object)componentInParent != (Object)null) { Bind(componentInParent, "camera hierarchy"); return; } } Object[] array = Object.FindObjectsOfType(_fpcType); Object[] array2 = array; for (int i = 0; i < array2.Length; i++) { Component val = (Component)array2[i]; bool flag; try { flag = _isOwner != null && (bool)_isOwner.GetValue(val, null); } catch { flag = false; } if (flag) { Bind(val, "IsOwner"); return; } } if (array.Length == 1) { Bind((Component)array[0], "only controller in scene"); } else if (array.Length != 0 && !_warnedNoOwner) { _warnedNoOwner = true; Plugin.Log.LogWarning((object)$"Found {array.Length} controllers but could not identify the local player."); } } private void Bind(Component player, string how) { _player = player; _playerHealth = ((_phType != null) ? player.GetComponent(_phType) : null); _cc = player.GetComponent(); _wasGrounded = (Object)(object)_cc != (Object)null && _cc.isGrounded; _wasSliding = false; _slideJudged = true; Plugin.Log.LogInfo((object)("Bound to local player via " + how + ": " + ((Object)player).name)); } private bool IsDead() { if ((Object)(object)_playerHealth == (Object)null || _healthProp == null) { return false; } try { return Convert.ToSingle(_healthProp.GetValue(_playerHealth, null)) <= 0f; } catch { return false; } } private void OnGUI() { //IL_0168: 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_019a: Unknown result type (might be due to invalid IL or missing references) //IL_019f: Unknown result type (might be due to invalid IL or missing references) //IL_01a6: Unknown result type (might be due to invalid IL or missing references) //IL_01b2: Expected O, but got Unknown //IL_01ef: Unknown result type (might be due to invalid IL or missing references) //IL_020e: 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_023c: Unknown result type (might be due to invalid IL or missing references) //IL_039c: Unknown result type (might be due to invalid IL or missing references) //IL_03c1: Unknown result type (might be due to invalid IL or missing references) //IL_0275: Unknown result type (might be due to invalid IL or missing references) //IL_027a: Unknown result type (might be due to invalid IL or missing references) //IL_029a: Unknown result type (might be due to invalid IL or missing references) //IL_029f: Unknown result type (might be due to invalid IL or missing references) //IL_0379: Unknown result type (might be due to invalid IL or missing references) //IL_0380: Unknown result type (might be due to invalid IL or missing references) //IL_0421: Unknown result type (might be due to invalid IL or missing references) //IL_0369: Unknown result type (might be due to invalid IL or missing references) //IL_0426: Unknown result type (might be due to invalid IL or missing references) //IL_043e: Unknown result type (might be due to invalid IL or missing references) //IL_041a: Unknown result type (might be due to invalid IL or missing references) //IL_0413: Unknown result type (might be due to invalid IL or missing references) //IL_036e: Unknown result type (might be due to invalid IL or missing references) //IL_0362: Unknown result type (might be due to invalid IL or missing references) //IL_035b: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)_player == (Object)null || Cursor.visible || IsDead()) { return; } bool flag = Plugin.ShowWallPip.Value && _canWallJump != null; bool value = Plugin.ShowHopJudge.Value; bool flag2 = Plugin.ShowSlideGrader.Value && _isSliding != null; bool value2 = Plugin.ShowAirMeter.Value; bool flag3 = Plugin.ShowMomentum.Value && _currentInput != null && _forceAdded != null && _bforcefinal != null; bool flag4 = Plugin.ShowCarveMeter.Value && _currentInput != null && _moveDirection != null; int num = (flag ? 1 : 0) + (value ? 1 : 0) + (flag2 ? 1 : 0) + (value2 ? 1 : 0) + (flag3 ? 2 : 0) + (flag4 ? 1 : 0); if (num == 0) { return; } float num2 = (float)Screen.height / 1080f * Plugin.Scale.Value; float num3 = 19f * num2; float num4 = 7f * num2; float num5 = 195f * num2; float num6 = (float)Screen.width * Plugin.PanelX.Value; float num7 = (float)Screen.height * Plugin.PanelY.Value; GUI.DrawTexture(new Rect(num6, num7, num5, (float)num * num3 + num4 * 2f), (Texture)(object)_tex, (ScaleMode)0, true, 0f, Smoke, 0f, 8f * num2); if (_style == null) { _style = new GUIStyle { alignment = (TextAnchor)3, fontStyle = (FontStyle)0 }; } _style.fontSize = Mathf.RoundToInt(12f * num2); float num8 = num6 + num4; float num9 = num5 - num4 * 2f; float num10 = num7 + num4; if (flag) { DrawWallLine(new Rect(num8, num10, num9, num3), num2); num10 += num3; } if (value) { Text(new Rect(num8, num10, num9, num3), $"HOPS {_streak} BEST {_bestStreak}", (_streak >= 5) ? Green : Cream, num2); num10 += num3; } if (flag2) { string text; Color color; if (_lastVerdict == "") { text = "SLIDE-JUMP --"; color = CreamDim; } else if (_lastVerdict == "NO JUMP") { text = "SLIDE-JUMP NO JUMP"; color = Warn; } else { text = $"SLIDE-JUMP {_lastSlideMs:0}ms {_lastVerdict}"; if (_slideReps.Count > 1) { float num11 = 0f; foreach (float slideRep in _slideReps) { num11 += slideRep; } text += $" avg {num11 / (float)_slideReps.Count:0}"; } color = ((_lastVerdict == "PERFECT") ? Green : ((_lastVerdict == "GOOD") ? Cream : Warn)); } Text(new Rect(num8, num10, num9, num3), text, color, num2); num10 += num3; } if (value2) { Text(new Rect(num8, num10, num9, num3), $"AIR {Mathf.RoundToInt(_airEma * 100f)}%", Cream, num2); num10 += num3; } if (flag3) { DrawMomentum(num8, num10, num9, num3, num2); num10 += num3 * 2f; } if (flag4) { Color color2 = ((_carveEma >= 0.97f) ? Green : ((_carveEma >= 0.9f) ? Cream : Warn)); DrawChannel(num8, num10, num9, num3, num2, "CARVE", _carveEma, color2, _carveActive ? $"{_carveEma * 100f:0}%" : "--"); } } private void DrawMomentum(float lx, float ly, float lw, float lineH, float s) { //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_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_0071: Unknown result type (might be due to invalid IL or missing references) //IL_0076: Unknown result type (might be due to invalid IL or missing references) //IL_00dd: Unknown result type (might be due to invalid IL or missing references) //IL_00d6: Unknown result type (might be due to invalid IL or missing references) //IL_0172: Unknown result type (might be due to invalid IL or missing references) float num = 0f; float num2 = 0f; float num3 = 0f; bool flag = false; try { Vector2 val = (Vector2)_currentInput.GetValue(_player); num = ((Vector2)(ref val)).magnitude; } catch { } Vector3 val2; try { val2 = (Vector3)_forceAdded.GetValue(_player); num2 = ((Vector3)(ref val2)).magnitude; } catch { } try { val2 = (Vector3)_bforcefinal.GetValue(_player); num3 = ((Vector3)(ref val2)).magnitude; } catch { } try { flag = _setSpeedTimer != null && (float)_setSpeedTimer.GetValue(_player) > 0f; } catch { } float num4 = num2 + num3; DrawChannel(lx, ly, lw, lineH, s, "IN", num / 14f, flag ? Warn : Cream, $"{num:0.0}" + (flag ? " SLOWED" : "")); ly += lineH; string arg = ""; if (num2 > 0.5f && num3 > 0.5f) { arg = "SLD+" + _bOwner; } else if (num2 > 0.5f) { arg = "SLIDE"; } else if (num3 > 0.5f) { arg = _bOwner; } DrawChannel(lx, ly, lw, lineH, s, "BURST", num4 / 60f, Green, (num4 > 0.5f) ? $"{num4:0.0} {arg}" : "--"); } private void DrawChannel(float lx, float ly, float lw, float lineH, float s, string label, float frac, Color color, string value) { //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_00de: 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_00ad: 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_00f3: Unknown result type (might be due to invalid IL or missing references) Text(new Rect(lx, ly, 44f * s, lineH), label, Cream, s); float num = 6f * s; Rect val = default(Rect); ((Rect)(ref val))..ctor(lx + 46f * s, ly + (lineH - num) / 2f, 64f * s, num); GUI.DrawTexture(val, (Texture)(object)_tex, (ScaleMode)0, true, 0f, Smoke, 0f, num / 2f); float num2 = ((Rect)(ref val)).width * Mathf.Clamp01(frac); if (num2 > 0.5f) { GUI.DrawTexture(new Rect(((Rect)(ref val)).x, ((Rect)(ref val)).y, num2, num), (Texture)(object)_tex, (ScaleMode)0, true, 0f, color, 0f, Mathf.Min(num, num2) / 2f); } Text(new Rect(lx + 116f * s, ly, lw - 116f * s, lineH), value, (value == "--") ? CreamDim : color, s); } private void DrawWallLine(Rect r, float s) { //IL_0087: Unknown result type (might be due to invalid IL or missing references) //IL_0091: Unknown result type (might be due to invalid IL or missing references) //IL_00d7: Unknown result type (might be due to invalid IL or missing references) //IL_00e5: 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_010e: Unknown result type (might be due to invalid IL or missing references) //IL_01e8: Unknown result type (might be due to invalid IL or missing references) //IL_01ed: Unknown result type (might be due to invalid IL or missing references) //IL_01ef: Unknown result type (might be due to invalid IL or missing references) //IL_01fd: Unknown result type (might be due to invalid IL or missing references) //IL_01e1: Unknown result type (might be due to invalid IL or missing references) //IL_01da: 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_0279: Unknown result type (might be due to invalid IL or missing references) //IL_0287: Unknown result type (might be due to invalid IL or missing references) //IL_0280: Unknown result type (might be due to invalid IL or missing references) float num = 10f * s; Rect val = default(Rect); ((Rect)(ref val))..ctor(((Rect)(ref r)).x + 46f * s, ((Rect)(ref r)).y + (((Rect)(ref r)).height - num) / 2f, num, num); Rect r2 = default(Rect); ((Rect)(ref r2))..ctor(((Rect)(ref r)).x + 62f * s, ((Rect)(ref r)).y, ((Rect)(ref r)).width - 62f * s, ((Rect)(ref r)).height); Text(new Rect(((Rect)(ref r)).x, ((Rect)(ref r)).y, ((Rect)(ref r)).width, ((Rect)(ref r)).height), "WALL", Cream, s); if (_vaultTimer != null) { float num2 = 0f; try { num2 = (float)_vaultTimer.GetValue(_player); } catch { } if (num2 > 0f) { GUI.DrawTexture(val, (Texture)(object)_tex, (ScaleMode)0, true, 0f, Green, 0f, num / 2f); Text(r2, $"DBL JUMP {num2:0.00}", Green, s); return; } } bool flag = false; bool flag2 = false; int num3 = 0; int num4 = 1; try { flag = (bool)_canWallJump.GetValue(_player); if (_isTouching != null) { flag2 = (bool)_isTouching.GetValue(_player); } if (_wallJumpsCount != null) { num3 = (int)_wallJumpsCount.GetValue(_player); } if (_maxWallJumps != null) { num4 = (int)_maxWallJumps.GetValue(_player); } } catch { } int num5 = num4 - num3; bool flag3 = flag && !flag2; Color val2 = (flag3 ? Green : (flag ? GreenDim : ((num5 > 0) ? CreamDim : Dark))); GUI.DrawTexture(val, (Texture)(object)_tex, (ScaleMode)0, true, 0f, val2, 0f, num / 2f); string text = (flag3 ? "BANKED" : ((!flag && num5 <= 0) ? "SPENT" : "")); if (num5 > 1) { text = text + ((text == "") ? "" : " ") + $"x{num5}"; } if (text != "") { Text(r2, text, flag3 ? Green : CreamDim, s); } } private void Text(Rect r, string text, Color color, float s) { //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_005e: 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_0080: Unknown result type (might be due to invalid IL or missing references) _style.normal.textColor = new Color(0f, 0f, 0f, 0.5f * color.a); GUI.Label(new Rect(((Rect)(ref r)).x + 1f * s, ((Rect)(ref r)).y + 1f * s, ((Rect)(ref r)).width, ((Rect)(ref r)).height), text, _style); _style.normal.textColor = color; GUI.Label(r, text, _style); } private void OnDisable() { Plugin.Log.LogWarning((object)"Trainer behaviour disabled."); } private void OnDestroy() { Plugin.Log.LogWarning((object)"Trainer behaviour destroyed."); } } }