Exemple #1
0
 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);
 }
Exemple #4
0
 public static float GetExplosionAP(ProjectileProperties props)
 {
     return(props.GetDamageAmount(1) * 0.1f);
 }
Exemple #5
0
 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);
                }
            }