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); }
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); }
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 { } }