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