diff --git a/code/controllers/subsystem/processing/objects.dm b/code/controllers/subsystem/processing/objects.dm index 0dc7c4a33c2..ae6ef8c9396 100644 --- a/code/controllers/subsystem/processing/objects.dm +++ b/code/controllers/subsystem/processing/objects.dm @@ -1,5 +1,9 @@ var/datum/subsystem/objects/SSobj +#define INITIALIZATION_INSSOBJ 0 //New should not call Initialize +#define INITIALIZATION_INNEW_MAPLOAD 1 //New should call Initialize(TRUE) +#define INITIALIZATION_INNEW_REGULAR 2 //New should call Initialize(FALSE) + /datum/var/isprocessing = 0 /datum/proc/process() set waitfor = 0 @@ -11,9 +15,8 @@ var/datum/subsystem/objects/SSobj init_order = 12 priority = 40 - var/initialized = FALSE + var/initialized = INITIALIZATION_INSSOBJ var/old_initialized - var/list/atom_spawners = list() var/list/processing = list() var/list/currentrun = list() @@ -23,28 +26,35 @@ var/datum/subsystem/objects/SSobj /datum/subsystem/objects/Initialize(timeofdayl) fire_overlay.appearance_flags = RESET_COLOR setupGenetics() //to set the mutations' place in structural enzymes, so monkey.initialize() knows where to put the monkey mutation. - trigger_atom_spawners() - for(var/thing in world) - var/atom/A = thing - A.Initialize(TRUE) - CHECK_TICK - initialized = TRUE + InitializeAtoms() . = ..() +/datum/subsystem/objects/proc/InitializeAtoms(list/objects = null) + initialized = INITIALIZATION_INNEW_MAPLOAD + + if(objects) + for(var/thing in objects) + var/atom/A = thing + A.Initialize(TRUE) + CHECK_TICK + else + for(var/atom/A in world) + if(!A.initialized) //this check is to make sure we don't call it twice on an object that was created in a previous Initialize call + var/start_tick = world.time + A.Initialize(TRUE) + if(start_tick != world.time) + WARNING("[A]: [A.type] slept during it's Initialize!") + CHECK_TICK + + initialized = INITIALIZATION_INNEW_REGULAR + /datum/subsystem/objects/proc/map_loader_begin() old_initialized = initialized - initialized = FALSE + initialized = INITIALIZATION_INSSOBJ /datum/subsystem/objects/proc/map_loader_stop() initialized = old_initialized -/datum/subsystem/objects/proc/trigger_atom_spawners(zlevel, ignore_z=FALSE) - for(var/V in atom_spawners) - var/atom/A = V - if (!ignore_z && (zlevel && A.z != zlevel)) - continue - A.spawn_atom_to_world() - /datum/subsystem/objects/stat_entry() ..("P:[processing.len]") @@ -65,18 +75,11 @@ var/datum/subsystem/objects/SSobj if (MC_TICK_CHECK) return - -/datum/subsystem/objects/proc/setup_template_objects(list/objects) - trigger_atom_spawners(0, ignore_z=TRUE) - if(initialized) - for(var/A in objects) - var/atom/B = A - B.Initialize(TRUE) - /datum/subsystem/objects/Recover() initialized = SSobj.initialized + if(initialized == INITIALIZATION_INNEW_MAPLOAD) + InitializeAtoms() old_initialized = SSobj.old_initialized - if (istype(SSobj.atom_spawners)) - atom_spawners = SSobj.atom_spawners + if (istype(SSobj.processing)) processing = SSobj.processing diff --git a/code/datums/helper_datums/map_template.dm b/code/datums/helper_datums/map_template.dm index 134a93b6eb2..19f9c1ff0da 100644 --- a/code/datums/helper_datums/map_template.dm +++ b/code/datums/helper_datums/map_template.dm @@ -40,7 +40,7 @@ atmos_machines += A continue - SSobj.setup_template_objects(atoms) + SSobj.InitializeAtoms(atoms) SSmachine.setup_template_powernets(cables) SSair.setup_template_machinery(atmos_machines) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index dab8a2ad0a2..88019b3fb42 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -23,6 +23,7 @@ var/list/atom_colours //used to store the different colors on an atom //its inherent color, the colored paint applied on it, special color effect etc... + var/initialized = FALSE /atom/New() @@ -40,8 +41,9 @@ if(luminosity) light = new(src) - if(SSobj && SSobj.initialized) - Initialize(FALSE) + var/initialized = SSobj.initialized + if(initialized > INITIALIZATION_INSSOBJ) + Initialize(initialized == INITIALIZATION_INNEW_MAPLOAD) //. = ..() //uncomment if you are dumb enough to add a /datum/New() proc /atom/Destroy() @@ -433,15 +435,14 @@ var/list/blood_splatter_icons = list() sleep(1) stoplag() -//This is called just before maps and objects are initialized, use it to spawn other mobs/objects -//effects at world start up without causing runtimes -/atom/proc/spawn_atom_to_world() - //Called after New if the world is not loaded with TRUE //Called from base of New if the world is loaded with FALSE +//This base must be called or derivatives must set initialized to TRUE to prevent repeat calls +//Derivatives must not sleep /atom/proc/Initialize(mapload) - set waitfor = 0 - return + if(initialized) + stack_trace("Warning: [src]([type]) initialized multiple times!") + initialized = TRUE //the vision impairment to give to the mob whose perspective is set to that atom (e.g. an unfocused camera giving you an impaired vision when looking through it) /atom/proc/get_remote_view_fullscreens(mob/user) diff --git a/code/game/machinery/buttons.dm b/code/game/machinery/buttons.dm index 22965fa1d64..d8fd11bc97b 100644 --- a/code/game/machinery/buttons.dm +++ b/code/game/machinery/buttons.dm @@ -9,7 +9,7 @@ var/obj/item/weapon/electronics/airlock/board var/device_type = null var/id = null - var/initialized = 0 + var/initialized_button = 0 armor = list(melee = 50, bullet = 50, laser = 50, energy = 50, bomb = 10, bio = 100, rad = 100, fire = 90, acid = 70) anchored = 1 use_power = 1 @@ -115,10 +115,10 @@ if(id && istype(device, /obj/item/device/assembly/control)) var/obj/item/device/assembly/control/A = device A.id = id - initialized = 1 + initialized_button = 1 /obj/machinery/button/attack_hand(mob/user) - if(!initialized) + if(!initialized_button) setup_device() src.add_fingerprint(user) if(panel_open) diff --git a/code/game/machinery/computer/camera_advanced.dm b/code/game/machinery/computer/camera_advanced.dm index e7ef1d57cab..c5b74c262df 100644 --- a/code/game/machinery/computer/camera_advanced.dm +++ b/code/game/machinery/computer/camera_advanced.dm @@ -47,7 +47,7 @@ if(!eyeobj) CreateEye() - if(!eyeobj.initialized) + if(!eyeobj.eye_initialized) var/camera_location for(var/obj/machinery/camera/C in cameranet.cameras) if(!C.can_use()) @@ -56,7 +56,7 @@ camera_location = get_turf(C) break if(camera_location) - eyeobj.initialized = 1 + eyeobj.eye_initialized = 1 give_eye_control(L) eyeobj.setLoc(camera_location) else @@ -82,7 +82,7 @@ var/acceleration = 1 var/mob/living/carbon/human/eye_user = null var/obj/machinery/computer/camera_advanced/origin - var/initialized = 0 + var/eye_initialized = 0 var/visible_icon = 0 var/image/user_image = null diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm index 1e3cb92f4c1..573f44043dc 100644 --- a/code/modules/awaymissions/corpse.dm +++ b/code/modules/awaymissions/corpse.dm @@ -36,28 +36,17 @@ log_game("[user.ckey] became [mob_name]") create(ckey = user.ckey) -/obj/effect/mob_spawn/spawn_atom_to_world() - //We no longer need to spawn mobs, deregister ourself - SSobj.atom_spawners -= src - if(roundstart) +/obj/effect/mob_spawn/Initialize(mapload) + if(roundstart && (mapload || (ticker && ticker.current_state > GAME_STATE_SETTING_UP))) create() else poi_list |= src /obj/effect/mob_spawn/New() ..() - if(roundstart) - if(ticker && ticker.current_state > GAME_STATE_SETTING_UP) - // The game has already initialised, just spawn it. - create() - else - //Add to the atom spawners register for roundstart atom spawning - SSobj.atom_spawners += src if(instant) create() - else - poi_list |= src /obj/effect/mob_spawn/Destroy() poi_list.Remove(src)