diff --git a/code/datums/expansions/expansion.dm b/code/datums/expansions/expansion.dm
index 936adc2cbd1..8e92e53bdc7 100644
--- a/code/datums/expansions/expansion.dm
+++ b/code/datums/expansions/expansion.dm
@@ -1,7 +1,5 @@
/datum/expansion
-
-/datum/expansion
- var/atom/holder = null // The holder
+ var/datum/holder = null // The holder
/datum/expansion/New(var/atom/holder)
if(!istype(holder))
@@ -22,3 +20,18 @@
if(CanUseTopic(usr) != STATUS_INTERACTIVE)
return 1
return 0
+
+/obj
+ var/list/datum/expansion/expansions = list()
+
+/obj/Destroy()
+ if(expansions)
+ for(var/expansion in expansions)
+ qdel(expansions[expansion])
+ expansions.Cut()
+ return ..()
+
+/obj/proc/set_expansion(var/type, var/instance)
+ if(expansions[type])
+ qdel(expansions[type])
+ expansions[type] = instance
diff --git a/code/datums/expansions/multitool/cloning.dm b/code/datums/expansions/multitool/cloning.dm
index 334c192ec7f..aeea22ef1e1 100644
--- a/code/datums/expansions/multitool/cloning.dm
+++ b/code/datums/expansions/multitool/cloning.dm
@@ -1,5 +1,9 @@
/datum/expansion/multitool/cryo/get_interact_window(var/obj/item/device/multitool/M, var/mob/user)
- return buffer(M)
+ . += buffer(M)
+ . += "
Connected Cloning Pods:
"
+ var/obj/machinery/computer/cloning/C = holder
+ for(var/atom/cloning_pod in C.pods)
+ . += "[cloning_pod.name]
"
/datum/expansion/multitool/cryo/receive_buffer(var/obj/item/device/multitool/M, var/atom/buffer, var/mob/user)
var/obj/machinery/clonepod/P = buffer
diff --git a/code/datums/expansions/multitool/multitool.dm b/code/datums/expansions/multitool/multitool.dm
index 5325ca32ca4..8a2b8226171 100644
--- a/code/datums/expansions/multitool/multitool.dm
+++ b/code/datums/expansions/multitool/multitool.dm
@@ -17,9 +17,9 @@
var/html = get_interact_window(M, user)
if(html)
- var/datum/browser/popup = new(usr, "multitool", holder.name, window_x, window_y)
+ var/datum/browser/popup = new(usr, "multitool", "Multitool Menu", window_x, window_y)
popup.set_content(html)
- popup.set_title_image(user.browse_rsc_icon(holder.icon, holder.icon_state))
+ popup.set_title_image(user.browse_rsc_icon(M.icon, M.icon_state))
popup.open()
else
close_window(usr)
@@ -32,8 +32,9 @@
/datum/expansion/multitool/proc/buffer(var/obj/item/device/multitool/multitool)
. += "Buffer Memory:
"
- if(multitool.buffer_name)
- . += "[multitool.buffer_name] Send Purge
"
+ var/buffer_name = multitool.get_buffer_name()
+ if(buffer_name)
+ . += "[buffer_name] Send Purge
"
else
. += "No connection stored in the buffer."
@@ -78,8 +79,10 @@
return MT_NOACTION
/datum/expansion/multitool/proc/send_buffer(var/obj/item/device/multitool/M, var/atom/buffer, var/mob/user)
- if(M.get_buffer() == buffer)
+ if(M.get_buffer() == buffer && buffer)
receive_buffer(M, buffer, user)
+ else if(!buffer)
+ user << "Unable to acquire data from the buffered object. Purging from memory."
return MT_REFRESH
/datum/expansion/multitool/proc/receive_buffer(var/obj/item/device/multitool/M, var/atom/buffer, var/mob/user)
diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm
index c6903b9c663..29deac78e16 100644
--- a/code/game/machinery/cloning.dm
+++ b/code/game/machinery/cloning.dm
@@ -57,7 +57,7 @@
RefreshParts()
update_icon()
- expansions[/datum/expansion/multitool] = new/datum/expansion/multitool/store(src)
+ set_expansion(/datum/expansion/multitool, new/datum/expansion/multitool/store(src))
/obj/machinery/clonepod/Destroy()
if(connected)
diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm
index e6a5f067412..69400c1ffdb 100644
--- a/code/game/machinery/computer/cloning.dm
+++ b/code/game/machinery/computer/cloning.dm
@@ -18,7 +18,7 @@
/obj/machinery/computer/cloning/initialize()
..()
- expansions[/datum/expansion/multitool] = new/datum/expansion/multitool/cryo(src, list(/proc/is_operable))
+ set_expansion(/datum/expansion/multitool, new/datum/expansion/multitool/cryo(src, list(/proc/is_operable)))
updatemodules()
/obj/machinery/computer/cloning/Destroy()
diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm
index e7c1872af9d..a804041694a 100644
--- a/code/game/objects/items/devices/multitool.dm
+++ b/code/game/objects/items/devices/multitool.dm
@@ -24,12 +24,19 @@
var/atom/buffer_object
/obj/item/device/multitool/proc/get_buffer(var/typepath)
- // Update the buffer name only when someone fetches the buffer.
+ // Only allow clearing the buffer name when someone fetches the buffer.
// Means you cannot be sure the source hasn't been destroyed until the very moment it's needed.
- buffer_name = buffer_object ? buffer_object.name : null
+ get_buffer_name(TRUE)
if(buffer_object && (!typepath || istype(buffer_object, typepath)))
return buffer_object
+/obj/item/device/multitool/proc/get_buffer_name(var/null_name_if_missing = FALSE)
+ if(buffer_object)
+ buffer_name = buffer_object.name
+ else if(null_name_if_missing)
+ buffer_name = null
+ return buffer_name
+
/obj/item/device/multitool/proc/set_buffer(var/atom/buffer)
if(!buffer || istype(buffer))
buffer_name = buffer ? buffer.name : null
diff --git a/code/game/objects/items/weapons/circuitboards/computer/station_alert.dm b/code/game/objects/items/weapons/circuitboards/computer/station_alert.dm
index 4f3c5800859..7eca3b4bf87 100644
--- a/code/game/objects/items/weapons/circuitboards/computer/station_alert.dm
+++ b/code/game/objects/items/weapons/circuitboards/computer/station_alert.dm
@@ -5,7 +5,7 @@
/obj/item/weapon/circuitboard/stationalert/New()
alarm_handlers = new()
- expansions[/datum/expansion/multitool] = new /datum/expansion/multitool/circuitboards/stationalert(src)
+ set_expansion(/datum/expansion/multitool, new/datum/expansion/multitool/circuitboards/stationalert(src))
..()
/obj/item/weapon/circuitboard/stationalert/construct(var/obj/machinery/computer/station_alert/SA)
diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm
index 063c9c7693f..69d10e00e02 100644
--- a/code/game/objects/objs.dm
+++ b/code/game/objects/objs.dm
@@ -14,14 +14,8 @@
var/force = 0
var/armor_penetration = 0
- var/list/datum/expansion/expansions = list()
-
/obj/Destroy()
processing_objects -= src
- for(var/expansion in expansions)
- qdel(expansions[expansion])
- if(expansions)
- expansions.Cut()
return ..()
/obj/Topic(href, href_list, var/datum/topic_state/state = default_state)