protected override Job TryGiveJob(Pawn pawn) { var myBuilding = CompMachine.cachedMachinesPawns[pawn].myBuilding; var buildingPosition = myBuilding.Position; Need_Power power = pawn.needs.TryGetNeed <Need_Power>(); if (power == null || power.CurLevelPercentage > maxLevelPercentage) { return(null); } if (myBuilding.Spawned && myBuilding.Map == pawn.Map && pawn.CanReserveAndReach(myBuilding, PathEndMode.OnCell, Danger.Deadly)) { if (pawn.Position != buildingPosition) { return(JobMaker.MakeJob(JobDefOf.Goto, buildingPosition)); } else { pawn.Rotation = Rot4.South; if (myBuilding.TryGetComp <CompPowerTrader>().PowerOn) { return(JobMaker.MakeJob(VFEDefOf.VFE_Mechanoids_Recharge, myBuilding)); } } } return(JobMaker.MakeJob(JobDefOf.Wait, 300)); }
public bool TryAddPawnForModification(Pawn pawn, RecipeDef recipeDef) { if ((!pawn.IsHacked() || (pawn.IsHacked() && pawn.Faction != Faction.OfPlayer))) { Bill_Medical bill = new Bill_Medical(recipeDef); IEnumerable <BodyPartRecord> bodyparts = RecipeUtility.GetPartsToApplyOn(pawn, bill.recipe); if (bodyparts.Count() == 0) { return(false); } if (pawn.health.surgeryBills.FirstShouldDoNow == null || pawn.health.surgeryBills.FirstShouldDoNow.recipe != WTH_DefOf.WTH_HackMechanoid) { pawn.health.surgeryBills.AddBill(bill); bill.Part = bodyparts.First(); } } Need_Power powerNeed = pawn.needs.TryGetNeed <Need_Power>(); if (powerNeed != null) { //discharge mech battery so pawns can work safely. powerNeed.CurLevel = 0; } pawn.jobs.TryTakeOrderedJob(new Job(WTH_DefOf.WTH_Mechanoid_Rest, this)); if (pawn.jobs.curDriver != null) { pawn.jobs.posture = PawnPosture.LayingInBed; } return(true); }
protected override Job TryGiveJob(Pawn pawn) { var buildingPosition = CompMachine.cachedMachinesPawns[pawn].myBuilding.Position; if (pawn.Position != buildingPosition) { return(JobMaker.MakeJob(JobDefOf.Goto, buildingPosition)); } else { pawn.Rotation = Rot4.South; Need_Power power = pawn.needs.TryGetNeed <Need_Power>(); if (power == null || power.CurLevelPercentage > maxLevelPercentage) { return(null); } var building = CompMachine.cachedMachinesPawns[pawn].myBuilding; if (building.TryGetComp <CompPowerTrader>().PowerOn) { return(JobMaker.MakeJob(VFEDefOf.VFE_Mechanoids_Recharge, building)); } else { return(JobMaker.MakeJob(JobDefOf.Wait, 300)); } } }
protected override Job TryGiveJob(Pawn pawn) { Need_Power power = pawn.needs.TryGetNeed <Need_Power>(); if (power == null || power.CurLevelPercentage > maxLevelPercentage) { return(null); } if (pawn.CurJobDef != VFEDefOf.VFE_Mechanoids_Recharge && power.CurCategory <= minCategory) { return(null); } var building = CompMachine.cachedMachinesPawns[pawn].myBuilding; if (building.Spawned && building.Map == pawn.Map && pawn.CanReserveAndReach(building, PathEndMode.OnCell, Danger.Deadly)) { if (building.TryGetComp <CompPowerTrader>().PowerOn) { return(JobMaker.MakeJob(VFEDefOf.VFE_Mechanoids_Recharge, building)); } else if (building.Position != pawn.Position) { return(JobMaker.MakeJob(JobDefOf.Goto, building)); } } return(null); }
private static IEnumerable <Gizmo> AddHackedPawnGizmos(Pawn __instance, ExtendedDataStorage store) { ExtendedPawnData pawnData = store.GetExtendedDataFor(__instance); yield return(CreateGizmo_SearchAndDestroy(__instance, pawnData)); Need_Power powerNeed = __instance.needs.TryGetNeed <Need_Power>(); Need_Maintenance maintenanceNeed = __instance.needs.TryGetNeed <Need_Maintenance>(); if (powerNeed != null) { yield return(CreateGizmo_AutoRecharge(__instance, powerNeed)); } HediffSet hediffSet = __instance.health.hediffSet; if (!__instance.IsColonistPlayerControlled) { if (__instance.apparel != null) { foreach (Gizmo apparelGizmo in __instance.apparel.GetGizmos()) { yield return(apparelGizmo); } } } if (__instance.workSettings != null) { yield return(CreateGizmo_Work(__instance, pawnData)); if (powerNeed != null) { yield return(CreateGizmo_WorkThreshold(__instance, powerNeed)); } } if (maintenanceNeed != null) { yield return(CreateGizmo_MaintenanceThreshold(__instance, maintenanceNeed)); } if (hediffSet.HasHediff(WTH_DefOf.WTH_SelfDestruct)) { yield return(CreateGizmo_SelfDestruct(__instance, pawnData)); } if (hediffSet.HasHediff(WTH_DefOf.WTH_RepairModule)) { yield return(CreateGizmo_SelfRepair(__instance, pawnData)); } if (hediffSet.HasHediff(WTH_DefOf.WTH_RepairModule) && hediffSet.HasHediff(WTH_DefOf.WTH_RepairArm)) { yield return(CreateGizmo_Repair(__instance, pawnData)); } if (hediffSet.HasHediff(WTH_DefOf.WTH_BeltModule)) { yield return(CreateGizmo_EquipBelt(__instance, pawnData)); } if (hediffSet.HasHediff(WTH_DefOf.WTH_OverdriveModule)) { yield return(CreateGizmo_Overdrive(__instance, pawnData)); } }
private static Gizmo CreateGizmo_SearchAndDestroy(Pawn __instance, ExtendedPawnData pawnData) { string disabledReason = ""; bool disabled = false; if (__instance.Downed) { disabled = true; disabledReason = "WTH_Reason_MechanoidDowned".Translate(); } else if (pawnData.shouldAutoRecharge) { Need_Power powerNeed = __instance.needs.TryGetNeed(WTH_DefOf.WTH_Mechanoid_Power) as Need_Power; if (powerNeed != null && powerNeed.CurCategory >= PowerCategory.LowPower) { disabled = true; disabledReason = "WTH_Reason_PowerLow".Translate(); } } Gizmo gizmo = new Command_Toggle { defaultLabel = "WTH_Gizmo_SearchAndDestroy_Label".Translate(), defaultDesc = "WTH_Gizmo_SearchAndDestroy_Description".Translate(), disabled = disabled, disabledReason = disabledReason, icon = ContentFinder <Texture2D> .Get(("UI/" + "Enable_SD"), true), isActive = () => pawnData.isActive, toggleAction = () => { pawnData.isActive = !pawnData.isActive; if (pawnData.isActive) { if (__instance.GetLord() == null || __instance.GetLord().LordJob == null) { LordMaker.MakeNewLord(Faction.OfPlayer, new LordJob_SearchAndDestroy(), __instance.Map, new List <Pawn> { __instance }); } __instance.jobs.EndCurrentJob(JobCondition.InterruptForced); if (__instance.relations == null) //Added here to fix existing saves. { __instance.relations = new Pawn_RelationsTracker(__instance); } } else { __instance.jobs.EndCurrentJob(JobCondition.InterruptForced); Building_BaseMechanoidPlatform closestAvailablePlatform = Utilities.GetAvailableMechanoidPlatform(__instance, __instance); if (closestAvailablePlatform != null) { Job job = new Job(WTH_DefOf.WTH_Mechanoid_Rest, closestAvailablePlatform); __instance.jobs.TryTakeOrderedJob(job); } } } }; return(gizmo); }
public static void SpawnHackedMechanoids(ref List <Pawn> list, IncidentParms parms) { if (list.Count == 0 || !(parms.raidArrivalMode == PawnsArrivalModeDefOf.EdgeWalkIn)) { return; } if (parms.faction == Faction.OfMechanoids) { return; } Random rand = new Random(DateTime.Now.Millisecond); if (rand.Next(0, 100) > Base.hackedMechChance) { return; } int minHackedMechPoints = Math.Min(Base.minHackedMechPoints, Base.maxHackedMechPoints); float maxMechPoints = parms.points * ((float)rand.Next(minHackedMechPoints, Base.maxHackedMechPoints)) / 100; //TODO: no magic numbers float cumulativePoints = 0; Map map = parms.target as Map; while (cumulativePoints < maxMechPoints) { PawnKindDef pawnKindDef = null; (from a in DefDatabase <PawnKindDef> .AllDefs where a.RaceProps.IsMechanoid && cumulativePoints + a.combatPower < maxMechPoints && Utilities.IsAllowedInModOptions(a.race.defName, parms.faction) //&& IsMountableUtility.isAllowedInModOptions(a.defName) select a).TryRandomElement(out pawnKindDef); if (pawnKindDef != null) { Pawn mechanoid = PawnGenerator.GeneratePawn(pawnKindDef, parms.faction); IntVec3 loc = CellFinder.RandomClosewalkCellNear(parms.spawnCenter, map, 8, null); GenSpawn.Spawn(mechanoid, loc, map, parms.spawnRotation); mechanoid.health.AddHediff(WTH_DefOf.WTH_TargetingHacked); mechanoid.health.AddHediff(WTH_DefOf.WTH_BackupBattery); Need_Power powerNeed = (Need_Power)mechanoid.needs.TryGetNeed(WTH_DefOf.WTH_Mechanoid_Power); powerNeed.CurLevel = powerNeed.MaxLevel; list.Add(mechanoid); cumulativePoints += pawnKindDef.combatPower; } else { break; } } foreach (Pawn pawn in list) { if (pawn.equipment == null) { pawn.equipment = new Pawn_EquipmentTracker(pawn); } } }
private static Gizmo CreateGizmo_SelfRepair(Pawn __instance, ExtendedPawnData pawnData) { CompRefuelable compRefuelable = __instance.GetComp <CompRefuelable>(); Need_Power powerNeed = __instance.needs.TryGetNeed <Need_Power>(); JobDef jobDef = WTH_DefOf.WTH_Ability_Repair; DefModExtension_Ability modExt = jobDef.GetModExtension <DefModExtension_Ability>(); bool alreadyRepairing = __instance.health.hediffSet.HasHediff(WTH_DefOf.WTH_Repairing); bool needsMorePower = powerNeed.CurLevel < modExt.powerDrain; bool needsMoreFuel = compRefuelable.Fuel < modExt.fuelDrain; bool notActicated = !__instance.IsActivated(); bool noDamage = !__instance.health.hediffSet.HasNaturallyHealingInjury(); bool isDisabled = alreadyRepairing || needsMorePower || needsMoreFuel || notActicated || noDamage; string disabledReason = ""; if (isDisabled) { if (alreadyRepairing) { disabledReason = "WTH_Reason_AlreadyRepairing".Translate(); } else if (notActicated) { disabledReason = "WTH_Reason_NotActivated".Translate(); } else if (noDamage) { disabledReason = "WTH_Reason_NoDamage".Translate(); } else if (needsMorePower) { disabledReason = "WTH_Reason_NeedsMorePower".Translate(new object[] { modExt.powerDrain }); } else if (needsMoreFuel) { disabledReason = "WTH_Reason_NeedsMoreFuel".Translate(new object[] { modExt.fuelDrain }); } } Gizmo gizmo = new Command_Action { defaultLabel = "WTH_Gizmo_SelfRepair_Label".Translate(), defaultDesc = "WTH_Gizmo_SelfRepair_Description".Translate(), icon = ContentFinder <Texture2D> .Get(("Things/" + "Mote_HealingCrossGreen"), true), disabled = isDisabled, disabledReason = disabledReason, action = delegate { Job job = new Job(WTH_DefOf.WTH_Ability_Repair, __instance); __instance.jobs.StartJob(job, JobCondition.InterruptForced); } }; return(gizmo); }
static void Postfix(ref Pawn_JobTracker __instance, ref ThinkResult __result) { Pawn pawn = Traverse.Create(__instance).Field("pawn").GetValue <Pawn>(); if (!pawn.RaceProps.IsMechanoid) { return; } ExtendedDataStorage store = Base.Instance.GetExtendedDataStorage(); if (store != null) { //de-activate if should auto recharge and power is very low. ExtendedPawnData pawnData = store.GetExtendedDataFor(pawn); Need_Power powerNeed = pawn.needs.TryGetNeed(WTH_DefOf.WTH_Mechanoid_Power) as Need_Power; if (powerNeed != null && powerNeed.CurCategory >= PowerCategory.LowPower && pawnData.shouldAutoRecharge && pawn.IsActivated() ) { pawn.drafter.Drafted = false; pawnData.isActive = false; } } if (pawn.Faction == Faction.OfPlayer && pawn.IsHacked() && !pawn.IsActivated() && pawn.OnBaseMechanoidPlatform() && pawn.CanReserve(pawn.CurrentBed())) { Job job = new Job(WTH_DefOf.WTH_Mechanoid_Rest, pawn.CurrentBed()); job.count = 1; __result = new ThinkResult(job, __result.SourceNode, __result.Tag, false); } if (pawn.Downed) { return; } if (pawn.IsHacked() && pawn.IsActivated() && pawn.health.hediffSet.HasHediff(WTH_DefOf.WTH_TargetingHackedPoorly)) { HackedPoorlyEvent(pawn); } if (pawn.Faction == Faction.OfPlayer && pawn.IsHacked() && !pawn.IsActivated() && !pawn.OnBaseMechanoidPlatform() && __result.Job.def != WTH_DefOf.WTH_Mechanoid_Rest) { Building_BaseMechanoidPlatform closestAvailablePlatform = Utilities.GetAvailableMechanoidPlatform(pawn, pawn); if (closestAvailablePlatform != null && pawn.CanReserve(closestAvailablePlatform)) { Job job = new Job(WTH_DefOf.WTH_Mechanoid_Rest, closestAvailablePlatform); __result = new ThinkResult(job, __result.SourceNode, __result.Tag, false); } } }
public static bool ShouldRecharge(this Pawn pawn) { Need_Power powerNeed = pawn.needs.TryGetNeed(WTH_DefOf.WTH_Mechanoid_Power) as Need_Power; if (powerNeed != null && powerNeed.CurCategory >= PowerCategory.LowPower && powerNeed.shouldAutoRecharge ) { return(true); } return(false); }
private static Gizmo CreateGizmo_Repair(Pawn __instance, ExtendedPawnData pawnData) { CompRefuelable compRefuelable = __instance.GetComp <CompRefuelable>(); Need_Power powerNeed = __instance.needs.TryGetNeed <Need_Power>(); JobDef jobDef = WTH_DefOf.WTH_Ability_Repair; DefModExtension_Ability modExt = jobDef.GetModExtension <DefModExtension_Ability>(); bool alreadyRepairing = __instance.health.hediffSet.HasHediff(WTH_DefOf.WTH_Repairing); bool needsMorePower = powerNeed.CurLevel < modExt.powerDrain; bool needsMoreFuel = compRefuelable.Fuel < modExt.fuelDrain; bool notActicated = !__instance.IsActivated(); bool isDisabled = needsMorePower || needsMoreFuel || notActicated; string disabledReason = ""; if (isDisabled) { if (needsMorePower) { disabledReason = "WTH_Reason_NeedsMorePower".Translate(new object[] { modExt.powerDrain }); } else if (needsMoreFuel) { disabledReason = "WTH_Reason_NeedsMoreFuel".Translate(new object[] { modExt.fuelDrain }); } else if (notActicated) { disabledReason = "WTH_Reason_NotActivated".Translate(); } } Gizmo gizmo = new Command_Target { defaultLabel = "WTH_Gizmo_Mech_Repair_Label".Translate(), defaultDesc = "WTH_Gizmo_Mech_Repair_Description".Translate(), icon = ContentFinder <Texture2D> .Get(("Things/" + "Mote_HealingCrossBlue"), true), //TODO: other icon disabled = isDisabled, targetingParams = GetTargetingParametersForRepairing(), disabledReason = disabledReason, action = delegate(LocalTargetInfo target) { if (target.HasThing && target.Thing is Pawn mech) { Job job = new Job(WTH_DefOf.WTH_Ability_Repair, target); __instance.jobs.StartJob(job, JobCondition.InterruptForced); } } }; return(gizmo); }
private static void DisableCommandIfMechanoidPowerLow(Pawn_DraftController __instance, Command_Toggle toggleCommand) { Need_Power powerNeed = __instance.pawn.needs.TryGetNeed(WTH_DefOf.WTH_Mechanoid_Power) as Need_Power; ExtendedDataStorage store = Base.Instance.GetExtendedDataStorage(); if (powerNeed != null && store != null) { ExtendedPawnData pawnData = store.GetExtendedDataFor(__instance.pawn); if (pawnData.shouldAutoRecharge && powerNeed.CurCategory >= PowerCategory.LowPower) { toggleCommand.Disable("WTH_Reason_PowerLow".Translate()); } } }
private static void AddHackedPawnGizmos(Pawn __instance, ref List <Gizmo> gizmoList, ExtendedDataStorage store) { ExtendedPawnData pawnData = store.GetExtendedDataFor(__instance); gizmoList.Add(CreateGizmo_SearchAndDestroy(__instance, pawnData)); Need_Power powerNeed = __instance.needs.TryGetNeed <Need_Power>(); if (powerNeed != null) { gizmoList.Add(CreateGizmo_AutoRecharge(__instance, powerNeed)); } HediffSet hediffSet = __instance.health.hediffSet; if (!__instance.IsColonistPlayerControlled) { if (__instance.apparel != null) { foreach (Gizmo apparelGizmo in __instance.apparel.GetGizmos()) { gizmoList.Add(apparelGizmo); } } } if (__instance.workSettings != null) { gizmoList.Add(CreateGizmo_Work(__instance, pawnData)); if (powerNeed != null) { gizmoList.Add(CreateGizmo_WorkThreshold(__instance, powerNeed)); } } if (hediffSet.HasHediff(WTH_DefOf.WTH_SelfDestruct)) { gizmoList.Add(CreateGizmo_SelfDestruct(__instance, pawnData)); } if (hediffSet.HasHediff(WTH_DefOf.WTH_RepairModule)) { gizmoList.Add(CreateGizmo_SelfRepair(__instance, pawnData)); } if (hediffSet.HasHediff(WTH_DefOf.WTH_RepairModule) && hediffSet.HasHediff(WTH_DefOf.WTH_RepairArm)) { gizmoList.Add(CreateGizmo_Repair(__instance, pawnData)); } if (hediffSet.HasHediff(WTH_DefOf.WTH_BeltModule)) { gizmoList.Add(CreateGizmo_EquipBelt(__instance, pawnData)); } }
private static Gizmo CreateGizmo_AutoRecharge(Pawn __instance, Need_Power powerNeed) { Gizmo gizmo = new Command_Toggle { defaultLabel = "WTH_Gizmo_AutoRecharge_Label".Translate(), defaultDesc = "WTH_Gizmo_AutoRecharge_Description".Translate(), icon = ContentFinder <Texture2D> .Get(("UI/" + "AutoRecharge"), true), isActive = () => powerNeed.shouldAutoRecharge, toggleAction = () => { powerNeed.shouldAutoRecharge = !powerNeed.shouldAutoRecharge; } }; return(gizmo); }
private static Gizmo CreateGizmo_WorkThreshold(Pawn __instance, Need_Power powerNeed) { string disabledReason = ""; bool disabled = false; Gizmo gizmo = new Command_SetWorkThreshold { powerNeed = powerNeed, defaultLabel = "WTH_Gizmo_WorkThreshold_Label".Translate(), defaultDesc = "WTH_Gizmo_WorkThreshold_Description".Translate(), disabled = disabled, disabledReason = disabledReason, icon = ContentFinder <Texture2D> .Get(("UI/" + "MechanoidWorkThreshold"), true), }; return(gizmo); }
private static Gizmo CreateGizmo_Overdrive(Pawn __instance, ExtendedPawnData pawnData) { Need_Power powerNeed = __instance.needs.TryGetNeed <Need_Power>(); JobDef jobDef = WTH_DefOf.WTH_Ability_Overdrive; DefModExtension_Ability modExt = jobDef.GetModExtension <DefModExtension_Ability>(); bool alreadyOverdriving = __instance.health.hediffSet.HasHediff(WTH_DefOf.WTH_Overdrive); bool needsMorePower = powerNeed.CurLevel < modExt.powerDrain; bool notActicated = !__instance.IsActivated(); bool isDisabled = needsMorePower || notActicated || alreadyOverdriving; string disabledReason = ""; if (isDisabled) { if (alreadyOverdriving) { disabledReason = "WTH_Reason_AlreadyOverdriving".Translate(); } else if (needsMorePower) { disabledReason = "WTH_Reason_NeedsMorePower".Translate(new object[] { modExt.powerDrain }); } else if (notActicated) { disabledReason = "WTH_Reason_NotActivated".Translate(); } } Gizmo gizmo = new Command_Action { defaultLabel = "WTH_Gizmo_Overdrive_Label".Translate(), defaultDesc = "WTH_Gizmo_Overdrive_Description".Translate(), icon = ContentFinder <Texture2D> .Get(("Things/" + "OverdriveModule"), true), disabled = isDisabled, disabledReason = disabledReason, action = delegate { Job job = new Job(WTH_DefOf.WTH_Ability_Overdrive, __instance); __instance.jobs.StartJob(job, JobCondition.InterruptForced); } }; return(gizmo); }
private static Gizmo CreateGizmo_SelfDestruct(Pawn pawn, ExtendedPawnData pawnData) { Need_Power powerNeed = pawn.needs.TryGetNeed <Need_Power>(); float powerDrain = 10f; bool needsMorePower = powerNeed.CurLevel < powerDrain; bool notActicated = !pawn.IsActivated(); bool isDisabled = needsMorePower || notActicated; string disabledReason = ""; if (isDisabled) { if (notActicated) { disabledReason = "WTH_Reason_NotActivated".Translate(); } else if (needsMorePower) { disabledReason = "WTH_Reason_NeedsMorePower".Translate(new object[] { powerDrain }); } } Gizmo gizmo = new Command_Action { defaultLabel = "WTH_Gizmo_SelfDestruct_Label".Translate(), defaultDesc = "WTH_Gizmo_SelfDestruct_Description".Translate(), icon = ContentFinder <Texture2D> .Get(("UI/" + "Detonate"), true), disabled = isDisabled, disabledReason = disabledReason, action = delegate { Job job = new Job(WTH_DefOf.WTH_Ability, pawn) { count = 150, playerForced = true }; pawn.jobs.StartJob(job, JobCondition.InterruptForced); pawn.jobs.curDriver.AddFinishAction(delegate { if (pawn.jobs.curDriver is JobDriver_Ability jobDriver && !pawn.Dead && jobDriver.finished) { powerNeed.CurLevel -= powerDrain; pawnData.shouldExplodeNow = true; } });
public override float GetPriority(Pawn pawn) { Need_Power power = pawn.needs.TryGetNeed <Need_Power>(); if (power == null) { return(0f); } if ((int)power.CurCategory < (int)minCategory) { return(0f); } if (power.CurLevelPercentage > maxLevelPercentage) { return(0f); } return(8f); }
public static bool CanStartWorkNow(this Pawn pawn) { ExtendedDataStorage store = Base.Instance.GetExtendedDataStorage(); if (store != null) { Need_Power powerNeed = pawn.needs.TryGetNeed <Need_Power>(); if (pawn.Downed || pawn.ShouldRecharge() || (pawn.OnBaseMechanoidPlatform() && powerNeed.CurLevelPercentage <= powerNeed.canStartWorkThreshold) || pawn.OnHackingTable()) { return(false); } ExtendedPawnData pawnData = store.GetExtendedDataFor(pawn); return(pawnData.canWorkNow); } return(false); }
private static Gizmo CreateGizmo_SelfDestruct(Pawn pawn, ExtendedPawnData pawnData) { Need_Power powerNeed = pawn.needs.TryGetNeed <Need_Power>(); JobDef jobDef = WTH_DefOf.WTH_Ability_SelfDestruct; DefModExtension_Ability modExt = jobDef.GetModExtension <DefModExtension_Ability>(); bool needsMorePower = powerNeed.CurLevel < modExt.powerDrain; bool notActicated = !pawn.IsActivated(); bool isDisabled = needsMorePower || notActicated; string disabledReason = ""; if (isDisabled) { if (notActicated) { disabledReason = "WTH_Reason_NotActivated".Translate(); } else if (needsMorePower) { disabledReason = "WTH_Reason_NeedsMorePower".Translate(new object[] { modExt.powerDrain }); } } Gizmo gizmo = new Command_Action { defaultLabel = "WTH_Gizmo_SelfDestruct_Label".Translate(), defaultDesc = "WTH_Gizmo_SelfDestruct_Description".Translate(), icon = ContentFinder <Texture2D> .Get(("UI/" + "Detonate"), true), disabled = isDisabled, disabledReason = disabledReason, action = delegate { Job job = new Job(WTH_DefOf.WTH_Ability_SelfDestruct, pawn); pawn.jobs.StartJob(job, JobCondition.InterruptForced); } }; return(gizmo); }
//returns pawns for compatibility reasons. public static void SpawnHackedMechanoids(List <Pawn> pawns, IncidentParms parms) { if (pawns.Count == 0) { return; } if (parms.faction == Faction.OfMechanoids) { return; } Random rand = new Random(DateTime.Now.Millisecond); if (rand.Next(0, 100) > Base.hackedMechChance) { return; } int minHackedMechPoints = Math.Min(Base.minHackedMechPoints, Base.maxHackedMechPoints); float maxMechPoints = parms.points * ((float)rand.Next(minHackedMechPoints, Base.maxHackedMechPoints)) / 100f; //TODO: no magic numbers float cumulativePoints = 0; Map map = parms.target as Map; List <Pawn> addedPawns = new List <Pawn>(); while (cumulativePoints < maxMechPoints) { PawnKindDef pawnKindDef = null; IEnumerable <PawnKindDef> selectedPawns = (from a in DefDatabase <PawnKindDef> .AllDefs where a.RaceProps.IsMechanoid && cumulativePoints + a.combatPower < maxMechPoints && Utilities.IsAllowedInModOptions(a.race.defName, parms.faction) && (parms.raidArrivalMode == PawnsArrivalModeDefOf.EdgeWalkIn || a.RaceProps.baseBodySize <= 1) //Only allow small mechs to use drop pods select a); if (selectedPawns != null) { selectedPawns.TryRandomElement(out pawnKindDef); } if (pawnKindDef != null) { Pawn mechanoid = PawnGenerator.GeneratePawn(pawnKindDef, parms.faction); if (parms.raidArrivalMode == PawnsArrivalModeDefOf.EdgeWalkIn) { IntVec3 loc = CellFinder.RandomClosewalkCellNear(parms.spawnCenter, map, 8, null); GenSpawn.Spawn(mechanoid, loc, map, parms.spawnRotation); } mechanoid.health.AddHediff(WTH_DefOf.WTH_TargetingHacked); mechanoid.health.AddHediff(WTH_DefOf.WTH_BackupBattery); Need_Power powerNeed = (Need_Power)mechanoid.needs.TryGetNeed(WTH_DefOf.WTH_Mechanoid_Power); powerNeed.CurLevel = powerNeed.MaxLevel; addedPawns.Add(mechanoid); cumulativePoints += pawnKindDef.combatPower; AddModules(mechanoid); } else { break; } } if (addedPawns.Count > 0 && !addedPawns[0].Spawned) { parms.raidArrivalMode.Worker.Arrive(addedPawns, parms); } pawns.AddRange(addedPawns); foreach (Pawn pawn in pawns) { if (pawn.equipment == null) { pawn.equipment = new Pawn_EquipmentTracker(pawn); } } }