Ejemplo n.º 1
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;
                    }
                }
            }
        }
 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;
             }
         }
     }
 }
Ejemplo n.º 3
0
        static void Postfix(MentalState __instance)
        {
            CompRunAndGun comp = __instance.pawn.TryGetComp <CompRunAndGun>();

            if (comp != null && Settings.enableForAI.Value)
            {
                comp.isEnabled = shouldRunAndGun();
            }
        }
        static void Postfix(MentalStateHandler __instance, MentalStateDef stateDef, ref Pawn ___pawn)
        {
            if (stateDef != MentalStateDefOf.PanicFlee)
            {
                return;
            }
            CompRunAndGun comp = ___pawn.TryGetComp <CompRunAndGun>();

            if (comp != null && Base.enableForAI.Value)
            {
                comp.isEnabled = shouldRunAndGun();
            }
        }
Ejemplo n.º 5
0
        static void Postfix(MentalStateHandler __instance, MentalStateDef stateDef)
        {
            if (stateDef != MentalStateDefOf.PanicFlee)
            {
                return;
            }
            Pawn pawn = Traverse.Create(__instance).Field("pawn").GetValue <Pawn>();

            CompRunAndGun comp = pawn.TryGetComp <CompRunAndGun>();

            if (comp != null && Base.enableForAI.Value)
            {
                comp.isEnabled = shouldRunAndGun();
            }
        }
Ejemplo n.º 6
0
        public static void Postfix(ref IEnumerable <Gizmo> __result, ref Pawn __instance)
        {
            if (__instance == null || !__instance.Drafted || !__instance.Faction.Equals(Faction.OfPlayer) || !WorkGiver_HunterHunt.HasHuntingWeapon(__instance))
            {
                return;
            }
            if (__result == null || !__result.Any())
            {
                return;
            }

            CompRunAndGun data = __instance.TryGetComp <CompRunAndGun>();

            if (data == null)
            {
                return;
            }
            if (__instance.equipment != null && __instance.equipment.Primary != null)
            {
                bool found = Settings.weaponForbidder.Value.InnerList.TryGetValue(__instance.equipment.Primary.def.defName, out WeaponRecord value);
                if (found && value.isSelected)
                {
                    return;
                }
            }

            String uiElement   = "enable_RG";
            String label       = "RG_Action_Enable_Label".Translate();
            String description = data.isEnabled ? "RG_Action_Disable_Description".Translate() : "RG_Action_Enable_Description".Translate();


            var gizmoList = __result.ToList();
            var ourGizmo  = new Command_Toggle
            {
                defaultLabel = label,
                defaultDesc  = description,
                icon         = ContentFinder <Texture2D> .Get(("UI/Buttons/" + uiElement), true),
                isActive     = () => data.isEnabled,
                toggleAction = () => { data.isEnabled = !data.isEnabled; }
            };


            gizmoList.Add(ourGizmo);
            __result = gizmoList;
        }
Ejemplo n.º 7
0
        static bool Prefix(Verb __instance, ref LocalTargetInfo castTarg, ref bool surpriseAttack, ref bool canFreeIntercept)
        {
            Pawn pawn = __instance.CasterPawn;

            if (__instance.caster == null)
            {
                Log.Error("Verb " + __instance.GetUniqueLoadID() + " needs caster to work (possibly lost during saving/loading).");
                return(false);
            }
            if (!__instance.caster.Spawned)
            {
                return(false);
            }
            if (__instance.state == VerbState.Bursting || !__instance.CanHitTarget(castTarg))
            {
                return(false);
            }
            if (__instance.verbProps.CausesTimeSlowdown && castTarg.HasThing && (castTarg.Thing.def.category == ThingCategory.Pawn || (castTarg.Thing.def.building != null && castTarg.Thing.def.building.IsTurret)) && castTarg.Thing.Faction == Faction.OfPlayer && __instance.caster.HostileTo(Faction.OfPlayer))
            {
                Find.TickManager.slower.SignalForceNormalSpeed();
            }
            if (__instance.CasterIsPawn)
            {
                CompRunAndGun comp = pawn.TryGetComp <CompRunAndGun>();
                if (comp == null || !comp.isEnabled || pawn.jobs.curJob.def != JobDefOf.Goto)
                {
                    return(true);
                }
            }
            if (!__instance.CasterIsPawn)
            {
                return(true);
            }

            if ((__instance.CasterPawn.stances.curStance is Stance_RunAndGun) || (__instance.CasterPawn.stances.curStance is Stance_RunAndGun_Cooldown))
            {
                return(false);
            }

            Traverse.Create(__instance).Field("surpriseAttack").SetValue(surpriseAttack);
            Traverse.Create(__instance).Field("canFreeInterceptNow").SetValue(canFreeIntercept);
            Traverse.Create(__instance).Field("currentTarget").SetValue(castTarg);

            if (__instance.CasterIsPawn && __instance.verbProps.warmupTime > 0f)
            {
                ShootLine newShootLine;
                if (!__instance.TryFindShootLineFromTo(__instance.caster.Position, castTarg, out newShootLine))
                {
                    return(false);
                }
                __instance.CasterPawn.Drawer.Notify_WarmingCastAlongLine(newShootLine, __instance.caster.Position);
                float statValue = __instance.CasterPawn.GetStatValue(StatDefOf.AimingDelayFactor, true);
                int   ticks     = (__instance.verbProps.warmupTime * statValue).SecondsToTicks();
                __instance.CasterPawn.stances.SetStance(new Stance_RunAndGun(ticks, castTarg, __instance));
            }
            else
            {
                __instance.WarmupComplete();
            }
            return(false);
        }