public static void Postfix(ref LocalTargetInfo target, Verb_MeleeAttackDamage __instance) { try { if (__instance.EquipmentSource != null) { ThingWithComps thing = __instance.EquipmentSource; if (thing.AllComps != null) { foreach (var comp in thing.AllComps) { comp.Notify_SignalReceived(new Signal(AttackSignalTag, target.Thing, __instance.CasterPawn)); } } } } catch { } }
public static void DamageInfosToApply_ForceWeapon_Postfix(ref Verb_MeleeAttackDamage __instance, LocalTargetInfo target, ref IEnumerable <DamageInfo> __result) { if (__instance.EquipmentSource != null) { if (!__instance.EquipmentSource.AllComps.NullOrEmpty()) { if (__instance.EquipmentSource.GetComp <CompWeapon_MeleeSpecialRules>() != null) { if (__instance.EquipmentSource.GetComp <CompWeapon_MeleeSpecialRules>() is CompWeapon_MeleeSpecialRules WeaponRules) { if (AMASettings.Instance.AllowForceWeaponEffect) { bool ForceAttack = __result.Any(x => x.Def.forceWeapon()); if (WeaponRules.ForceWeapon && ForceAttack && __instance.CasterPawn is Pawn Caster) { bool casterPsychiclySensitive = Caster.RaceProps.Humanlike ? Caster.story.traits.HasTrait(TraitDefOf.PsychicSensitivity) : false; bool Activate = false; if ((casterPsychiclySensitive || !WeaponRules.ForceEffectRequiresPsyker) && target.Thing.def.category == ThingCategory.Pawn && target.Thing is Pawn Victim) { int casterPsychiclySensitiveDegree = casterPsychiclySensitive ? Caster.story.traits.DegreeOfTrait(TraitDefOf.PsychicSensitivity) : 0; if ((casterPsychiclySensitiveDegree >= 1 || !WeaponRules.ForceEffectRequiresPsyker)) { float?casterPsychicSensitivity = Caster.GetStatValue(StatDefOf.PsychicSensitivity, true) * 100f; bool targetPsychiclySensitive = Victim.RaceProps.Humanlike ? Victim.story.traits.HasTrait(TraitDefOf.PsychicSensitivity) : false; float?targetPsychicSensitivity = Victim.GetStatValue(StatDefOf.PsychicSensitivity, true) * 100f; if (targetPsychiclySensitive == true) { int targetPsychiclySensitiveDegree = Victim.story.traits.DegreeOfTrait(TraitDefOf.PsychicSensitivity); if (targetPsychiclySensitiveDegree == -1) { targetPsychicSensitivity = Victim.def.statBases.GetStatValueFromList(StatDefOf.PsychicSensitivity, 1.5f) * 100f; } else if (targetPsychiclySensitiveDegree == -2) { targetPsychicSensitivity = Victim.def.statBases.GetStatValueFromList(StatDefOf.PsychicSensitivity, 2f) * 100f; } } else { int targetPsychiclySensitiveDegree = 0; } if (__result.Any(x => x.Def.forceWeapon())) { Log.Message(string.Format("1")); float CasterMood = Caster.needs.mood.CurLevelPercentage; float VictimMood = Victim?.needs?.mood != null ? Victim.needs.mood.CurLevelPercentage : 1; foreach (var item in __result.Where(x => x.Def.forceWeapon())) { float?casterRoll = Rand.Range(0, (int)casterPsychicSensitivity) * CasterMood; float?targetRoll = Rand.Range(0, (int)targetPsychicSensitivity) * VictimMood; casterRoll = (casterRoll - (targetPsychicSensitivity / 2)); Activate = (casterRoll > targetRoll); Log.Message(string.Format("Caster:{0}, Victim:{1}", casterRoll, targetRoll)); if (Activate) { DamageDef damDef = WeaponRules.ForceWeaponEffect; float damAmount = __instance.verbProps.AdjustedMeleeDamageAmount(__instance, __instance.CasterPawn); float armorPenetration = __instance.verbProps.AdjustedArmorPenetration(__instance, __instance.CasterPawn); BodyPartRecord bodyPart = Rand.Chance(0.05f) && Victim.RaceProps.body.AllParts.Any(x => x.def.defName.Contains("Brain")) ? Victim.RaceProps.body.AllParts.Find(x => x.def.defName.Contains("Brain")) : null; BodyPartGroupDef bodyPartGroupDef = null; HediffDef hediffDef = WeaponRules.ForceWeaponHediff; damAmount = Rand.Range(damAmount * 0.1f, damAmount * 0.5f); ThingDef source = __instance.EquipmentSource.def; Thing caster = __instance.caster; Vector3 direction = (target.Thing.Position - __instance.CasterPawn.Position).ToVector3(); float num = damAmount; float num2 = armorPenetration; DamageInfo mainDinfo = new DamageInfo(damDef, num, num2, -1f, caster, bodyPart, source, DamageInfo.SourceCategory.ThingOrUnknown, null); mainDinfo.SetBodyRegion(BodyPartHeight.Undefined, BodyPartDepth.Outside); mainDinfo.SetWeaponBodyPartGroup(bodyPartGroupDef); mainDinfo.SetWeaponHediff(hediffDef); mainDinfo.SetAngle(direction); Victim.TakeDamage(mainDinfo); Map map = Caster.Map; IntVec3 position = target.Cell; Map map2 = map; float explosionRadius = 0f; Thing launcher = __instance.EquipmentSource; SoundDef soundExplode = WeaponRules.ForceWeaponTriggerSound; Thing thing = target.Thing; GenExplosion.DoExplosion(position, map2, explosionRadius, damDef, launcher, (int)damAmount, armorPenetration, soundExplode, source, null, thing, null, 0f, 0, false, null, 0, 0, 0, false); float KillChance = WeaponRules.ForceWeaponKillChance; if (KillChance != 0) { float KillRoll = Rand.Range(0, 100); if (Rand.Chance(WeaponRules.ForceWeaponKillChance)) { string msg = string.Format("{0} was slain by a force strike", target.Thing.LabelCap); target.Thing.Kill(mainDinfo); if (target.Thing.Faction == Faction.OfPlayer) { Messages.Message(msg, MessageTypeDefOf.PawnDeath); } } } /* */ } } } } } } } } } } } }
public static IEnumerable <DamageInfo> Postfix_ForceWeaponAttack(IEnumerable <DamageInfo> __result, Verb_MeleeAttackDamage __instance, LocalTargetInfo target) { foreach (DamageInfo info in __result) { bool returnoriginal = true; if (info.Def.forceWeapon()) { returnoriginal = false; DamageInfo dinfo = GetForceDamage(info, __instance, target); yield return(dinfo); } if (returnoriginal) { yield return(info); } } yield break; }
public static DamageInfo GetForceDamage(DamageInfo cloneSource, Verb_MeleeAttackDamage __instance, LocalTargetInfo target) { Pawn Caster = __instance.CasterPawn as Pawn; if (Caster != null) { if (Caster.isPsyker(out int Level, out float Mult)) { if (__instance.EquipmentSource != null) { CompForceWeaponActivatableEffect WeaponRules = __instance.EquipmentSource.TryGetComp <CompForceWeaponActivatableEffect>(); if (WeaponRules != null) { if (WeaponRules.ForceWeapon) { bool casterPsychiclySensitive = Caster.RaceProps.Humanlike ? Caster.story.traits.HasTrait(TraitDefOf.PsychicSensitivity) || Caster.story.traits.HasTrait(DefDatabase <TraitDef> .GetNamedSilentFail("Psyker")) : false; bool Activate = false; if ((casterPsychiclySensitive || !WeaponRules.ForceEffectRequiresPsyker) && target.Thing.def.category == ThingCategory.Pawn && target.Thing is Pawn Victim) { int casterPsychiclySensitiveDegree = casterPsychiclySensitive ? Caster.story.traits.DegreeOfTrait(TraitDefOf.PsychicSensitivity) : 0; if ((casterPsychiclySensitiveDegree >= 1 || !WeaponRules.ForceEffectRequiresPsyker)) { float?casterPsychicSensitivity = Caster.GetStatValue(StatDefOf.PsychicSensitivity, true) * 100f; bool targetPsychiclySensitive = Victim.RaceProps.Humanlike ? Victim.story.traits.HasTrait(TraitDefOf.PsychicSensitivity) : false; float?targetPsychicSensitivity = Victim.GetStatValue(StatDefOf.PsychicSensitivity, true) * 100f; if (targetPsychiclySensitive == true) { int targetPsychiclySensitiveDegree = Victim.story.traits.DegreeOfTrait(TraitDefOf.PsychicSensitivity); if (targetPsychiclySensitiveDegree == -1) { targetPsychicSensitivity = Victim.def.statBases.GetStatValueFromList(StatDefOf.PsychicSensitivity, 1.5f) * 100f; } else if (targetPsychiclySensitiveDegree == -2) { targetPsychicSensitivity = Victim.def.statBases.GetStatValueFromList(StatDefOf.PsychicSensitivity, 2f) * 100f; } } else /*int targetPsychiclySensitiveDegree = 0;*/ } { { float CasterMood = Caster.needs.mood.CurLevelPercentage; float VictimMood = Victim?.needs?.mood != null ? Victim.needs.mood.CurLevelPercentage : 1; Rand.PushState(); float?casterRoll = Rand.Range(0, (int)casterPsychicSensitivity) * CasterMood; float?targetRoll = Rand.Range(0, (int)targetPsychicSensitivity) * VictimMood; Rand.PopState(); casterRoll = (casterRoll - (targetPsychicSensitivity / 2)); Activate = (casterRoll > targetRoll); // log.message(string.Format("Caster:{0}, Victim:{1}", casterRoll, targetRoll)); if (Activate) { DamageDef damDef = WeaponRules.ForceWeaponEffect; float damAmount = __instance.verbProps.AdjustedMeleeDamageAmount(__instance, __instance.CasterPawn); float armorPenetration = __instance.verbProps.AdjustedArmorPenetration(__instance, __instance.CasterPawn); BodyPartRecord bodyPart = Rand.Chance(0.05f) && Victim.RaceProps.body.AllParts.Any(x => x.def.defName.Contains("Brain")) ? Victim.RaceProps.body.AllParts.Find(x => x.def.defName.Contains("Brain")) : null; BodyPartGroupDef bodyPartGroupDef = null; HediffDef hediffDef = WeaponRules.ForceWeaponHediff; damAmount = Rand.Range(damAmount * 0.1f, damAmount * 0.5f); ThingDef source = __instance.EquipmentSource.def; Thing caster = __instance.caster; Vector3 direction = (target.Thing.Position - __instance.CasterPawn.Position).ToVector3(); float num = damAmount; DamageInfo mainDinfo = new DamageInfo(damDef, num, 2, -1f, caster, bodyPart, source, DamageInfo.SourceCategory.ThingOrUnknown, null); mainDinfo.SetBodyRegion(BodyPartHeight.Undefined, BodyPartDepth.Outside); mainDinfo.SetWeaponBodyPartGroup(bodyPartGroupDef); mainDinfo.SetWeaponHediff(hediffDef); mainDinfo.SetAngle(direction); Victim.TakeDamage(mainDinfo); Map map = Caster.Map; IntVec3 position = target.Cell; Map map2 = map; float explosionRadius = 0f; Thing launcher = __instance.EquipmentSource; SoundDef soundExplode = WeaponRules.ForceWeaponTriggerSound; Thing thing = target.Thing; GenExplosion.DoExplosion(position, map2, explosionRadius, damDef, launcher, (int)damAmount, armorPenetration, soundExplode, source, null, thing, null, 0f, 0, false, null, 0, 0, 0, false); float KillChance = WeaponRules.ForceWeaponKillChance; if (KillChance != 0) { float KillRoll = Rand.Range(0, 100); if (Rand.Chance(WeaponRules.ForceWeaponKillChance)) { string msg = string.Format("{0} was slain by a force strike", target.Thing.LabelCap); target.Thing.Kill(mainDinfo); if (target.Thing.Faction == Faction.OfPlayer) { Messages.Message(msg, MessageTypeDefOf.PawnDeath); } } } return(mainDinfo); } } } } } } } } } return(cloneSource); }
public static void DamageInfosToApply_PostFix(Verb_MeleeAttackDamage __instance, ref IEnumerable <DamageInfo> __result, LocalTargetInfo target) // strenghtens certain pawns melee attacks { if (!__instance.CasterIsPawn) { return; } List <DamageInfo> newOutput = new List <DamageInfo>(); newOutput.AddRange(__result); if (__instance.CasterPawn.health.hediffSet.HasHediff(RWBYDefOf.RWBY_YangReturnDamage)) // add Yang damage { CompAbilityUserAura compAbilityUserAura = __instance.CasterPawn.TryGetComp <CompAbilityUserAura>(); if (compAbilityUserAura == null) { return; } Aura_Yang aura_Yang = (Aura_Yang)compAbilityUserAura.aura; if (aura_Yang == null) { return; } if (aura_Yang.absorbedDamage == 0f) { return; } float damageAmount = aura_Yang.absorbedDamage; DamageInfo extraDinfo = new DamageInfo(DamageDefOf.Blunt, damageAmount, 0.5f, -1f, __instance.caster, null, __instance.CasterPawn.def, DamageInfo.SourceCategory.ThingOrUnknown, null); extraDinfo.SetBodyRegion(BodyPartHeight.Undefined, BodyPartDepth.Outside); BodyPartGroupDef bodyPartGroupDef = __instance.verbProps.AdjustedLinkedBodyPartsGroup(__instance.tool); extraDinfo.SetWeaponBodyPartGroup(bodyPartGroupDef); HediffDef hediffDef = null; if (__instance.HediffCompSource != null) { hediffDef = __instance.HediffCompSource.Def; } extraDinfo.SetWeaponHediff(hediffDef); Vector3 direction = (target.Thing.Position - __instance.CasterPawn.Position).ToVector3(); extraDinfo.SetAngle(direction); newOutput.Add(extraDinfo); } if (__instance.CasterPawn.health.hediffSet.HasHediff(RWBYDefOf.RWBY_LightningBuff)) // add Nora damage { float damageAmount = 20f; DamageInfo extraDinfo = new DamageInfo(RWBYDefOf.RWBY_Lightning_Blunt, damageAmount, 0.5f, -1f, __instance.caster, null, __instance.CasterPawn.def, DamageInfo.SourceCategory.ThingOrUnknown, null); extraDinfo.SetBodyRegion(BodyPartHeight.Undefined, BodyPartDepth.Outside); BodyPartGroupDef bodyPartGroupDef = __instance.verbProps.AdjustedLinkedBodyPartsGroup(__instance.tool); extraDinfo.SetWeaponBodyPartGroup(bodyPartGroupDef); HediffDef hediffDef = null; if (__instance.HediffCompSource != null) { hediffDef = __instance.HediffCompSource.Def; } extraDinfo.SetWeaponHediff(hediffDef); Vector3 direction = (target.Thing.Position - __instance.CasterPawn.Position).ToVector3(); extraDinfo.SetAngle(direction); newOutput.Add(extraDinfo); } if (__instance.CasterPawn.health.hediffSet.HasHediff(RWBYDefOf.RWBY_InjectedFireCrystal)) // add Fire Dust Crystal injection damage { float damageAmount = 20f + 10f * __instance.CasterPawn.health.hediffSet.hediffs.Find(h => h.def == RWBYDefOf.RWBY_InjectedFireCrystal).CurStageIndex; DamageInfo extraDinfo = new DamageInfo(RWBYDefOf.RWBY_Inflame_Blunt, damageAmount, 0.5f, -1f, __instance.caster, null, __instance.CasterPawn.def, DamageInfo.SourceCategory.ThingOrUnknown, null); extraDinfo.SetBodyRegion(BodyPartHeight.Undefined, BodyPartDepth.Outside); BodyPartGroupDef bodyPartGroupDef = __instance.verbProps.AdjustedLinkedBodyPartsGroup(__instance.tool); extraDinfo.SetWeaponBodyPartGroup(bodyPartGroupDef); HediffDef hediffDef = null; if (__instance.HediffCompSource != null) { hediffDef = __instance.HediffCompSource.Def; } extraDinfo.SetWeaponHediff(hediffDef); Vector3 direction = (target.Thing.Position - __instance.CasterPawn.Position).ToVector3(); extraDinfo.SetAngle(direction); newOutput.Add(extraDinfo); } if (__instance.CasterPawn.health.hediffSet.HasHediff(RWBYDefOf.RWBY_InjectedIceCrystal)) // add Ice Dust Crystal injection damage { float damageAmount = 20f + 10f * __instance.CasterPawn.health.hediffSet.hediffs.Find(h => h.def == RWBYDefOf.RWBY_InjectedIceCrystal).CurStageIndex; DamageInfo extraDinfo = new DamageInfo(RWBYDefOf.RWBY_Ice_Blunt, damageAmount, 0.5f, -1f, __instance.caster, null, __instance.CasterPawn.def, DamageInfo.SourceCategory.ThingOrUnknown, null); extraDinfo.SetBodyRegion(BodyPartHeight.Undefined, BodyPartDepth.Outside); BodyPartGroupDef bodyPartGroupDef = __instance.verbProps.AdjustedLinkedBodyPartsGroup(__instance.tool); extraDinfo.SetWeaponBodyPartGroup(bodyPartGroupDef); HediffDef hediffDef = null; if (__instance.HediffCompSource != null) { hediffDef = __instance.HediffCompSource.Def; } extraDinfo.SetWeaponHediff(hediffDef); Vector3 direction = (target.Thing.Position - __instance.CasterPawn.Position).ToVector3(); extraDinfo.SetAngle(direction); newOutput.Add(extraDinfo); } if (__instance.CasterPawn.health.hediffSet.HasHediff(RWBYDefOf.RWBY_InjectedLightningCrystal)) // add Lightning Dust Crystal injection damage { float damageAmount = 20f + 10f * __instance.CasterPawn.health.hediffSet.hediffs.Find(h => h.def == RWBYDefOf.RWBY_InjectedLightningCrystal).CurStageIndex; DamageInfo extraDinfo = new DamageInfo(RWBYDefOf.RWBY_Lightning_Blunt, damageAmount, 0.5f, -1f, __instance.caster, null, __instance.CasterPawn.def, DamageInfo.SourceCategory.ThingOrUnknown, null); extraDinfo.SetBodyRegion(BodyPartHeight.Undefined, BodyPartDepth.Outside); BodyPartGroupDef bodyPartGroupDef = __instance.verbProps.AdjustedLinkedBodyPartsGroup(__instance.tool); extraDinfo.SetWeaponBodyPartGroup(bodyPartGroupDef); HediffDef hediffDef = null; if (__instance.HediffCompSource != null) { hediffDef = __instance.HediffCompSource.Def; } extraDinfo.SetWeaponHediff(hediffDef); Vector3 direction = (target.Thing.Position - __instance.CasterPawn.Position).ToVector3(); extraDinfo.SetAngle(direction); newOutput.Add(extraDinfo); } if (__instance.CasterPawn.health.hediffSet.HasHediff(RWBYDefOf.RWBY_InjectedGravityCrystal)) // add Gravity Dust Crystal injection damage { float damageAmount = 20f + 10f * __instance.CasterPawn.health.hediffSet.hediffs.Find(h => h.def == RWBYDefOf.RWBY_InjectedGravityCrystal).CurStageIndex; DamageInfo extraDinfo = new DamageInfo(DamageDefOf.Blunt, damageAmount, 0.5f, -1f, __instance.caster, null, __instance.CasterPawn.def, DamageInfo.SourceCategory.ThingOrUnknown, null); extraDinfo.SetBodyRegion(BodyPartHeight.Undefined, BodyPartDepth.Outside); BodyPartGroupDef bodyPartGroupDef = __instance.verbProps.AdjustedLinkedBodyPartsGroup(__instance.tool); extraDinfo.SetWeaponBodyPartGroup(bodyPartGroupDef); HediffDef hediffDef = null; if (__instance.HediffCompSource != null) { hediffDef = __instance.HediffCompSource.Def; } extraDinfo.SetWeaponHediff(hediffDef); Vector3 direction = (target.Thing.Position - __instance.CasterPawn.Position).ToVector3(); extraDinfo.SetAngle(direction); newOutput.Add(extraDinfo); } if (__instance.CasterPawn.health.hediffSet.HasHediff(RWBYDefOf.RWBY_InjectedHardLightCrystal)) // add HardLight Dust Crystal injection damage { float damageAmount = 20f + 10f * __instance.CasterPawn.health.hediffSet.hediffs.Find(h => h.def == RWBYDefOf.RWBY_InjectedHardLightCrystal).CurStageIndex; DamageInfo extraDinfo = new DamageInfo(RWBYDefOf.RWBY_Burn_Blunt, damageAmount, 0.5f, -1f, __instance.caster, null, __instance.CasterPawn.def, DamageInfo.SourceCategory.ThingOrUnknown, null); extraDinfo.SetBodyRegion(BodyPartHeight.Undefined, BodyPartDepth.Outside); BodyPartGroupDef bodyPartGroupDef = __instance.verbProps.AdjustedLinkedBodyPartsGroup(__instance.tool); extraDinfo.SetWeaponBodyPartGroup(bodyPartGroupDef); HediffDef hediffDef = null; if (__instance.HediffCompSource != null) { hediffDef = __instance.HediffCompSource.Def; } extraDinfo.SetWeaponHediff(hediffDef); Vector3 direction = (target.Thing.Position - __instance.CasterPawn.Position).ToVector3(); extraDinfo.SetAngle(direction); newOutput.Add(extraDinfo); } __result = newOutput; }
public static void DamageInfosToApply_ForceWeapon_Postfix(ref Verb_MeleeAttackDamage __instance, LocalTargetInfo target, ref IEnumerable <DamageInfo> __result) { if (__instance != null) { if (target == null) { return; } if (!target.HasThing) { return; } if (target.Pawn == null) { return; } if (__instance.CasterIsPawn) { Pawn Attacker = __instance.CasterPawn; Pawn hitPawn = target.Pawn; if (__instance.CasterPawn.isXenomorph()) { if (Attacker.def == XenomorphRacesDefOf.RRY_Xenomorph_FaceHugger) { if (!hitPawn.isPotentialHost() || Head(hitPawn) == null) { return; } DamageWorker.DamageResult result = new DamageWorker.DamageResult(); DamageDef def = __instance.verbProps.meleeDamageDef; float tgtmelee = 0f; float tgtdodge = 0f; float armour = 0f; if (hitPawn.RaceProps.Humanlike) { tgtmelee = hitPawn.skills.GetSkill(SkillDefOf.Melee).Level; } if (hitPawn.RaceProps.Humanlike) { tgtdodge = hitPawn.GetStatValue(StatDefOf.MeleeDodgeChance); } if (hitPawn.RaceProps.Humanlike) { if (hitPawn.apparel.WornApparel.Count > 0 && hitPawn.apparel.WornApparel is List <Apparel> wornApparel) { for (int i = 0; i < wornApparel.Count; i++) { bool flag2 = wornApparel[i].def.apparel.CoversBodyPart(Head(hitPawn)) || wornApparel[i].def.apparel.bodyPartGroups.Contains(BodyPartGroupDefOf.FullHead); if (flag2) { armour += wornApparel[i].def.statBases.GetStatOffsetFromList(def.armorCategory.armorRatingStat); } } } } float InfectionDefence = 50 + tgtmelee + (armour * 10); float InfecterRoll = (Rand.Value * 100) * (1 - tgtdodge); if ((InfecterRoll > InfectionDefence || (hitPawn.Downed || !hitPawn.Awake())) && !hitPawn.health.hediffSet.HasHediff(XenomorphDefOf.RRY_Hediff_Anesthetic)) { Hediff hediff = HediffMaker.MakeHediff(XenomorphDefOf.RRY_FaceHuggerInfection, hitPawn, null); Comp_Facehugger _Facehugger = Attacker.TryGetComp <Comp_Facehugger>(); HediffComp_XenoFacehugger comp = hediff.TryGetComp <HediffComp_XenoFacehugger>(); comp.instigator = Attacker; comp.instigatorKindDef = Attacker.kindDef; comp.royaleHugger = _Facehugger.RoyaleHugger; comp.previousImpregnations = _Facehugger.Impregnations; hitPawn.health.AddHediff(hediff, Head(hitPawn), null); string text = TranslatorFormattedStringExtensions.Translate("Xeno_Facehugger_Attach", hitPawn.LabelShort, Head(hitPawn).LabelShortCap); MoteMaker.ThrowText(hitPawn.Position.ToVector3(), hitPawn.Map, text, 5f); if (Attacker.Spawned) { Attacker.DeSpawn(); } comp.TryAcceptThing(Attacker); // comp.GetDirectlyHeldThings().TryAdd(CasterPawn); } } else { if (!hitPawn.isPotentialHost() || hitPawn.Awake()) { return; } HealthUtility.DamageUntilDowned(hitPawn, false); } } } } }