public virtual async Task<bool> Gather(GatherCollectableTag tag)
        {
            while (tag.Node.CanGather && GatheringManager.SwingsRemaining > 0 && Behaviors.ShouldContinue)
            {
                await Wait();

                if (GatheringManager.GatheringCombo == 4 && GatheringManager.SwingsRemaining > 0)
                {
                    await tag.Cast(Ability.IncreaseGatherChanceQuality100);

                    await Wait();
                }

                if (!await tag.ResolveGatherItem())
                {
                    return false;
                }

                var swingsRemaining = GatheringManager.SwingsRemaining - 1;

                if (!tag.GatherItem.TryGatherItem())
                {
                    return false;
                }

                var ticks = 0;
                while (swingsRemaining != GatheringManager.SwingsRemaining && ticks < 60 && Behaviors.ShouldContinue)
                {
                    await Coroutine.Yield();
                    ticks++;
                }
            }

            return true;
        }