Merge pull request #7199 from Crazylemon64/controller_reboot_fix

Makes the master controller's auto-restart work
This commit is contained in:
Fox McCloud
2017-05-13 19:55:03 -04:00
committed by GitHub
18 changed files with 60 additions and 30 deletions
+14 -1
View File
@@ -18,4 +18,17 @@
#define SCHECK if(world.tick_usage >= next_sleep_usage) defer()
//Timing Controller
#define GLOBAL_PROC "some_magic_bullshit"
#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!");}\
@@ -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
@@ -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)
+3 -1
View File
@@ -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)
+2 -1
View File
@@ -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)
+2 -3
View File
@@ -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))
+1 -1
View File
@@ -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()
world.update_status()
+3 -2
View File
@@ -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)
burning.Remove(burningobj)
DECLARE_GLOBAL_CONTROLLER(fire, fire_master)
+3 -4
View File
@@ -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++
current_cycle++
DECLARE_GLOBAL_CONTROLLER(mob, mob_master)
@@ -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
+4 -4
View File
@@ -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++
current_cycle++
DECLARE_GLOBAL_CONTROLLER(npcai, npcai_master)
+4 -4
View File
@@ -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
SCHECK
+3 -2
View File
@@ -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()
+1 -1
View File
@@ -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.
+2 -2
View File
@@ -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
+2 -1
View File
@@ -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)
+2 -1
View File
@@ -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
+1 -1
View File
@@ -78,4 +78,4 @@
reagents.add_reagent("water", min(volume - reagents.total_volume, amount_per_transfer_from_this))
to_chat(user, "<span class='notice'>You fill [src] from [source].</span>")
return
..()
..()