public static void GetExplanationUnfinalized(StatWorker __instance, StatRequest req, ToStringNumberSense numberSense, ref string __result) { if (__instance != null) { StatDef value = Traverse.Create(__instance).Field("stat").GetValue <StatDef>(); if (req != null && req.Thing != null && req.Def != null && (req.Def == YautjaDefOf.RRY_Gun_Hunting_Bow || req.Def == YautjaDefOf.RRY_Gun_Compound_Bow) && value == StatDefOf.RangedWeapon_DamageMultiplier) { DamageArmorCategoryDef CategoryOfDamage = ((ThingDef)req.Def).Verbs[0].defaultProjectile.projectile.damageDef.armorCategory; StringBuilder stringBuilder = new StringBuilder(); stringBuilder.Append(__instance.GetExplanationUnfinalized(req, numberSense)); stringBuilder.AppendLine(); ThingDef def = (ThingDef)req.Def; if (req.StuffDef != null) { StatDef statDef = null; if (CategoryOfDamage != null) { statDef = CategoryOfDamage.multStat; } if (statDef != null) { stringBuilder.AppendLine(req.StuffDef.LabelCap + ": x" + req.StuffDef.GetStatValueAbstract(statDef, null).ToStringPercent()); } } __result = stringBuilder.ToString(); } } return; }
public static bool IsDerpWeapon(ThingDef thing, ThingDef stuff) { if (stuff == null) { return(false); } if (thing.IsMeleeWeapon) { if (thing.tools.NullOrEmpty()) { return(false); } DamageDef damageDef = ThingUtility.PrimaryMeleeWeaponDamageType(thing); if (damageDef == null) { return(false); } DamageArmorCategoryDef armorCategory = damageDef.armorCategory; if (armorCategory != null && armorCategory.multStat != null && stuff.GetStatValueAbstract(armorCategory.multStat) < 0.7f) { return(true); } } return(false); }
public static void GetValueUnfinalized(StatWorker __instance, StatRequest req, ref float __result) { if (__instance != null) { StatDef value = Traverse.Create(__instance).Field("stat").GetValue <StatDef>(); if (req != null && req.Thing != null && req.Def != null && (req.Def == YautjaDefOf.RRY_Gun_Hunting_Bow || req.Def == YautjaDefOf.RRY_Gun_Compound_Bow) && value == StatDefOf.RangedWeapon_DamageMultiplier) { // Log.Message(string.Format("GetValueUnfinalized value: {0}, Def: {1}, Empty: {2}, HasThing: {3}, QualityCategory: {4}, StuffDef: {5}, Thing: {6}", value, req.Def, req.Empty, req.HasThing, req.QualityCategory, req.StuffDef, req.Thing)); // Log.Message(string.Format("GetValueUnfinalized Original __result: {0}", __result)); DamageArmorCategoryDef CategoryOfDamage = ((ThingDef)req.Def).Verbs[0].defaultProjectile.projectile.damageDef.armorCategory; float num = __result; ThingDef def = (ThingDef)req.Def; if (req.StuffDef != null) { StatDef statDef = null; if (CategoryOfDamage != null) { statDef = CategoryOfDamage.multStat; } if (statDef != null) { num *= req.StuffDef.GetStatValueAbstract(statDef, null); } __result = num; } // Log.Message(string.Format("GetValueUnfinalized Modified __result: {0}", __result)); } } return; }
public static void WarpRift(Projectile __instance, Thing ___launcher, Pawn hitPawn) { Map map = hitPawn.Map; if (__instance.def.projectile.explosionEffect != null) { Effecter effecter = __instance.def.projectile.explosionEffect.Spawn(); effecter.Trigger(new TargetInfo(hitPawn.Position, map, false), new TargetInfo(hitPawn.Position, map, false)); effecter.Cleanup(); } IntVec3 position = hitPawn.Position; Map map2 = map; float explosionRadius = __instance.def.projectile.explosionRadius; DamageDef damageDef = __instance.def.projectile.damageDef; int DamageAmount = __instance.def.projectile.GetDamageAmount(___launcher, null); DamageArmorCategoryDef armorCategory = damageDef.armorCategory; StatDef armorcatdef = armorCategory.armorRatingStat; float ArmorPenetration = hitPawn.GetStatValue(armorcatdef, true); SoundDef soundExplode = __instance.def.projectile.soundExplode; ThingDef postExplosionSpawnThingDef = __instance.def.projectile.postExplosionSpawnThingDef; float postExplosionSpawnChance = __instance.def.projectile.postExplosionSpawnChance; int postExplosionSpawnThingCount = __instance.def.projectile.postExplosionSpawnThingCount; float y = __instance.ExactRotation.eulerAngles.y; ThingDef preExplosionSpawnThingDef = __instance.def.projectile.preExplosionSpawnThingDef; damageDef = OGDamageDefOf.OG_E_Distortion_Damage_Blast; GenExplosion.DoExplosion(position, map2, explosionRadius, damageDef, ___launcher, DamageAmount, ArmorPenetration, soundExplode);//, equipmentDef, def, thing, postExplosionSpawnThingDef, postExplosionSpawnChance, postExplosionSpawnThingCount, EquipmentSource.def.projectile.applyDamageToExplosionCellsNeighbors, preExplosionSpawnThingDef, EquipmentSource.def.projectile.preExplosionSpawnChance, EquipmentSource.def.projectile.preExplosionSpawnThingCount, EquipmentSource.def.projectile.explosionChanceToStartFire, EquipmentSource.def.projectile.explosionDamageFalloff); DamageInfo dinfo = new DamageInfo(damageDef, DamageAmount, ArmorPenetration, y, ___launcher, null, ___launcher.def, DamageInfo.SourceCategory.ThingOrUnknown, hitPawn); hitPawn.TakeDamage(dinfo); string msg = string.Format("{0} was lost to the warp", hitPawn.LabelCap); if (!hitPawn.Dead) { hitPawn.Kill(dinfo); } if (hitPawn.Faction == Faction.OfPlayer) { Messages.Message(msg, MessageTypeDefOf.PawnDeath); } if (hitPawn.Dead) { hitPawn.Corpse.Destroy(DestroyMode.KillFinalize); } return; }
public static bool Prefix(ProjectileCE __instance, Thing ___launcher, IntVec3 ___originInt, Vector2 ___origin, Vector2 ___destinationInt, int ___startingTicksToImpactInt, int ___ticksToImpact, int ___intTicksToImpact, ThingDef ___equipmentDef, ref float ___suppressionAmount, Thing hitThing) { if (hitThing != null) { bool Rending = false; float RendingChance = 0.167f; Pawn caster = ___launcher as Pawn; Thing Launcher = ___launcher; if (caster != null) { if (caster.equipment != null) { // Log.Warning(string.Format("___launcher: {0}", ___launcher)); if (caster.equipment.Primary != null) { // Log.Warning(string.Format("caster.equipment != null")); Launcher = caster.equipment.Primary; // Log.Warning(string.Format("Launcher = caster.equipment.Primary")); CompWeapon_GunSpecialRules _GunSpecialRules = Launcher.TryGetCompFast <CompWeapon_GunSpecialRules>(); if (_GunSpecialRules != null) { // Log.Warning(string.Format("_GunSpecialRules != null")); Rending = _GunSpecialRules.Rending; RendingChance = _GunSpecialRules.RendingChance; } } else { // Log.Warning(string.Format("caster.equipment == null")); if (caster.health.hediffSet.hediffs.Any(x => x.TryGetCompFast <HediffComp_VerbGiverExtra>() != null)) { // Log.Warning(string.Format("HediffComp_VerbGiverExtra: {0}", ___launcher)); HediffComp_VerbGiverExtra _VGE = caster.health.hediffSet.hediffs.Find(x => x.TryGetCompFast <HediffComp_VerbGiverExtra>() is HediffComp_VerbGiverExtra z && z.verbTracker.AllVerbs.Any(y => y.verbProps.defaultProjectile == __instance.def)).TryGetCompFast <HediffComp_VerbGiverExtra>(); if (_VGE != null) { // Log.Warning(string.Format("_VGE != null: {0}", _VGE.parent.LabelCap)); GunVerbEntry entry = _VGE.Props.verbEntrys.Find(x => x.VerbProps.defaultProjectile == __instance.def); if (entry != null) { // Log.Warning(string.Format("{0}, Rending: {1}, Chance: {2}", entry.VerbProps.label, entry.Rending, entry.RendingChance)); Rending = entry.Rending; RendingChance = entry.RendingChance; } } } } } } if (Rending) { // Log.Warning(string.Format("Rending: {0}", ___launcher)); Rand.PushState(); bool RendingEffect = Rand.Chance(RendingChance); Rand.PopState(); if (RendingEffect) { DamageDef damageDef = __instance.def.projectile.damageDef; DamageArmorCategoryDef armorCategory = damageDef.armorCategory != null ? damageDef.armorCategory: null; StatDef armorcatdef = damageDef.armorCategory != null ? armorCategory.armorRatingStat : null; float num = 0f; float num2 = Mathf.Clamp01((armorcatdef != null ? hitThing.GetStatValue(armorcatdef, true) : 0f) / 2f); if (hitThing is Pawn hitPawn) { List <BodyPartRecord> allParts = hitPawn.RaceProps.body.AllParts; List <Apparel> list = (hitPawn.apparel == null) ? null : hitPawn.apparel.WornApparel; for (int i = 0; i < allParts.Count; i++) { float num3 = 1f - num2; if (list != null) { for (int j = 0; j < list.Count; j++) { if (list[j].def.apparel.CoversBodyPart(allParts[i])) { float num4 = Mathf.Clamp01((armorcatdef != null ? list[j].GetStatValue(armorcatdef, true) : 0f) / 2f); num3 *= 1f - num4; } } } num += allParts[i].coverageAbs * (1f - num3); } } num = Mathf.Clamp(num * 2f, 0f, 2f); float armorPenetration = num; MoteMaker.ThrowText(hitThing.PositionHeld.ToVector3(), hitThing.MapHeld, "AdeptusMechanicus.Rending_Shot".Translate(__instance.LabelCap, hitThing.LabelShortCap), 3f); // Log.Warning(string.Format("ArmorPenetration: {0}", ArmorPenetration)); bool flag = ___launcher is AmmoThing; Map map = __instance.Map; LogEntry_DamageResult logEntry_DamageResult = null; bool flag2 = __instance.logMisses || (!__instance.logMisses && hitThing != null && (hitThing is Pawn || hitThing is Building_Turret)); if (flag2) { bool flag3 = !flag; if (flag3) { LogImpact(__instance, ___launcher, ___equipmentDef, hitThing, out logEntry_DamageResult); } } bool flag4 = hitThing != null; if (flag4) { int damageAmount = __instance.def.projectile.GetDamageAmount(1f, null); DamageDefExtensionCE damageDefExtensionCE = __instance.def.projectile.damageDef.GetModExtension <DamageDefExtensionCE>() ?? new DamageDefExtensionCE(); ProjectilePropertiesCE projectilePropertiesCE = (ProjectilePropertiesCE)__instance.def.projectile; // float armorPenetration = (this.def.projectile.damageDef.armorCategory == DamageArmorCategoryDefOf.Sharp) ? projectilePropertiesCE.armorPenetrationSharp : projectilePropertiesCE.armorPenetrationBlunt; DamageInfo damageInfo = new DamageInfo(__instance.def.projectile.damageDef, (float)damageAmount, armorPenetration, __instance.ExactRotation.eulerAngles.y, ___launcher, null, __instance.def, DamageInfo.SourceCategory.ThingOrUnknown, null); BodyPartDepth depth = (damageDefExtensionCE != null && damageDefExtensionCE.harmOnlyOutsideLayers) ? BodyPartDepth.Outside : BodyPartDepth.Undefined; BodyPartHeight collisionBodyHeight = new CollisionVertical(hitThing).GetCollisionBodyHeight(__instance.ExactPosition.y); damageInfo.SetBodyRegion(collisionBodyHeight, depth); bool flag5 = damageDefExtensionCE != null && damageDefExtensionCE.harmOnlyOutsideLayers; if (flag5) { damageInfo.SetBodyRegion(BodyPartHeight.Undefined, BodyPartDepth.Outside); } bool flag6 = flag && hitThing is Pawn; if (flag6) { logEntry_DamageResult = new BattleLogEntry_DamageTaken((Pawn)hitThing, DefDatabase <RulePackDef> .GetNamed("DamageEvent_CookOff", true), null); Find.BattleLog.Add(logEntry_DamageResult); } try { hitThing.TakeDamage(damageInfo).AssociateWithLog(logEntry_DamageResult); bool flag7 = !(hitThing is Pawn) && projectilePropertiesCE != null && !projectilePropertiesCE.secondaryDamage.NullOrEmpty <SecondaryDamage>(); if (flag7) { foreach (SecondaryDamage secondaryDamage in projectilePropertiesCE.secondaryDamage) { bool destroyed = hitThing.Destroyed; if (destroyed) { break; } DamageInfo dinfo = secondaryDamage.GetDinfo(damageInfo); hitThing.TakeDamage(dinfo).AssociateWithLog(logEntry_DamageResult); } } } catch (Exception ex) { Log.Error("CombatExtended :: BulletCE impacting thing " + hitThing.LabelCap + " of def " + hitThing.def.LabelCap + " added by mod " + hitThing.def.modContentPack.Name + ". See following stacktrace for information.", false); throw ex; } finally { Impact(__instance, ___launcher, ___equipmentDef, hitThing, ___originInt, ___origin, ___destinationInt, ___startingTicksToImpactInt, ___ticksToImpact, ___intTicksToImpact, ref ___suppressionAmount); } } else { SoundDefOf.BulletImpact_Ground.PlayOneShot(new TargetInfo(__instance.Position, map, false)); bool castShadow = __instance.castShadow; if (castShadow) { FleckMaker.Static(__instance.ExactPosition, map, FleckDefOf.ShotHit_Dirt, 1f); bool takeSplashes = __instance.Position.GetTerrain(map).takeSplashes; if (takeSplashes) { FleckMaker.WaterSplash(__instance.ExactPosition, map, Mathf.Sqrt((float)__instance.def.projectile.GetDamageAmount(___launcher, null)) * 1f, 4f); } } Impact(__instance, ___launcher, ___equipmentDef, hitThing, ___originInt, ___origin, ___destinationInt, ___startingTicksToImpactInt, ___ticksToImpact, ___intTicksToImpact, ref ___suppressionAmount); } NotifyImpact(__instance, ___launcher, hitThing, map, __instance.Position); } return(false); } } return(true); }
public static void Projectile_ArmorPenetration_Rending_Postfix(Projectile __instance, ref LocalTargetInfo ___usedTarget, ref Thing ___launcher, ref float __result) { if (___usedTarget.HasThing) { bool Rending = false; float RendingChance = 0.167f; Pawn caster = ___launcher as Pawn; Thing hitThing = ___usedTarget.Thing; Thing Launcher = ___launcher; if (caster != null) { if (caster.equipment != null) { // Log.Warning(string.Format("___launcher: {0}", ___launcher)); if (caster.equipment.Primary != null) { // Log.Warning(string.Format("caster.equipment != null")); Launcher = caster.equipment.Primary; // Log.Warning(string.Format("Launcher = caster.equipment.Primary")); CompWeapon_GunSpecialRules _GunSpecialRules = Launcher.TryGetComp <CompWeapon_GunSpecialRules>(); if (_GunSpecialRules != null) { // Log.Warning(string.Format("_GunSpecialRules != null")); Rending = _GunSpecialRules.Rending; RendingChance = _GunSpecialRules.RendingChance; } } else { // Log.Warning(string.Format("caster.equipment == null")); if (caster.health.hediffSet.hediffs.Any(x => x.TryGetComp <HediffComp_VerbGiverExtra>() != null)) { // Log.Warning(string.Format("HediffComp_VerbGiverExtra: {0}", ___launcher)); HediffComp_VerbGiverExtra _VGE = caster.health.hediffSet.hediffs.Find(x => x.TryGetComp <HediffComp_VerbGiverExtra>() is HediffComp_VerbGiverExtra z && z.verbTracker.AllVerbs.Any(y => y.verbProps.defaultProjectile == __instance.def)).TryGetComp <HediffComp_VerbGiverExtra>(); if (_VGE != null) { // Log.Warning(string.Format("_VGE != null: {0}", _VGE.parent.LabelCap)); GunVerbEntry entry = _VGE.Props.verbEntrys.Find(x => x.VerbProps.defaultProjectile == __instance.def); if (entry != null) { // Log.Warning(string.Format("{0}, Rending: {1}, Chance: {2}", entry.VerbProps.label, entry.Rending, entry.RendingChance)); Rending = entry.Rending; RendingChance = entry.RendingChance; } } } } } } if (Rending) { // Log.Warning(string.Format("Rending: {0}", ___launcher)); bool RendingEffect = Rand.Chance(RendingChance); if (RendingEffect) { // Log.Warning(string.Format("RendingEffect: {0}", ___launcher)); DamageDef damageDef = __instance.def.projectile.damageDef; // Log.Warning(string.Format("damageDef: {0}", damageDef.LabelCap)); DamageArmorCategoryDef armorCategory = damageDef.armorCategory != null ? damageDef.armorCategory: null; // Log.Warning(string.Format("armorCategory: {0}", armorCategory)); StatDef armorcatdef = damageDef.armorCategory != null ? armorCategory.armorRatingStat : null; // Log.Warning(string.Format("armorcatdef: {0}", armorcatdef)); float num = 0f; float num2 = Mathf.Clamp01((armorcatdef != null ? hitThing.GetStatValue(armorcatdef, true) : 0f) / 2f); // Log.Warning(string.Format("num2: {0}", num2)); if (hitThing is Pawn hitPawn) { List <BodyPartRecord> allParts = hitPawn.RaceProps.body.AllParts; // Log.Warning(string.Format("allParts: {0}", allParts.Count)); List <Apparel> list = (hitPawn.apparel == null) ? null : hitPawn.apparel.WornApparel; // Log.Warning(string.Format("list: {0}", list.Count)); for (int i = 0; i < allParts.Count; i++) { float num3 = 1f - num2; if (list != null) { for (int j = 0; j < list.Count; j++) { if (list[j].def.apparel.CoversBodyPart(allParts[i])) { float num4 = Mathf.Clamp01((armorcatdef != null ? list[j].GetStatValue(armorcatdef, true) : 0f) / 2f); num3 *= 1f - num4; } } } num += allParts[i].coverageAbs * (1f - num3); } } num = Mathf.Clamp(num * 2f, 0f, 2f); float ArmorPenetration = num; MoteMaker.ThrowText(hitThing.PositionHeld.ToVector3(), hitThing.MapHeld, "AMA_Rending_Shot".Translate(__instance.LabelCap, hitThing.LabelShortCap), 3f); // Log.Warning(string.Format("ArmorPenetration: {0}", ArmorPenetration)); __result = ArmorPenetration; } } } }