Example #1
0
        // 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);
        }