Пример #1
0
        public static void StanceTick(Stance_Warmup __instance)
        {
            if (SimpleSidearms.RangedCombatAutoSwitch == false)
            {
                return;
            }
            Pawn pawn = __instance.stanceTracker.pawn;

            if (IsHunting(pawn))
            {
                return;
            }
            if (!SimpleSidearms.CEOverride && !(__instance.verb is Verb_Shoot))
            {
                return;
            }
            if (SimpleSidearms.CEOverride && !(CERangedVerb.IsAssignableFrom(__instance.verb.GetType())))
            {
                return;
            }
            float statValue = pawn.GetStatValue(StatDefOf.AimingDelayFactor, true);
            int   ticks     = (__instance.verb.verbProps.warmupTime * statValue).SecondsToTicks();

            if (__instance.ticksLeft / (float)ticks < 1f - SimpleSidearms.RangedCombatAutoSwitchMaxWarmup.Value)
            {
                return;
            }

            LocalTargetInfo target = __instance.focusTarg;

            WeaponAssingment.trySwapToMoreAccurateRangedWeapon(pawn, target, MiscUtils.shouldDrop(DroppingModeEnum.Combat), pawn.IsColonistPlayerControlled);
        }
Пример #2
0
        public static void StanceTick(Stance_Warmup __instance)
        {
            if (Settings.RangedCombatAutoSwitch == false)
            {
                return;
            }
            Pawn pawn = __instance.stanceTracker.pawn;

            if (IsHunting(pawn))
            {
                return;
            }
            if (!pawn.IsValidSidearmsCarrier())
            {
                return;
            }
            if (!(__instance.verb is Verb_Shoot))
            {
                return;
            }

            /*if (!SimpleSidearms.CEOverride && !(__instance.verb is Verb_Shoot))
             *  return;
             * if (SimpleSidearms.CEOverride && !(CERangedVerb.IsAssignableFrom(__instance.verb.GetType())))
             *  return;*/
            float statValue = pawn.GetStatValue(StatDefOf.AimingDelayFactor, true);
            int   ticks     = (__instance.verb.verbProps.warmupTime * statValue).SecondsToTicks();

            if (__instance.ticksLeft / (float)ticks < 1f - Settings.RangedCombatAutoSwitchMaxWarmup)
            {
                return;
            }

            LocalTargetInfo target  = __instance.focusTarg;
            var             EMPGood = false;

            if (target.Pawn != null)
            {
                if (target.Pawn.RaceProps.IsMechanoid)
                {
                    EMPGood = true;
                }
                //unfortunately pawns with EMP grenades dont seem to know they work on shield belts => without forcing the target, the pawn stops attacking

                /*else if(target.Pawn.apparel.WornApparel.Where(a => a is ShieldBelt).Any(b => (b as ShieldBelt).ShieldState == ShieldState.Active)) //check for active shield belts
                 * {
                 *  EMPGood = true;
                 * } */
            }


            bool skipManualUse = true;
            bool skipDangerous = pawn.IsColonistPlayerControlled && Settings.SkipDangerousWeapons;
            bool skipEMP       = (pawn.IsColonistPlayerControlled && Settings.SkipEMPWeapons) || !EMPGood;

            WeaponAssingment.trySwapToMoreAccurateRangedWeapon(pawn, target, MiscUtils.shouldDrop(pawn, DroppingModeEnum.Combat, false), skipManualUse, skipDangerous, skipEMP);
        }
Пример #3
0
        public override void DrawAt(Vector3 drawLoc)
        {
            if (!Spawned)
            {
                base.DrawAt(drawLoc);
                return;
            }
            saddleLoc   = drawLoc;
            saddleLoc.y = Altitudes.AltitudeFor(AltitudeLayer.Pawn) + 0.01f;

            if (mountableComp.IsMounted)
            {
                graphic_Saddle.Draw(saddleLoc, Rotation, this);
                Vector3 crewLoc = drawLoc;
                crewLoc.y = Altitudes.AltitudeFor(AltitudeLayer.PawnUnused) + 0.1f;
                Vector3 crewsOffset = new Vector3(0.25f, 0.02f, -0.25f);
                if (Rotation == Rot4.North || Rotation == Rot4.South)
                {
                    crewsOffset.x = 0f;
                }
                else
                {
                    crewLoc.z += 1f;
                }
                if (storage == null)
                {
                    return;
                }

                foreach (Thing thing in storage.Where(x => x is Pawn).ToList())
                {
                    Pawn pawn = (Pawn)thing;
                    if (pawn == null)
                    {
                        continue;
                    }
                    pawn.Rotation = Rotation;
                    pawn.DrawAt(crewLoc + crewsOffset.RotatedBy(Rotation.AsAngle));

                    if (pawn.stances.curStance is Stance_Warmup && Find.Selector.IsSelected(this))
                    {
                        Stance_Warmup stanceWarmup = pawn.stances.curStance as Stance_Warmup;
                        float         num2         = stanceWarmup.ticksLeft >= 300 ? (stanceWarmup.ticksLeft >= 450 ? 0.5f : 0.75f) : 1f;
                        GenDraw.DrawAimPie(stanceWarmup.stanceTracker.pawn, stanceWarmup.focusTarg, (int)(stanceWarmup.ticksLeft * (double)num2), 0.2f);
                    }
                }
            }
            else
            {
                base.DrawAt(drawLoc);
            }
        }
