public static bool ToggleSafetyPrefix(Handgun __instance, ref int ___m_fireSelectorMode,
                                              ref bool ___m_isSafetyEngaged, ref bool ___m_isHammerCocked, ref bool __result)
        {
            if (!__instance.HasSafety)
            {
                __result = false;
                return(false);
            }

            if (__instance.DoesSafetyRequireSlideForward && __instance.Slide.CurPos != HandgunSlide.SlidePos.Forward)
            {
                __result = false;
                return(false);
            }

            if (__instance.Slide.CurPos == HandgunSlide.SlidePos.Forward ||
                __instance.Slide.CurPos >= HandgunSlide.SlidePos.Locked)
            {
                if (___m_isSafetyEngaged)
                {
                    __instance.PlayAudioEvent(FirearmAudioEventType.Safety);
                    ___m_isSafetyEngaged = false;
                    if (__instance.DoesSafetyDisengageCockHammer)
                    {
                        __instance.CockHammer(true);
                    }
                    ___m_fireSelectorMode = 0;
                }
                else if (__instance.FireSelectorModes[___m_fireSelectorMode].ModeType !=
                         Handgun.FireSelectorModeType.FullAuto)
                {
                    __instance.PlayAudioEvent(FirearmAudioEventType.Safety, 0.7f);
                    ___m_fireSelectorMode = (___m_fireSelectorMode + 1) % __instance.FireSelectorModes.Length;
                }
                else
                {
                    ___m_fireSelectorMode = 0;
                    var flag = !(__instance.DoesSafetyRequireCockedHammer && !___m_isHammerCocked);
                    if (flag)
                    {
                        ___m_isSafetyEngaged = true;
                        if (__instance.DoesSafetyEngagingDecock)
                        {
                            __instance.DeCockHammer(true, true);
                        }
                        __instance.PlayAudioEvent(FirearmAudioEventType.Safety);
                    }
                }

                UpdateSafetyPos(__instance);
                __result = true;
                return(false);
            }

            __result = false;
            return(false);
        }