private bool CheckCurrentToilEndOrFail() { CaravanToil curToil = this.CurToil; if (this.globalFailConditions != null) { for (int i = 0; i < this.globalFailConditions.Count; i++) { JobCondition jobCondition = this.globalFailConditions[i](); if (jobCondition != JobCondition.Ongoing) { this.EndJobWith(jobCondition); return(true); } } } if (curToil != null && curToil.endConditions != null) { for (int j = 0; j < curToil.endConditions.Count; j++) { JobCondition jobCondition2 = curToil.endConditions[j](); if (jobCondition2 != JobCondition.Ongoing) { this.EndJobWith(jobCondition2); return(true); } } } return(false); }
public static CaravanToil GotoObject(TargetIndex ind, CaravanArrivalAction arrivalAction = null) { int tileInt = -1; CaravanToil toil = new CaravanToil(); toil.initAction = delegate { //Log.Message("GoToObject1"); tileInt = CurJob(toil.actor).GetTarget(ind).WorldObject.Tile; //Log.Message("GoToObject2"); toil.actor.pather.StartPath(tileInt, arrivalAction, true); //Log.Message("GoToObject3"); }; toil.tickAction = delegate { if (tileInt < 0) { tileInt = CurJob(toil.actor).GetTarget(ind).WorldObject.Tile; } if (toil.actor.Tile == tileInt) { //Log.Message("GoToObject4a"); CurTracker(toil.actor).curDriver.Notify_PatherArrived(); } }; toil.defaultCompleteMode = ToilCompleteMode.PatherArrival; //toil.FailOnDespawnedOrNull(ind); return(toil); }
public static CaravanToil GotoTile(TargetIndex ind, CaravanArrivalAction arrivalAction = null) { CaravanToil toil = new CaravanToil(); toil.initAction = delegate { Caravan actor = toil.actor; actor.pather.StartPath(Find.World.GetComponent <CaravanJobGiver>().CurJob(actor).GetTarget(ind).Tile, arrivalAction); }; toil.defaultCompleteMode = ToilCompleteMode.PatherArrival; //toil.FailOnDespawnedOrNull(ind); return(toil); }
public static CaravanToil GotoTile(TargetIndex ind, CaravanArrivalAction arrivalAction = null) { var toil = new CaravanToil(); toil.initAction = () => { var actor = toil.actor; actor.pather.StartPath(CaravanJobsUtility.GetCaravanJobGiver().CurJob(actor).GetTarget(ind).Tile, arrivalAction); }; toil.defaultCompleteMode = ToilCompleteMode.PatherArrival; //toil.FailOnDespawnedOrNull(ind); return(toil); }
// Verse.AI.ToilEffects public static CaravanToil WithProgressBar(this CaravanToil CaravanToil, TargetIndex ind, Func <float> progressGetter, bool interpolateBetweenActorAndTarget = false, float offsetZ = -0.5f) { WorldObject_ProgressBar progressBar = null; CaravanToil.AddPreTickAction(delegate { if (CaravanToil.actor.Faction != Faction.OfPlayer) { return; } var curProgress = Mathf.Clamp01(progressGetter()); //Log.Message(curProgress.ToString()); //WorldProgressBarDrawer.DrawProgressBarOnGUIFor(target, curProgress); if (progressBar == null) { progressBar = (WorldObject_ProgressBar)WorldObjectMaker.MakeWorldObject( DefDatabase <WorldObjectDef> .GetNamed("WorldObject_ProgressBar")); progressBar.Tile = Find.World.GetComponent <CaravanJobGiver>().CurJob(CaravanToil.actor) .GetTarget(ind).Tile; progressBar.offset = offsetZ; Find.WorldObjects.Add(progressBar); } else { progressBar.curProgress = Mathf.Clamp01(progressGetter()); if (CaravanToil.actor == null || !CaravanToil.actor.Spawned || CaravanToil.actor.Tile != Find.World.GetComponent <CaravanJobGiver>().CurJob(CaravanToil.actor) .GetTarget(ind).Tile) { if (progressBar.Spawned) { Find.WorldObjects.Remove(progressBar); } } } }); CaravanToil.AddFinishAction(delegate { if (progressBar != null && progressBar.Spawned) { Find.WorldObjects.Remove(progressBar); progressBar = null; } }); return(CaravanToil); }
public void JumpToToil(CaravanToil to) { this.SetNextToil(to); this.ReadyForNextToil(); }
private void SetNextToil(CaravanToil to) { this.curToilIndex = this.toils.IndexOf(to) - 1; }
public void DriverTick() { try { this.ticksLeftThisToil--; this.debugTicksSpentThisToil++; if (this.CurToil == null) { //if (!this.caravan.stances.FullBodyBusy || this.CanStartNextToilInBusyStance) //{ this.ReadyForNextToil(); //} } else if (!this.CheckCurrentToilEndOrFail()) { if (this.curToilCompleteMode == ToilCompleteMode.Delay) { if (this.ticksLeftThisToil <= 0) { this.ReadyForNextToil(); return; } } else if (this.curToilCompleteMode == ToilCompleteMode.FinishedBusy) //&& !this.caravan.stances.FullBodyBusy) { this.ReadyForNextToil(); return; } if (this.wantBeginNextToil) { this.TryActuallyStartNextToil(); } else if (this.curToilCompleteMode == ToilCompleteMode.Instant && this.debugTicksSpentThisToil > 300) { Log.Error(string.Concat(new object[] { this.caravan, " had to be broken from frozen state. He was doing job ", this.CurJob, ", toilindex=", this.curToilIndex })); this.ReadyForNextToil(); } else { CaravanJob curJob = this.CurJob; if (this.CurToil.preTickActions != null) { CaravanToil curToil = this.CurToil; for (int i = 0; i < curToil.preTickActions.Count; i++) { curToil.preTickActions[i](); if (this.CurJob != curJob) { return; } if (this.CurToil != curToil || this.wantBeginNextToil) { return; } } } if (this.CurToil.tickAction != null) { this.CurToil.tickAction(); } } } } catch (Exception ex) { Find.World.GetComponent <CaravanJobGiver>().Tracker(caravan).StartErrorRecoverJob(string.Concat(new object[] { "Exception in Tick (pawn=", this.caravan, ", job=", this.CurJob, ", CurToil=", this.curToilIndex, "): ", ex })); } }