public override void PawnDied(Corpse corpse) { if (!AndroidsModSettings.Instance.androidExplodesOnDeath) { return; } //Pawn Pawn pawn = corpse.InnerPawn; //Try get energy tracker. EnergyTrackerComp energy = pawn.TryGetComp <EnergyTrackerComp>(); bool shouldBeDeadByNaturalCauses = pawn.health.hediffSet.hediffs.Any(hediff => hediff.CauseDeathNow()); Hediff overheatingHediff = pawn.health.hediffSet.GetFirstHediffOfDef(HediffDefOf.ChjOverheating); bool deadFromOverheating = overheatingHediff != null ? overheatingHediff.Severity >= 1f : false; if (overheatingHediff != null || !shouldBeDeadByNaturalCauses) { float explosionRadius = AndroidsModSettings.Instance.androidExplosionRadius * energy.energy; if (deadFromOverheating) { explosionRadius *= 2; } //Scale explosion strength from how much remaining energy we got. if (explosionRadius >= 1f) { GenExplosion.DoExplosion(corpse.Position, corpse.Map, explosionRadius, RimWorld.DamageDefOf.Bomb, corpse.InnerPawn); } } //Remove corpse. if (!corpse.Destroyed) { ButcherUtility.SpawnDrops(corpse.InnerPawn, corpse.Position, corpse.Map); //Dump inventory. if (corpse.InnerPawn.apparel != null) { corpse.InnerPawn.apparel.DropAll(corpse.PositionHeld); } corpse.Destroy(DestroyMode.Vanish); } }
// Token: 0x060000F0 RID: 240 RVA: 0x00009888 File Offset: 0x00007A88 public override void ApplyOnPawn(Pawn pawn, BodyPartRecord part, Pawn billDoer, List <Thing> ingredients, Bill bill) { Need_Energy need_Energy = pawn.needs.TryGetNeed <Need_Energy>(); EnergyTrackerComp energyTrackerComp = pawn.TryGetComp <EnergyTrackerComp>(); bool flag = need_Energy != null; if (flag) { need_Energy.CurLevelPercentage = 0f; } bool flag2 = energyTrackerComp != null; if (flag2) { energyTrackerComp.energy = 0f; } ButcherUtility.SpawnDrops(pawn, pawn.Position, pawn.Map); pawn.Kill(null, null); }
public override void ApplyOnPawn(Pawn pawn, BodyPartRecord part, Pawn billDoer, List <Thing> ingredients, Bill bill) { //Set the power Need and EnergyTrackerComp to 0. Need_Energy needEnergy = pawn.needs.TryGetNeed <Need_Energy>(); EnergyTrackerComp energyTrackerComp = pawn.TryGetComp <EnergyTrackerComp>(); if (needEnergy != null) { needEnergy.CurLevelPercentage = 0f; } if (energyTrackerComp != null) { energyTrackerComp.energy = 0f; } //Spawn extra butcher products. ButcherUtility.SpawnDrops(pawn, pawn.Position, pawn.Map); pawn.Kill(null); }
// Token: 0x060000EB RID: 235 RVA: 0x0000969C File Offset: 0x0000789C public override void PawnDied(Corpse corpse) { bool flag = !AndroidsModSettings.Instance.androidExplodesOnDeath; if (!flag) { Pawn innerPawn = corpse.InnerPawn; EnergyTrackerComp energyTrackerComp = corpse.InnerPawn.TryGetComp <EnergyTrackerComp>(); bool flag2 = energyTrackerComp != null; if (flag2) { bool flag3 = innerPawn.health.hediffSet.hediffs.Any((Hediff hediff) => hediff.CauseDeathNow()); Hediff firstHediffOfDef = innerPawn.health.hediffSet.GetFirstHediffOfDef(HediffDefOf.ChjOverheating, false); bool flag4 = firstHediffOfDef != null && firstHediffOfDef.Severity >= 1f; bool flag5 = flag4 || !flag3; if (flag5) { float num = AndroidsModSettings.Instance.androidExplosionRadius * energyTrackerComp.energy; bool flag6 = flag4; if (flag6) { num *= 2f; } bool flag7 = num >= 1f; if (flag7) { GenExplosion.DoExplosion(corpse.Position, corpse.Map, num, DamageDefOf.Bomb, corpse.InnerPawn, -1, null, null, null, null, 0f, 1, false, null, 0f, 1, 0f, false); } } } else { Log.Warning("Androids.DeathActionWorker_Android: EnergyTrackerComp is null at " + corpse.ThingID); } } }
public override void PawnDied(Corpse corpse) { //Log.Message("Inside DeathActionWorker"); if (!AndroidsModSettings.Instance.androidExplodesOnDeath) { return; } //Pawn Pawn pawn = corpse.InnerPawn; //Try get energy tracker. EnergyTrackerComp energy = pawn.TryGetComp <EnergyTrackerComp>(); if (energy != null) { //Log.Message("EnergyTracker"); //Make sure we did not die from natural causes. As natural as an Android can be. bool shouldBeDeadByNaturalCauses = pawn.health.hediffSet.hediffs.Any(hediff => hediff.CauseDeathNow()); Hediff overheatingHediff = pawn.health.hediffSet.GetFirstHediffOfDef(HediffDefOf.ChjOverheating); //bool deadFromOverheating = overheatingHediff != null ? overheatingHediff.Severity >= 1f : false; if (overheatingHediff == null) { return; } //Overheating death is excepted. if (overheatingHediff != null || !shouldBeDeadByNaturalCauses) { float explosionRadius = overheatingHediff.Severity * AndroidsModSettings.Instance.androidExplosionRadius * energy.energy; //if (deadFromOverheating) // explosionRadius *= 2; //Scale explosion strength from how much remaining energy we got. if (overheatingHediff != null && explosionRadius >= 1f) { GenExplosion.DoExplosion(corpse.Position, corpse.Map, explosionRadius, RimWorld.DamageDefOf.Bomb, corpse.InnerPawn); } } } else { //Log.Message("Android Like"); //Attempt to get the energy need directly. if (pawn.health.hediffSet.GetFirstHediffOfDef(HediffDefOf.ChjAndroidLike) is Hediff androidLike && androidLike is AndroidLikeHediff androidLikeForReal) { //Make sure we did not die from natural causes. As natural as an Android can be. bool shouldBeDeadByNaturalCauses = pawn.health.hediffSet.hediffs.Any(hediff => hediff.CauseDeathNow()); Hediff overheatingHediff = pawn.health.hediffSet.GetFirstHediffOfDef(HediffDefOf.ChjOverheating); //bool deadFromOverheating = overheatingHediff != null ? overheatingHediff.Severity >= 1f : false; if (overheatingHediff == null) { return; } //Overheating death is excepted. if (overheatingHediff != null || !shouldBeDeadByNaturalCauses) { float explosionRadius = overheatingHediff.Severity * AndroidsModSettings.Instance.androidExplosionRadius * androidLikeForReal.energyTracked; //if (deadFromOverheating) // explosionRadius *= 2; //Scale explosion strength from how much remaining energy we got. if (overheatingHediff != null && explosionRadius >= 1f) { GenExplosion.DoExplosion(corpse.Position, corpse.Map, explosionRadius, RimWorld.DamageDefOf.Bomb, corpse.InnerPawn); } } return; }