diff --git a/code/__DEFINES/process_scheduler.dm b/code/__DEFINES/process_scheduler.dm index 5cdb99fc4bd..d3dbf1e085c 100644 --- a/code/__DEFINES/process_scheduler.dm +++ b/code/__DEFINES/process_scheduler.dm @@ -18,4 +18,17 @@ #define SCHECK if(world.tick_usage >= next_sleep_usage) defer() //Timing Controller -#define GLOBAL_PROC "some_magic_bullshit" \ No newline at end of file +#define GLOBAL_PROC "some_magic_bullshit" + +#define DECLARE_GLOBAL_CONTROLLER(PROCESS,VARNAME) \ +/datum/controller/process/##PROCESS/assertGlobality(){\ + if(##VARNAME){\ + message_admins("Controller '[name]' tried to become global but found another controller there already. Deleting the old controller.");\ + qdel(##VARNAME);}\ + ##VARNAME = src;}\ +\ +/datum/controller/process/##PROCESS/releaseGlobality(){\ + if(##VARNAME == src)\ + ##VARNAME = null;\ + else\ + message_admins("Controller '[name]' asked to release global control in spite of not having it!");}\ diff --git a/code/controllers/ProcessScheduler/core/process.dm b/code/controllers/ProcessScheduler/core/process.dm index ed33a738bf3..5fe1663d7e8 100644 --- a/code/controllers/ProcessScheduler/core/process.dm +++ b/code/controllers/ProcessScheduler/core/process.dm @@ -398,3 +398,11 @@ if(isnull(caught) || !istype(caught) || !isnull(caught.gcDestroyed)) return // Only bother with types we can identify and that don't belong catchException("Type [caught.type] does not belong in process' queue") + +// This is called to make a controller THE global authority on a global variable - like `air_master` +/datum/controller/process/proc/assertGlobality() + return + +// Called to let another instance of the controller have the fun +/datum/controller/process/proc/releaseGlobality() + return diff --git a/code/controllers/ProcessScheduler/core/processScheduler.dm b/code/controllers/ProcessScheduler/core/processScheduler.dm index aed1a125d96..e8f723586d8 100644 --- a/code/controllers/ProcessScheduler/core/processScheduler.dm +++ b/code/controllers/ProcessScheduler/core/processScheduler.dm @@ -122,6 +122,7 @@ var/global/datum/controller/processScheduler/processScheduler process.idle() idle.Add(process) + process.assertGlobality() // Set up process process.setup() @@ -132,6 +133,8 @@ var/global/datum/controller/processScheduler/processScheduler processes.Remove(oldProcess) processes.Add(newProcess) + oldProcess.releaseGlobality() + newProcess.assertGlobality() newProcess.idle() idle.Remove(oldProcess) running.Remove(oldProcess) diff --git a/code/controllers/Processes/air.dm b/code/controllers/Processes/air.dm index ab8dd1a6906..311699bb720 100644 --- a/code/controllers/Processes/air.dm +++ b/code/controllers/Processes/air.dm @@ -22,11 +22,11 @@ var/global/datum/controller/process/air_system/air_master var/last_hotspots = 0 var/last_asc = 0 + /datum/controller/process/air_system/setup() name = "air" schedule_interval = 20 // every 2 seconds start_delay = 4 - air_master = src var/watch = start_watch() log_startup_progress("Processing geometry...") @@ -50,6 +50,8 @@ var/global/datum/controller/process/air_system/air_master stat(null, "[last_active] active") stat(null, "[last_excited] EG | [last_hpd] HPD | [last_asc] ASC | [last_hotspots] Hot") +DECLARE_GLOBAL_CONTROLLER(air_system, air_master) + /datum/controller/process/air_system/proc/process_hotspots() last_hotspots = hotspots.len for(var/obj/effect/hotspot/H in hotspots) diff --git a/code/controllers/Processes/alarm.dm b/code/controllers/Processes/alarm.dm index 311d8912d7a..068ef0c1213 100644 --- a/code/controllers/Processes/alarm.dm +++ b/code/controllers/Processes/alarm.dm @@ -17,12 +17,13 @@ var/datum/controller/process/alarm/alarm_manager name = "alarm" schedule_interval = 20 // every 2 seconds all_handlers = list(atmosphere_alarm, burglar_alarm, camera_alarm, fire_alarm, motion_alarm, power_alarm) - alarm_manager = src /datum/controller/process/alarm/doWork() for(var/datum/alarm_handler/AH in all_handlers) AH.process() +DECLARE_GLOBAL_CONTROLLER(alarm, alarm_manager) + /datum/controller/process/alarm/proc/active_alarms() var/list/all_alarms = new for(var/datum/alarm_handler/AH in all_handlers) diff --git a/code/controllers/Processes/diseases.dm b/code/controllers/Processes/diseases.dm index a263551a4e0..d0bec749ac8 100644 --- a/code/controllers/Processes/diseases.dm +++ b/code/controllers/Processes/diseases.dm @@ -9,9 +9,6 @@ var/datum/controller/process/diseases/disease_master schedule_interval = 20 // every 2 seconds start_delay = 7 log_startup_progress("Disease controller starting.") - if(disease_master) - qdel(disease_master) //only one mob master - disease_master = src register_diseases() //register all pre-round diseases created @@ -38,6 +35,8 @@ var/datum/controller/process/diseases/disease_master catchBadType(thing) processing_diseases.Remove(thing) +DECLARE_GLOBAL_CONTROLLER(diseases, disease_master) + /datum/controller/process/diseases/proc/register_diseases() for(var/datum/disease/D in world) if(!processing_diseases.Find(D)) diff --git a/code/controllers/Processes/event.dm b/code/controllers/Processes/event.dm index f6592875c67..42e8c4bcc1d 100644 --- a/code/controllers/Processes/event.dm +++ b/code/controllers/Processes/event.dm @@ -45,4 +45,4 @@ var/global/datum/controller/holiday/holiday_master //This has to be defined befo if(holidays) holidays = shuffle(holidays) - world.update_status() \ No newline at end of file + world.update_status() diff --git a/code/controllers/Processes/fires.dm b/code/controllers/Processes/fires.dm index 4566143a906..26d42833d84 100644 --- a/code/controllers/Processes/fires.dm +++ b/code/controllers/Processes/fires.dm @@ -6,7 +6,6 @@ var/global/datum/controller/process/fire/fire_master /datum/controller/process/fire/setup() name = "fire" schedule_interval = 20 //every 2 seconds - fire_master = src log_startup_progress("Fire process starting up.") /datum/controller/process/fire/statProcess() @@ -20,4 +19,6 @@ var/global/datum/controller/process/fire/fire_master burningobj.burn() SCHECK else - burning.Remove(burningobj) \ No newline at end of file + burning.Remove(burningobj) + +DECLARE_GLOBAL_CONTROLLER(fire, fire_master) diff --git a/code/controllers/Processes/mob.dm b/code/controllers/Processes/mob.dm index 8de5b1d6774..86c76604606 100644 --- a/code/controllers/Processes/mob.dm +++ b/code/controllers/Processes/mob.dm @@ -8,9 +8,6 @@ var/global/datum/controller/process/mob/mob_master schedule_interval = 20 // every 2 seconds start_delay = 16 log_startup_progress("Mob ticker starting up.") - if(mob_master) - qdel(mob_master) //only one mob master - mob_master = src /datum/controller/process/mob/started() ..() @@ -33,4 +30,6 @@ var/global/datum/controller/process/mob/mob_master else catchBadType(M) mob_list -= M - current_cycle++ \ No newline at end of file + current_cycle++ + +DECLARE_GLOBAL_CONTROLLER(mob, mob_master) diff --git a/code/controllers/Processes/nano_mob_hunter.dm b/code/controllers/Processes/nano_mob_hunter.dm index 469ce22651d..fb57b6e0bbf 100644 --- a/code/controllers/Processes/nano_mob_hunter.dm +++ b/code/controllers/Processes/nano_mob_hunter.dm @@ -15,7 +15,6 @@ var/global/datum/controller/process/mob_hunt/mob_hunt_server /datum/controller/process/mob_hunt/setup() name = "Nano-Mob Hunter GO Server" start_delay = 20 - mob_hunt_server = src /datum/controller/process/mob_hunt/doWork() if(reset_cooldown) //if reset_cooldown is set (we are on cooldown, duh), reduce the remaining cooldown every cycle @@ -26,6 +25,8 @@ var/global/datum/controller/process/mob_hunt/mob_hunt_server if(normal_spawns.len < max_normal_spawns) spawn_mob() +DECLARE_GLOBAL_CONTROLLER(mob_hunt, mob_hunt_server) + //leaving this here in case admins want to use it for a random mini-event or something /datum/controller/process/mob_hunt/proc/server_crash(recover_time = 3000) server_status = 0 diff --git a/code/controllers/Processes/npcai.dm b/code/controllers/Processes/npcai.dm index 1bc8cbe008e..09d8556187e 100644 --- a/code/controllers/Processes/npcai.dm +++ b/code/controllers/Processes/npcai.dm @@ -9,9 +9,6 @@ var/global/datum/controller/process/npcai/npcai_master schedule_interval = 20 // every 2 seconds start_delay = 16 log_startup_progress("NPC ticker starting up.") - if(npcai_master) - qdel(npcai_master) //only one mob master - npcai_master = src /datum/controller/process/npcai/started() ..() @@ -58,4 +55,7 @@ var/global/datum/controller/process/npcai/npcai_master catchBadType(M) snpc_list -= M - current_cycle++ \ No newline at end of file + current_cycle++ + + +DECLARE_GLOBAL_CONTROLLER(npcai, npcai_master) diff --git a/code/controllers/Processes/npcpool.dm b/code/controllers/Processes/npcpool.dm index 266754dd36b..553801b42b8 100644 --- a/code/controllers/Processes/npcpool.dm +++ b/code/controllers/Processes/npcpool.dm @@ -14,9 +14,6 @@ var/global/datum/controller/process/npcpool/npc_master schedule_interval = 100 start_delay = 17 log_startup_progress("NPC pool ticker starting up.") - if(npc_master) - qdel(npc_master) //only one mob master - npc_master = src /datum/controller/process/npcpool/copyStateFrom(var/datum/controller/process/npcpool/target) canBeUsed = target.canBeUsed @@ -27,6 +24,9 @@ var/global/datum/controller/process/npcpool/npc_master botPool_l = target.botPool_l botPool_l_non = target.botPool_l_non + +DECLARE_GLOBAL_CONTROLLER(npcpool, npc_master) + /datum/controller/process/npcpool/proc/insertBot(toInsert) if(istype(toInsert, /mob/living/carbon/human/interactive)) botPool_l |= toInsert @@ -113,4 +113,4 @@ var/global/datum/controller/process/npcpool/npc_master needsAssistant -= check canBeUsed -= candidate candidate.change_eye_color(255, 255, 0) - SCHECK \ No newline at end of file + SCHECK diff --git a/code/controllers/Processes/shuttles.dm b/code/controllers/Processes/shuttles.dm index c027a63b902..21f2e8c390e 100644 --- a/code/controllers/Processes/shuttles.dm +++ b/code/controllers/Processes/shuttles.dm @@ -40,8 +40,6 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12 name = "shuttle" schedule_interval = 20 - shuttle_master = src - var/watch = start_watch() log_startup_progress("Initializing shuttle docks...") initialize_docks() @@ -72,6 +70,9 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12 continue mobile.Remove(thing) + +DECLARE_GLOBAL_CONTROLLER(shuttle, shuttle_master) + /datum/controller/process/shuttle/proc/initialize_docks() for(var/obj/docking_port/D in world) D.register() diff --git a/code/controllers/Processes/sun.dm b/code/controllers/Processes/sun.dm index 06eac82baf0..bd9644b4536 100644 --- a/code/controllers/Processes/sun.dm +++ b/code/controllers/Processes/sun.dm @@ -10,7 +10,6 @@ var/global/datum/controller/process/sun/sun /datum/controller/process/sun/setup() name = "sun" schedule_interval = 600 // every 60 seconds - sun = src log_startup_progress("Sun ticker starting up.") angle = rand (0,360) // the station position to the sun is randomised at round start @@ -22,6 +21,7 @@ var/global/datum/controller/process/sun/sun calc_position() update_solar_machinery() +DECLARE_GLOBAL_CONTROLLER(sun, sun) // calculate the sun's position given the time of day // at the standard rate (100%) the angle is increase/decreased by 6 degrees every minute. diff --git a/code/controllers/Processes/ticker.dm b/code/controllers/Processes/ticker.dm index 19dad45a898..8fc476116e5 100644 --- a/code/controllers/Processes/ticker.dm +++ b/code/controllers/Processes/ticker.dm @@ -14,12 +14,12 @@ var/global/datum/controller/process/ticker/tickerProcess if(!ticker) ticker = new - tickerProcess = src - spawn(0) if(ticker) ticker.pregame() +DECLARE_GLOBAL_CONTROLLER(ticker, tickerProcess) + /datum/controller/process/ticker/doWork() var/currentTime = world.timeofday diff --git a/code/controllers/Processes/timer.dm b/code/controllers/Processes/timer.dm index 4add16aae31..0dcaf128193 100644 --- a/code/controllers/Processes/timer.dm +++ b/code/controllers/Processes/timer.dm @@ -7,7 +7,6 @@ var/global/datum/controller/process/timer/timer_master /datum/controller/process/timer/setup() name = "timer" schedule_interval = 1 //every 0.1 seconds--2 server ticks - timer_master = src log_startup_progress("Timer process starting up.") /datum/controller/process/timer/statProcess() @@ -27,6 +26,8 @@ var/global/datum/controller/process/timer/timer_master qdel(event) SCHECK +DECLARE_GLOBAL_CONTROLLER(timer, timer_master) + /datum/controller/process/timer/proc/runevent(datum/timedevent/event) set waitfor = 0 if(event.thingToCall) diff --git a/code/controllers/Processes/weather.dm b/code/controllers/Processes/weather.dm index d2149371649..1706b2232c0 100644 --- a/code/controllers/Processes/weather.dm +++ b/code/controllers/Processes/weather.dm @@ -10,7 +10,6 @@ var/global/datum/controller/process/weather/weather_master /datum/controller/process/weather/setup() name = "weather" schedule_interval = 10 - weather_master = src for(var/V in subtypesof(/datum/weather)) var/datum/weather/W = V @@ -40,6 +39,8 @@ var/global/datum/controller/process/weather/weather_master eligible_zlevels -= Z addtimer(src, "make_z_eligible", rand(3000, 6000) + W.weather_duration_upper, TRUE, Z) //Around 5-10 minutes between weathers +DECLARE_GLOBAL_CONTROLLER(weather, weather_master) + /datum/controller/process/weather/proc/run_weather(weather_name) if(!weather_name) return diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index 727574fed16..c441ab97805 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -78,4 +78,4 @@ reagents.add_reagent("water", min(volume - reagents.total_volume, amount_per_transfer_from_this)) to_chat(user, "You fill [src] from [source].") return - ..() \ No newline at end of file + ..()