i have this weapon pickup script:
using UnityEngine;
using MarsFPSKit;
using MarsFPSKit.Weapons;
using Mirror;

public class Kit_WeaponPickup : MonoBehaviour
{
    [Tooltip("Weapon ID this pickup grants")]
    public int weaponID = 1;

    [Tooltip("Assign the respawn manager here or it will try to find it in parent at runtime.")]
    [SerializeField]
    private Kit_WeaponPickupRespawnManager respawnManager;

    /// <summary>
    /// Public setter to assign respawnManager at runtime (important for prefabs)
    /// </summary>
    public void SetRespawnManager(Kit_WeaponPickupRespawnManager manager)
    {
        respawnManager = manager;
    }

    private void Start()
    {
        if (respawnManager == null)
        {
            respawnManager = GetComponentInParent<Kit_WeaponPickupRespawnManager>();
            if (respawnManager == null)
            {
                Debug.LogWarning("[Kit_WeaponPickup] No Kit_WeaponPickupRespawnManager assigned or found in parent!");
            }
            else
            {
                Debug.Log("[Kit_WeaponPickup] RespawnManager found via parent.");
            }
        }
        else
        {
            Debug.Log("[Kit_WeaponPickup] RespawnManager assigned manually.");
        }
    }

    private void OnTriggerEnter(Collider other)
    {
        Debug.Log($"[Kit_WeaponPickup] OnTriggerEnter called with: {other.gameObject.name}, tag: {other.tag}");

        Kit_PlayerBehaviour player = other.GetComponentInParent<Kit_PlayerBehaviour>();

        if (player == null)
        {
            Debug.Log("[Kit_WeaponPickup] No Kit_PlayerBehaviour found on collider or parents, ignoring.");
            return;
        }

        Debug.Log($"[Kit_WeaponPickup] Player detected: netId={player.netId}, collider={other.gameObject.name}");

        var weaponManager = player.weaponManager as Kit_ModernWeaponManager;
        if (weaponManager == null)
        {
            Debug.LogWarning("[Kit_WeaponPickup] Player's weaponManager is not Kit_ModernWeaponManager.");
            return;
        }

        int slot = weaponManager.HasWeapon(player, weaponID);
        if (slot != -1)
        {
            Debug.Log($"[Kit_WeaponPickup] Player already owns weapon at slot {slot}, ignoring pickup.");
            return;
        }

        Debug.Log("[Kit_WeaponPickup] Player does NOT have weapon, attempting to give...");

        bool success = TryGiveWeapon(weaponManager, player, weaponID);
        if (success)
        {
            Debug.Log("[Kit_WeaponPickup] Successfully gave weapon to player.");

            if (respawnManager != null)
            {
                Debug.Log("[Kit_WeaponPickup] Notifying respawn manager pickup taken.");
                respawnManager.PickupTaken();
            }
            else
            {
                Debug.LogWarning("[Kit_WeaponPickup] Respawn manager reference missing; cannot notify pickup.");
            }
        }
        else
        {
            Debug.LogWarning("[Kit_WeaponPickup] Failed to give weapon to player.");
        }
    }

    private bool TryGiveWeapon(Kit_ModernWeaponManager wpnManager, Kit_PlayerBehaviour player, int weaponID)
    {
        if (player == null || wpnManager == null)
        {
            Debug.LogWarning("[Kit_WeaponPickup] Invalid player or weapon manager in TryGiveWeapon.");
            return false;
        }

        var runtimeData = player.weaponManagerNetworkData as Kit_ModernWeaponManagerNetworkData;
        if (runtimeData == null)
        {
            Debug.LogWarning("[Kit_WeaponPickup] Player's weaponManagerNetworkData is null or wrong type.");
            return false;
        }

        int maxSlots = runtimeData.weaponsInUseDataObjects != null ? runtimeData.weaponsInUseDataObjects.Length : 0;
        if (maxSlots == 0)
        {
            Debug.LogWarning("[Kit_WeaponPickup] weaponsInUseDataObjects is not initialized.");
            return false;
        }

        int slot = -1;

        // Find a free or unselectable weapon slot first
        for (int i = 0; i < maxSlots; i++)
        {
            var weaponData = runtimeData.weaponsInUseDataObjects[i];
            if (weaponData == null || weaponData.behaviour == null || weaponData.behaviour.GetType() == typeof(Kit_WeaponUnselectable))
            {
                slot = i;
                Debug.Log($"[Kit_WeaponPickup] Found free/unselectable weapon slot: {slot}");
                break;
            }
        }

        // If no free slot found, replace the currently equipped weapon or slot 0 fallback
        if (slot == -1)
        {
            slot = runtimeData.desiredWeapon;
            if (slot < 0 || slot >= maxSlots)
            {
                slot = 0; // Fallback to first slot if desired weapon invalid
            }
            Debug.LogWarning($"[Kit_WeaponPickup] No free weapon slot found, replacing weapon in slot {slot}");
        }

        try
        {
            wpnManager.NetworkReplaceWeapon(player, slot, weaponID, 0, 0, new int[0]);
            Debug.Log($"[Kit_WeaponPickup] Replaced weapon in slot {slot} with weaponID {weaponID}");

            runtimeData.desiredWeapon = slot;
            runtimeData.isDesiredWeaponLocked = false;
            runtimeData.quickUseInProgress = false;

            Debug.Log($"[Kit_WeaponPickup] Requested switch to weapon slot {slot}");

            return true;
        }
        catch (System.Exception e)
        {
            Debug.LogError("[Kit_WeaponPickup] Exception during NetworkReplaceWeapon: " + e);
            return false;
        }
    }
}

but when it respawns once, it cant be picked up anymore. I want it like in quake 3.

Adjust it and make it compatible with mmfpse.
Which mmfpse scripts do you need to deliver 100% bulletproof code ?