From 3251c19176abffbc4a174c788b35e6815e2e1a16 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Fri, 8 Oct 2021 14:06:58 +0200 Subject: [PATCH] [MIRROR] Fix maint loot spawners not deleting after roundstart/spawning their loot. [MDB IGNORE] (#8686) * Fix maint loot spawners not deleting after roundstart/spawning their loot. (#61707) Maint loot spawners hang around and never get qdeleted after spawning their loot. This does a little bit of simple code logic to limit copypasta and ensure that loot spawners never qdel late and that they qdel precisely when they intend to. Or when SSmapping intends for them to. * Fix maint loot spawners not deleting after roundstart/spawning their loot. Co-authored-by: Timberpoes --- code/controllers/subsystem/mapping.dm | 2 +- .../effects/spawners/random/maintenance.dm | 21 ++++++++++++------- .../objects/effects/spawners/random/random.dm | 6 +++++- 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm index fd91dae782c..d3d91f66fae 100644 --- a/code/controllers/subsystem/mapping.dm +++ b/code/controllers/subsystem/mapping.dm @@ -661,4 +661,4 @@ GLOBAL_LIST_EMPTY(the_station_areas) CHECK_TICK spawner.spawn_loot() - spawner.hide() + qdel(spawner) diff --git a/code/game/objects/effects/spawners/random/maintenance.dm b/code/game/objects/effects/spawners/random/maintenance.dm index ad3f26ffcb7..d685e448368 100644 --- a/code/game/objects/effects/spawners/random/maintenance.dm +++ b/code/game/objects/effects/spawners/random/maintenance.dm @@ -10,16 +10,21 @@ . += span_info("This spawner has an effective loot count of [get_effective_lootcount()].") /obj/effect/spawner/random/maintenance/Initialize(mapload) - . = ..() - // There is a single callback in SSmapping to spawn all delayed maintenance loot - // so we don't just make one callback per loot spawner - GLOB.maintenance_loot_spawners += src loot = GLOB.maintenance_loot - // Late loaded templates like shuttles can have maintenance loot - if(SSticker.current_state >= GAME_STATE_SETTING_UP) - spawn_loot() - hide() + . = ..() + + GLOB.maintenance_loot_spawners += src + +/obj/effect/spawner/random/maintenance/should_spawn_on_init() + . = ..() + + if(.) + return + + // Late loaded templates like shuttles can have maintenance loot. + // Once the game state progresses to roundstart, new maint loot spawners should just instantly pop. + return (SSticker.current_state >= GAME_STATE_SETTING_UP) /obj/effect/spawner/random/maintenance/Destroy() GLOB.maintenance_loot_spawners -= src diff --git a/code/game/objects/effects/spawners/random/random.dm b/code/game/objects/effects/spawners/random/random.dm index ca43aa3fef7..d4a381ec1b1 100644 --- a/code/game/objects/effects/spawners/random/random.dm +++ b/code/game/objects/effects/spawners/random/random.dm @@ -33,10 +33,14 @@ /obj/effect/spawner/random/Initialize(mapload) . = ..() - if(spawn_on_init) + if(should_spawn_on_init()) spawn_loot() return INITIALIZE_HINT_QDEL +/// Helper proc that returns TRUE if the spawner should spawn loot in Initialise() and FALSE otherwise. Override this to change spawning behaviour. +/obj/effect/spawner/random/proc/should_spawn_on_init() + return spawn_on_init + ///If the spawner has any loot defined, randomly picks some and spawns it. Does not cleanup the spawner. /obj/effect/spawner/random/proc/spawn_loot(lootcount_override) if(!prob(spawn_loot_chance))