diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm
index 622264189bf..ef9cce290c2 100644
--- a/code/game/area/areas.dm
+++ b/code/game/area/areas.dm
@@ -169,11 +169,12 @@
poweralm = state
if(istype(source)) //Only report power alarms on the z-level where the source is located.
for(var/thing in cameras)
- var/obj/machinery/camera/C = thing
- if(state == 1)
- C.network -= "Power Alarms"
- else
- C.network |= "Power Alarms"
+ var/obj/machinery/camera/C = locateUID(thing)
+ if(!QDELETED(C))
+ if(state == 1)
+ C.network -= "Power Alarms"
+ else
+ C.network |= "Power Alarms"
for(var/item in GLOB.silicon_mob_list)
var/mob/living/silicon/aiPlayer = item
@@ -206,8 +207,9 @@
if(danger_level == ATMOS_ALARM_DANGER)
for(var/thing in cameras)
- var/obj/machinery/camera/C = thing
- C.network |= "Atmosphere Alarms"
+ var/obj/machinery/camera/C = locateUID(thing)
+ if(!QDELETED(C))
+ C.network |= "Atmosphere Alarms"
for(var/item in GLOB.silicon_mob_list)
var/mob/living/silicon/aiPlayer = item
@@ -221,8 +223,9 @@
else if(atmosalm == ATMOS_ALARM_DANGER)
for(var/thing in cameras)
- var/obj/machinery/camera/C = thing
- C.network -= "Atmosphere Alarms"
+ var/obj/machinery/camera/C = locateUID(thing)
+ if(!QDELETED(C))
+ C.network -= "Atmosphere Alarms"
for(var/item in GLOB.silicon_mob_list)
var/mob/living/silicon/aiPlayer = item
aiPlayer.cancelAlarm("Atmosphere", src, source)
@@ -277,8 +280,9 @@
F.update_icon()
for(var/thing in cameras)
- var/obj/machinery/camera/C = thing
- C.network |= "Fire Alarms"
+ var/obj/machinery/camera/C = locateUID(thing)
+ if(!QDELETED(C))
+ C.network |= "Fire Alarms"
for(var/item in GLOB.alert_consoles)
var/obj/machinery/computer/station_alert/a = item
@@ -309,8 +313,9 @@
F.update_icon()
for(var/thing in cameras)
- var/obj/machinery/camera/C = thing
- C.network -= "Fire Alarms"
+ var/obj/machinery/camera/C = locateUID(thing)
+ if(!QDELETED(C))
+ C.network -= "Fire Alarms"
for(var/item in GLOB.silicon_mob_list)
var/mob/living/silicon/aiPlayer = item
diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm
index 28382888af5..62db9341e5c 100644
--- a/code/game/machinery/camera/camera.dm
+++ b/code/game/machinery/camera/camera.dm
@@ -47,7 +47,7 @@
GLOB.cameranet.addCamera(src)
if(isturf(loc))
myArea = get_area(src)
- LAZYADD(myArea.cameras, src)
+ LAZYADD(myArea.cameras, UID())
if(is_station_level(z) && prob(3) && !start_active)
toggle_cam(null, FALSE)
wires.CutAll()
@@ -67,7 +67,7 @@
GLOB.cameranet.removeCamera(src) //Will handle removal from the camera network and the chunks, so we don't need to worry about that
GLOB.cameranet.cameras -= src
if(isarea(myArea))
- LAZYREMOVE(myArea.cameras, src)
+ LAZYREMOVE(myArea.cameras, UID())
var/area/ai_monitored/A = get_area(src)
if(istype(A))
A.motioncameras -= src
@@ -295,14 +295,14 @@
GLOB.cameranet.addCamera(src)
if(isturf(loc))
myArea = get_area(src)
- LAZYADD(myArea.cameras, src)
+ LAZYADD(myArea.cameras, UID())
else
myArea = null
else
set_light(0)
GLOB.cameranet.removeCamera(src)
if(isarea(myArea))
- LAZYREMOVE(myArea.cameras, src)
+ LAZYREMOVE(myArea.cameras, UID())
GLOB.cameranet.updateChunk(x, y, z)
var/change_msg = "deactivates"
if(status)
@@ -333,7 +333,7 @@
/obj/machinery/camera/proc/triggerCameraAlarm()
alarm_on = TRUE
for(var/mob/living/silicon/S in GLOB.silicon_mob_list)
- S.triggerAlarm("Camera", get_area(src), list(src), src)
+ S.triggerAlarm("Camera", get_area(src), list(UID()), src)
/obj/machinery/camera/proc/cancelCameraAlarm()
alarm_on = FALSE
diff --git a/code/game/machinery/camera/motion.dm b/code/game/machinery/camera/motion.dm
index 1c3f4f30405..47e98006e2a 100644
--- a/code/game/machinery/camera/motion.dm
+++ b/code/game/machinery/camera/motion.dm
@@ -56,7 +56,7 @@
return FALSE
for(var/mob/living/silicon/aiPlayer in GLOB.player_list)
if(status)
- aiPlayer.triggerAlarm("Motion", get_area(src), list(src), src)
+ aiPlayer.triggerAlarm("Motion", get_area(src), list(UID()), src)
visible_message("A red light flashes on the [src]!")
detectTime = -1
return TRUE
diff --git a/code/game/machinery/computer/station_alert.dm b/code/game/machinery/computer/station_alert.dm
index 8f9f6ea2390..679fd0c63b3 100644
--- a/code/game/machinery/computer/station_alert.dm
+++ b/code/game/machinery/computer/station_alert.dm
@@ -47,7 +47,7 @@
return data
-/obj/machinery/computer/station_alert/proc/triggerAlarm(class, area/A, O, obj/alarmsource)
+/obj/machinery/computer/station_alert/proc/triggerAlarm(class, area/A, list/O, obj/alarmsource)
if(alarmsource.z != z)
return
if(stat & (BROKEN))
@@ -58,18 +58,10 @@
if(I == A.name)
var/list/alarm = L[I]
var/list/sources = alarm[3]
- if(!(alarmsource in sources))
- sources += alarmsource
+ if(!(alarmsource.UID() in sources))
+ sources += alarmsource.UID()
return TRUE
- var/obj/machinery/camera/C = null
- var/list/CL = null
- if(O && islist(O))
- CL = O
- if(CL.len == 1)
- C = CL[1]
- else if(O && istype(O, /obj/machinery/camera))
- C = O
- L[A.name] = list(A, (C ? C : O), list(alarmsource))
+ L[A.name] = list(get_area_name(A, TRUE), O, list(alarmsource.UID()))
update_icon()
return TRUE
@@ -83,8 +75,8 @@
if(I == A.name)
var/list/alarm = L[I]
var/list/srcs = alarm[3]
- if(origin in srcs)
- srcs -= origin
+ if(origin.UID() in srcs)
+ srcs -= origin.UID()
if(srcs.len == 0)
cleared = TRUE
L -= I
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index 11dfaed5758..2fc14cb9f7c 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -250,20 +250,19 @@ GLOBAL_LIST_INIT(ai_verbs_default, list(
if(L.len)
for(var/alarm in L)
var/list/alm = L[alarm]
- var/area/A = alm[1]
+ var/area_name = alm[1]
var/C = alm[2]
var/list/sources = alm[3]
dat += ""
- if(C && istype(C, /list))
+ if(C && islist(C))
var/dat2 = ""
- for(var/obj/machinery/camera/I in C)
- dat2 += text("[][]", (dat2=="") ? "" : " | ", I.c_tag)
- dat += text("-- [] ([])", A.name, (dat2!="") ? dat2 : "No Camera")
- else if(C && istype(C, /obj/machinery/camera))
- var/obj/machinery/camera/Ctmp = C
- dat += text("-- [] ([])", A.name, Ctmp.c_tag)
+ for(var/thing in C)
+ var/obj/machinery/camera/I = locateUID(thing)
+ if(!QDELETED(I))
+ dat2 += text("[][]", (dat2 == "") ? "" : " | ", I.c_tag)
+ dat += text("-- [] ([])", area_name, (dat2 != "") ? dat2 : "No Camera")
else
- dat += text("-- [] (No Camera)", A.name)
+ dat += text("-- [] (No Camera)", area_name)
if(sources.len > 1)
dat += text("- [] sources", sources.len)
dat += "
\n"
@@ -819,7 +818,7 @@ GLOBAL_LIST_INIT(ai_verbs_default, list(
Bot.call_bot(src, waypoint)
-/mob/living/silicon/ai/triggerAlarm(class, area/A, O, obj/alarmsource)
+/mob/living/silicon/ai/triggerAlarm(class, area/A, list/O, obj/alarmsource)
if(alarmsource.z != z)
return
if(stat == DEAD)
@@ -829,27 +828,22 @@ GLOBAL_LIST_INIT(ai_verbs_default, list(
if(I == A.name)
var/list/alarm = L[I]
var/list/sources = alarm[3]
- if(!(alarmsource in sources))
- sources += alarmsource
+ if(!(alarmsource.UID() in sources))
+ sources += alarmsource.UID()
return TRUE
- var/obj/machinery/camera/C = null
- var/list/CL = null
- if(O && islist(O))
- CL = O
- if(CL.len == 1)
- C = CL[1]
- else if(O && istype(O, /obj/machinery/camera))
- C = O
- L[A.name] = list(A, (C ? C : O), list(alarmsource))
+ L[A.name] = list(get_area_name(A, TRUE), O, list(alarmsource.UID()))
if(O)
- if(C && C.can_use())
- queueAlarm("--- [class] alarm detected in [A.name]! ([C.c_tag])", class)
- else if(CL && CL.len)
+ var/obj/machinery/camera/C = locateUID(O[1])
+ if(O.len == 1 && !QDELETED(C) && C.can_use())
+ queueAlarm("--- [class] alarm detected in [A.name]! ([C.c_tag])", class)
+ else if(O && O.len)
var/foo = 0
var/dat2 = ""
- for(var/obj/machinery/camera/I in CL)
- dat2 += text("[][]", (!foo) ? "" : " | ", I.c_tag) //I'm not fixing this shit...
- foo = 1
+ for(var/thing in O)
+ var/obj/machinery/camera/I = locateUID(thing)
+ if(!QDELETED(I))
+ dat2 += text("[][]", (!foo) ? "" : " | ", I.c_tag) //I'm not fixing this shit...
+ foo = 1
queueAlarm(text ("--- [] alarm detected in []! ([])", class, A.name, dat2), class)
else
queueAlarm(text("--- [] alarm detected in []! (No Camera)", class, A.name), class)
@@ -866,8 +860,8 @@ GLOBAL_LIST_INIT(ai_verbs_default, list(
if(I == A.name)
var/list/alarm = L[I]
var/list/srcs = alarm[3]
- if(origin in srcs)
- srcs -= origin
+ if(origin.UID() in srcs)
+ srcs -= origin.UID()
if(srcs.len == 0)
cleared = TRUE
L -= I
@@ -882,7 +876,7 @@ GLOBAL_LIST_INIT(ai_verbs_default, list(
if(!tracking)
cameraFollow = null
- if(!C || stat == DEAD) //C.can_use())
+ if(!C || QDELETED(C) || stat == DEAD) //C.can_use())
return FALSE
if(!eyeobj)
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index c5877c1a5dd..eefc889dc77 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -557,9 +557,9 @@ GLOBAL_LIST_INIT(robot_verbs_default, list(
if(L.len)
for(var/alarm in L)
var/list/alm = L[alarm]
- var/area/A = alm[1]
+ var/area_name = alm[1]
dat += ""
- dat += text("-- [A.name]")
+ dat += text("-- [area_name]")
dat += "
\n"
else
dat += "-- All Systems Nominal
\n"
@@ -630,7 +630,7 @@ GLOBAL_LIST_INIT(robot_verbs_default, list(
/mob/living/silicon/robot/InCritical()
return low_power_mode
-/mob/living/silicon/robot/triggerAlarm(class, area/A, O, obj/alarmsource)
+/mob/living/silicon/robot/triggerAlarm(class, area/A, list/O, obj/alarmsource)
if(alarmsource.z != z)
return
if(stat == DEAD)
@@ -640,18 +640,10 @@ GLOBAL_LIST_INIT(robot_verbs_default, list(
if(I == A.name)
var/list/alarm = L[I]
var/list/sources = alarm[3]
- if(!(alarmsource in sources))
- sources += alarmsource
+ if(!(alarmsource.UID() in sources))
+ sources += alarmsource.UID()
return TRUE
- var/obj/machinery/camera/C = null
- var/list/CL = null
- if(O && islist(O))
- CL = O
- if(CL.len == 1)
- C = CL[1]
- else if(O && istype(O, /obj/machinery/camera))
- C = O
- L[A.name] = list(A, (C ? C : O), list(alarmsource))
+ L[A.name] = list(get_area_name(A, TRUE), O, list(alarmsource.UID()))
queueAlarm(text("--- [class] alarm detected in [A.name]!"), class)
return TRUE
@@ -662,8 +654,8 @@ GLOBAL_LIST_INIT(robot_verbs_default, list(
if(I == A.name)
var/list/alarm = L[I]
var/list/srcs = alarm[3]
- if(origin in srcs)
- srcs -= origin
+ if(origin.UID() in srcs)
+ srcs -= origin.UID()
if(srcs.len == 0)
cleared = 1
L -= I
diff --git a/code/modules/modular_computers/file_system/programs/engineering/alarm.dm b/code/modules/modular_computers/file_system/programs/engineering/alarm.dm
index 76d28827a30..f0015305360 100644
--- a/code/modules/modular_computers/file_system/programs/engineering/alarm.dm
+++ b/code/modules/modular_computers/file_system/programs/engineering/alarm.dm
@@ -39,7 +39,7 @@
return data
-/datum/computer_file/program/alarm_monitor/proc/triggerAlarm(class, area/A, O, obj/alarmsource)
+/datum/computer_file/program/alarm_monitor/proc/triggerAlarm(class, area/A, list/O, obj/alarmsource)
if(is_station_level(source.z))
if(!(A.type in GLOB.the_station_areas))
return
@@ -51,18 +51,10 @@
if(I == A.name)
var/list/alarm = L[I]
var/list/sources = alarm[3]
- if(!(alarmsource in sources))
- sources += alarmsource
+ if(!(alarmsource.UID() in sources))
+ sources += alarmsource.UID()
return TRUE
- var/obj/machinery/camera/C = null
- var/list/CL = null
- if(O && islist(O))
- CL = O
- if(CL.len == 1)
- C = CL[1]
- else if(O && istype(O, /obj/machinery/camera))
- C = O
- L[A.name] = list(A, (C ? C : O), list(alarmsource))
+ L[A.name] = list(get_area_name(A, TRUE), O, list(alarmsource.UID()))
update_alarm_display()
return TRUE
@@ -78,8 +70,8 @@
if(!arealevelalarm) // the traditional behaviour
var/list/alarm = L[I]
var/list/srcs = alarm[3]
- if(origin in srcs)
- srcs -= origin
+ if(origin.UID() in srcs)
+ srcs -= origin.UID()
if(srcs.len == 0)
cleared = 1
L -= I