diff --git a/code/FEA/FEA_turf_tile.dm b/code/FEA/FEA_turf_tile.dm
index ba506f5e7ea..da7b1f856cb 100644
--- a/code/FEA/FEA_turf_tile.dm
+++ b/code/FEA/FEA_turf_tile.dm
@@ -148,7 +148,7 @@ turf/simulated
if(istype(target))
air_master.tiles_to_update.Add(target)
- Del()
+ Destroy()
if(air_master)
if(parent)
air_master.groups_to_rebuild.Add(parent)
diff --git a/code/TriDimension/controller.dm b/code/TriDimension/controller.dm
index e336e417b6e..a9d4df675ab 100644
--- a/code/TriDimension/controller.dm
+++ b/code/TriDimension/controller.dm
@@ -30,7 +30,7 @@
/obj/effect/landmark/zcontroller/Destroy()
processing_objects.Remove(src)
- return
+ return ..()
/obj/effect/landmark/zcontroller/process()
if (world.time > fast_time)
diff --git a/code/__HELPERS/datum_pool.dm b/code/__HELPERS/datum_pool.dm
index 9f21fbae6e2..16594ed0483 100644
--- a/code/__HELPERS/datum_pool.dm
+++ b/code/__HELPERS/datum_pool.dm
@@ -76,6 +76,10 @@ var/global/list/GlobalPool = list()
D.Destroy()
D.ResetVars()
+/proc/IsPooled(var/datum/D)
+ if(isnull(GlobalPool[D.type]) || length(GlobalPool[D.type]) == 0)
+ return 0
+ return 1
/datum/proc/Prepare(args)
if(islist(args))
diff --git a/code/controllers/ProcessScheduler/core/process.dm b/code/controllers/ProcessScheduler/core/process.dm
index 95adbb09194..1f27f4c1ded 100644
--- a/code/controllers/ProcessScheduler/core/process.dm
+++ b/code/controllers/ProcessScheduler/core/process.dm
@@ -314,3 +314,9 @@ datum/controller/process/proc/enable()
/datum/controller/process/proc/getTicks()
return ticks
+
+/datum/controller/process/proc/getStatName()
+ return name
+
+/datum/controller/process/proc/getTickTime()
+ return "#[getTicks()]\t- [getLastRunTime()]"
diff --git a/code/controllers/Processes/alarm.dm b/code/controllers/Processes/alarm.dm
index d41aa6ffdf2..6269ab89d1e 100644
--- a/code/controllers/Processes/alarm.dm
+++ b/code/controllers/Processes/alarm.dm
@@ -4,3 +4,7 @@
/datum/controller/process/alarm/doWork()
alarm_manager.fire()
+
+/datum/controller/process/alarm/getStatName()
+ var/list/alarms = alarm_manager.active_alarms()
+ return ..()+"([alarms.len])"
diff --git a/code/controllers/Processes/disease.dm b/code/controllers/Processes/disease.dm
index a8d840097ec..35cf0d98917 100644
--- a/code/controllers/Processes/disease.dm
+++ b/code/controllers/Processes/disease.dm
@@ -9,3 +9,6 @@
/datum/controller/process/disease/doWork()
updateQueueInstance.init(active_diseases, "process")
updateQueueInstance.Run()
+
+/datum/controller/process/disease/getStatName()
+ return ..()+"([active_diseases.len])"
diff --git a/code/controllers/Processes/garbage.dm b/code/controllers/Processes/garbage.dm
index b9a6c7017b2..7180008ddbb 100644
--- a/code/controllers/Processes/garbage.dm
+++ b/code/controllers/Processes/garbage.dm
@@ -1,14 +1,14 @@
var/datum/controller/process/garbage_collector/garbage_collector
var/list/delayed_garbage = list()
-#define GC_DEBUG 1
/datum/controller/process/garbage_collector
var/garbage_collect = 1 // Whether or not to actually do work
var/collection_timeout = 300 //deciseconds to wait to let running procs finish before we just say fuck it and force del() the object
var/max_checks_multiplier = 5 //multiplier (per-decisecond) for calculating max number of tests per tick. These tests check if our GC'd objects are actually GC'd
var/max_forcedel_multiplier = 1 //multiplier (per-decisecond) for calculating max number of force del() calls per tick.
- var/dels = 0 // number of del()'s we've done this tick
+ var/dels = 0 // number of del()'s we've done this tick
+ var/hard_dels = 0 // number of hard dels in total
var/list/destroyed = list() // list of refID's of things that should be garbage collected
// refID's are associated with the time at which they time out and need to be manually del()
// we do this so we aren't constantly locating them and preventing them from being gc'd
@@ -60,6 +60,7 @@ var/list/delayed_garbage = list()
logging["[A.type]"]++
del(A)
++dels
+ ++hard_dels
#ifdef GC_DEBUG
else
testing("GC: [refID] properly GC'd at [world.time] with timeout [GCd_at_time]")
@@ -76,6 +77,8 @@ var/list/delayed_garbage = list()
destroyed -= "\ref[A]" // Removing any previous references that were GC'd so that the current object will be at the end of the list.
destroyed["\ref[A]"] = world.time
+/datum/controller/process/garbage_collector/getStatName()
+ return ..()+"([garbage_collector.dels]/[garbage_collector.hard_dels])"
// Should be treated as a replacement for the 'del' keyword.
// Datums passed to this will be given a chance to clean up references to allow the GC to collect them.
@@ -92,6 +95,7 @@ var/list/delayed_garbage = list()
//warning("qdel() passed object of type [A.type]. qdel() can only handle /datum types.")
del(A)
garbage_collector.dels++
+ garbage_collector.hard_dels++
else if(isnull(A.gcDestroyed))
// Let our friend know they're about to get collected
. = !A.Destroy()
@@ -99,13 +103,19 @@ var/list/delayed_garbage = list()
A.finalize_qdel()
/datum/proc/finalize_qdel()
- del(src)
+ if(IsPooled(src))
+ PlaceInPool(src)
+ else
+ del(src)
/atom/finalize_qdel()
- if(garbage_collector)
- garbage_collector.AddTrash(src)
+ if(IsPooled(src))
+ PlaceInPool(src)
else
- delayed_garbage |= src
+ if(garbage_collector)
+ garbage_collector.AddTrash(src)
+ else
+ delayed_garbage |= src
/icon/finalize_qdel()
del(src)
@@ -126,7 +136,6 @@ var/list/delayed_garbage = list()
tag = null
return
-#define TESTING 1
#ifdef TESTING
/client/var/running_find_references
diff --git a/code/controllers/Processes/machinery.dm b/code/controllers/Processes/machinery.dm
index 61f3c7f4dee..232ef919734 100644
--- a/code/controllers/Processes/machinery.dm
+++ b/code/controllers/Processes/machinery.dm
@@ -42,3 +42,7 @@
#endif
scheck()
+
+
+/datum/controller/process/machinery/getStatName()
+ return ..()+"([machines.len])"
\ No newline at end of file
diff --git a/code/controllers/Processes/mob.dm b/code/controllers/Processes/mob.dm
index b3765b0cf9c..39d4844a021 100644
--- a/code/controllers/Processes/mob.dm
+++ b/code/controllers/Processes/mob.dm
@@ -18,3 +18,6 @@
if(updateQueueInstance)
updateQueueInstance.init(mob_list, "Life")
updateQueueInstance.Run()
+
+/datum/controller/process/mob/getStatName()
+ return ..()+"([mob_list.len])"
diff --git a/code/controllers/Processes/nanoui.dm b/code/controllers/Processes/nanoui.dm
index a35280131fc..654b1621be5 100644
--- a/code/controllers/Processes/nanoui.dm
+++ b/code/controllers/Processes/nanoui.dm
@@ -9,3 +9,6 @@
/datum/controller/process/nanoui/doWork()
updateQueueInstance.init(nanomanager.processing_uis, "process")
updateQueueInstance.Run()
+
+/datum/controller/process/nanoui/getStatName()
+ return ..()+"([nanomanager.processing_uis.len])"
diff --git a/code/controllers/Processes/obj.dm b/code/controllers/Processes/obj.dm
index 15ad98dd3d6..37766cf92d1 100644
--- a/code/controllers/Processes/obj.dm
+++ b/code/controllers/Processes/obj.dm
@@ -19,3 +19,6 @@ var/global/list/object_profiling = list()
if(updateQueueInstance)
updateQueueInstance.init(processing_objects, "process")
updateQueueInstance.Run()
+
+/datum/controller/process/obj/getStatName()
+ return ..()+"([processing_objects.len])"
diff --git a/code/controllers/Processes/pipenet.dm b/code/controllers/Processes/pipenet.dm
index 56a068f54ca..8a5d6a22ca4 100644
--- a/code/controllers/Processes/pipenet.dm
+++ b/code/controllers/Processes/pipenet.dm
@@ -10,3 +10,6 @@
continue
pipe_networks.Remove(pipeNetwork)
+
+/datum/controller/process/pipenet/getStatName()
+ return ..()+"([pipe_networks.len])"
\ No newline at end of file
diff --git a/code/controllers/Processes/powernet.dm b/code/controllers/Processes/powernet.dm
index 1edf194915a..f2a98228167 100644
--- a/code/controllers/Processes/powernet.dm
+++ b/code/controllers/Processes/powernet.dm
@@ -10,3 +10,6 @@
continue
powernets.Remove(powerNetwork)
+
+/datum/controller/process/powernet/getStatName()
+ return ..()+"([powernets.len])"
\ No newline at end of file
diff --git a/code/defines/procs/sd_Alert.dm b/code/defines/procs/sd_Alert.dm
index 1e2649687cf..e10416f1128 100644
--- a/code/defines/procs/sd_Alert.dm
+++ b/code/defines/procs/sd_Alert.dm
@@ -93,7 +93,7 @@ sd_alert
response
list/validation
- Del()
+ Destroy()
target << browse(null,"window=\ref[src]")
..()
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 9ff603900c7..152622f88e1 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -24,10 +24,12 @@
/atom/Destroy()
. = ..()
+ density = 0
SetOpacity(0)
if(reagents)
qdel(reagents)
+ reagents = null
for(var/atom/movable/AM in contents)
qdel(AM)
invisibility = 101
diff --git a/code/game/gamemodes/blob/blobs/factory.dm b/code/game/gamemodes/blob/blobs/factory.dm
index b4adaea0495..c1d14d00402 100644
--- a/code/game/gamemodes/blob/blobs/factory.dm
+++ b/code/game/gamemodes/blob/blobs/factory.dm
@@ -22,6 +22,11 @@
new/mob/living/simple_animal/hostile/blobspore(src.loc, src)
return 1
+/obj/effect/blob/factory/Destroy()
+ for(var/mob/living/simple_animal/hostile/blobspore/spore in spores)
+ if(spore.factory == src)
+ spore.factory = null
+ ..()
/mob/living/simple_animal/hostile/blobspore
name = "blob"
@@ -58,9 +63,10 @@
..(loc)
return
death()
- ..()
- if(factory)
- factory.spores -= src
- ..()
qdel(src)
+/mob/living/simple_animal/hostile/blobspore/Destroy()
+ if(factory)
+ factory.spores -= src
+ factory = null
+ ..()
diff --git a/code/game/gamemodes/blob/theblob.dm b/code/game/gamemodes/blob/theblob.dm
index a89ebb99c6c..8b90715e793 100644
--- a/code/game/gamemodes/blob/theblob.dm
+++ b/code/game/gamemodes/blob/theblob.dm
@@ -31,7 +31,7 @@
return
- Del()
+ Destroy()
blobs -= src
..()
return
@@ -212,7 +212,7 @@
icon_state = "blobidle0"
- Del()
+ Destroy()
var/obj/effect/blob/B = new /obj/effect/blob( src.loc )
spawn(30)
B.Life()
diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm
index 02d31d5846a..9d18216aa53 100644
--- a/code/game/gamemodes/meteor/meteors.dm
+++ b/code/game/gamemodes/meteor/meteors.dm
@@ -97,6 +97,10 @@
pass_flags = PASSTABLE | PASSGRILLE
power = 2
+/obj/effect/meteor/Destroy()
+ walk(src,0) //this cancels the walk_towards() proc
+ ..()
+
/obj/effect/meteor/Bump(atom/A)
spawn(0)
@@ -157,4 +161,4 @@
if(istype(W, /obj/item/weapon/pickaxe))
qdel(src)
return
- ..()
\ No newline at end of file
+ ..()
diff --git a/code/game/gamemodes/nuclear/pinpointer.dm b/code/game/gamemodes/nuclear/pinpointer.dm
index d26f1a07892..7b6b1dc9527 100644
--- a/code/game/gamemodes/nuclear/pinpointer.dm
+++ b/code/game/gamemodes/nuclear/pinpointer.dm
@@ -48,6 +48,9 @@
if(bomb.timing)
user << "Extreme danger. Arming signal detected. Time remaining: [bomb.timeleft]"
+/obj/item/weapon/pinpointer/Destroy()
+ active = 0
+ ..()
/obj/item/weapon/pinpointer/advpinpointer
name = "Advanced Pinpointer"
diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm
index 86eadfa053d..acd558403fe 100644
--- a/code/game/machinery/alarm.dm
+++ b/code/game/machinery/alarm.dm
@@ -98,6 +98,10 @@
TLV["temperature"] = list(20, 40, 140, 160) // K
target_temperature = 90
+/obj/machinery/alarm/Destroy()
+ if(radio_controller)
+ radio_controller.remove_object(src, frequency)
+ ..()
/obj/machinery/alarm/New(var/loc, var/dir, var/building = 0)
..()
diff --git a/code/game/machinery/atmo_control.dm b/code/game/machinery/atmo_control.dm
index 0294607e8aa..390696dfcdf 100644
--- a/code/game/machinery/atmo_control.dm
+++ b/code/game/machinery/atmo_control.dm
@@ -73,6 +73,11 @@
if(radio_controller)
set_frequency(frequency)
+obj/machinery/air_sensor/Destroy()
+ if(radio_controller)
+ radio_controller.remove_object(src,frequency)
+ ..()
+
/obj/machinery/computer/general_air_control
icon = 'icons/obj/computer.dmi'
icon_state = "tank"
@@ -86,6 +91,11 @@
var/datum/radio_frequency/radio_connection
circuit = /obj/item/weapon/circuitboard/air_management
+obj/machinery/computer/general_air_control/Destroy()
+ if(radio_controller)
+ radio_controller.remove_object(src, frequency)
+ ..()
+
/obj/machinery/computer/general_air_control/attack_hand(mob/user)
if(..(user))
return
diff --git a/code/game/machinery/atmoalter/portable_atmospherics.dm b/code/game/machinery/atmoalter/portable_atmospherics.dm
index 910c84608f4..bb9d399cb8b 100644
--- a/code/game/machinery/atmoalter/portable_atmospherics.dm
+++ b/code/game/machinery/atmoalter/portable_atmospherics.dm
@@ -20,6 +20,10 @@
return 1
+/obj/machinery/portable_atmospherics/Destroy()
+ del(air_contents)
+ ..()
+
/obj/machinery/portable_atmospherics/initialize()
. = ..()
spawn()
diff --git a/code/game/machinery/bots/bots.dm b/code/game/machinery/bots/bots.dm
index d1257eeaf64..3d54f12e30e 100644
--- a/code/game/machinery/bots/bots.dm
+++ b/code/game/machinery/bots/bots.dm
@@ -15,7 +15,6 @@
var/locked = 1
//var/emagged = 0 //Urist: Moving that var to the general /bot tree as it's used by most bots
-
/obj/machinery/bot/proc/turn_on()
if(stat) return 0
on = 1
diff --git a/code/game/machinery/bots/cleanbot.dm b/code/game/machinery/bots/cleanbot.dm
index 87eb1be30ff..7901c097464 100644
--- a/code/game/machinery/bots/cleanbot.dm
+++ b/code/game/machinery/bots/cleanbot.dm
@@ -58,6 +58,10 @@
if(radio_controller)
radio_controller.add_object(src, beacon_freq, filter = RADIO_NAVBEACONS)
+/obj/machinery/bot/cleanbot/Destroy()
+ if(radio_controller)
+ radio_controller.remove_object(src,beacon_freq)
+ ..()
/obj/machinery/bot/cleanbot/turn_on()
. = ..()
diff --git a/code/game/machinery/bots/mulebot.dm b/code/game/machinery/bots/mulebot.dm
index 4226700d2c8..e6df495a10b 100644
--- a/code/game/machinery/bots/mulebot.dm
+++ b/code/game/machinery/bots/mulebot.dm
@@ -76,6 +76,12 @@
suffix = "#[count]"
name = "Mulebot ([suffix])"
+/obj/machinery/bot/mulebot/Destroy()
+ if(radio_controller)
+ radio_controller.remove_object(src,beacon_freq)
+ radio_controller.remove_object(src,control_freq)
+ ..()
+
// attack by item
// emag : lock/unlock,
// screwdriver: open/close hatch
diff --git a/code/game/machinery/bots/secbot.dm b/code/game/machinery/bots/secbot.dm
index f29f8355ca8..7f01ba7e5d3 100644
--- a/code/game/machinery/bots/secbot.dm
+++ b/code/game/machinery/bots/secbot.dm
@@ -107,6 +107,11 @@
if((lasercolor == "r") && (name == created_name))
name = pick("RED RAMPAGE","RED ROVER","RED KILLDEATH MURDERBOT")
+/obj/machinery/bot/mulebot/Destroy()
+ if(radio_controller)
+ radio_controller.remove_object(src,beacon_freq)
+ radio_controller.remove_object(src,control_freq)
+ ..()
/obj/machinery/bot/secbot/update_icon()
if(on && is_attacking)
diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm
index da733083fcf..5670ef20603 100644
--- a/code/game/machinery/camera/camera.dm
+++ b/code/game/machinery/camera/camera.dm
@@ -53,6 +53,14 @@
ASSERT(src.network.len > 0)
..()
+/obj/machinery/camera/Destroy()
+ deactivate(null, 0) //kick anyone viewing out
+ if(assembly)
+ qdel(assembly)
+ assembly = null
+ qdel(wires)
+ ..()
+
/obj/machinery/camera/emp_act(severity)
if(!isEmpProof())
if(prob(100/severity))
diff --git a/code/game/machinery/computer3/laptop.dm b/code/game/machinery/computer3/laptop.dm
index 82807769b40..484db524625 100644
--- a/code/game/machinery/computer3/laptop.dm
+++ b/code/game/machinery/computer3/laptop.dm
@@ -185,7 +185,7 @@
else
stat &= ~NOPOWER
- Del()
+ Destroy()
if(istype(loc,/obj/item/device/laptop))
var/obj/O = loc
spawn(5)
diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm
index d90c895000e..4ccc48f8bd3 100644
--- a/code/game/machinery/cryo.dm
+++ b/code/game/machinery/cryo.dm
@@ -25,8 +25,10 @@
initialize_directions = dir
/obj/machinery/atmospherics/unary/cryo_cell/Destroy()
- if(occupant)
- occupant.loc = loc
+ var/turf/T = loc
+ T.contents += contents
+ if(beaker)
+ beaker.loc = get_step(loc, SOUTH) //Beaker is carefully ejected from the wreckage of the cryotube
..()
/obj/machinery/atmospherics/unary/cryo_cell/initialize()
diff --git a/code/game/machinery/doors/airlock_control.dm b/code/game/machinery/doors/airlock_control.dm
index ad9d9910365..053b776736e 100644
--- a/code/game/machinery/doors/airlock_control.dm
+++ b/code/game/machinery/doors/airlock_control.dm
@@ -30,7 +30,7 @@ obj/machinery/door/airlock/proc/execute_current_command()
if (!cur_command)
return
-
+
do_command(cur_command)
if (command_completed(cur_command))
cur_command = null
@@ -63,7 +63,7 @@ obj/machinery/door/airlock/proc/do_command(var/command)
lock()
sleep(2)
-
+
send_status()
obj/machinery/door/airlock/proc/command_completed(var/command)
@@ -85,7 +85,7 @@ obj/machinery/door/airlock/proc/command_completed(var/command)
if("secure_close")
return (locked && density)
-
+
return 1 //Unknown command. Just assume it's completed.
obj/machinery/door/airlock/proc/send_status(var/bumped = 0)
@@ -97,7 +97,7 @@ obj/machinery/door/airlock/proc/send_status(var/bumped = 0)
signal.data["door_status"] = density?("closed"):("open")
signal.data["lock_status"] = locked?("locked"):("unlocked")
-
+
if (bumped)
signal.data["bumped_with_access"] = 1
@@ -142,8 +142,10 @@ obj/machinery/door/airlock/New()
if(radio_controller)
set_frequency(frequency)
-
-
+obj/machinery/door/airlock/Destroy()
+ if(frequency && radio_controller)
+ radio_controller.remove_object(src,frequency)
+ ..()
obj/machinery/airlock_sensor
icon = 'icons/obj/airlock_machines.dmi'
@@ -215,6 +217,10 @@ obj/machinery/airlock_sensor/New()
if(radio_controller)
set_frequency(frequency)
+obj/machinery/airlock_sensor/Destroy()
+ if(radio_controller)
+ radio_controller.remove_object(src,frequency)
+ ..()
obj/machinery/airlock_sensor/airlock_interior
command = "cycle_interior"
@@ -283,6 +289,11 @@ obj/machinery/access_button/New()
if(radio_controller)
set_frequency(frequency)
+obj/machinery/access_button/Destroy()
+ if(radio_controller)
+ radio_controller.remove_object(src, frequency)
+ ..()
+
obj/machinery/access_button/airlock_interior
frequency = 1379
command = "cycle_interior"
diff --git a/code/game/machinery/doors/alarmlock.dm b/code/game/machinery/doors/alarmlock.dm
index 67e5c83dc30..27033903afe 100644
--- a/code/game/machinery/doors/alarmlock.dm
+++ b/code/game/machinery/doors/alarmlock.dm
@@ -13,6 +13,11 @@
..()
air_connection = new
+/obj/machinery/door/airlock/alarmlock/Destroy()
+ if(radio_controller)
+ radio_controller.remove_object(src,air_frequency)
+ ..()
+
/obj/machinery/door/airlock/alarmlock/initialize()
..()
radio_controller.remove_object(src, air_frequency)
diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm
index 17db582bdd0..8fd0629ed03 100644
--- a/code/game/machinery/doors/door.dm
+++ b/code/game/machinery/doors/door.dm
@@ -68,7 +68,6 @@
update_nearby_tiles(need_rebuild=1)
return
-
/obj/machinery/door/Destroy()
density = 0
update_nearby_tiles()
diff --git a/code/game/machinery/embedded_controller/embedded_controller_base.dm b/code/game/machinery/embedded_controller/embedded_controller_base.dm
index 0e6de7c5dcd..a128e6c4e48 100644
--- a/code/game/machinery/embedded_controller/embedded_controller_base.dm
+++ b/code/game/machinery/embedded_controller/embedded_controller_base.dm
@@ -9,6 +9,11 @@
var/on = 1
+obj/machinery/embedded_controller/radio/Destroy()
+ if(radio_controller)
+ radio_controller.remove_object(src,frequency)
+ ..()
+
/obj/machinery/embedded_controller/proc/post_signal(datum/signal/signal, comm_line)
return 0
diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm
index ebe0bc60d65..1c57b14a900 100644
--- a/code/game/machinery/machinery.dm
+++ b/code/game/machinery/machinery.dm
@@ -49,7 +49,7 @@ Class Variables:
Class Procs:
New() 'game/machinery/machine.dm'
- Del() 'game/machinery/machine.dm'
+ Destroy() 'game/machinery/machine.dm'
auto_use_power() 'game/machinery/machine.dm'
This proc determines how power mode power is deducted by the machine.
diff --git a/code/game/machinery/magnet.dm b/code/game/machinery/magnet.dm
index e6dcd63bd0a..501d7a0b758 100644
--- a/code/game/machinery/magnet.dm
+++ b/code/game/machinery/magnet.dm
@@ -190,8 +190,10 @@
pulling = 0
-
-
+/obj/machinery/magnetic_module/Destroy()
+ if(radio_controller)
+ radio_controller.remove_object(src, freq)
+ ..()
/obj/machinery/magnetic_controller
name = "Magnetic Control Console"
@@ -399,25 +401,7 @@
// there doesn't HAVE to be separators but it makes paths syntatically visible
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+/obj/machinery/magnetic_controller/Destroy()
+ if(radio_controller)
+ radio_controller.remove_object(src, frequency)
+ ..()
diff --git a/code/game/machinery/navbeacon.dm b/code/game/machinery/navbeacon.dm
index de2a13aab52..d7224f2212a 100644
--- a/code/game/machinery/navbeacon.dm
+++ b/code/game/machinery/navbeacon.dm
@@ -240,6 +240,7 @@ Transponder Codes:
"}
updateDialog()
-
-
-
+/obj/machinery/navbeacon/Destroy()
+ if(radio_controller)
+ radio_controller.remove_object(src, freq)
+ ..()
diff --git a/code/game/machinery/requests_console.dm b/code/game/machinery/requests_console.dm
index e624e61d589..a5638067147 100644
--- a/code/game/machinery/requests_console.dm
+++ b/code/game/machinery/requests_console.dm
@@ -80,37 +80,48 @@ var/list/obj/machinery/requests_console/allConsoles = list()
//req_console_departments += department
switch(departmentType)
if(1)
- if(!("[department]" in req_console_assistance))
- req_console_assistance += department
+ req_console_assistance |= department
if(2)
- if(!("[department]" in req_console_supplies))
- req_console_supplies += department
+ req_console_supplies |= department
if(3)
- if(!("[department]" in req_console_information))
- req_console_information += department
+ req_console_information |= department
if(4)
- if(!("[department]" in req_console_assistance))
- req_console_assistance += department
- if(!("[department]" in req_console_supplies))
- req_console_supplies += department
+ req_console_assistance |= department
+ req_console_supplies |= department
if(5)
- if(!("[department]" in req_console_assistance))
- req_console_assistance += department
- if(!("[department]" in req_console_information))
- req_console_information += department
+ req_console_assistance |= department
+ req_console_information |= department
if(6)
- if(!("[department]" in req_console_supplies))
- req_console_supplies += department
- if(!("[department]" in req_console_information))
- req_console_information += department
+ req_console_supplies |= department
+ req_console_information |= department
if(7)
- if(!("[department]" in req_console_assistance))
- req_console_assistance += department
- if(!("[department]" in req_console_supplies))
- req_console_supplies += department
- if(!("[department]" in req_console_information))
- req_console_information += department
+ req_console_assistance |= department
+ req_console_supplies |= department
+ req_console_information |= department
+/obj/machinery/requests_console/Destroy()
+ allConsoles -= src
+ switch(departmentType)
+ if(1)
+ req_console_assistance -= department
+ if(2)
+ req_console_supplies -= department
+ if(3)
+ req_console_information -= department
+ if(4)
+ req_console_assistance -= department
+ req_console_supplies -= department
+ if(5)
+ req_console_assistance -= department
+ req_console_information -= department
+ if(6)
+ req_console_supplies -= department
+ req_console_information -= department
+ if(7)
+ req_console_assistance -= department
+ req_console_supplies -= department
+ req_console_information -= department
+ ..()
/obj/machinery/requests_console/attack_hand(user as mob)
if(..(user))
diff --git a/code/game/machinery/status_display.dm b/code/game/machinery/status_display.dm
index 8d7ed7fccc4..cf67c4d01f0 100644
--- a/code/game/machinery/status_display.dm
+++ b/code/game/machinery/status_display.dm
@@ -45,6 +45,11 @@
var/const/STATUS_DISPLAY_TIME = 4
var/const/STATUS_DISPLAY_CUSTOM = 99
+/obj/machinery/status_display/Destroy()
+ if(radio_controller)
+ radio_controller.remove_object(src,frequency)
+ ..()
+
// register for radio system
/obj/machinery/status_display/initialize()
..()
diff --git a/code/game/machinery/telecomms/telecomunications.dm b/code/game/machinery/telecomms/telecomunications.dm
index 9e3fdf81e28..4bca127857e 100644
--- a/code/game/machinery/telecomms/telecomunications.dm
+++ b/code/game/machinery/telecomms/telecomunications.dm
@@ -130,9 +130,11 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list()
for(var/obj/machinery/telecomms/T in telecomms_list)
add_link(T)
-
/obj/machinery/telecomms/Destroy()
telecomms_list -= src
+ for(var/obj/machinery/telecomms/comm in telecomms_list)
+ comm.links -= src
+ links = list()
..()
// Used in auto linking
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index f4219372f5c..81529cf8044 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -146,9 +146,8 @@
/obj/machinery/vending/Destroy()
qdel(wires)
wires = null
- if(coin)
- qdel(coin)
- coin = null
+ qdel(coin)
+ coin = null
..()
/obj/machinery/vending/ex_act(severity)
diff --git a/code/game/objects/effects/bump_teleporter.dm b/code/game/objects/effects/bump_teleporter.dm
index 256caa010a5..9379234ca68 100644
--- a/code/game/objects/effects/bump_teleporter.dm
+++ b/code/game/objects/effects/bump_teleporter.dm
@@ -17,7 +17,7 @@ var/list/obj/effect/bump_teleporter/BUMP_TELEPORTERS = list()
/obj/effect/bump_teleporter/Destroy()
BUMP_TELEPORTERS -= src
- ..()
+ return ..()
/obj/effect/bump_teleporter/Bumped(atom/user)
if(!ismob(user))
diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm
index d826a78b037..b81089d9fb4 100644
--- a/code/game/objects/effects/decals/Cleanable/humans.dm
+++ b/code/game/objects/effects/decals/Cleanable/humans.dm
@@ -24,7 +24,7 @@ var/global/list/image/splatter_cache=list()
/obj/effect/decal/cleanable/blood/Destroy()
for(var/datum/disease/D in viruses)
D.cure(0)
- ..()
+ return ..()
/obj/effect/decal/cleanable/blood/New()
..()
diff --git a/code/game/objects/effects/effect_system.dm b/code/game/objects/effects/effect_system.dm
index abb4c93f215..29eb08f4875 100644
--- a/code/game/objects/effects/effect_system.dm
+++ b/code/game/objects/effects/effect_system.dm
@@ -23,8 +23,7 @@ would spawn and follow the beaker, even if it is carried or thrown.
/obj/effect/Destroy()
if(reagents)
reagents.delete()
- PlaceInPool(src)
- return 1
+ return ..()
/obj/effect/effect/water/Move(turf/newloc)
//var/turf/T = src.loc
@@ -140,8 +139,7 @@ steam.start() -- spawns the effect
var/turf/T = src.loc
if (istype(T, /turf))
T.hotspot_expose(1000,100)
- ..()
- return
+ return ..()
/obj/effect/effect/sparks/Move()
..()
diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm
index f8b06554bcc..6ca10456713 100644
--- a/code/game/objects/effects/landmarks.dm
+++ b/code/game/objects/effects/landmarks.dm
@@ -83,7 +83,7 @@
/obj/effect/landmark/Destroy()
landmarks_list -= src
- ..()
+ return ..()
/obj/effect/landmark/start
name = "start"
@@ -103,7 +103,8 @@
/obj/effect/landmark/start/ninja/New()
..()
- ninjastart += src
+ ninjastart += loc
+ qdel(src)
//Costume spawner landmarks
diff --git a/code/game/objects/effects/overlays.dm b/code/game/objects/effects/overlays.dm
index b5ba9584ea3..336ee0386d4 100644
--- a/code/game/objects/effects/overlays.dm
+++ b/code/game/objects/effects/overlays.dm
@@ -3,10 +3,6 @@
unacidable = 1
var/i_attached//Added for possible image attachments to objects. For hallucinations and the like.
-/obj/effect/overlay/Destroy()
- PlaceInPool(src)
- return 1 //cancels the GCing
-
/obj/effect/overlay/beam//Not actually a projectile, just an effect.
name="beam"
icon='icons/effects/beam.dmi'
diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm
index 14c81a10933..54da6b1b371 100644
--- a/code/game/objects/effects/spiders.dm
+++ b/code/game/objects/effects/spiders.dm
@@ -209,4 +209,4 @@
src.visible_message("\red \the [src] splits open.")
for(var/atom/movable/A in contents)
A.loc = src.loc
- ..()
+ return ..()
diff --git a/code/game/objects/items/devices/PDA/cart.dm b/code/game/objects/items/devices/PDA/cart.dm
index 5ab09d08539..992f2f251c4 100644
--- a/code/game/objects/items/devices/PDA/cart.dm
+++ b/code/game/objects/items/devices/PDA/cart.dm
@@ -115,7 +115,9 @@
spawn(5)
radio = new /obj/item/radio/integrated/signal(src)
-
+/obj/item/weapon/cartridge/signal/Destroy()
+ qdel(radio)
+ ..()
/obj/item/weapon/cartridge/quartermaster
name = "\improper Space Parts & Space Vendors cartridge"
diff --git a/code/game/objects/items/devices/PDA/radio.dm b/code/game/objects/items/devices/PDA/radio.dm
index 0c7105118fb..5998fb8d3bc 100644
--- a/code/game/objects/items/devices/PDA/radio.dm
+++ b/code/game/objects/items/devices/PDA/radio.dm
@@ -99,6 +99,12 @@
post_signal(control_freq, "command", "summon", "active", active, "target", get_turf(PDA) , s_filter = RADIO_SECBOT)
post_signal(control_freq, "command", "bot_status", "active", active, s_filter = RADIO_SECBOT)
+
+/obj/item/radio/integrated/beepsky/Destroy()
+ if(radio_controller)
+ radio_controller.remove_object(src, control_freq)
+ ..()
+
/obj/item/radio/integrated/mule
var/list/botlist = null // list of bots
var/obj/machinery/bot/mulebot/active // the active bot; if null, show bot list
@@ -245,3 +251,8 @@
radio_connection.post_signal(src, signal)
return
+
+/obj/item/radio/integrated/signal/Destroy()
+ if(radio_controller)
+ radio_controller.remove_object(src, frequency)
+ ..()
diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm
index 7378c85f168..e2e2c2b365a 100644
--- a/code/game/objects/items/devices/radio/headset.dm
+++ b/code/game/objects/items/devices/radio/headset.dm
@@ -29,6 +29,8 @@
/obj/item/device/radio/headset/Destroy()
qdel(keyslot1)
qdel(keyslot2)
+ keyslot1 = null
+ keyslot2 = null
..()
/obj/item/device/radio/headset/examine(mob/user)
diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm
index 39cc0304329..d03179cff82 100644
--- a/code/game/objects/items/devices/radio/radio.dm
+++ b/code/game/objects/items/devices/radio/radio.dm
@@ -45,6 +45,15 @@
if(radio_controller)
initialize()
+/obj/item/device/radio/Destroy()
+ qdel(wires)
+ wires = null
+ if(radio_controller)
+ radio_controller.remove_object(src, frequency)
+ for (var/ch_name in channels)
+ radio_controller.remove_object(src, radiochannels[ch_name])
+ ..()
+
/obj/item/device/radio/initialize()
@@ -625,7 +634,6 @@
onclose(user, "radio")
return
-
/obj/item/device/radio/proc/config(op)
if(radio_controller)
for (var/ch_name in channels)
diff --git a/code/game/objects/items/shooting_range.dm b/code/game/objects/items/shooting_range.dm
index 28b8a18fa42..2893b4f3a10 100644
--- a/code/game/objects/items/shooting_range.dm
+++ b/code/game/objects/items/shooting_range.dm
@@ -9,7 +9,7 @@
var/icon/virtualIcon
var/list/bulletholes = list()
- Del()
+ Destroy()
// if a target is deleted and associated with a stake, force stake to forget
for(var/obj/structure/target_stake/T in view(3,src))
if(T.pinned_target == src)
diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm
index 7aa7a034617..a34e39ab9a3 100644
--- a/code/game/objects/items/stacks/stack.dm
+++ b/code/game/objects/items/stacks/stack.dm
@@ -31,10 +31,10 @@
/obj/item/stack/Destroy()
if(uses_charge)
- return
+ return 1
if (src && usr && usr.machine == src)
usr << browse(null, "window=stack")
- ..()
+ return ..()
/obj/item/stack/examine(mob/user)
if(..(user, 1))
diff --git a/code/game/objects/items/weapons/RCD.dm b/code/game/objects/items/weapons/RCD.dm
index 92ce56be523..52e7fac02d0 100644
--- a/code/game/objects/items/weapons/RCD.dm
+++ b/code/game/objects/items/weapons/RCD.dm
@@ -40,6 +40,11 @@
spark_system.set_up(5, 0, src)
spark_system.attach(src)
+/obj/item/weapon/rcd/Destroy()
+ qdel(spark_system)
+ spark_system = null
+ return ..()
+
/obj/item/weapon/rcd/attackby(obj/item/weapon/W, mob/user)
if(istype(W, /obj/item/weapon/rcd_ammo))
diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm
index 5ceb3a5ccd7..ba605549fa6 100644
--- a/code/game/objects/items/weapons/implants/implant.dm
+++ b/code/game/objects/items/weapons/implants/implant.dm
@@ -46,7 +46,7 @@
icon_state = "implant_melted"
malfunction = MALFUNCTION_PERMANENT
- Del()
+ Destroy()
if(part)
part.implants.Remove(src)
..()
diff --git a/code/game/objects/items/weapons/storage/internal.dm b/code/game/objects/items/weapons/storage/internal.dm
index 5dda9b89c25..89f058ba477 100644
--- a/code/game/objects/items/weapons/storage/internal.dm
+++ b/code/game/objects/items/weapons/storage/internal.dm
@@ -9,6 +9,10 @@
name = master_item.name
verbs -= /obj/item/verb/verb_pickup //make sure this is never picked up.
..()
+
+/obj/item/weapon/storage/internal/Destroy()
+ master_item = null
+ ..()
/obj/item/weapon/storage/internal/attack_hand()
return //make sure this is never picked up
diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm
index c70ade7e621..9a119835c18 100644
--- a/code/game/objects/items/weapons/storage/storage.dm
+++ b/code/game/objects/items/weapons/storage/storage.dm
@@ -11,6 +11,7 @@
w_class = 3
var/list/can_hold = new/list() //List of objects which this item can store (if set, it can't store anything else)
var/list/cant_hold = new/list() //List of objects which this item can't store (in effect only if can_hold isn't set)
+ var/list/is_seeing = new/list() //List of mobs which are currently seeing the contents of this item's storage
var/max_w_class = 2 //Max size of objects that this object can store (in effect only if can_hold isn't set)
var/max_storage_space = 14 //The sum of the storage costs of all the items in this storage item.
var/storage_slots = 7 //The number of storage slots in this container.
@@ -23,6 +24,12 @@
var/collection_mode = 1; //0 = pick one at a time, 1 = pick all on tile
var/use_sound = "rustle" //sound played when used. null for no sound.
+/obj/item/weapon/storage/Destroy()
+ close_all()
+ qdel(boxes)
+ qdel(closer)
+ ..()
+
/obj/item/weapon/storage/MouseDrop(obj/over_object as obj)
if(!canremove)
@@ -86,6 +93,7 @@
user.client.screen += src.closer
user.client.screen += src.contents
user.s_active = src
+ is_seeing |= user
return
/obj/item/weapon/storage/proc/hide_from(mob/user as mob)
@@ -97,7 +105,7 @@
user.client.screen -= src.contents
if(user.s_active == src)
user.s_active = null
- return
+ is_seeing -= user
/obj/item/weapon/storage/proc/open(mob/user as mob)
if (src.use_sound)
@@ -109,11 +117,24 @@
show_to(user)
/obj/item/weapon/storage/proc/close(mob/user as mob)
-
src.hide_from(user)
user.s_active = null
return
+/obj/item/weapon/storage/proc/close_all()
+ for(var/mob/M in can_see_contents())
+ close(M)
+ . = 1
+
+/obj/item/weapon/storage/proc/can_see_contents()
+ var/list/cansee = list()
+ for(var/mob/M in is_seeing)
+ if(M.s_active == src && M.client)
+ cansee |= M
+ else
+ is_seeing -= M
+ return cansee
+
//This proc draws out the inventory and places the items on it. tx and ty are the upper left tile and mx, my are the bottm right.
//The numbers are calculated from the bottom-left The bottom-left slot being 1,1.
/obj/item/weapon/storage/proc/orient_objs(tx, ty, mx, my)
@@ -463,4 +484,4 @@
return depth
/obj/item/proc/get_storage_cost()
- return 2**(w_class-1) //1,2,4,8,16,...
+ return 2**(w_class-1) //1,2,4,8,16,...
diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm
index af95bddc408..7455e987227 100644
--- a/code/game/objects/structures.dm
+++ b/code/game/objects/structures.dm
@@ -6,10 +6,11 @@
var/parts
/obj/structure/Destroy()
- ..()
+ if(opacity)
+ UpdateAffectingLights()
if(parts)
new parts(loc)
- density = 0
+ ..()
/obj/structure/attack_hand(mob/user)
if(breakable)
diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm
index 68316e07a65..d0a60d2a3e5 100644
--- a/code/game/objects/structures/mineral_doors.dm
+++ b/code/game/objects/structures/mineral_doors.dm
@@ -22,7 +22,7 @@
name = "[mineralType] door"
update_nearby_tiles(need_rebuild=1)
- Del()
+ Destroy()
update_nearby_tiles()
..()
diff --git a/code/game/supplyshuttle.dm b/code/game/supplyshuttle.dm
index beb4133d19b..3c6e434b8c5 100644
--- a/code/game/supplyshuttle.dm
+++ b/code/game/supplyshuttle.dm
@@ -102,7 +102,7 @@ var/list/mechtoys = list(
T.blocks_air = 1
..()
- Del() //lazy hack to set the turf to allow air to pass if it's a simulated floor
+ Destroy() //lazy hack to set the turf to allow air to pass if it's a simulated floor
var/turf/T = get_turf(loc)
if(T)
if(istype(T, /turf/simulated/floor))
diff --git a/code/game/turfs/turf_flick_animations.dm b/code/game/turfs/turf_flick_animations.dm
index 59bcfd56d7b..b1bccd51bcd 100644
--- a/code/game/turfs/turf_flick_animations.dm
+++ b/code/game/turfs/turf_flick_animations.dm
@@ -17,5 +17,5 @@
flick("turf_animation",c_animation)
spawn(10)
if(c_animation)
- PlaceInPool(c_animation)
+ qdel(c_animation)
c_animation = null
diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm
index 53bc063c918..3f3c4f4dbd5 100644
--- a/code/modules/assembly/infrared.dm
+++ b/code/modules/assembly/infrared.dm
@@ -259,6 +259,9 @@
return
/obj/effect/beam/i_beam/Destroy()
- qdel(next)
+ if(master.first == src)
+ master.first = null
+ if(next)
+ qdel(next)
+ next = null
..()
- return
diff --git a/code/modules/assembly/signaler.dm b/code/modules/assembly/signaler.dm
index 0b2acd5a5b0..d12d11662a8 100644
--- a/code/modules/assembly/signaler.dm
+++ b/code/modules/assembly/signaler.dm
@@ -141,6 +141,8 @@
proc/set_frequency(new_frequency)
+ if(!frequency)
+ return
if(!radio_controller)
sleep(20)
if(!radio_controller)
@@ -170,3 +172,9 @@
deadman = 1
processing_objects.Add(src)
usr.visible_message("\red [usr] moves their finger over [src]'s signal button...")
+
+/obj/item/device/assembly/signaler/Destroy()
+ if(radio_controller)
+ radio_controller.remove_object(src,frequency)
+ frequency = 0
+ ..()
diff --git a/code/modules/clothing/suits/storage.dm b/code/modules/clothing/suits/storage.dm
index 692e2987f54..221a8dbd293 100644
--- a/code/modules/clothing/suits/storage.dm
+++ b/code/modules/clothing/suits/storage.dm
@@ -8,6 +8,11 @@
pockets.max_w_class = 2 //fit only pocket sized items
pockets.max_storage_space = 4
+/obj/item/clothing/suit/storage/Destroy()
+ qdel(pockets)
+ pockets = null
+ ..()
+
/obj/item/clothing/suit/storage/attack_hand(mob/user as mob)
if (pockets.handle_attack_hand(user))
..(user)
@@ -59,7 +64,6 @@
pockets.max_w_class = 2
pockets.max_storage_space = 8
-
/obj/item/clothing/suit/storage/vest
var/icon_badge
var/icon_nobadge
diff --git a/code/modules/mob/freelook/ai/cameranet.dm b/code/modules/mob/freelook/ai/cameranet.dm
index 2fb3c4b5ced..f29749b38c1 100644
--- a/code/modules/mob/freelook/ai/cameranet.dm
+++ b/code/modules/mob/freelook/ai/cameranet.dm
@@ -3,7 +3,7 @@
// The datum containing all the chunks.
/datum/visualnet/camera
- // The cameras on the map, no matter if they work or not. Updated in obj/machinery/camera.dm by New() and Del().
+ // The cameras on the map, no matter if they work or not. Updated in obj/machinery/camera.dm by New() and Destroy().
var/list/cameras = list()
var/cameras_unsorted = 1
chunk_type = /datum/chunk/camera
diff --git a/code/modules/mob/freelook/ai/eye.dm b/code/modules/mob/freelook/ai/eye.dm
index 81aad905c8d..c0a42ace48c 100644
--- a/code/modules/mob/freelook/ai/eye.dm
+++ b/code/modules/mob/freelook/ai/eye.dm
@@ -43,6 +43,7 @@
if(eyeobj)
eyeobj.owner = null
qdel(eyeobj) // No AI, no Eye
+ eyeobj = null
..()
/atom/proc/move_camera_by_click()
diff --git a/code/modules/mob/freelook/read_me.dm b/code/modules/mob/freelook/read_me.dm
index 53e68ff1377..8ddb0689409 100644
--- a/code/modules/mob/freelook/read_me.dm
+++ b/code/modules/mob/freelook/read_me.dm
@@ -20,7 +20,7 @@
HOW IT WORKS
It works by first creating a camera network datum. Inside of this camera network are "chunks" (which will be
- explained later) and "cameras". The cameras list is kept up to date by obj/machinery/camera/New() and Del().
+ explained later) and "cameras". The cameras list is kept up to date by obj/machinery/camera/New() and Destroy().
Next the camera network has chunks. These chunks are a 16x16 tile block of turfs and cameras contained inside the chunk.
These turfs are then sorted out based on what the cameras can and cannot see. If none of the cameras can see the turf, inside
diff --git a/code/modules/mob/freelook/update_triggers.dm b/code/modules/mob/freelook/update_triggers.dm
index c7dc3466486..8408083ba8b 100644
--- a/code/modules/mob/freelook/update_triggers.dm
+++ b/code/modules/mob/freelook/update_triggers.dm
@@ -36,7 +36,7 @@
/obj/effect/Destroy()
updateVisibility(src)
- ..()
+ return ..()
/obj/effect/New()
..()
diff --git a/code/modules/mob/living/carbon/brain/MMI.dm b/code/modules/mob/living/carbon/brain/MMI.dm
index 819613ee655..0e548bab25c 100644
--- a/code/modules/mob/living/carbon/brain/MMI.dm
+++ b/code/modules/mob/living/carbon/brain/MMI.dm
@@ -115,6 +115,15 @@
locked = 1
return
+/obj/item/device/mmi/Destroy()
+ if(isrobot(loc))
+ var/mob/living/silicon/robot/borg = loc
+ borg.mmi = null
+ if(brainmob)
+ qdel(brainmob)
+ brainmob = null
+ ..()
+
/obj/item/device/mmi/radio_enabled
name = "radio-enabled man-machine interface"
desc = "The Warrior's bland acronym, MMI, obscures the true horror of this monstrosity. This one comes with a built-in radio."
diff --git a/code/modules/mob/living/carbon/brain/brain.dm b/code/modules/mob/living/carbon/brain/brain.dm
index 230b7736f2d..e72671d78ad 100644
--- a/code/modules/mob/living/carbon/brain/brain.dm
+++ b/code/modules/mob/living/carbon/brain/brain.dm
@@ -15,7 +15,7 @@
R.my_atom = src
..()
- Del()
+ Destroy()
if(key) //If there is a mob connected to this thing. Have to check key twice to avoid false death reporting.
if(stat!=DEAD) //If not dead.
death(1) //Brains can die again. AND THEY SHOULD AHA HA HA HA HA HA
diff --git a/code/modules/mob/living/carbon/brain/brain_item.dm b/code/modules/mob/living/carbon/brain/brain_item.dm
index 05ceed79162..486916821bc 100644
--- a/code/modules/mob/living/carbon/brain/brain_item.dm
+++ b/code/modules/mob/living/carbon/brain/brain_item.dm
@@ -27,6 +27,12 @@
if(brainmob && brainmob.client)
brainmob.client.screen.len = null //clear the hud
+/obj/item/organ/brain/Destroy()
+ if(brainmob)
+ qdel(brainmob)
+ brainmob = null
+ ..()
+
/obj/item/organ/brain/proc/transfer_identity(var/mob/living/carbon/H)
name = "\the [H]'s [initial(src.name)]"
brainmob = new(src)
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index a3b46d64424..6647b7c9304 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -7,6 +7,13 @@
if(germ_level < GERM_LEVEL_AMBIENT && prob(30)) //if you're just standing there, you shouldn't get more germs beyond an ambient level
germ_level++
+/mob/living/carbon/Destroy()
+ for(var/guts in internal_organs)
+ qdel(guts)
+ for(var/food in stomach_contents)
+ qdel(food)
+ return ..()
+
/mob/living/carbon/Move(NewLoc, direct)
. = ..()
if(.)
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 8ab47583400..498b46345d4 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -47,6 +47,11 @@
dna.real_name = real_name
make_blood()
+/mob/living/carbon/human/Destroy()
+ for(var/organ in organs)
+ qdel(organ)
+ return ..()
+
/mob/living/carbon/human/Stat()
..()
statpanel("Status")
@@ -1358,4 +1363,4 @@
/mob/living/carbon/human/drop_from_inventory(var/obj/item/W, var/atom/Target = null)
if(W in organs)
return
- ..()
+ ..()
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index f4809a79eef..93546427826 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -244,7 +244,7 @@ var/list/ai_verbs_default = list(
/obj/machinery/ai_powersupply/New(var/mob/living/silicon/ai/ai=null)
powered_ai = ai
if(isnull(powered_ai))
- Del()
+ qdel(src)
loc = powered_ai.loc
use_power(1) // Just incase we need to wake up the power system.
@@ -253,7 +253,7 @@ var/list/ai_verbs_default = list(
/obj/machinery/ai_powersupply/process()
if(!powered_ai || powered_ai.stat & DEAD)
- Del()
+ qdel(src)
if(!powered_ai.anchored)
loc = powered_ai.loc
use_power = 0
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index f087cee60c8..1aed7a848fb 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -228,11 +228,18 @@
//If there's an MMI in the robot, have it ejected when the mob goes away. --NEO
//Improved /N
/mob/living/silicon/robot/Destroy()
- if(mmi)//Safety for when a cyborg gets dust()ed. Or there is no MMI inside.
+ if(mmi && mind)//Safety for when a cyborg gets dust()ed. Or there is no MMI inside.
var/turf/T = get_turf(loc)//To hopefully prevent run time errors.
if(T) mmi.loc = T
- if(mind) mind.transfer_to(mmi.brainmob)
+ if(mmi.brainmob)
+ mind.transfer_to(mmi.brainmob)
+ else
+ src << "Oops! Something went very wrong, your MMI was unable to receive your mind. You have been ghosted. Please make a bug report so we can fix this bug."
+ ghostize()
+ //ERROR("A borg has been destroyed, but its MMI lacked a brainmob, so the mind could not be transferred. Player: [ckey].")
mmi = null
+ if(connected_ai)
+ connected_ai.connected_robots -= src
..()
/mob/living/silicon/robot/proc/pick_module()
@@ -662,7 +669,7 @@
C.r_arm = new/obj/item/robot_parts/r_arm(C)
C.updateicon()
new/obj/item/robot_parts/chest(loc)
- src.Del()
+ qdel(src)
else
// Okay we're not removing the cell or an MMI, but maybe something else?
var/list/removable_components = list()
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index a48adddeb82..5dfb88b092f 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -11,6 +11,17 @@
var/obj/item/emag = null
var/obj/item/borg/upgrade/jetpack = null
+/obj/item/weapon/robot_module/Destroy()
+ qdel(modules)
+ qdel(synths)
+ qdel(emag)
+ qdel(jetpack)
+ modules = null
+ synths = null
+ emag = null
+ jetpack = null
+ ..()
+
/obj/item/weapon/robot_module/emp_act(severity)
if(modules)
for(var/obj/O in modules)
diff --git a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm
index 02ed66ae21a..af59941b1f7 100644
--- a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm
+++ b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm
@@ -210,7 +210,7 @@
held_item = null
gibs(loc, viruses, null, null, /obj/effect/gibspawner/robot) //TODO: use gib() or refactor spiderbots into synthetics.
- src.Del()
+ qdel(src)
return
//Cannibalized from the parrot mob. ~Zuhayr
diff --git a/code/modules/mob/living/simple_animal/worm.dm b/code/modules/mob/living/simple_animal/worm.dm
index 33915be02b4..6342c66576d 100644
--- a/code/modules/mob/living/simple_animal/worm.dm
+++ b/code/modules/mob/living/simple_animal/worm.dm
@@ -98,7 +98,7 @@
return
- Del() //if a chunk a destroyed, make a new worm out of the split halves
+ Destroy() //if a chunk a destroyed, make a new worm out of the split halves
if(previous)
previous.Detach()
..()
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index cfb8696f8fe..bb654373369 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -2,6 +2,11 @@
mob_list -= src
dead_mob_list -= src
living_mob_list -= src
+ qdel(hud_used)
+ if(mind && mind.current == src)
+ spellremove(src)
+ for(var/infection in viruses)
+ qdel(infection)
ghostize()
..()
@@ -726,52 +731,11 @@ note dizziness decrements automatically in the mob's Life() proc.
statpanel("Status","CPU:","[world.cpu]")
statpanel("Status","Instances:","[world.contents.len]")
if(statpanel("Status") && processScheduler && processScheduler.getIsRunning())
- var/datum/controller/process/process
-
- process = processScheduler.getProcess("air")
- statpanel("Status",process.name, "#[process.getTicks()]\t- [process.getLastRunTime()]")
-
- process = processScheduler.getProcess("alarm")
- var/list/alarms = alarm_manager.active_alarms()
- statpanel("Status",process.name+"([alarms.len])","#[process.getTicks()]\t- [process.getLastRunTime()]")
-
- process = processScheduler.getProcess("disease")
- statpanel("Status",process.name+"([active_diseases.len])","#[process.getTicks()]\t- [process.getLastRunTime()]")
-
- process = processScheduler.getProcess("garbage")
- statpanel("Status",process.name+"([garbage_collector.dels])","#[process.getTicks()]\t- [process.getLastRunTime()]")
-
- process = processScheduler.getProcess("machinery")
- statpanel("Status",process.name+"([machines.len])","#[process.getTicks()]\t- [process.getLastRunTime()]")
-
- process = processScheduler.getProcess("mob")
- statpanel("Status",process.name+"([mob_list.len])","#[process.getTicks()]\t- [process.getLastRunTime()]")
-
- process = processScheduler.getProcess("nanoui")
- statpanel("Status",process.name+"([nanomanager.processing_uis.len])","t#[process.getTicks()]\t- [process.getLastRunTime()]")
-
- process = processScheduler.getProcess("lighting")
- statpanel("Status",process.name, "#[process.getTicks()]\t- [process.getLastRunTime()]")
-
- process = processScheduler.getProcess("obj")
- statpanel("Status",process.name+"([processing_objects.len])","#[process.getTicks()]\t- [process.getLastRunTime()]")
-
- process = processScheduler.getProcess("pipenet")
- statpanel("Status",process.name+"([pipe_networks.len])","#[process.getTicks()]\t- [process.getLastRunTime()]")
-
- process = processScheduler.getProcess("powernet")
- statpanel("Status",process.name+"([powernets.len])","#[process.getTicks()]\t- [process.getLastRunTime()]")
-
- process = processScheduler.getProcess("sun")
- statpanel("Status",process.name, "#[process.getTicks()]\t- [process.getLastRunTime()]")
-
- process = processScheduler.getProcess("ticker")
- statpanel("Status",process.name, "#[process.getTicks()]\t- [process.getLastRunTime()]")
-
+ for(var/datum/controller/process/P in processScheduler.processes)
+ statpanel("Status",P.getStatName(), P.getTickTime())
else
statpanel("Status","processScheduler is not running.")
-
if(listed_turf && client)
if(!TurfAdjacent(listed_turf))
listed_turf = null
diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm
index 2246a031c0c..36065960dc1 100644
--- a/code/modules/mob/mob_grab.dm
+++ b/code/modules/mob/mob_grab.dm
@@ -37,7 +37,14 @@
/obj/item/weapon/grab/Destroy()
//make sure the grabbed_by list doesn't fill up with nulls
- if(affecting) affecting.grabbed_by -= src
+ if(affecting)
+ affecting.grabbed_by -= src
+ affecting = null
+ if(assailant)
+ if(assailant.client)
+ assailant.client.screen -= hud
+ assailant = null
+ qdel(hud)
..()
//Used by throw code to hand over the mob, instead of throwing the grab. The grab is then deleted by the throw code.
diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm
index 1c97c6f4d3a..2f388006371 100644
--- a/code/modules/power/singularity/field_generator.dm
+++ b/code/modules/power/singularity/field_generator.dm
@@ -31,7 +31,7 @@ field_generator power level display
var/list/obj/machinery/containment_field/fields
var/list/obj/machinery/field_generator/connected_gens
var/clean_up = 0
-
+
//If keeping field generators powered is hard then increase the emitter active power usage.
var/gen_power_draw = 5500 //power needed per generator
var/field_power_draw = 2000 //power needed per field object
@@ -61,7 +61,6 @@ field_generator power level display
connected_gens = list()
return
-
/obj/machinery/field_generator/process()
if(Varedit_start == 1)
if(active == 0)
@@ -231,22 +230,22 @@ field_generator power level display
//Tries to draw the needed power from our own power reserve, or connected generators if we can. Returns the amount of power we were able to get.
/obj/machinery/field_generator/proc/draw_power(var/draw = 0, var/list/flood_list = list())
flood_list += src
-
+
if(src.power >= draw)//We have enough power
src.power -= draw
return draw
-
+
//Need more power
var/actual_draw = src.power //already checked that power < draw
src.power = 0
-
+
for(var/obj/machinery/field_generator/FG in connected_gens)
if (FG in flood_list)
continue
actual_draw += FG.draw_power(draw - actual_draw, flood_list) //since the flood list reference is shared this actually works.
if (actual_draw >= draw)
return actual_draw
-
+
return actual_draw
/obj/machinery/field_generator/proc/start_fields()
diff --git a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm
index 485a25137bf..6ae932dee1d 100644
--- a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm
+++ b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm
@@ -72,6 +72,12 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin
var/strength = null
var/desc_holder = null
+/obj/structure/particle_accelerator/Destroy()
+ construction_state = 0
+ if(master)
+ master.part_scan()
+ ..()
+
/obj/structure/particle_accelerator/end_cap
name = "Alpha Particle Generation Array"
desc_holder = "This is where Alpha particles are generated from \[REDACTED\]"
diff --git a/code/modules/power/singularity/particle_accelerator/particle_control.dm b/code/modules/power/singularity/particle_accelerator/particle_control.dm
index 26239ff5678..985bd74e62a 100644
--- a/code/modules/power/singularity/particle_accelerator/particle_control.dm
+++ b/code/modules/power/singularity/particle_accelerator/particle_control.dm
@@ -27,6 +27,10 @@
active_power_usage = initial(active_power_usage) * (strength + 1)
..()
+/obj/machinery/particle_accelerator/control_box/Destroy()
+ if(active)
+ toggle_power()
+ ..()
/obj/machinery/particle_accelerator/control_box/attack_hand(mob/user as mob)
if(construction_state >= 3)
diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm
index 593a33c7bfd..e42c5289b7d 100644
--- a/code/modules/power/smes.dm
+++ b/code/modules/power/smes.dm
@@ -83,6 +83,12 @@
return
+
+/obj/machinery/power/smes/Destroy()
+ if(terminal)
+ disconnect_terminal()
+ ..()
+
/obj/machinery/power/smes/update_icon()
overlays.Cut()
if(stat & BROKEN) return
diff --git a/code/modules/projectiles/guns/launcher/crossbow.dm b/code/modules/projectiles/guns/launcher/crossbow.dm
index a0654000e55..4736fc0c7bf 100644
--- a/code/modules/projectiles/guns/launcher/crossbow.dm
+++ b/code/modules/projectiles/guns/launcher/crossbow.dm
@@ -43,7 +43,7 @@
user << "[src] shatters into a scattering of overstressed metal shards as it leaves the crossbow."
var/obj/item/weapon/shard/shrapnel/S = new()
S.loc = get_turf(src)
- src.Del()
+ qdel(src)
/obj/item/weapon/gun/launcher/crossbow
name = "powered crossbow"
diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm
index 871bab523c7..a0ff92aad2a 100644
--- a/code/modules/reagents/Chemistry-Holder.dm
+++ b/code/modules/reagents/Chemistry-Holder.dm
@@ -649,6 +649,15 @@ datum
return trans_data
+datum/reagents/Destroy()
+ ..()
+ for(var/datum/reagent/R in reagent_list)
+ qdel(R)
+ reagent_list.Cut()
+ reagent_list = null
+ if(my_atom && my_atom.reagents == src)
+ my_atom.reagents = null
+
///////////////////////////////////////////////////////////////////////////////////
diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm
index b1fa7c7bc00..560b0c8bff3 100644
--- a/code/modules/reagents/Chemistry-Reagents.dm
+++ b/code/modules/reagents/Chemistry-Reagents.dm
@@ -162,7 +162,7 @@ datum
/* Must check the transfering of reagents and their data first. They all can point to one disease datum.
- Del()
+ Destroy()
if(src.data["virus"])
var/datum/disease/D = src.data["virus"]
D.cure(0)
@@ -1790,7 +1790,7 @@ datum
..()
return
- Del()
+ Destroy()
if(holder && ismob(holder.my_atom))
var/mob/M = holder.my_atom
M.status_flags &= ~FAKEDEATH
@@ -4428,5 +4428,9 @@ datum
..()
return
+datum/reagent/Destroy() // This should only be called by the holder, so it's already handled clearing its references
+ ..()
+ holder = null
+
// Undefine the alias for REAGENTS_EFFECT_MULTIPLER
#undef REM
diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm
index 63cad438519..ead3ba3d91d 100644
--- a/code/modules/recycling/disposal.dm
+++ b/code/modules/recycling/disposal.dm
@@ -43,6 +43,11 @@
air_contents.volume = PRESSURE_TANK_VOLUME
update()
+/obj/machinery/disposal/Destroy()
+ eject()
+ if(trunk)
+ trunk.linked = null
+ ..()
// attack by item places it in to disposal
/obj/machinery/disposal/attackby(var/obj/item/I, var/mob/user)
@@ -638,6 +643,11 @@
location.assume_air(gas) // vent all gas to turf
return
+/obj/structure/disposalholder/Destroy()
+ qdel(gas)
+ active = 0
+ ..()
+
// Disposal pipes
/obj/structure/disposalpipe
@@ -663,7 +673,7 @@
// pipe is deleted
// ensure if holder is present, it is expelled
- Del()
+ Destroy()
var/obj/structure/disposalholder/H = locate() in src
if(H)
// holder was present
@@ -920,6 +930,30 @@
qdel(src)
+// pipe is deleted
+// ensure if holder is present, it is expelled
+/obj/structure/disposalpipe/Destroy()
+ var/obj/structure/disposalholder/H = locate() in src
+ if(H)
+ // holder was present
+ H.active = 0
+ var/turf/T = src.loc
+ if(T.density)
+ // deleting pipe is inside a dense turf (wall)
+ // this is unlikely, but just dump out everything into the turf in case
+
+ for(var/atom/movable/AM in H)
+ AM.loc = T
+ AM.pipe_eject(0)
+ qdel(H)
+ ..()
+ return
+
+ // otherwise, do normal expel from turf
+ if(H)
+ expel(H, T, 0)
+ ..()
+
// *** TEST verb
//client/verb/dispstop()
// for(var/obj/structure/disposalholder/H in world)
@@ -1468,8 +1502,6 @@
user << "You need more welding fuel to complete this task."
return
-
-
// called when movable is expelled from a disposal pipe or outlet
// by default does nothing, override for special behaviour
diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm
index aedbe2a0bde..0b4cd1a608a 100755
--- a/code/modules/recycling/sortingmachinery.dm
+++ b/code/modules/recycling/sortingmachinery.dm
@@ -307,6 +307,16 @@
return
+/obj/structure/bigDelivery/Destroy()
+ if(wrapped) //sometimes items can disappear. For example, bombs. --rastaf0
+ wrapped.loc = (get_turf(loc))
+ if(istype(wrapped, /obj/structure/closet))
+ var/obj/structure/closet/O = wrapped
+ O.welded = 0
+ var/turf/T = get_turf(src)
+ for(var/atom/movable/AM in contents)
+ AM.loc = T
+ ..()
/obj/item/device/destTagger
name = "destination tagger"
@@ -440,3 +450,8 @@
else
user << "You need more welding fuel to complete this task."
return
+
+/obj/machinery/disposal/deliveryChute/Destroy()
+ if(trunk)
+ trunk.linked = null
+ ..()
diff --git a/code/modules/shieldgen/emergency_shield.dm b/code/modules/shieldgen/emergency_shield.dm
index 12781021ba7..2400070ba3a 100644
--- a/code/modules/shieldgen/emergency_shield.dm
+++ b/code/modules/shieldgen/emergency_shield.dm
@@ -153,7 +153,6 @@
collapse_shields()
..()
-
/obj/machinery/shieldgen/proc/shields_up()
if(active) return 0 //If it's already turned on, how did this get called?
@@ -161,7 +160,7 @@
update_icon()
create_shields()
-
+
idle_power_usage = 0
for(var/obj/machinery/shield/shield_tile in deployed_shields)
idle_power_usage += shield_tile.shield_idle_power
@@ -174,7 +173,7 @@
update_icon()
collapse_shields()
-
+
update_use_power(0)
/obj/machinery/shieldgen/proc/create_shields()
@@ -201,22 +200,22 @@
/obj/machinery/shieldgen/process()
if (!active || (stat & NOPOWER))
return
-
+
if(malfunction)
if(deployed_shields.len && prob(5))
qdel(pick(deployed_shields))
else
if (check_delay <= 0)
create_shields()
-
+
var/new_power_usage = 0
for(var/obj/machinery/shield/shield_tile in deployed_shields)
new_power_usage += shield_tile.shield_idle_power
-
+
if (new_power_usage != idle_power_usage)
idle_power_usage = new_power_usage
use_power(0)
-
+
check_delay = 60
else
check_delay--
diff --git a/code/modules/shieldgen/shield_gen.dm b/code/modules/shieldgen/shield_gen.dm
index 6789867232d..9f89ede0394 100644
--- a/code/modules/shieldgen/shield_gen.dm
+++ b/code/modules/shieldgen/shield_gen.dm
@@ -39,6 +39,12 @@
field = new/list()
..()
+/obj/machinery/shield_gen/Destroy()
+ for(var/obj/effect/energy_field/D in field)
+ field.Remove(D)
+ D.loc = null
+ ..()
+
/obj/machinery/shield_gen/attackby(obj/item/W, mob/user)
if(istype(W, /obj/item/weapon/card/id))
var/obj/item/weapon/card/id/C = W
diff --git a/code/modules/spells/targeted/ethereal_jaunt.dm b/code/modules/spells/targeted/ethereal_jaunt.dm
index b6c786c2e31..12dfd55caaa 100644
--- a/code/modules/spells/targeted/ethereal_jaunt.dm
+++ b/code/modules/spells/targeted/ethereal_jaunt.dm
@@ -80,7 +80,7 @@
// Eject contents if deleted somehow
for(var/atom/movable/AM in src)
AM.loc = get_turf(src)
- ..()
+ return ..()
/obj/effect/dummy/spell_jaunt/relaymove(var/mob/user, direction)
if (!src.canmove || reappearing) return