using System; using System.Collections.Generic; using System.Diagnostics; using System.Globalization; using System.IO; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Text; using BoneLib; using BoneLib.BoneMenu; using BoneLib.Notifications; using HarmonyLib; using Il2CppInterop.Runtime.InteropTypes; using Il2CppInterop.Runtime.InteropTypes.Arrays; using Il2CppSLZ.Marrow; using Il2CppSLZ.Marrow.Data; using MagSlide; using MelonLoader; using MelonLoader.Preferences; using Microsoft.CodeAnalysis; using UnityEngine; using UnityEngine.SceneManagement; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: MelonInfo(typeof(Mod), "MagSlide", "1.1.0", "ElectroDynamic", null)] [assembly: MelonGame("Stress Level Zero", "BONELAB")] [assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")] [assembly: AssemblyCompany("MagSlide")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("MagSlide")] [assembly: AssemblyTitle("MagSlide")] [assembly: AssemblyVersion("1.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 MagSlide { public class Mod : MelonMod { private class Rec { public AmmoSocket Socket; public float OrigInfluence; public float OrigEndDistance; public SphereCollider Trigger; public float OrigTriggerRadius; public float AppliedRadius = -1f; public bool WasLocked; public bool PlugCaptured; public bool HasSeat; public Rigidbody GunRb; public Vector3 SeatMagPosL; public Quaternion SeatMagRotL; public Vector3 SocketPosL; public Vector3 AxisL; public float RailLen; public Magazine LastMag; public Rail Rail; public float NoRelatchUntil; } private class Rail { public ConfigurableJoint Joint; public Magazine Mag; public Transform MagT; public Rigidbody MagRb; public AmmoPlug Plug; public Transform PlugT; public Collider[] MagCols; public Collider[] GunCols; public Collider[] HandCols; public List HandRbs; public List GunHandCols; public bool Armed; public float LatchTime; public float NextTelem; public float LastT; public float NextBuzz; } private class SeatData { public Vector3 SocketPosL; public Vector3 AxisL; public Vector3 SeatMagPosL; public Quaternion SeatMagRotL; public float RailLen; } private enum BuzzKind { Catch, Slide, Insert } private static MelonPreferences_Category _cat; private static MelonPreferences_Entry _enabled; private static MelonPreferences_Entry _range; private static MelonPreferences_Entry _magSlide; private static MelonPreferences_Entry _catch; private static MelonPreferences_Entry _depth; private static MelonPreferences_Entry _trace; private const float InfluenceFloor = 0.05f; private const float ScanInterval = 1f; private const float CatchMin = 0.001f; private const float CatchMax = 0.08f; private const float CatchDefault = 0.01f; private const float DepthMin = 0.4f; private const float DepthMax = 0.95f; private const float DepthDefault = 0.7f; private const float RetainMargin = 0.05f; private static readonly Dictionary _known = new Dictionary(); private static float _scanAccum; private static int _lastCount = -1; private static bool _structLogged; private static bool _patchesOk; private const float RailBottomOff = 0.045f; private const float RailAngleGate = 25f; private const float RelatchAngleGate = 35f; private const float RelatchCooldown = 0.6f; private const float RailAlignRate = 0.06f; private static readonly List _plugs = new List(); private static readonly Dictionary _seatLib = new Dictionary(); private static readonly List> _dyingRails = new List>(); public static Instance Log { get; private set; } private static string RailLibPath => Path.Combine(MelonUtils.UserDataDirectory, "MagSlide_rails.txt"); public override void OnInitializeMelon() { Log = ((MelonBase)this).LoggerInstance; _cat = MelonPreferences.CreateCategory("MagSlide"); _enabled = _cat.CreateEntry("Enabled", true, "Half-Life Alyx style mag insertion", (string)null, false, false, (ValueValidator)null, (string)null); _range = _cat.CreateEntry("SnapRange", 0.2f, "How close the mag must get before it pulls in (lower = more realistic)", (string)null, false, false, (ValueValidator)null, (string)null); _magSlide = _cat.CreateEntry("MagSlide", true, "Staccato style: mag catches at the well mouth and slides up into the gun", (string)null, false, false, (ValueValidator)null, (string)null); _catch = _cat.CreateEntry("CatchRange", 0.01f, "Capture bubble radius; the mag body adds ~7cm on top. Near zero = touch-the-well catch", (string)null, false, false, (ValueValidator)null, (string)null); _depth = _cat.CreateEntry("InsertDepth", 0.7f, "How far up the rail the mag must be pushed before it clicks in (fraction of the travel)", (string)null, false, false, (ValueValidator)null, (string)null); _trace = _cat.CreateEntry("TraceInserts", false, "Log every mag capture/insert/lock event with distances (research tool)", (string)null, false, false, (ValueValidator)null, (string)null); if (_catch.Value > 0.08f || _catch.Value < 0.001f) { _catch.Value = 0.01f; } if (_depth.Value > 0.95f || _depth.Value < 0.4f) { _depth.Value = 0.7f; } _cat.SaveToFile(false); BuildMenu(); InstallTracer(); LoadSeatLib(); Hooking.OnLevelLoaded += delegate { CleanupForLevelChange(); }; Log.Msg("MagSlide 1.1.0 loaded."); } public override void OnUpdate() { if (_enabled.Value || _magSlide.Value) { if (_magSlide.Value) { ManageTriggers(); UpdateRails(); } ProcessDyingRails(); _scanAccum += Time.unscaledDeltaTime; if (!(_scanAccum < 1f)) { _scanAccum = 0f; ApplyToAll(); } } } private static void CleanupForLevelChange() { foreach (Rec value in _known.Values) { try { if (value.Rail != null) { ReleaseRail(value, "level change"); } } catch { } } for (int num = _dyingRails.Count - 1; num >= 0; num--) { try { SetPairIgnores(_dyingRails[num].Key, ignore: false); RestoreHandBodies(_dyingRails[num].Key); } catch { } } _dyingRails.Clear(); _known.Clear(); _lastCount = -1; _structLogged = false; } private static float EngagedRadius(Rec r) { return Mathf.Min(r.OrigTriggerRadius, r.OrigEndDistance + 0.05f); } private static float CompleteAt(Rec r) { float num = Mathf.Clamp(_depth.Value, 0.4f, 0.95f); return Mathf.Min(r.RailLen - 0.01f, r.RailLen * num); } private static void SetTrigger(Rec r, bool on, float radius) { try { if (!((Object)(object)r.Trigger == (Object)null)) { if (((Collider)r.Trigger).enabled != on) { ((Collider)r.Trigger).enabled = on; } if (Mathf.Abs(radius - r.AppliedRadius) > 0.0001f) { r.Trigger.radius = radius; r.AppliedRadius = radius; } } } catch { } } private static void ManageTriggers() { if (!_patchesOk) { return; } float num = Mathf.Clamp(_catch.Value, 0.001f, 0.08f); foreach (Rec value in _known.Values) { try { if ((Object)(object)value.Socket == (Object)null || (Object)(object)value.Trigger == (Object)null) { continue; } if (value.Rail != null) { value.WasLocked = false; continue; } bool flag = (Object)(object)((Socket)value.Socket).LockedPlug != (Object)null; if (value.WasLocked && !flag) { value.WasLocked = false; value.PlugCaptured = false; SetTrigger(value, !value.HasSeat, Mathf.Min(value.OrigTriggerRadius, num)); TryRelatchEjected(value); continue; } value.WasLocked = flag; if (flag || value.PlugCaptured) { SetTrigger(value, on: true, EngagedRadius(value)); } else if (value.HasSeat) { SetTrigger(value, on: false, Mathf.Min(value.OrigTriggerRadius, num)); } else { SetTrigger(value, on: true, Mathf.Min(value.OrigTriggerRadius, num)); } } catch { } } } private static void ApplyToAll() { //IL_009c: Unknown result type (might be due to invalid IL or missing references) //IL_00a1: Unknown result type (might be due to invalid IL or missing references) try { Il2CppArrayBase val = Resources.FindObjectsOfTypeAll(); if (val == null) { if (_lastCount != 0) { Log.Warning("MagSlide: AmmoSocket search returned null."); _lastCount = 0; } return; } int length = val.Length; if (length != _lastCount) { Log.Msg($"MagSlide: {length} mag well(s) loaded in memory."); _lastCount = length; } int num = 0; for (int i = 0; i < length; i++) { AmmoSocket val2 = val[i]; if ((Object)(object)val2 == (Object)null) { continue; } try { Scene scene = ((Component)val2).gameObject.scene; if (((Scene)(ref scene)).IsValid()) { num++; Register(val2); ApplyOne(val2); } } catch { } } if (!_structLogged && num > 0) { _structLogged = true; DumpInSceneSockets("auto"); } RefreshPlugCache(); } catch (Exception ex) { Log.Warning("Socket sweep failed: " + ex.Message); } } private static void Register(AmmoSocket s) { int instanceID = ((Object)s).GetInstanceID(); if (_known.ContainsKey(instanceID)) { return; } Rec rec = new Rec { Socket = s }; try { rec.OrigInfluence = ((Socket)s).influenceRadius; } catch { } try { rec.OrigEndDistance = ((Socket)s).endDistance; } catch { } try { Il2CppArrayBase components = ((Component)s).GetComponents(); if (components != null) { for (int i = 0; i < components.Length; i++) { SphereCollider val = components[i]; if (!((Object)(object)val == (Object)null) && ((Collider)val).isTrigger) { rec.Trigger = val; rec.OrigTriggerRadius = val.radius; break; } } } } catch { } _known[instanceID] = rec; } private static void ApplyOne(AmmoSocket s) { int instanceID = ((Object)s).GetInstanceID(); if (!_known.TryGetValue(instanceID, out var value)) { return; } bool value2 = _enabled.Value; bool value3 = _magSlide.Value; if (value2) { float num = Mathf.Clamp(_range.Value, 0.05f, 1f); ((Socket)s).influenceRadius = Mathf.Max(0.05f, value.OrigInfluence * num); } else { ((Socket)s).influenceRadius = value.OrigInfluence; } ((Socket)s).endDistance = value.OrigEndDistance; if (value3) { return; } if (value.Rail != null) { ReleaseRail(value, "mode off"); } if (!((Object)(object)value.Trigger != (Object)null) || !(value.AppliedRadius >= 0f)) { return; } try { value.Trigger.radius = value.OrigTriggerRadius; ((Collider)value.Trigger).enabled = true; value.AppliedRadius = -1f; } catch { } } private static void RestoreAll() { foreach (Rec value in _known.Values) { try { if (value.Rail != null) { ReleaseRail(value, "restore"); } if (!((Object)(object)value.Socket == (Object)null)) { ((Socket)value.Socket).influenceRadius = value.OrigInfluence; ((Socket)value.Socket).endDistance = value.OrigEndDistance; if ((Object)(object)value.Trigger != (Object)null) { value.Trigger.radius = value.OrigTriggerRadius; ((Collider)value.Trigger).enabled = true; value.AppliedRadius = -1f; } } } catch { } } } private static void DumpInSceneSockets(string reason) { //IL_0059: 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) try { Il2CppArrayBase val = Resources.FindObjectsOfTypeAll(); if (val == null) { Log.Msg("[MagSlide diag/" + reason + "] socket search null."); return; } int num = 0; for (int i = 0; i < val.Length && num < 8; i++) { AmmoSocket val2 = val[i]; if ((Object)(object)val2 == (Object)null) { continue; } GameObject gameObject; try { gameObject = ((Component)val2).gameObject; } catch { continue; } bool flag; try { Scene scene = gameObject.scene; flag = ((Scene)(ref scene)).IsValid(); } catch { continue; } if (!flag) { continue; } num++; float value = -1f; float value2 = -1f; try { value = ((Socket)val2).influenceRadius; value2 = ((Socket)val2).endDistance; } catch { } string value3 = "?"; string value4 = "?"; string value5 = "none"; if (_known.TryGetValue(((Object)val2).GetInstanceID(), out var value6)) { value3 = value6.OrigInfluence.ToString("F3"); value4 = value6.OrigEndDistance.ToString("F3"); if ((Object)(object)value6.Trigger != (Object)null) { float value7 = -1f; try { value7 = value6.Trigger.radius; } catch { } value5 = $"{value7:F3} (orig {value6.OrigTriggerRadius:F3})"; } } Log.Msg($"[MagSlide diag] well '{((Object)gameObject).name}' captureTrigger r={value5} | influenceRadius now={value:F3} (orig {value3}) | endDistance now={value2:F3} (orig {value4})"); } if (num == 0) { Log.Msg("[MagSlide diag/" + reason + "] no in-world mag wells found. Hold or spawn a gun, then press Diagnose again."); return; } Log.Msg($"[MagSlide diag/{reason}] dumped {num} in-world mag well(s)."); } catch (Exception ex) { Log.Warning("[MagSlide diag] dump failed: " + ex.Message); } } private static void BuildMenu() { //IL_0019: 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_0065: 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_00e8: Unknown result type (might be due to invalid IL or missing references) //IL_0140: Unknown result type (might be due to invalid IL or missing references) //IL_0197: Unknown result type (might be due to invalid IL or missing references) //IL_01b8: Unknown result type (might be due to invalid IL or missing references) //IL_01e7: Unknown result type (might be due to invalid IL or missing references) Page obj = Page.Root.CreatePage("MagSlide", new Color(0.95f, 0.55f, 0.2f), 0, true); obj.CreateBool("Realistic Insert", Color.green, _enabled.Value, (Action)delegate(bool v) { _enabled.Value = v; _cat.SaveToFile(false); Retune(); Notify(v ? "On — bring the mag right up to the well to insert it." : "Off — vanilla capture range restored.", (NotificationType)0); }); obj.CreateFloat("Snap Range", Color.yellow, _range.Value, 0.05f, 0.05f, 1f, (Action)delegate(float v) { _range.Value = v; _cat.SaveToFile(false); Retune(); }); obj.CreateBool("Mag Slide", Color.cyan, _magSlide.Value, (Action)delegate(bool v) { _magSlide.Value = v; _cat.SaveToFile(false); Retune(); Notify(v ? "On — the mag catches at the well mouth and slides up into the gun." : "Off — vanilla long-range mag capture restored.", (NotificationType)0); }); obj.CreateFloat("Catch Range", Color.white, _catch.Value, 0.005f, 0.001f, 0.08f, (Action)delegate(float v) { _catch.Value = v; _cat.SaveToFile(false); }); obj.CreateFloat("Insert Depth", new Color(0.6f, 1f, 0.6f), _depth.Value, 0.05f, 0.4f, 0.95f, (Action)delegate(float v) { _depth.Value = Mathf.Clamp(v, 0.4f, 0.95f); _cat.SaveToFile(false); }); Page obj2 = obj.CreatePage("Advanced", new Color(0.65f, 0.65f, 0.65f), 0, true); obj2.CreateFunction("Forget Learned Guns", new Color(1f, 0.6f, 0.2f), (Action)delegate { ClearSeatLib(); Notify("All learned guns forgotten. The next mag you insert teaches each gun again.", (NotificationType)3); }); obj2.CreateFunction("Reset Defaults", Color.red, (Action)delegate { _range.Value = 0.2f; _catch.Value = 0.01f; _depth.Value = 0.7f; _cat.SaveToFile(false); Retune(); Notify("Snap Range, Catch Range and Insert Depth reset to defaults.", (NotificationType)3); }); } private static void ClearSeatLib() { _seatLib.Clear(); try { if (File.Exists(RailLibPath)) { File.Delete(RailLibPath); } } catch { } foreach (Rec value in _known.Values) { try { if (value.Rail != null) { ReleaseRail(value, "rails cleared"); } value.HasSeat = false; value.LastMag = null; } catch { } } } private static void Retune() { if (_enabled.Value || _magSlide.Value) { ApplyToAll(); } else { RestoreAll(); } } private static string F(float v) { return v.ToString("R", CultureInfo.InvariantCulture); } private static float PF(string s) { return float.Parse(s, CultureInfo.InvariantCulture); } private static void LoadSeatLib() { //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_0086: Unknown result type (might be due to invalid IL or missing references) //IL_008b: Unknown result type (might be due to invalid IL or missing references) //IL_00b9: Unknown result type (might be due to invalid IL or missing references) //IL_00be: Unknown result type (might be due to invalid IL or missing references) //IL_00e8: Unknown result type (might be due to invalid IL or missing references) //IL_00ed: Unknown result type (might be due to invalid IL or missing references) try { if (!File.Exists(RailLibPath)) { return; } string[] array = File.ReadAllLines(RailLibPath); foreach (string text in array) { try { string[] array2 = text.Split('|'); if (array2.Length == 15) { _seatLib[array2[0]] = new SeatData { SocketPosL = new Vector3(PF(array2[1]), PF(array2[2]), PF(array2[3])), AxisL = new Vector3(PF(array2[4]), PF(array2[5]), PF(array2[6])), RailLen = PF(array2[7]), SeatMagPosL = new Vector3(PF(array2[8]), PF(array2[9]), PF(array2[10])), SeatMagRotL = new Quaternion(PF(array2[11]), PF(array2[12]), PF(array2[13]), PF(array2[14])) }; } } catch { } } if (_seatLib.Count > 0) { Log.Msg($"Loaded {_seatLib.Count} learned mag rail(s)."); } } catch (Exception ex) { Log.Warning("rail library load failed: " + ex.Message); } } private static void SaveSeatLib() { try { StringBuilder stringBuilder = new StringBuilder(); foreach (KeyValuePair item in _seatLib) { SeatData value = item.Value; stringBuilder.Append(item.Key).Append('|').Append(F(value.SocketPosL.x)) .Append('|') .Append(F(value.SocketPosL.y)) .Append('|') .Append(F(value.SocketPosL.z)) .Append('|') .Append(F(value.AxisL.x)) .Append('|') .Append(F(value.AxisL.y)) .Append('|') .Append(F(value.AxisL.z)) .Append('|') .Append(F(value.RailLen)) .Append('|') .Append(F(value.SeatMagPosL.x)) .Append('|') .Append(F(value.SeatMagPosL.y)) .Append('|') .Append(F(value.SeatMagPosL.z)) .Append('|') .Append(F(value.SeatMagRotL.x)) .Append('|') .Append(F(value.SeatMagRotL.y)) .Append('|') .Append(F(value.SeatMagRotL.z)) .Append('|') .Append(F(value.SeatMagRotL.w)) .AppendLine(); } File.WriteAllText(RailLibPath, stringBuilder.ToString()); } catch { } } private static string GunModelKey(Component socketSide) { try { string name = ((Object)socketSide.transform.root).name; int num = name.LastIndexOf(" [", StringComparison.Ordinal); return (num > 0) ? name.Substring(0, num) : name; } catch { return null; } } private static void TrySeatFromLibrary(Rec r) { //IL_005b: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Unknown result type (might be due to invalid IL or missing references) //IL_0067: Unknown result type (might be due to invalid IL or missing references) //IL_006c: Unknown result type (might be due to invalid IL or missing references) //IL_007f: Unknown result type (might be due to invalid IL or missing references) //IL_0084: Unknown result type (might be due to invalid IL or missing references) //IL_008b: Unknown result type (might be due to invalid IL or missing references) //IL_0090: Unknown result type (might be due to invalid IL or missing references) try { if (r.HasSeat || (Object)(object)r.Socket == (Object)null) { return; } string text = GunModelKey((Component)(object)r.Socket); if (text != null && _seatLib.TryGetValue(text, out var value)) { Rigidbody componentInParent = ((Component)r.Socket).GetComponentInParent(); if (!((Object)(object)componentInParent == (Object)null)) { r.GunRb = componentInParent; r.SocketPosL = value.SocketPosL; r.AxisL = value.AxisL; r.RailLen = value.RailLen; r.SeatMagPosL = value.SeatMagPosL; r.SeatMagRotL = value.SeatMagRotL; r.HasSeat = true; } } } catch { } } private static void RefreshPlugCache() { //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Unknown result type (might be due to invalid IL or missing references) _plugs.Clear(); try { Il2CppArrayBase val = Resources.FindObjectsOfTypeAll(); if (val == null) { return; } for (int i = 0; i < val.Length; i++) { AmmoPlug val2 = val[i]; if ((Object)(object)val2 == (Object)null) { continue; } try { Scene scene = ((Component)val2).gameObject.scene; if (((Scene)(ref scene)).IsValid()) { _plugs.Add(val2); } } catch { } } } catch { } } private static List CollectGunHandColliders(Rec r) { List list = new List(); try { Gun gun = r.Socket.gun; if ((Object)(object)gun == (Object)null || (Object)(object)gun.triggerGrip == (Object)null) { return list; } Hand hand = gun.triggerGrip.GetHand(); if ((Object)(object)hand == (Object)null) { return list; } try { Il2CppArrayBase componentsInChildren = ((Component)hand).GetComponentsInChildren(true); if (componentsInChildren != null) { foreach (Collider item in componentsInChildren) { if ((Object)(object)item != (Object)null) { list.Add(item); } } } } catch { } try { PhysHand physHand = hand.physHand; if ((Object)(object)physHand != (Object)null) { if ((Object)(object)physHand.handCol != (Object)null && !list.Contains((Collider)(object)physHand.handCol)) { list.Add((Collider)(object)physHand.handCol); } if ((Object)(object)physHand.fingersCol != (Object)null && !list.Contains((Collider)(object)physHand.fingersCol)) { list.Add((Collider)(object)physHand.fingersCol); } if ((Object)(object)physHand.cUpper != (Object)null && !list.Contains((Collider)(object)physHand.cUpper)) { list.Add((Collider)(object)physHand.cUpper); } if ((Object)(object)physHand.cLower != (Object)null && !list.Contains((Collider)(object)physHand.cLower)) { list.Add((Collider)(object)physHand.cLower); } } } catch { } } catch { } return list; } private static void SetPairIgnores(Rail rail, bool ignore) { if (rail == null) { return; } try { Collider[] gunCols; if (rail.GunCols != null && rail.MagCols != null) { gunCols = rail.GunCols; foreach (Collider val in gunCols) { if ((Object)(object)val == (Object)null || val.isTrigger) { continue; } Collider[] magCols = rail.MagCols; foreach (Collider val2 in magCols) { if (!((Object)(object)val2 == (Object)null) && !val2.isTrigger) { try { Physics.IgnoreCollision(val2, val, ignore); } catch { } } } if (!ignore || rail.HandCols == null) { continue; } magCols = rail.HandCols; foreach (Collider val3 in magCols) { if (!((Object)(object)val3 == (Object)null) && !val3.isTrigger) { try { Physics.IgnoreCollision(val3, val, true); } catch { } } } } } if (rail.GunHandCols != null && rail.MagCols != null) { foreach (Collider gunHandCol in rail.GunHandCols) { if ((Object)(object)gunHandCol == (Object)null || gunHandCol.isTrigger) { continue; } gunCols = rail.MagCols; foreach (Collider val4 in gunCols) { if (!((Object)(object)val4 == (Object)null) && !val4.isTrigger) { try { Physics.IgnoreCollision(val4, gunHandCol, ignore); } catch { } } } } } if (ignore || rail.HandCols == null || rail.GunCols == null) { return; } gunCols = rail.GunCols; foreach (Collider val5 in gunCols) { if ((Object)(object)val5 == (Object)null || val5.isTrigger) { continue; } Collider[] magCols = rail.HandCols; foreach (Collider val6 in magCols) { if (!((Object)(object)val6 == (Object)null) && !val6.isTrigger) { try { Physics.IgnoreCollision(val6, val5, false); } catch { } } } } } catch { } } private static void ProcessDyingRails() { for (int num = _dyingRails.Count - 1; num >= 0; num--) { if (!(Time.unscaledTime < _dyingRails[num].Value)) { Rail key = _dyingRails[num].Key; _dyingRails.RemoveAt(num); SetPairIgnores(key, ignore: false); RestoreHandBodies(key); } } } private static void RestoreHandBodies(Rail rail) { try { if (rail.HandRbs == null) { return; } foreach (Rigidbody handRb in rail.HandRbs) { try { if ((Object)(object)handRb != (Object)null) { handRb.detectCollisions = true; } } catch { } } } catch { } } private static bool IsHeld(AmmoPlug plug) { try { InteractableHost host = ((Plug)plug).host; return (Object)(object)host != (Object)null && (Object)(object)host.GetHand(0) != (Object)null; } catch { return false; } } private static bool RailedAnywhere(AmmoPlug plug) { foreach (Rec value in _known.Values) { try { if (value.Rail != null && (Object)(object)value.Rail.Plug == (Object)(object)plug) { return true; } } catch { } } return false; } private static void Buzz(AmmoPlug plug, BuzzKind kind) { try { InteractableHost val = (((Object)(object)plug != (Object)null) ? ((Plug)plug).host : null); Hand val2 = (((Object)(object)val != (Object)null) ? val.GetHand(0) : null); if ((Object)(object)val2 == (Object)null || (Object)(object)val2.Controller == (Object)null) { return; } Haptor haptor = val2.Controller.haptor; if (!((Object)(object)haptor == (Object)null)) { switch (kind) { case BuzzKind.Catch: haptor.Haptic_Tap(); break; case BuzzKind.Slide: haptor.Haptic_SlideFriction(); break; case BuzzKind.Insert: haptor.Haptic_WepMagInsert(); break; } } } catch { } } private static bool PlatformMatches(Rec r, AmmoPlug plug) { try { Gun gun = r.Socket.gun; if ((Object)(object)gun == (Object)null || (Object)(object)gun.defaultMagazine == (Object)null) { return true; } Magazine magazine = plug.magazine; if ((Object)(object)magazine == (Object)null) { return true; } MagazineData magazineData = magazine.magazineState.magazineData; if ((Object)(object)magazineData == (Object)null) { return true; } string platform = gun.defaultMagazine.platform; string platform2 = magazineData.platform; if (string.IsNullOrEmpty(platform) || string.IsNullOrEmpty(platform2)) { return true; } return platform == platform2; } catch { return true; } } private static void UpdateRails() { //IL_0148: Unknown result type (might be due to invalid IL or missing references) //IL_014d: Unknown result type (might be due to invalid IL or missing references) //IL_0153: Unknown result type (might be due to invalid IL or missing references) //IL_0158: Unknown result type (might be due to invalid IL or missing references) //IL_015d: 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) //IL_016c: Unknown result type (might be due to invalid IL or missing references) //IL_0173: Unknown result type (might be due to invalid IL or missing references) //IL_0178: Unknown result type (might be due to invalid IL or missing references) //IL_017d: 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_00d0: Unknown result type (might be due to invalid IL or missing references) //IL_01c6: Unknown result type (might be due to invalid IL or missing references) //IL_01cc: Unknown result type (might be due to invalid IL or missing references) //IL_01d1: Unknown result type (might be due to invalid IL or missing references) //IL_01dd: Unknown result type (might be due to invalid IL or missing references) if (!_patchesOk) { return; } float unscaledTime = Time.unscaledTime; foreach (Rec value in _known.Values) { try { if (value.Rail != null) { TickRail(value); continue; } if (!value.HasSeat) { TrySeatFromLibrary(value); } if (!value.HasSeat || (Object)(object)value.Socket == (Object)null || (Object)(object)value.Trigger == (Object)null) { continue; } if ((Object)(object)value.GunRb == (Object)null) { value.HasSeat = false; } else { if (unscaledTime < value.NoRelatchUntil || (Object)(object)((Socket)value.Socket).LockedPlug != (Object)null || value.PlugCaptured) { continue; } Transform transform = ((Component)value.GunRb).transform; transform.TransformPoint(value.SocketPosL); for (int i = 0; i < _plugs.Count; i++) { AmmoPlug val = _plugs[i]; if ((Object)(object)val == (Object)null) { continue; } try { Magazine magazine = val.magazine; if (!((Object)(object)magazine == (Object)null) && ((Component)magazine).gameObject.activeInHierarchy && !magazine.isMagazineInserted && !RailedAnywhere(val)) { Transform transform2 = ((Component)val).transform; Vector3 val2 = transform.InverseTransformPoint(transform2.position) - value.SocketPosL; float num = Vector3.Dot(val2, value.AxisL); Vector3 val3 = val2 - value.AxisL * num; float magnitude = ((Vector3)(ref val3)).magnitude; if (!(num < -0.02f) && !(num > value.RailLen * 0.5f) && !(magnitude > 0.02f) && IsHeld(val) && PlatformMatches(value, val) && !(Quaternion.Angle(transform.rotation * value.SeatMagRotL, ((Component)magazine).transform.rotation) > 25f)) { Latch(value, val); break; } } } catch { } } continue; } } catch { } } } private static void Latch(Rec r, AmmoPlug plug) { //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Unknown result type (might be due to invalid IL or missing references) //IL_004d: 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_0223: Unknown result type (might be due to invalid IL or missing references) //IL_0228: Unknown result type (might be due to invalid IL or missing references) //IL_022d: Unknown result type (might be due to invalid IL or missing references) //IL_0232: Unknown result type (might be due to invalid IL or missing references) //IL_0236: Unknown result type (might be due to invalid IL or missing references) //IL_023d: Unknown result type (might be due to invalid IL or missing references) //IL_023f: Unknown result type (might be due to invalid IL or missing references) //IL_0244: Unknown result type (might be due to invalid IL or missing references) //IL_0249: Unknown result type (might be due to invalid IL or missing references) //IL_026b: Unknown result type (might be due to invalid IL or missing references) //IL_0259: Unknown result type (might be due to invalid IL or missing references) //IL_025b: Unknown result type (might be due to invalid IL or missing references) //IL_0260: Unknown result type (might be due to invalid IL or missing references) //IL_0265: Unknown result type (might be due to invalid IL or missing references) Magazine magazine = plug.magazine; Transform transform = ((Component)magazine).transform; Rigidbody component = ((Component)magazine).GetComponent(); if ((Object)(object)component == (Object)null) { return; } Transform transform2 = ((Component)r.GunRb).transform; Transform transform3 = ((Component)plug).transform; PurgeStrayJoints(null, component); float num = Vector3.Dot(transform2.InverseTransformPoint(transform3.position) - r.SocketPosL, r.AxisL); num = Mathf.Clamp(num, 0f, r.RailLen); Collider[] magCols = null; Collider[] gunCols = null; Collider[] handCols = null; List list = null; List list2 = null; try { magCols = Il2CppArrayBase.op_Implicit(((Component)magazine).GetComponentsInChildren(true)); gunCols = Il2CppArrayBase.op_Implicit(((Component)r.GunRb).GetComponentsInChildren(true)); list2 = CollectGunHandColliders(r); try { Hand val = (((Object)(object)((Plug)plug).host != (Object)null) ? ((Plug)plug).host.GetHand(0) : null); if ((Object)(object)val != (Object)null) { handCols = Il2CppArrayBase.op_Implicit(((Component)val).GetComponentsInChildren(true)); list = new List(); Rigidbody componentInParent = ((Component)val).GetComponentInParent(); if ((Object)(object)componentInParent != (Object)null) { list.Add(componentInParent); } Il2CppArrayBase componentsInChildren = ((Component)val).GetComponentsInChildren(false); if (componentsInChildren != null) { foreach (Rigidbody item in componentsInChildren) { if ((Object)(object)item != (Object)null && !list.Contains(item)) { list.Add(item); } } } foreach (Rigidbody item2 in list) { try { item2.detectCollisions = false; } catch { } } } } catch { } if (_trace.Value) { Log.Msg($"[trace] LATCH: magHandBodies={list?.Count ?? 0} gunHandCols={list2.Count}"); } } catch { } ConfigurableJoint val2 = ((Component)component).gameObject.AddComponent(); ((Joint)val2).connectedBody = r.GunRb; Vector3 val3 = (((Joint)val2).axis = transform.InverseTransformDirection(transform2.TransformDirection(r.AxisL))); Vector3 val5 = Vector3.Cross(val3, Vector3.up); if (((Vector3)(ref val5)).sqrMagnitude < 0.001f) { val5 = Vector3.Cross(val3, Vector3.right); } val2.secondaryAxis = ((Vector3)(ref val5)).normalized; val2.xMotion = (ConfigurableJointMotion)2; val2.yMotion = (ConfigurableJointMotion)0; val2.zMotion = (ConfigurableJointMotion)0; val2.angularXMotion = (ConfigurableJointMotion)0; val2.angularYMotion = (ConfigurableJointMotion)0; val2.angularZMotion = (ConfigurableJointMotion)0; ((Joint)val2).enableCollision = false; ((Joint)val2).enablePreprocessing = false; ((Joint)val2).autoConfigureConnectedAnchor = false; try { ((Collider)r.Trigger).enabled = false; } catch { } float num2 = CompleteAt(r); r.Rail = new Rail { Joint = val2, Mag = magazine, MagT = transform, MagRb = component, Plug = plug, PlugT = transform3, MagCols = magCols, GunCols = gunCols, HandCols = handCols, HandRbs = list, GunHandCols = list2, Armed = (num < num2 - 0.015f), LatchTime = Time.unscaledTime, LastT = num }; SetPairIgnores(r.Rail, ignore: true); Buzz(plug, BuzzKind.Catch); if (_trace.Value) { Log.Msg($"[trace] LATCH gun='{GunName((Component)(object)r.Socket)}' t0={num:F3} rail={r.RailLen:F3} complete={num2:F3} armed={r.Rail.Armed}"); } } private static void PurgeStrayJoints(Rail rail, Rigidbody magRb) { try { Il2CppArrayBase components = ((Component)magRb).GetComponents(); if (components == null) { return; } for (int i = 0; i < components.Length; i++) { ConfigurableJoint val = components[i]; if (!((Object)(object)val == (Object)null) && (rail == null || !((Object)(object)rail.Joint != (Object)null) || ((Object)val).GetInstanceID() != ((Object)rail.Joint).GetInstanceID()) && !((Object)(object)((Joint)val).connectedBody != (Object)null)) { if (_trace.Value) { Log.Msg("[trace] purged a world-anchored joint on the mag"); } Object.Destroy((Object)(object)val); } } } catch { } } private static void TickRail(Rec r) { //IL_0137: Unknown result type (might be due to invalid IL or missing references) //IL_0139: Unknown result type (might be due to invalid IL or missing references) //IL_013f: Unknown result type (might be due to invalid IL or missing references) //IL_0144: Unknown result type (might be due to invalid IL or missing references) //IL_0149: Unknown result type (might be due to invalid IL or missing references) //IL_0178: Unknown result type (might be due to invalid IL or missing references) //IL_017d: Unknown result type (might be due to invalid IL or missing references) //IL_0181: Unknown result type (might be due to invalid IL or missing references) //IL_0188: Unknown result type (might be due to invalid IL or missing references) //IL_018d: Unknown result type (might be due to invalid IL or missing references) //IL_0075: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Unknown result type (might be due to invalid IL or missing references) //IL_0080: Unknown result type (might be due to invalid IL or missing references) //IL_0085: Unknown result type (might be due to invalid IL or missing references) //IL_008a: Unknown result type (might be due to invalid IL or missing references) //IL_008b: Unknown result type (might be due to invalid IL or missing references) //IL_008d: 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_00b3: Unknown result type (might be due to invalid IL or missing references) //IL_00b8: Unknown result type (might be due to invalid IL or missing references) //IL_00c1: Unknown result type (might be due to invalid IL or missing references) //IL_00c6: Unknown result type (might be due to invalid IL or missing references) //IL_00d0: 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_00e5: 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_00fa: Unknown result type (might be due to invalid IL or missing references) //IL_0113: Unknown result type (might be due to invalid IL or missing references) //IL_0118: Unknown result type (might be due to invalid IL or missing references) //IL_011c: Unknown result type (might be due to invalid IL or missing references) //IL_0121: Unknown result type (might be due to invalid IL or missing references) Rail rail = r.Rail; if ((Object)(object)rail.Joint == (Object)null || (Object)(object)rail.Mag == (Object)null || (Object)(object)rail.PlugT == (Object)null || (Object)(object)r.GunRb == (Object)null || !((Component)rail.Mag).gameObject.activeInHierarchy) { ReleaseRail(r, "stale"); return; } Transform transform = ((Component)r.GunRb).transform; Vector3 val = transform.InverseTransformPoint(rail.PlugT.position) - r.SocketPosL; float num = Vector3.Dot(val, r.AxisL); float num2 = CompleteAt(r); if (num > r.RailLen) { Vector3 val2 = transform.TransformDirection(r.AxisL); try { Rigidbody magRb = rail.MagRb; magRb.position -= val2 * (num - r.RailLen); float num3 = Vector3.Dot(rail.MagRb.velocity - r.GunRb.velocity, val2); if (num3 > 0f) { Rigidbody magRb2 = rail.MagRb; magRb2.velocity -= val2 * num3; } } catch { } num = r.RailLen; } Vector3 val3 = val - r.AxisL * num; float magnitude = ((Vector3)(ref val3)).magnitude; if (magnitude > 0.0005f) { try { float num4 = Mathf.Min(magnitude, 0.06f * Time.deltaTime); ConfigurableJoint joint = rail.Joint; ((Joint)joint).connectedAnchor = ((Joint)joint).connectedAnchor - val3 / magnitude * num4; } catch { } } if (Mathf.Abs(num - rail.LastT) > 0.006f && Time.unscaledTime >= rail.NextBuzz) { rail.NextBuzz = Time.unscaledTime + 0.09f; Buzz(rail.Plug, BuzzKind.Slide); } rail.LastT = num; if (!rail.Armed && (num < num2 - 0.015f || Time.unscaledTime - rail.LatchTime > 0.35f)) { rail.Armed = true; } if (Time.unscaledTime >= rail.NextTelem) { rail.NextTelem = Time.unscaledTime + 0.4f; PurgeStrayJoints(rail, rail.MagRb); SetPairIgnores(rail, ignore: true); try { if (rail.HandRbs != null) { foreach (Rigidbody handRb in rail.HandRbs) { try { if ((Object)(object)handRb != (Object)null) { handRb.detectCollisions = false; } } catch { } } } } catch { } if (_trace.Value) { try { bool value = IsHeld(rail.Plug); int value2 = 0; try { value2 = ((Component)rail.MagRb).GetComponents()?.Length ?? 0; } catch { } Log.Msg($"[trace] RAIL t={num:F3}/{r.RailLen:F3} held={value} joints={value2} armed={rail.Armed}"); } catch { } } } if (rail.Armed && num >= num2) { AmmoPlug plug = rail.Plug; AmmoSocket socket = r.Socket; ReleaseRail(r, "top", 0.4f); r.PlugCaptured = true; SetTrigger(r, on: true, EngagedRadius(r)); try { ((AlignPlug)plug).ForceInSocket((Socket)(object)socket); } catch { } Buzz(plug, BuzzKind.Insert); } else if (num < -0.040000003f) { AmmoPlug plug2 = rail.Plug; ReleaseRail(r, "pulled off"); r.NoRelatchUntil = Time.unscaledTime + 0.6f; Buzz(plug2, BuzzKind.Catch); } } private static void ReleaseRail(Rec r, string why, float deferRestore = 0f) { Rail rail = r.Rail; r.Rail = null; if (rail == null) { return; } try { if ((Object)(object)rail.Joint != (Object)null) { Object.Destroy((Object)(object)rail.Joint); } } catch { } if (deferRestore > 0f) { _dyingRails.Add(new KeyValuePair(rail, Time.unscaledTime + deferRestore)); } else { SetPairIgnores(rail, ignore: false); RestoreHandBodies(rail); } if (!_trace.Value) { return; } try { Log.Msg($"[trace] RAIL-END gun='{GunName((Component)(object)r.Socket)}' ({why})"); } catch { } } private static void TryRelatchEjected(Rec r) { //IL_0087: Unknown result type (might be due to invalid IL or missing references) //IL_008c: Unknown result type (might be due to invalid IL or missing references) //IL_0092: Unknown result type (might be due to invalid IL or missing references) //IL_0097: Unknown result type (might be due to invalid IL or missing references) //IL_009d: Unknown result type (might be due to invalid IL or missing references) //IL_00c2: Unknown result type (might be due to invalid IL or missing references) //IL_00c8: Unknown result type (might be due to invalid IL or missing references) //IL_00cd: Unknown result type (might be due to invalid IL or missing references) //IL_00d8: Unknown result type (might be due to invalid IL or missing references) try { if (!r.HasSeat || r.Rail != null || (Object)(object)r.LastMag == (Object)null || (Object)(object)r.GunRb == (Object)null) { return; } Magazine lastMag = r.LastMag; if (!((Component)lastMag).gameObject.activeInHierarchy || lastMag.isMagazineInserted) { return; } AmmoPlug magazinePlug = lastMag.magazinePlug; if (!((Object)(object)magazinePlug == (Object)null) && !RailedAnywhere(magazinePlug)) { Transform transform = ((Component)r.GunRb).transform; float num = Vector3.Dot(transform.InverseTransformPoint(((Component)magazinePlug).transform.position) - r.SocketPosL, r.AxisL); if (!(num < -0.045f) && !(num > r.RailLen + 0.03f) && !(Quaternion.Angle(transform.rotation * r.SeatMagRotL, ((Component)lastMag).transform.rotation) > 35f)) { Latch(r, magazinePlug); } } } catch { } } private static void RecordSeat(AmmoSocket socket, AmmoPlug plug) { //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_008e: Unknown result type (might be due to invalid IL or missing references) //IL_0093: Unknown result type (might be due to invalid IL or missing references) //IL_009f: Unknown result type (might be due to invalid IL or missing references) //IL_00a4: 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_00ab: 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_00b2: Unknown result type (might be due to invalid IL or missing references) //IL_00dc: Unknown result type (might be due to invalid IL or missing references) //IL_00de: Unknown result type (might be due to invalid IL or missing references) //IL_00e4: Unknown result type (might be due to invalid IL or missing references) //IL_00e8: Unknown result type (might be due to invalid IL or missing references) //IL_00ed: Unknown result type (might be due to invalid IL or missing references) //IL_0102: Unknown result type (might be due to invalid IL or missing references) //IL_0107: Unknown result type (might be due to invalid IL or missing references) //IL_010c: Unknown result type (might be due to invalid IL or missing references) //IL_0113: Unknown result type (might be due to invalid IL or missing references) //IL_0118: Unknown result type (might be due to invalid IL or missing references) //IL_0123: Unknown result type (might be due to invalid IL or missing references) //IL_0128: Unknown result type (might be due to invalid IL or missing references) //IL_012d: Unknown result type (might be due to invalid IL or missing references) //IL_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_01df: Unknown result type (might be due to invalid IL or missing references) //IL_01e4: Unknown result type (might be due to invalid IL or missing references) //IL_01f7: Unknown result type (might be due to invalid IL or missing references) //IL_01fc: Unknown result type (might be due to invalid IL or missing references) //IL_0203: Unknown result type (might be due to invalid IL or missing references) //IL_0208: Unknown result type (might be due to invalid IL or missing references) //IL_017e: Unknown result type (might be due to invalid IL or missing references) //IL_0184: Unknown result type (might be due to invalid IL or missing references) //IL_0189: Unknown result type (might be due to invalid IL or missing references) //IL_018e: Unknown result type (might be due to invalid IL or missing references) //IL_01a0: 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_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) try { if (!_known.TryGetValue(((Object)socket).GetInstanceID(), out var value)) { try { Scene scene = ((Component)socket).gameObject.scene; if (!((Scene)(ref scene)).IsValid()) { return; } } catch { return; } Register(socket); if (!_known.TryGetValue(((Object)socket).GetInstanceID(), out value)) { return; } } Magazine magazine = plug.magazine; if ((Object)(object)magazine == (Object)null) { return; } Rigidbody componentInParent = ((Component)socket).GetComponentInParent(); if ((Object)(object)componentInParent == (Object)null) { return; } Transform transform = ((Component)componentInParent).transform; Vector3 val = transform.InverseTransformPoint(((Component)plug).transform.position); Vector3 val2 = transform.InverseTransformPoint(((Component)socket).transform.position); Vector3 val3 = val - val2; float magnitude = ((Vector3)(ref val3)).magnitude; if (magnitude < 0.03f || magnitude > 0.4f) { return; } value.GunRb = componentInParent; value.SocketPosL = val2; value.AxisL = val3 / magnitude; value.RailLen = magnitude; value.SeatMagPosL = transform.InverseTransformPoint(((Component)magazine).transform.position); value.SeatMagRotL = Quaternion.Inverse(transform.rotation) * ((Component)magazine).transform.rotation; value.LastMag = magazine; value.HasSeat = true; string text = GunModelKey((Component)(object)socket); if (text == null) { return; } bool flag = true; int num; if (_seatLib.TryGetValue(text, out var value2)) { if (!(Mathf.Abs(value2.RailLen - value.RailLen) > 0.005f)) { Vector3 val4 = value2.SocketPosL - value.SocketPosL; if (!(((Vector3)(ref val4)).sqrMagnitude > 2.5E-05f)) { val4 = value2.SeatMagPosL - value.SeatMagPosL; num = ((((Vector3)(ref val4)).sqrMagnitude > 2.5E-05f) ? 1 : 0); goto IL_01c3; } } num = 1; goto IL_01c3; } goto IL_01c5; IL_01c3: flag = (byte)num != 0; goto IL_01c5; IL_01c5: _seatLib[text] = new SeatData { SocketPosL = value.SocketPosL, AxisL = value.AxisL, RailLen = value.RailLen, SeatMagPosL = value.SeatMagPosL, SeatMagRotL = value.SeatMagRotL }; if (flag) { SaveSeatLib(); } } catch { } } private static void InstallTracer() { bool num = TryPatch(typeof(AmmoSocket), "OnPlugEnter", "TrPlugEnter"); bool flag = TryPatch(typeof(AmmoSocket), "OnPlugExit", "TrPlugExit"); _patchesOk = num && flag; if (!_patchesOk) { Log.Warning("capture hooks failed — Mag Slide trigger crush disabled (vanilla capture)."); } TryPatch(typeof(AmmoSocket), "OnPlugLocked", "TrPlugLocked"); TryPatch(typeof(AlignPlug), "InsertPlug", "TrInsertPlug"); TryPatch(typeof(AmmoPlug), "OnPlugInsertComplete", "TrSeated"); TryPatch(typeof(AmmoSocket), "EjectMagazine", "TrEject"); } private static bool TryPatch(Type type, string method, string postfixName) { //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Expected O, but got Unknown try { MethodInfo methodInfo = AccessTools.Method(type, method, (Type[])null, (Type[])null); HarmonyMethod val = new HarmonyMethod(typeof(Mod), postfixName, (Type[])null); ((MelonBase)Melon.Instance).HarmonyInstance.Patch((MethodBase)methodInfo, (HarmonyMethod)null, val, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); return true; } catch (Exception ex) { Log.Warning($"hooks: couldn't patch {type.Name}.{method}: {ex.Message}"); return false; } } private static string GunName(Component c) { try { return ((Object)c.transform.root).name; } catch { return "?"; } } private static float Dist(Component a, Component b) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Unknown result type (might be due to invalid IL or missing references) try { return Vector3.Distance(a.transform.position, b.transform.position); } catch { return -1f; } } public static void TrPlugEnter(AmmoSocket __instance, Plug plug) { float value = -1f; try { if (_known.TryGetValue(((Object)__instance).GetInstanceID(), out var value2) && (Object)(object)value2.Trigger != (Object)null && value2.Rail == null) { try { value = value2.Trigger.radius; } catch { } value2.PlugCaptured = true; if (_magSlide.Value) { try { float num = EngagedRadius(value2); value2.Trigger.radius = num; value2.AppliedRadius = num; } catch { } } } } catch { } if (!_trace.Value) { return; } try { Log.Msg($"[trace] CAPTURE gun='{GunName((Component)(object)__instance)}' d={Dist((Component)(object)__instance, (Component)(object)plug):F3} infl={((Socket)__instance).influenceRadius:F3} end={((Socket)__instance).endDistance:F3} trigR={value:F3}"); } catch { } } public static void TrPlugExit(AmmoSocket __instance, Plug plug) { try { if (_known.TryGetValue(((Object)__instance).GetInstanceID(), out var value)) { value.PlugCaptured = false; } } catch { } if (!_trace.Value) { return; } try { Log.Msg($"[trace] EXIT gun='{GunName((Component)(object)__instance)}' d={Dist((Component)(object)__instance, (Component)(object)plug):F3}"); } catch { } } public static void TrPlugLocked(AmmoSocket __instance, Plug plug) { //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Unknown result type (might be due to invalid IL or missing references) if (!_trace.Value) { return; } try { string value = "none"; try { if ((Object)(object)((Socket)__instance).endTransform != (Object)null) { value = Vector3.Distance(((Socket)__instance).endTransform.position, ((Component)plug).transform.position).ToString("F3"); } } catch { } Log.Msg($"[trace] LOCKED gun='{GunName((Component)(object)__instance)}' d={Dist((Component)(object)__instance, (Component)(object)plug):F3} dToEndT={value} end={((Socket)__instance).endDistance:F3}"); } catch { } } public static void TrInsertPlug(AlignPlug __instance, Socket socket) { if (!_trace.Value) { return; } try { Log.Msg($"[trace] ENGAGE gun='{GunName((Component)(object)socket)}' d={Dist((Component)(object)socket, (Component)(object)__instance):F3}"); } catch { } } public static void TrSeated(AmmoPlug __instance) { Socket val = null; try { val = ((AlignPlug)__instance)._lastSocket; } catch { } try { AmmoSocket val2 = (((Object)(object)val == (Object)null) ? null : ((Il2CppObjectBase)val).TryCast()); if ((Object)(object)val2 != (Object)null) { RecordSeat(val2, __instance); } } catch { } if (!_trace.Value) { return; } try { if ((Object)(object)val != (Object)null) { Log.Msg($"[trace] SEATED gun='{GunName((Component)(object)val)}' d={Dist((Component)(object)val, (Component)(object)__instance):F3} end={val.endDistance:F3}"); } else { Log.Msg("[trace] SEATED (no socket ref)"); } } catch { } } public static void TrEject(AmmoSocket __instance) { if (!_trace.Value) { return; } try { Log.Msg("[trace] EJECT gun='" + GunName((Component)(object)__instance) + "'"); } catch { } } internal static void Notify(string message, NotificationType type) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_002c: 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_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Expected O, but got Unknown try { Notifier.Send(new Notification { Title = NotificationText.op_Implicit("MagSlide"), Message = NotificationText.op_Implicit(message), PopupLength = 2.5f, Type = type }); } catch { } } } }