Beispiel #1
0
        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
            {
            }
        }
Beispiel #2
0
        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);
                                                                }
                                                            }
                                                        }

                                                        /*
                                                         */
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
Beispiel #3
0
 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;
 }
Beispiel #4
0
        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);
    }
Beispiel #5
0
        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);
                        }
                    }
                }
            }
        }