static bool Prefix(ref JobDriver_Goto __instance) { Pawn pawn = __instance.pawn; return(!(pawn.Map.Parent is WorldSettlementFC settlementFc) || settlementFc.supporting.Any(caravan => caravan.pawns.Contains(pawn))); }
static void checkForAutoAttack(JobDriver_Goto __instance) { if ((__instance.pawn.story == null || !__instance.pawn.story.WorkTagIsDisabled(WorkTags.Violent)) && __instance.pawn.Faction != null && !(__instance.pawn.stances.curStance is Stance_RunAndGun) && __instance.pawn.jobs.curJob.def == JobDefOf.Goto && (__instance.pawn.drafter == null || __instance.pawn.drafter.FireAtWill)) { CompRunAndGun comp = __instance.pawn.TryGetComp <CompRunAndGun>(); if (comp == null || comp.isEnabled == false) { return; } Verb verb = __instance.pawn.TryGetAttackVerb(true); if (verb != null && !verb.verbProps.MeleeRange) { TargetScanFlags targetScanFlags = TargetScanFlags.NeedLOSToPawns | TargetScanFlags.NeedLOSToNonPawns | TargetScanFlags.NeedThreat; if (verb.IsIncendiary()) { targetScanFlags |= TargetScanFlags.NeedNonBurning; } Thing thing = (Thing)AttackTargetFinder.BestShootTargetFromCurrentPosition(__instance.pawn, null, verb.verbProps.range, verb.verbProps.minRange, targetScanFlags); if (thing != null) { __instance.pawn.TryStartAttack(thing); return; } } } }
static void checkForAutoAttack(JobDriver_Goto __instance) { if ((__instance.pawn.story == null || !__instance.pawn.story.DisabledWorkTagsBackstoryAndTraits.HasFlag(WorkTags.Violent)) && __instance.pawn.Faction != null && !(__instance.pawn.stances.curStance is Stance_RunAndGun) && __instance.pawn.jobs.curJob.def == JobDefOf.Goto && (__instance.pawn.drafter == null || __instance.pawn.drafter.FireAtWill)) { CompRunAndGun comp = __instance.pawn.TryGetComp <CompRunAndGun>(); if (comp == null || comp.isEnabled == false) { return; } Verb verb = __instance.pawn.TryGetAttackVerb(null); if (verb != null) { TargetScanFlags targetScanFlags = TargetScanFlags.NeedLOSToPawns | TargetScanFlags.NeedLOSToNonPawns | TargetScanFlags.NeedThreat; if (verb.IsIncendiary()) { targetScanFlags |= TargetScanFlags.NeedNonBurning; } Thing thing = (Thing)AttackTargetFinder.BestShootTargetFromCurrentPosition(__instance.pawn, targetScanFlags, null, 0f, 9999f); if (thing != null && !(verb.IsMeleeAttack && __instance.pawn.CanReachImmediate(thing, PathEndMode.Touch))) //Don't allow melee attacks, but take into account ranged animals or dual wield users { __instance.pawn.TryStartAttack(thing); return; } } } }
static bool Prefix(ref JobDriver_Goto __instance) { Pawn pawn = __instance.pawn; //Log.Message("Can't leave due to supporting: " + settlementFc?.supporting.Any(caravan => caravan.pawns.Contains(pawn))); //Log.Message("Can't leave due to defending: " + settlementFc?.defenders.Contains(pawn)); //Log.Message("Is Mercenary: " + pawn.IsMercenary()); return(!(pawn.IsMercenary() && pawn.Map.Parent is WorldSettlementFC)); }
static void Postfix(JobDriver_Goto __instance) { List <Toil> toils = Traverse.Create(__instance).Field("toils").GetValue <List <Toil> >(); if (toils.Count() > 0) { Toil toil = toils.ElementAt(0); toil.AddPreTickAction(delegate { if (__instance.pawn != null && !__instance.pawn.IsBurning() && (__instance.pawn.Drafted || !__instance.pawn.IsColonist) && !__instance.pawn.Downed) { checkForAutoAttack(__instance); } }); } }
static void Postfix(JobDriver_Goto __instance, ref IEnumerable <Toil> __result) { if (__instance?.job == null) { return; } if (__instance.job.targetB == LocalTargetInfo.Invalid || __instance.pawn?.Faction != Faction.OfPlayer) { return; } List <Toil> l = __result.ToList(); l[0].AddPreTickAction(delegate { Pawn a = __instance.GetActor(); if (a.Faction != Faction.OfPlayer) { return; } IntVec3 val = a.jobs.curJob.GetTarget(TargetIndex.B).Cell; if (val == IntVec3.Invalid) { return; } val.y += 1; // if (a.pather.Moving && a.pather.Destination != a.pather.nextCell) { if (val.y >= val.x) { a.pather.StartPath(a.pather.nextCell, PathEndMode.OnCell); } else if (a.pather.curPath != null && val.z != a.pather.curPath.NodesLeftCount) { val.z = a.pather.curPath.NodesLeftCount; if (!JoyUtility.EnjoyableOutsideNow(a.Map) && a.Position.Roofed(a.Map) && !a.pather.nextCell.Roofed(a.Map)) { a.pather.StartPath(a.Position, PathEndMode.OnCell); } } } // a.jobs.curJob.SetTarget(TargetIndex.B, val); }); __result = l; }
static void Postfix(JobDriver __instance) { if (!(__instance is JobDriver_Goto)) { return; } JobDriver_Goto jobDriver = (JobDriver_Goto)__instance; List <Toil> toils = Traverse.Create(jobDriver).Field("toils").GetValue <List <Toil> >(); if (toils.Count() > 0) { Toil toil = toils.ElementAt(0); toil.AddPreTickAction(delegate { if (jobDriver.pawn != null && !jobDriver.pawn.IsBurning() && (jobDriver.pawn.Drafted || !jobDriver.pawn.IsColonist) && !jobDriver.pawn.Downed) { checkForAutoAttack(jobDriver); } }); } }
static void Postfix(JobDriver __instance, List <Toil> ___toils) { if (!(__instance is JobDriver_Goto)) { return; } JobDriver_Goto jobDriver = (JobDriver_Goto)__instance; if (___toils.Count() > 0) { Toil toil = ___toils.ElementAt(0); toil.AddPreTickAction(delegate { if (jobDriver.pawn != null && jobDriver.pawn.IsHashIntervalTick(10) && !jobDriver.pawn.IsBurning() && (jobDriver.pawn.Drafted || !jobDriver.pawn.IsColonist) && !jobDriver.pawn.Downed) { checkForAutoAttack(jobDriver); } }); } }
static bool Prefix(ref JobDriver_Goto __instance) { Pawn pawn = __instance.pawn; return(!(pawn.IsMercenary() && pawn.Map.Parent is WorldSettlementFC)); }