public IEnumerable <YieldResult> New_TendToFields()
        {
            Furniture  furniture  = InteractionTarget.GetPrimaryHolder <Furniture>();
            SoilModule soilModule = furniture.GetModule <SoilModule>();

            foreach (var interaction in soilModule.GetInteractions(human, InteractionInfo.issuedByAI, false))
            {
                if (interaction.interaction == Interaction.RemoveInfestedPlants ||
                    interaction.interaction == Interaction.RemovePlant ||
                    interaction.interaction == Specialization.TendToFieldsInteraction)
                {
                    continue;
                }

                if (interaction.interaction == Interaction.WaterPlant)
                {
                    if (!soilModule.GetSeasons().Contains(SeasonManager.GetCurrentSeason()))
                    {
                        continue;
                    }

                    //InteractionRestrictionCanTakeResourceNearby cheat.  we don't check the distance
                    if (!WorldScripts.Instance.furnitureFactory.GetModules <InventoryReplenishmentModule>().Any(x => x.GetResource() == Resource.Water))
                    {
                        continue;
                    }

                    //InteractionRestrictionEquipmentEffect cheat.  we don't check the distance
                    if (!human.equipmentSet.GetEffects().Any(x => x.first == EquipmentEffect.WateringPlants))
                    {
                        continue;
                    }
                }
                else if (!WorkInteractionControllerPatch.CheckInteraction(InteractionTarget, interaction, human))
                {
                    continue;
                }

                subTask = new YieldMicroInteraction(new InteractionInfo(
                                                        interaction.interaction, InteractionTarget, interaction.restrictions, InteractionInfo.issuedByAI, InteractionInfo.priority, isContinuationOrSubtask: true),
                                                    human);

                while (subTask != null)   // WHILEPROTECTED
                {
                    subTask = subTask.Handle();
                    yield return(YieldResult.WaitFrame);
                }
                StopCurrentSubtask();
            }

            yield return(YieldResult.Completed);
        }
        public YieldMicroInteraction New_Handle()
        {
            YieldResult           result;
            YieldMicroInteraction resultHandle = y.Handle(out result) as YieldMicroInteraction;

            if (result == YieldResult.Failed && this.Interaction == Interaction.Bury &&
                this.InteractionInfo.restrictions != null &&
                this.InteractionInfo.restrictions.OfType <InteractionRestrictionFaction>().Any())
            {
                AbsoluteProfessionPrioritiesMod.Instance.buryColonistFailCooldown = 5;
            }

            return(resultHandle);
        }
        public IEnumerable <YieldResult> New_WaterPlantCustom()
        {
            if (human.inventory.GetCount(Resource.Water) == 0)
            {
                List <InteractionRestriction> restrictions = new List <InteractionRestriction>()
                {
                    new InteractionRestrictionResource(Resource.Water)
                };
                Interactable well = human.SearchForInteractableWithInteraction(Interaction.TakeIntoInventory, -1f, restrictions);

                subTask = new YieldMicroInteraction(new InteractionInfo(Interaction.TakeIntoInventory, well, restrictions, InteractionInfo.issuedByAI, InteractionInfo.priority, false, false, true), human);
                while (subTask != null)   // WHILEPROTECTED
                {
                    subTask = subTask.Handle();
                    yield return(YieldResult.WaitFrame);
                }
                StopCurrentSubtask();
                if (human.inventory.GetCount(Resource.Water) == 0)
                {
                    yield return(YieldResult.Failed);
                }
            }

            foreach (var x in Walk(InteractionTarget, 0.1f))
            {
                yield return(x);
            }
            TurnToTransform();
            yield return(LockInteraction());

            human.SetAnimationParameter("isWatering", true);
            foreach (var x in Wait(5 * human.GetWorkTimeFactor()))
            {
                yield return(x);
            }
            yield return(Interact());

            human.inventory.Remove(Resource.Water, 1);
            yield return(YieldResult.Completed);
        }