public override void UseGrapple(Player player, ref int type)
        {
            var config   = LockedAbilitiesConfig.Instance;
            int chainAmt = config.Get <int>(nameof(LockedAbilitiesConfig.GrappleRequiresChainAmount));

            if (chainAmt > 0)
            {
                int idx = ItemFinderLibraries.FindIndexOfFirstOfItemInCollection(
                    player.inventory,
                    new HashSet <int> {
                    ItemID.Chain
                }
                    );

                if (idx == -1)
                {
                    Main.NewText("No chains available for grappling.", Color.Yellow);
                    return;
                }

                PlayerItemLibraries.RemoveInventoryItemQuantity(
                    player,
                    ItemID.Chain,
                    chainAmt
                    );
            }
        }
        /// <summary>
        /// Counts the total of a given set of items owned by a given player.
        /// </summary>
        /// <param name="player"></param>
        /// <param name="itemTypes"></param>
        /// <param name="includeBanks"></param>
        /// <returns></returns>
        public static int CountTotalOfEach(Player player, ISet <int> itemTypes, bool includeBanks)
        {
            int total = ItemFinderLibraries.CountTotalOfEach(player.inventory, itemTypes);

            if (includeBanks)
            {
                total += ItemFinderLibraries.CountTotalOfEach(player.bank.item, itemTypes);
                total += ItemFinderLibraries.CountTotalOfEach(player.bank2.item, itemTypes);
                total += ItemFinderLibraries.CountTotalOfEach(player.bank3.item, itemTypes);
            }

            return(total);
        }
        public override bool?CanUseGrapple(int projType, Player player)
        {
            var config = LockedAbilitiesConfig.Instance;

            if (config.Get <int>(nameof(LockedAbilitiesConfig.GrappleRequiresChainAmount)) > 0)
            {
                int idx = ItemFinderLibraries.FindIndexOfFirstOfItemInCollection(
                    player.inventory,
                    new HashSet <int> {
                    ItemID.Chain
                }
                    );

                if (idx == -1)
                {
                    return(false);
                }
            }

            if (!config.Get <bool>(nameof(config.GrappleHarnessEnabled)))
            {
                return(null);
            }

            int grappleHarnessType = ModContent.ItemType <GrappleHarnessItem>();
            int utilBeltType       = ModContent.ItemType <UtilitarianBeltItem>();
            int firstAccSlot       = PlayerItemLibraries.VanillaAccessorySlotFirst;
            int lastAccSlot        = PlayerItemLibraries.GetFirstVanitySlot(player);

            for (int i = firstAccSlot; i < lastAccSlot; i++)
            {
                Item item = player.armor[i];
                if (item?.active != true || (item.type != grappleHarnessType && item.type != utilBeltType))
                {
                    continue;
                }

                return(true);
            }

            return(false);
        }
        /// <summary>
        /// Finds first of any of a set of item types currently in the player's possession.
        /// </summary>
        /// <param name="player"></param>
        /// <param name="itemTypes"></param>
        /// <param name="includeBanks"></param>
        /// <returns></returns>
        public static Item FindFirstOfPossessedItemFor(Player player, ISet <int> itemTypes, bool includeBanks)
        {
            int found = ItemFinderLibraries.FindIndexOfFirstOfItemInCollection(player.inventory, itemTypes);

            if (found != -1)
            {
                return(player.inventory[found]);
            }

            found = ItemFinderLibraries.FindIndexOfFirstOfItemInCollection(player.armor, itemTypes);
            if (found != -1)
            {
                return(player.armor[found]);
            }

            found = ItemFinderLibraries.FindIndexOfFirstOfItemInCollection(player.miscEquips, itemTypes);
            if (found != -1)
            {
                return(player.miscEquips[found]);
            }

            if (includeBanks)
            {
                found = ItemFinderLibraries.FindIndexOfFirstOfItemInCollection(player.bank.item, itemTypes);
                if (found != -1)
                {
                    return(player.bank.item[found]);
                }
                found = ItemFinderLibraries.FindIndexOfFirstOfItemInCollection(player.bank2.item, itemTypes);
                if (found != -1)
                {
                    return(player.bank2.item[found]);
                }
                found = ItemFinderLibraries.FindIndexOfFirstOfItemInCollection(player.bank3.item, itemTypes);
                if (found != -1)
                {
                    return(player.bank3.item[found]);
                }
            }

            return(null);
        }