static void Prefix(Pawn_JobTracker __instance, ref ThinkResult __result) { Pawn pawn = Traverse.Create(__instance).Field("pawn").GetValue <Pawn>(); if (pawn.RaceProps.Animal && pawn.Faction != Faction.OfPlayer) { if (pawn.GetLord() != null && pawn.GetLord().CurLordToil is LordToil_DefendPoint || pawn.GetLord().CurLordToil.GetType().Name == "LordToil_DefendTraderCaravan") { Log.Message("set duty radius 4 for animal"); //pawn.mindState.duty.radius = 4f; if (__result.SourceNode is JobGiver_Wander) { JobGiver_Wander jgWander = (JobGiver_Wander)__result.SourceNode; Traverse.Create(__result.SourceNode).Field("wanderRadius").SetValue(5f); } } } }
static bool Prefix(Pawn pawn, ref Job __result, JobGiver_Wander __instance) { if (!pawn.ShouldHideFromWeather() || pawn.Position.Roofed(pawn.Map)) { return(true); } var root = FindRoofedInHomeArea(pawn); if (root != IntVec3.Invalid) { Job job = JobMaker.MakeJob(JobDefOf.GotoWander, root); job.locomotionUrgency = LocomotionUrgency.Jog; job.expiryInterval = -1; __result = job; return(false); } return(true); }
static bool Prefix(Pawn pawn, ref Job __result, JobGiver_Wander __instance) { if (pawn.Faction != Faction.OfPlayer || JoyUtility.EnjoyableOutsideNow(pawn.Map) || pawn.Position.Roofed(pawn.Map)) { return(true); } Predicate <IntVec3> cellValidator = (IntVec3 x) => pawn.Map.areaManager.Home[x] && !PawnUtility.KnownDangerAt(x, pawn.Map, pawn) && !x.GetTerrain(pawn.Map).avoidWander&& x.Standable(pawn.Map) && x.Roofed(pawn.Map); Predicate <Region> validator = delegate(Region x) { IntVec3 intVec; return(x.OverlapWith(pawn.Map.areaManager.Home) > AreaOverlap.None && !x.IsForbiddenEntirely(pawn) && x.TryFindRandomCellInRegionUnforbidden(pawn, cellValidator, out intVec)); }; Region reg; if (!CellFinder.TryFindClosestRegionWith(pawn.GetRegion(RegionType.Set_Passable), TraverseParms.For(pawn, Danger.Deadly, TraverseMode.ByPawn, false), validator, 100, out reg, RegionType.Set_Passable)) { return(true); } // IntVec3 root; if (!reg.TryFindRandomCellInRegionUnforbidden(pawn, cellValidator, out root)) { return(true); } root = RCellFinder.RandomWanderDestFor(pawn, root, 7, ((Pawn p, IntVec3 v1, IntVec3 v2) => true), PawnUtility.ResolveMaxDanger(pawn, Danger.Deadly)); Job job = JobMaker.MakeJob(JobDefOf.GotoWander, root); job.locomotionUrgency = LocomotionUrgency.Jog; job.expiryInterval = -1; __result = job; return(false); }
static void Postfix(Pawn_JobTracker __instance, ref ThinkResult __result, ref Pawn ___pawn) { if (___pawn.RaceProps.Animal && ___pawn.Faction != Faction.OfPlayer && ___pawn.Faction != null) { if (___pawn.GetLord() != null && (___pawn.GetLord().CurLordToil is LordToil_DefendPoint || ___pawn.GetLord().CurLordToil.GetType().Name == "LordToil_DefendTraderCaravan")) { if (__result.SourceNode is JobGiver_Wander) { JobGiver_Wander jgWander = (JobGiver_Wander)__result.SourceNode; Traverse.Create(__result.SourceNode).Field("wanderRadius").SetValue(5f); } } } if (___pawn.IsColonistPlayerControlled || ___pawn.RaceProps.Animal || ___pawn.Faction.HostileTo(Faction.OfPlayer)) { return; } if (___pawn.IsPrisoner) { return; } LocalTargetInfo target = DistanceUtility.GetFirstTarget(__result.Job, TargetIndex.A); if (!target.IsValid) { return; } ExtendedDataStorage store = Base.GetExtendedDataStorage(); if (store == null) { return; } //Log.Message("wrong duty"); ExtendedPawnData PawnData = store.GetExtendedDataFor(___pawn); Lord lord = ___pawn.GetLord(); if (lord == null) { return; } if (__result.Job.def == GUC_JobDefOf.Dismount || __result.Job.def == GUC_JobDefOf.Mount) { return; } QueuedJob qJob = ___pawn.jobs.jobQueue.FirstOrFallback(null); if (qJob != null && (qJob.job.def == GUC_JobDefOf.Dismount || qJob.job.def == GUC_JobDefOf.Mount)) { return; } if (lord.CurLordToil is LordToil_ExitMapAndEscortCarriers || lord.CurLordToil is LordToil_Travel || lord.CurLordToil is LordToil_ExitMap || lord.CurLordToil is LordToil_ExitMapTraderFighting) { if (PawnData.owning != null && PawnData.owning.Faction == ___pawn.Faction && PawnData.mount == null && !PawnData.owning.Downed && PawnData.owning.Spawned && !___pawn.IsBurning() && !___pawn.Downed) { mountAnimal(__instance, ___pawn, PawnData, ref __result); } } else if (lord.CurLordToil.GetType().Name == "LordToil_DefendTraderCaravan" || lord.CurLordToil is LordToil_DefendPoint) //first option is internal class, hence this way of accessing. { if (PawnData.mount != null) { parkAnimal(__instance, ___pawn, PawnData); } } }