예제 #1
0
        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;
             }
         }
     }
 }
예제 #3
0
        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;
                    }
                }
            }
        }
예제 #4
0
        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));
        }
예제 #5
0
        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);
                    }
                });
            }
        }
예제 #8
0
        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);
                    }
                });
            }
        }
예제 #9
0
        static bool Prefix(ref JobDriver_Goto __instance)
        {
            Pawn pawn = __instance.pawn;

            return(!(pawn.IsMercenary() && pawn.Map.Parent is WorldSettlementFC));
        }