public override void Tick() { base.Tick(); if (DronesLeft > 0 && !lockdown && this.IsHashIntervalTick(60) && GetComp <CompPowerTrader>()?.PowerOn != false) { Job job = TryGiveJob(); if (job != null) { job.playerForced = true; job.expiryInterval = -1; Pawn_Drone drone = MakeDrone(); GenSpawn.Spawn(drone, Position, Map); drone.jobs.StartJob(job); } } //To enhance performence we could add "this.IsHashIntervalTick(60)" if (spawnedDrones.Count > 0 && GetComp <CompPowerTrader>()?.PowerOn == false) { for (int i = spawnedDrones.Count - 1; i >= 0; i--) { spawnedDrones[i].jobs.StartJob(new Job(PRFDefOf.PRFDrone_ReturnToStation, this), JobCondition.InterruptForced); } } //TODO Check if we should increase the IsHashIntervalTick to enhace performence (will reduce responsivness) if (this.IsHashIntervalTick(60) && GetComp <CompPowerTrader>().powerOutputInt != LastPowerOutput) { //Update the Range Update_droneAllowedArea_forDrones(); //Update the last know Val LastPowerOutput = GetComp <CompPowerTrader>().powerOutputInt; //TODO add cell calc cashed_GetCoverageCells = StationRangecells.ToList(); } }
public override void SpawnSetup(Map map, bool respawningAfterLoad) { base.SpawnSetup(map, respawningAfterLoad); this.mapManager = map.GetComponent <MapTickManager>(); refuelableComp = GetComp <CompRefuelable>(); compPowerTrader = GetComp <CompPowerTrader>(); extension = def.GetModExtension <DefModExtension_DroneStation>(); compPowerWorkSetting = GetComp <CompPowerWorkSetting>(); StationRangecells_old = StationRangecells; //Setup Allowd Area //Enssuring that Update_droneAllowedArea_forDrones() is run resolves #224 (May need to add a diffrent check) if (droneAllowedArea == null) { //Log.Message("droneAllowedArea was null"); Update_droneAllowedArea_forDrones(droneAllowedArea); } //Load the SleepTimes from XML cachedSleepTimeList = extension.Sleeptimes.Split(','); cashed_GetCoverageCells = StationRangecells.ToList(); //Check for missing WorkTypeDef foreach (WorkTypeDef def in extension.workTypes.Except(WorkSettings.Keys).ToList()) { WorkSettings.Add(def, true); } //Remove stuff thats nolonger valid (can only happen after updates) foreach (WorkTypeDef def in WorkSettings.Keys.Except(extension.workTypes).ToList()) { WorkSettings.Remove(def); } //need to take action to init droneSkillsRecord if (droneSkillsRecord.Count == 0) { Pawn_Drone drone = MakeDrone(); GenSpawn.Spawn(drone, Position, Map); drone.Destroy(); GetComp <CompRefuelable>()?.Refuel(1); } //Init the Designator default Label update_droneAreaSelectorLable(droneAllowedArea); //Need this type of call to set the Powerconsumption on load //A normal call will not work var rangePowerSupplyMachine = this.RangePowerSupplyMachine; if (rangePowerSupplyMachine != null) { this.MapManager.NextAction(rangePowerSupplyMachine.RefreshPowerStatus); this.MapManager.AfterAction(5, rangePowerSupplyMachine.RefreshPowerStatus); } }
public override void Tick() { //Base Tick base.Tick(); //Return if not Spawnd if (!this.Spawned) { return; } //Should not draw much performence... //To enhance performence we could add "this.IsHashIntervalTick(60)" if (spawnedDrones.Count > 0 && compPowerTrader?.PowerOn == false) { for (int i = spawnedDrones.Count - 1; i >= 0; i--) { spawnedDrones[i].jobs.StartJob(new Job(PRFDefOf.PRFDrone_ReturnToStation, this), JobCondition.InterruptForced); } //return as there is nothing to do if its off.... return; } //Update the Allowed Area Range on Power Change if (this.IsHashIntervalTick(60)) { //Update the Range Update_droneAllowedArea_forDrones(droneAllowedArea); //TODO add cell calc cashed_GetCoverageCells = StationRangecells.ToList(); } //Search for Job if (this.IsHashIntervalTick(60 + additionJobSearchTickDelay) && DronesLeft > 0 && !lockdown && compPowerTrader?.PowerOn != false) { //The issue appears to be 100% with TryGiveJob Job job = TryGiveJob(); if (job != null) { additionJobSearchTickDelay = 0; //Reset to 0 - found a job -> may find more job.playerForced = true; job.expiryInterval = -1; //MakeDrone takes about 1ms Pawn_Drone drone = MakeDrone(); GenSpawn.Spawn(drone, Position, Map); drone.jobs.StartJob(job); } else { //Experimental Delay //Add delay (limit to 300) i am well aware that this can be higher that 300 with the current code if (additionJobSearchTickDelay < 300) { //Exponential delay additionJobSearchTickDelay = (additionJobSearchTickDelay + 1) * 2; } } } }