// I wanted them to repair forbidden doors, but can't get it working. static bool Prefix(JobDriver_Repair __instance, ref IEnumerable <Toil> __result) { JobDriver_Repair new_this = __instance; List <Toil> new_result = new List <Toil>(); BindingFlags bindFlags = BindingFlags.Instance | BindingFlags.NonPublic; FieldInfo field_ticksToNextRepair = typeof(JobDriver_Repair).GetField("ticksToNextRepair", bindFlags); float new_ticksToNextRepair = (float)field_ticksToNextRepair.GetValue(__instance); PropertyInfo field_baseTargetThingA = typeof(JobDriver_Repair).GetProperty("TargetThingA", bindFlags); Thing new_baseTargetThingA = (Thing)field_baseTargetThingA.GetValue(__instance); PropertyInfo field_baseMap = typeof(JobDriver_Repair).GetProperty("Map", bindFlags); Map new_baseMap = (Map)field_baseMap.GetValue(__instance); //new_this.FailOnDespawnedOrNull(TargetIndex.A); new_result.Add(Toils_Goto.GotoThing(TargetIndex.A, PathEndMode.Touch)); Toil repair = new Toil(); repair.initAction = delegate { //ticksToNextRepair = 80f; field_ticksToNextRepair.SetValue(__instance, 80f); }; repair.tickAction = delegate { Pawn actor = repair.actor; actor.skills.Learn(SkillDefOf.Construction, 0.05f); float num = actor.GetStatValue(StatDefOf.ConstructionSpeed) * 1.7f; //ticksToNextRepair -= num; field_ticksToNextRepair.SetValue(__instance, ((float)field_ticksToNextRepair.GetValue(__instance)) - num); if (((float)field_ticksToNextRepair.GetValue(__instance)) <= 0f) { //ticksToNextRepair += 20f; field_ticksToNextRepair.SetValue(__instance, ((float)field_ticksToNextRepair.GetValue(__instance)) + 20f); new_baseTargetThingA.HitPoints++; new_baseTargetThingA.HitPoints = Mathf.Min(new_baseTargetThingA.HitPoints, new_baseTargetThingA.MaxHitPoints); new_baseMap.listerBuildingsRepairable.Notify_BuildingRepaired((Building)new_baseTargetThingA); if (new_baseTargetThingA.HitPoints == new_baseTargetThingA.MaxHitPoints) { actor.records.Increment(RecordDefOf.ThingsRepaired); actor.jobs.EndCurrentJob(JobCondition.Succeeded); } } }; repair.FailOnCannotTouch(TargetIndex.A, PathEndMode.Touch); repair.WithEffect(new_baseTargetThingA.def.repairEffect, TargetIndex.A); repair.defaultCompleteMode = ToilCompleteMode.Never; repair.activeSkill = (() => SkillDefOf.Construction); new_result.Add(repair); __result = new_result.AsEnumerable <Toil>(); return(false); }
public static bool MakeNewToilsPrefix(JobDriver_Repair __instance, ref IEnumerable <Toil> __result) { if (WorkRebalancerMod.Instance.Prof.RestoreWhenHostileDetected && HostileHandler.HostileDetected) { return(true); } __result = MakeNewToils(__instance, WorkRebalancerMod.Instance.Prof.RepairJobAddX); return(false); }
public static IEnumerable <Toil> MakeNewToils(JobDriver_Repair __instance, int repairInTick = 1) { __instance.FailOnDespawnedNullOrForbidden(TargetIndex.A); yield return(Toils_Goto.GotoThing(TargetIndex.A, PathEndMode.Touch)); Toil repair = new Toil(); Thing TargetThingA = Traverse.Create(__instance).Property("TargetThingA").GetValue <Thing>(); repair.initAction = () => TicksToNextRepair.SetValue(__instance, 80f); repair.tickAction = () => { Pawn actor = repair.actor; actor.skills.Learn(SkillDefOf.Construction, 0.05f); float statValue = actor.GetStatValue(StatDefOf.ConstructionSpeed); float ticksToNextRepair = (float)TicksToNextRepair.GetValue(__instance) - statValue; TicksToNextRepair.SetValue(__instance, ticksToNextRepair); // this.ticksToNextRepair -= statValue; if (ticksToNextRepair <= 0f) { ticksToNextRepair += 20f; TicksToNextRepair.SetValue(__instance, ticksToNextRepair); //TargetThingA.HitPoints++; TargetThingA.HitPoints += repairInTick; TargetThingA.HitPoints = Mathf.Min(TargetThingA.HitPoints, TargetThingA.MaxHitPoints); Map Map = Traverse.Create(__instance).Property("Map").GetValue <Map>(); Map.listerBuildingsRepairable.Notify_BuildingRepaired((Building)TargetThingA); if (TargetThingA.HitPoints == TargetThingA.MaxHitPoints) { actor.records.Increment(RecordDefOf.ThingsRepaired); actor.jobs.EndCurrentJob(JobCondition.Succeeded); } } }; repair.FailOnCannotTouch(TargetIndex.A, PathEndMode.Touch); repair.WithEffect(TargetThingA.def.repairEffect, TargetIndex.A); repair.defaultCompleteMode = ToilCompleteMode.Never; repair.activeSkill = (() => SkillDefOf.Construction); yield return(repair); }