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)