protected override IEnumerable <Toil> MakeNewToils() { yield return(Toils_Goto.GotoCell(TargetIndex.B, PathEndMode.OnCell)); pawn.Rotation = Rot4.Random; Toil waiting = Toils_General.Wait(job.def.joyDuration); waiting.socialMode = RandomSocialMode.Quiet; waiting.FailOn(() => !MeditationUtility.CanMeditateNow(pawn) || !MeditationUtility.SafeEnvironmentalConditions(pawn, TargetB.Cell, base.Map)); waiting.tickAction = () => { pawn.GainComfortFromCellIfPossible(); if (pawn.needs.joy != null) { JoyUtility.JoyTickCheckEnd(pawn, JoyTickFullJoyAction.None, 0.2f); } waiting.handlingFacing = true; if (pawn.IsHashIntervalTick(400)) { MakeThinkingBubble(pawn, TargetA.Pawn); } }; yield return(waiting); yield break; }
public override Job NonScanJob(Pawn pawn) { if (MeditationUtility.CanMeditateNow(pawn)) { return(GetAnimaMeditationJob(pawn)); } return(null); }
public override Job NonScanJob(Pawn pawn) { bool shouldMeditate = pawn.HasPsylink && pawn.psychicEntropy.CurrentPsyfocus < pawn.psychicEntropy.TargetPsyfocus; if (shouldMeditate && MeditationUtility.CanMeditateNow(pawn)) { return(MeditationUtility.GetMeditationJob(pawn)); } return(null); }
public static MeditationSpotAndFocus FindAnimaMeditationSpot(Pawn pawn) { LocalTargetInfo spot = LocalTargetInfo.Invalid; LocalTargetInfo focus = LocalTargetInfo.Invalid; if (!ModLister.RoyaltyInstalled) { Log.ErrorOnce("Psyfocus meditation is a Royalty-specific game system. If you want to use this code please check ModLister.RoyaltyInstalled before calling it.", 657324); return(new MeditationSpotAndFocus(spot, focus)); } Thing animaTree = pawn.Map.listerThings.ThingsOfDef(DefDatabase <ThingDef> .GetNamed("Plant_TreeAnima")).FirstOrDefault(); if (animaTree != null) { CompMeditationFocus compMeditationFocus = animaTree.TryGetComp <CompMeditationFocus>(); if (compMeditationFocus != null && compMeditationFocus.CanPawnUse(pawn)) { if (pawn.HasPsylink && animaTree.GetStatValueForPawn(StatDefOf.MeditationFocusStrength, pawn) > float.Epsilon) { spot = MeditationUtility.MeditationSpotForFocus(animaTree, pawn); focus = animaTree; return(new MeditationSpotAndFocus(spot, focus)); } else { Area area = pawn.playerSettings.AreaRestriction; IntVec3 c2 = RCellFinder.RandomWanderDestFor( pawn, animaTree.Position, 4, delegate(Pawn p, IntVec3 c, IntVec3 r) { return(c.Standable(p.Map) && c.GetDoor(p.Map) == null && (area == null || area[c])); }, pawn.NormalMaxDanger() ); if (c2.IsValid && (area == null || area[c2])) { return(new MeditationSpotAndFocus(c2, null)); } } } } return(new MeditationSpotAndFocus(spot, focus)); }
protected override string GetTextFor(Pawn pawn) { return(MeditationUtility.FocusTypesAvailableForPawnString(pawn)); }