Exemplo n.º 1
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);
    }
Exemplo n.º 2
0
     public static DamageInfo GetForceDamage(DamageInfo cloneSource, Pawn Caster, Thing target)
     {
         if (Caster != null)
         {
             if (Caster.isPsyker(out int Level, out float Mult))
             {
                 //    log.message(Caster.NameShortColored + " Level " + Level + " Mult " + Mult);
                 if (cloneSource.Weapon != null)
                 {
                     Thing Weapon = null;
                     if (cloneSource.Weapon.IsWeapon)
                     {
                         foreach (var item in Caster.equipment.AllEquipmentListForReading)
                         {
                             if (item.def == cloneSource.Weapon)
                             {
                                 Weapon = item;
                             }
                         }
                     }
                     else
                     if (cloneSource.Weapon.IsApparel)
                     {
                         foreach (var item in Caster.apparel.WornApparel)
                         {
                             if (item.def == cloneSource.Weapon)
                             {
                                 Weapon = item;
                             }
                         }
                     }
                     if (Weapon != null)
                     {
                         Weapon = Caster.equipment.Primary;
                     }
                     CompWeapon_MeleeSpecialRules     WeaponRules = Weapon.TryGetCompFast <CompWeapon_MeleeSpecialRules>();
                     CompForceWeaponActivatableEffect compForce   = Weapon.TryGetCompFast <CompForceWeaponActivatableEffect>();
                     if (WeaponRules != null || compForce != null)
                     {
                         if (WeaponRules?.ForceWeapon ?? compForce != null)
                         {
                             bool requiresPsyker           = WeaponRules?.ForceEffectRequiresPsyker ?? compForce.ForceEffectRequiresPsyker;
                             bool casterPsychiclySensitive = Caster.RaceProps.Humanlike && (Caster.story.traits.HasTrait(TraitDefOf.PsychicSensitivity) || Caster.story.traits.HasTrait(DefDatabase <TraitDef> .GetNamedSilentFail("Psyker")));
                             bool Activate = false;
                             if ((casterPsychiclySensitive || !requiresPsyker) && target.def.category == ThingCategory.Pawn && target is Pawn Victim)
                             {
                                 int casterPsychiclySensitiveDegree = casterPsychiclySensitive ? Caster.story.traits.DegreeOfTrait(TraitDefOf.PsychicSensitivity) : 0;
                                 if ((casterPsychiclySensitiveDegree >= 1 || !requiresPsyker))
                                 {
                                     float?casterPsychicSensitivity = Caster.GetStatValue(StatDefOf.PsychicSensitivity, true) * 100f;
                                     bool  targetPsychiclySensitive = Victim.RaceProps.Humanlike && Victim.story.traits.HasTrait(TraitDefOf.PsychicSensitivity);
                                     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 ?? compForce.ForceWeaponEffect;
                                             float     damAmount        = cloneSource.Amount;
                                             float     armorPenetration = cloneSource.ArmorPenetrationInt;
                                             Rand.PushState();
                                             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;
                                             Rand.PopState();
                                             BodyPartGroupDef bodyPartGroupDef = null;
                                             HediffDef        hediffDef        = WeaponRules?.ForceWeaponHediff ?? compForce.ForceWeaponHediff;
                                             damAmount = Rand.Range(damAmount * 0.1f, damAmount * 0.5f);
                                             ThingDef   source    = cloneSource.Weapon;
                                             Thing      caster    = Caster;
                                             Vector3    direction = (target.Position - Caster.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.Position;
                                             Map      map2            = map;
                                             float    explosionRadius = 0f;
                                             Thing    launcher        = Weapon;
                                             SoundDef soundExplode    = WeaponRules?.ForceWeaponTriggerSound ?? compForce.ForceWeaponTriggerSound;
                                             Thing    thing           = target;
                                             GenExplosion.DoExplosion(position, map2, explosionRadius, damDef, launcher, (int)damAmount, armorPenetration, soundExplode, source, null, thing, null, 0f, 0, false, null, 0, 0, 0, false);
                                             TaggedString   msg        = "AdeptusMechanicus.ForceStrike";
                                             MessageTypeDef typeDef    = MessageTypeDefOf.NegativeHealthEvent;
                                             float          KillChance = WeaponRules?.ForceWeaponKillChance ?? compForce.ForceWeaponKillChance;
                                             if (KillChance != 0)
                                             {
                                                 Rand.PushState();
                                                 float KillRoll = Rand.Range(0, 100);
                                                 if (Rand.Chance(KillChance))
                                                 {
                                                     typeDef = MessageTypeDefOf.PawnDeath;
                                                 }
                                                 Rand.PopState();
                                             }
                                             if (typeDef == MessageTypeDefOf.PawnDeath)
                                             {
                                                 Victim.Kill(mainDinfo);
                                             }
                                             if (Victim.Faction == Faction.OfPlayer)
                                             {
                                                 Messages.Message(string.Format("AdeptusMechanicus.Force_Strike ".Translate(), Victim.Name, typeDef == MessageTypeDefOf.PawnDeath ? "slain" : "blasted"), typeDef);
                                             }
                                             return(mainDinfo);
                                         }
                                     }
                             }
                         }
                     }
                 }
             }
         }
     }
     return(cloneSource);
 }