mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-25 04:57:12 +01:00
Merge pull request #7199 from Crazylemon64/controller_reboot_fix
Makes the master controller's auto-restart work
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
..()
|
||||
..()
|
||||
|
||||
Reference in New Issue
Block a user