public override void Tick() { base.Tick(); if (this.count++ > 1) { this.count = 0; List <Lord> lords = base.Map.lordManager.lords; IntVec3 position = base.Position; checked { for (int i = 0; i < lords.Count; i++) { Lord lord = lords[i]; if (lord.LordJob is LordJob_TradeWithColony) { FieldInfo field = lord.LordJob.GetType().GetField("chillSpot", BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic); IntVec3 intVec = (IntVec3)field.GetValue(lord.LordJob); if (intVec.x != position.x || intVec.y != position.y || intVec.z != position.z) { field.SetValue(lord.LordJob, position); } LordToil curLordToil = lord.CurLordToil; if (curLordToil is LordToil_Travel) { LordToil_Travel lordToil_Travel = (LordToil_Travel)curLordToil; if (lordToil_Travel.FlagLoc != position) { lordToil_Travel.SetDestination(position); lordToil_Travel.UpdateAllDuties(); } } else if (curLordToil is LordToil_DefendPoint) { LordToil_DefendPoint lordToil_DefendPoint = (LordToil_DefendPoint)curLordToil; if (lordToil_DefendPoint.FlagLoc != position) { lordToil_DefendPoint.SetDefendPoint(position); lordToil_DefendPoint.UpdateAllDuties(); } } foreach (Pawn current in lord.ownedPawns) { if (current.RaceProps.Animal) { if (current.needs != null && current.needs.food != null && current.needs.food.CurLevel <= current.needs.food.MaxLevel) { current.needs.food.CurLevel = current.needs.food.MaxLevel; } } } } } } } }
public override void DoAction(Transition trans) { Lord lord = trans.target.lord; IntVec3 targetDestination = (lord.LordJob as LordJob_MiningCoBase).targetDestination; bool needNewExitSpot = false; bool isEdgeCell = targetDestination.InBounds(lord.Map) && ((targetDestination.x == 0) || (targetDestination.x == lord.Map.Size.x - 1) || (targetDestination.z == 0) || (targetDestination.z == lord.Map.Size.z - 1)); if (isEdgeCell == false) { needNewExitSpot = true; } else { foreach (Pawn pawn in lord.ownedPawns) { if (pawn.CanReach(targetDestination, PathEndMode.OnCell, Danger.Some) == false) { needNewExitSpot = true; break; } } } IntVec3 newTargetDestination = targetDestination; if (needNewExitSpot) { if (Expedition.TryFindRandomExitSpot(lord.Map, lord.ownedPawns.RandomElement().Position, out newTargetDestination) == false) { newTargetDestination = CellFinder.RandomEdgeCell(lord.Map); } } (lord.LordJob as LordJob_MiningCoBase).targetDestination = newTargetDestination; // Refresh lord toil destination anyway as it may have been initialized with an invalid vector (case of a fallback). LordToil_Travel travelToil = trans.target as LordToil_Travel; if (travelToil != null) { travelToil.SetDestination(newTargetDestination); } LordToil_EscortDownedPawn escortToil = trans.target as LordToil_EscortDownedPawn; if (escortToil != null) { escortToil.SetDestination(newTargetDestination); } }
static bool Prefix(Transition trans) { LordToil_Travel lordToil_Travel = (LordToil_Travel)trans.target; if (!lordToil_Travel.HasDestination()) { Pawn pawn = lordToil_Travel.lord.ownedPawns.RandomElement(); if (!CellFinderExtended.TryFindRandomPawnExitCell(pawn, out IntVec3 result)) { RCellFinderExtended.TryFindRandomPawnEntryCell(out result, pawn.Map, pawn.kindDef, 0f); } lordToil_Travel.SetDestination(result); } return(false); }