public static void PostfixStoppingPower(ProjectileProperties __instance, ref float __result) { if (__result == 0.5f) { __result = __instance.GetDamageAmount(null) * StoppingPowerPerDamageAmount; } }
protected override bool TryCastShot() { if (base.TryCastShot()) { ThingDef projectile = this.GetProjectile(); ProjectileProperties projectile2 = projectile.projectile; ThingDef equipmentDef = EquipmentSource?.def; if (equipmentDef is null) { Log.Error($"Unable to retrieve weapon def from <color=teal>{GetType()}</color>. Please report to Oskar or Smash Phil."); return(true); } MoteProperties moteProps = equipmentDef.GetModExtension <MoteProperties>(); if (moteProps is null) { Log.ErrorOnce($"<color=teal>{GetType()}</color> cannot be used without <color=teal>MoteProperties</color> DefModExtension. Motes will not be thrown.", Gen.HashCombine(projectile.GetHashCode(), "MoteProperties".GetHashCode())); return(true); } float size = moteProps.Size(projectile2.GetDamageAmount(caster, null)); for (int i = 0; i < moteProps.numTimesThrown; i++) { float relAngle = Quaternion.LookRotation(CurrentTarget.CenterVector3 - Caster.Position.ToVector3Shifted()).eulerAngles.y; SmokeMaker.ThrowMoteDef(moteProps.moteDef, caster.PositionHeld.ToVector3Shifted(), caster.MapHeld, size, moteProps.Velocity, relAngle + moteProps.Angle, moteProps.Rotation); } return(true); } return(false); }
protected override bool TryCastShot() { if (base.TryCastShot()) { Vector3 loc = this.caster.PositionHeld.ToVector3(); Map mapHeld = this.caster.MapHeld; ThingDef projectile = this.GetProjectile(); int? num; if (projectile == null) { num = null; } else { ProjectileProperties projectile2 = projectile.projectile; num = ((projectile2 != null) ? new int?(projectile2.GetDamageAmount(this.caster, null)) : null); } int? num2 = num; float size = Mathf.Clamp01(((num2 != null) ? new float?((float)num2.GetValueOrDefault() / MEHNI_DECIDED_ON_MAGIC_NUMBER) : null) ?? 1f); MoteMaker2.ThrowFlintLockSmoke(loc, mapHeld, size); MoteMaker2.ThrowFlintLockSmoke(loc, mapHeld, size); return(true); } return(false); }
public static float GetExplosionAP(ProjectileProperties props) { return(props.GetDamageAmount(1) * 0.1f); }
private static float GetDamage(ProjectileProperties projectile, Thing weapon) => projectile.GetDamageAmount(weapon);
public static void Postfix(ThingDef __instance, StatRequest req, ref IEnumerable <StatDrawEntry> __result) { // Add mortar shell stats to the list of stat draw entries if (__instance.IsShell) { Thing shellThing = ThingMaker.MakeThing(__instance.projectileWhenLoaded); ProjectileProperties shellProps = __instance.projectileWhenLoaded.projectile; int shellDamage = shellProps.GetDamageAmount(shellThing); float shellArmorPenetration = shellProps.GetArmorPenetration(shellThing); float shellStoppingPower = shellProps.StoppingPower; string shellDamageDef = shellProps.damageDef.label.CapitalizeFirst(); float shellExplosionRadius = shellProps.explosionRadius; __result = __result.AddItem(new StatDrawEntry(StatCategoryDefOf.TurretAmmo, "Damage".Translate(), shellDamage.ToString(), "Stat_Thing_Damage_Desc".Translate(), 20)); __result = __result.AddItem(new StatDrawEntry(StatCategoryDefOf.TurretAmmo, "TurretExtensions.ShellDamageType".Translate(), shellDamageDef, "TurretExtensions.ShellDamageType_Desc".Translate(), 19)); __result = __result.AddItem(new StatDrawEntry(StatCategoryDefOf.TurretAmmo, "ArmorPenetration".Translate(), shellArmorPenetration.ToStringPercent(), "ArmorPenetrationExplanation".Translate(), 18)); __result = __result.AddItem(new StatDrawEntry(StatCategoryDefOf.TurretAmmo, "StoppingPower".Translate(), shellStoppingPower.ToString(), "StoppingPowerExplanation".Translate(), 17)); if (shellExplosionRadius > 0) { __result = __result.AddItem(new StatDrawEntry(StatCategoryDefOf.TurretAmmo, "TurretExtensions.ShellExplosionRadius".Translate(), shellExplosionRadius.ToString(), "TurretExtensions.ShellExplosionRadius_Desc".Translate(), 16)); } } // Minimum range if (__instance.Verbs.FirstOrDefault(v => v.isPrimary) is VerbProperties verb) { var verbStatCategory = (__instance.category != ThingCategory.Pawn) ? RimWorld.StatCategoryDefOf.Weapon : RimWorld.StatCategoryDefOf.PawnCombat; if (verb.LaunchesProjectile) { if (verb.minRange > default(float)) { __result = __result.AddItem(new StatDrawEntry(verbStatCategory, "MinimumRange".Translate(), verb.minRange.ToString("F0"), "TurretExtensions.MinimumRange_Desc".Translate(), 5385)); } } } // Add turret weapons stats to the list of SpecialDisplayStats var buildingProps = __instance.building; if (buildingProps != null && buildingProps.IsTurret) { var gunStatList = new List <StatDrawEntry>(); if (req.Def is ThingDef tDef) { // Add upgradability string upgradableString; CompProperties_Upgradable upgradableCompProps; if (req.HasThing && req.Thing.IsUpgradable(out CompUpgradable upgradableComp)) { upgradableString = (upgradableComp.upgraded ? "TurretExtensions.NoAlreadyUpgraded" : "TurretExtensions.YesClickForDetails").Translate(); upgradableCompProps = upgradableComp.Props; } else { upgradableString = (tDef.IsUpgradable(out upgradableCompProps) ? "TurretExtensions.YesClickForDetails" : "No").Translate(); } var upgradeHyperlinks = new List <Dialog_InfoCard.Hyperlink>(); if (upgradableCompProps?.turretGunDef != null) { upgradeHyperlinks.Add(new Dialog_InfoCard.Hyperlink(upgradableCompProps.turretGunDef)); } gunStatList.Add(new StatDrawEntry(RimWorld.StatCategoryDefOf.BasicsNonPawn, "TurretExtensions.Upgradable".Translate(), upgradableString, TurretExtensionsUtility.UpgradeReadoutReportText(req), 999, hyperlinks: upgradeHyperlinks)); // Add firing arc float firingArc = req.HasThing ? TurretExtensionsUtility.FiringArcFor(req.Thing) : TurretFrameworkExtension.Get(tDef).FiringArc; gunStatList.Add(new StatDrawEntry(RimWorld.StatCategoryDefOf.Weapon, "TurretExtensions.FiringArc".Translate(), firingArc.ToStringDegrees(), "TurretExtensions.FiringArc_Desc".Translate(), 5380)); } // Replace cooldown __result = __result.Where(s => s.stat != StatDefOf.RangedWeapon_Cooldown); var cooldownStat = StatDefOf.RangedWeapon_Cooldown; gunStatList.Add(new StatDrawEntry(cooldownStat.category, cooldownStat, TurretCooldown(req, buildingProps), StatRequest.ForEmpty(), cooldownStat.toStringNumberSense)); // Replace warmup __result = __result.Where(s => s.LabelCap != "WarmupTime".Translate().CapitalizeFirst()); gunStatList.Add(new StatDrawEntry(RimWorld.StatCategoryDefOf.Weapon, "WarmupTime".Translate(), $"{TurretWarmup(req, buildingProps).ToString("0.##")} s", "Stat_Thing_Weapon_MeleeWarmupTime_Desc".Translate(), StatDisplayOrder.Thing_Weapon_MeleeWarmupTime)); __result = __result.Concat(gunStatList); } }