private void SelfConsume() { var inventory = ShooterPawn?.TryGetComp <CompInventory>(); if (this.EquipmentSource != null && !this.EquipmentSource.Destroyed) { this.EquipmentSource.Destroy(DestroyMode.Vanish); } if (inventory != null) { var newGun = inventory.rangedWeaponList.FirstOrDefault(t => t.def == EquipmentSource.def); if (newGun != null) { inventory.TrySwitchToWeapon(newGun); } else { inventory.SwitchToNextViableWeapon(); } } }
public virtual bool CanHitTargetFrom(IntVec3 root, LocalTargetInfo targ, out string report) { report = ""; if (caster?.Map == null || !targ.Cell.InBounds(caster.Map) || !root.InBounds(caster.Map)) { report = "Out of bounds"; return(false); } // Check target self if (targ.Thing != null && targ.Thing == caster) { if (!verbProps.targetParams.canTargetSelf) { report = "Can't target self"; return(false); } return(true); } // Check thick roofs if (Projectile.projectile.flyOverhead) { RoofDef roofDef = caster.Map.roofGrid.RoofAt(targ.Cell); if (roofDef != null && roofDef.isThickRoof) { report = "Blocked by roof"; return(false); } } if (ShooterPawn != null) { // Check for capable of violence if (ShooterPawn.story != null && ShooterPawn.WorkTagIsDisabled(WorkTags.Violent)) { report = "IsIncapableOfViolenceLower".Translate(ShooterPawn.Name.ToStringShort); return(false); } // Check for apparel bool isTurretOperator = caster.def.building?.IsTurret ?? false; if (ShooterPawn.apparel != null) { List <Apparel> wornApparel = ShooterPawn.apparel.WornApparel; foreach (Apparel current in wornApparel) { //pawns can use turrets while wearing shield belts, but the shield is disabled for the duration via Harmony patch (see Harmony-ShieldBelt.cs) if (!current.AllowVerbCast(root, caster.Map, targ, this) && !(current is ShieldBelt && isTurretOperator)) { report = "Shooting disallowed by " + current.LabelShort; return(false); } } } } // Check for line of sight ShootLine shootLine; if (!TryFindCEShootLineFromTo(root, targ, out shootLine)) { float lengthHorizontalSquared = (root - targ.Cell).LengthHorizontalSquared; if (lengthHorizontalSquared > verbProps.range * verbProps.range) { report = "Out of range"; } else if (lengthHorizontalSquared < verbProps.minRange * verbProps.minRange) { report = "Within minimum range"; } else { report = "No line of sight"; } return(false); } return(true); }