Пример #4
0
        public override void DrawAt(Vector3 drawLoc)
        {
            if (!this.Spawned)
            {
                base.DrawAt(drawLoc);
                return;
            }
            saddleLoc = drawLoc; saddleLoc.y = Altitudes.AltitudeFor(AltitudeLayer.Pawn) + 0.01f;

            if (mountableComp.IsMounted)
            {
                graphic_Saddle.Draw(saddleLoc, this.Rotation, this);
                Vector3 crewLoc     = drawLoc; crewLoc.y = Altitudes.AltitudeFor(AltitudeLayer.Pawn);
                Vector3 crewsOffset = new Vector3(0.25f, 0.02f, -0.25f);
                if (this.Rotation == Rot4.North || this.Rotation == Rot4.South)
                {
                    crewsOffset.x = 0f;
                }
                foreach (Pawn pawn in this.storage.Where(x => x is Pawn).ToList())
                {
                    pawn.Rotation = this.Rotation;
                    pawn.DrawAt(crewLoc + crewsOffset.RotatedBy(this.Rotation.AsAngle));
                    Stance_Warmup stance_Warmup = null;
                    if (pawn.stances.curStance is Stance_Warmup && Find.Selector.IsSelected(this))
                    {
                        stance_Warmup = pawn.stances.curStance as Stance_Warmup;
                        float pieSizeFactor;
                        if (stance_Warmup.ticksLeft < 300)
                        {
                            pieSizeFactor = 1f;
                        }
                        else if (stance_Warmup.ticksLeft < 450)
                        {
                            pieSizeFactor = 0.75f;
                        }
                        else
                        {
                            pieSizeFactor = 0.5f;
                        }
                        GenDraw.DrawAimPie((Thing)stance_Warmup.stanceTracker.pawn, stance_Warmup.focusTarg, (int)((double)stance_Warmup.ticksLeft * (double)pieSizeFactor), 0.2f);
                    }
                }
            }
            else
            {
                base.DrawAt(drawLoc);
            }
        }
        private static void StanceTick(Stance_Warmup __instance)
        {
            if (SimpleSidearms.RangedCombatAutoSwitch == false)
            {
                return;
            }
            Pawn pawn = __instance.stanceTracker.pawn;

            if (SwapControlsHandler.GetHandlerForPawn(pawn).currentWeaponLocked)
            {
                return;
            }
            if (IsHunting(pawn))
            {
                return;
            }
            if (!SimpleSidearms.CEOverride && !(__instance.verb is Verb_Shoot))
            {
                return;
            }
            if (SimpleSidearms.CEOverride && !(CERangedVerb.IsAssignableFrom(__instance.verb.GetType())))
            {
                return;
            }
            float statValue = pawn.GetStatValue(StatDefOf.AimingDelayFactor, true);
            int   ticks     = (__instance.verb.verbProps.warmupTime * statValue).SecondsToTicks();

            if (__instance.ticksLeft / (float)ticks < 1f - SimpleSidearms.RangedCombatAutoSwitchMaxWarmup.Value)
            {
                return;
            }

            LocalTargetInfo targ = __instance.focusTarg;

            if (pawn.inventory.innerContainer.Any((Thing x) => x.def.IsRangedWeapon))
            {
                CellRect cellRect = (!targ.HasThing) ? CellRect.SingleCell(targ.Cell) : targ.Thing.OccupiedRect();
                float    range    = cellRect.ClosestDistSquaredTo(pawn.Position);
                WeaponAssingment.trySwapToMoreAccurateRangedWeapon(pawn, MiscUtils.shouldDrop(DroppingModeEnum.Range), range, pawn.IsColonistPlayerControlled);
            }
            else
            {
            }
        }