diff --git a/code/WorkInProgress/buildmode.dm b/code/WorkInProgress/buildmode.dm
index ceb1954a5d..d93d45fec5 100644
--- a/code/WorkInProgress/buildmode.dm
+++ b/code/WorkInProgress/buildmode.dm
@@ -259,7 +259,8 @@
if(4)
if(pa.Find("left"))
- holder.throw_atom = object
+ if(istype(object, /atom/movable))
+ holder.throw_atom = object
if(pa.Find("right"))
if(holder.throw_atom)
holder.throw_atom.throw_at(object, 10, 1)
diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm
index 093899c5c4..147d790919 100644
--- a/code/_onclick/click.dm
+++ b/code/_onclick/click.dm
@@ -16,9 +16,11 @@
Note that this proc can be overridden, and is in the case of screen objects.
*/
/atom/Click(location,control,params)
- usr.ClickOn(src, params)
+ if(src)
+ usr.ClickOn(src, params)
/atom/DblClick(location,control,params)
- usr.DblClickOn(src,params)
+ if(src)
+ usr.DblClickOn(src,params)
/*
Standard mob ClickOn()
diff --git a/code/game/objects/effects/effect_system.dm b/code/game/objects/effects/effect_system.dm
index 5585c033c1..0eb8685aec 100644
--- a/code/game/objects/effects/effect_system.dm
+++ b/code/game/objects/effects/effect_system.dm
@@ -27,24 +27,6 @@ would spawn and follow the beaker, even if it is carried or thrown.
reagents.delete()
return
-
-/obj/effect/effect/water/New()
- ..()
- //var/turf/T = src.loc
- //if (istype(T, /turf))
- // T.firelevel = 0 //TODO: FIX
- spawn( 70 )
- delete()
- return
- return
-
-/obj/effect/effect/water/Del()
- //var/turf/T = src.loc
- //if (istype(T, /turf))
- // T.firelevel = 0 //TODO: FIX
- ..()
- return
-
/obj/effect/effect/water/Move(turf/newloc)
//var/turf/T = src.loc
//if (istype(T, /turf))
diff --git a/code/game/objects/items/weapons/extinguisher.dm b/code/game/objects/items/weapons/extinguisher.dm
index 0db404c021..1dd2832fd9 100644
--- a/code/game/objects/items/weapons/extinguisher.dm
+++ b/code/game/objects/items/weapons/extinguisher.dm
@@ -123,6 +123,7 @@
W.reagents.reaction(atm)
if(W.loc == my_target) break
sleep(2)
+ W.delete()
if((istype(usr.loc, /turf/space)) || (usr.lastarea.has_gravity == 0))
user.inertia_dir = get_dir(target, user)
diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm
index efea3d1609..bdc93347ff 100644
--- a/code/modules/admin/verbs/adminpm.dm
+++ b/code/modules/admin/verbs/adminpm.dm
@@ -114,7 +114,7 @@
//play the recieving admin the adminhelp sound (if they have them enabled)
//non-admins shouldn't be able to disable this
- if(C.prefs.toggles & SOUND_ADMINHELP)
+ if(C.prefs && C.prefs.toggles & SOUND_ADMINHELP)
C << 'sound/effects/adminhelp.ogg'
log_admin("PM: [key_name(src)]->[key_name(C)]: [msg]")
diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm
index 89d6302597..98d64231ec 100644
--- a/code/modules/mob/living/say.dm
+++ b/code/modules/mob/living/say.dm
@@ -103,7 +103,7 @@ var/list/department_radio_keys = list(
var/obj/O = I
hearturfs += O.locs[1]
objects |= O
-
+
for(var/mob/M in player_list)
if(M.stat == DEAD && M.client && (M.client.prefs.toggles & CHAT_GHOSTEARS))
listening |= M
@@ -113,7 +113,8 @@ var/list/department_radio_keys = list(
for(var/obj/O in objects)
spawn(0)
- O.hear_talk(src, message, verb, speaking)
+ if(O) //It's possible that it could be deleted in the meantime.
+ O.hear_talk(src, message, verb, speaking)
var/speech_bubble_test = say_test(message)
var/image/speech_bubble = image('icons/mob/talk.dmi',src,"h[speech_bubble_test]")
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index 77ec775059..3248f9dcfa 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -241,13 +241,13 @@ var/list/ai_list = list()
for (var/area_name in alarmlist)
var/datum/alarm/alarm = alarmlist[area_name]
dat += ""
-
+
var/cameratext = ""
if (alarm.cameras)
for (var/obj/machinery/camera/I in alarm.cameras)
cameratext += text("[][]", (cameratext=="") ? "" : " | ", src, I, I.c_tag)
dat += text("-- [] ([])", alarm.area.name, (cameratext)? cameratext : "No Camera")
-
+
if (alarm.sources.len > 1)
dat += text(" - [] sources", alarm.sources.len)
dat += "
\n"
@@ -398,23 +398,11 @@ var/list/ai_list = list()
if (href_list["track"])
var/mob/target = locate(href_list["track"]) in mob_list
-/*
- var/mob/living/silicon/ai/A = locate(href_list["track2"]) in mob_list
- if(A && target)
- A.ai_actual_track(target)
-*/
- //Strip off any "(as Derplord)".
- //If there's a way to do this via a var that doesn't give the AI extra info, please let me know.
- var/seeking = target.name
- var/index = findtext(seeking, "(as ")
- if(index)
- seeking = copytext(seeking, 1, index-1)
-
- if(target && html_decode(href_list["trackname"]) == seeking)
+ if(target && (!istype(target, /mob/living/carbon/human) || html_decode(href_list["trackname"]) == target:get_face_name()))
ai_actual_track(target)
- else
- src << "\red System error. Cannot locate [html_decode(href_list["trackname"])]."
+
+ src << "\red System error. Cannot locate [html_decode(href_list["trackname"])]."
return
else if (href_list["faketrack"])
@@ -530,24 +518,24 @@ var/list/ai_list = list()
/mob/living/silicon/ai/triggerAlarm(var/class, area/A, list/cameralist, var/source)
if (stat == 2)
return 1
-
+
..()
-
+
var/cameratext = ""
for (var/obj/machinery/camera/C in cameralist)
cameratext += "[(cameratext == "")? "" : "|"][C.c_tag]"
-
+
queueAlarm("--- [class] alarm detected in [A.name]! ([(cameratext)? cameratext : "No Camera"])", class)
-
+
if (viewalerts) ai_alerts()
/mob/living/silicon/ai/cancelAlarm(var/class, area/A as area, var/source)
var/has_alarm = ..()
-
+
if (!has_alarm)
queueAlarm(text("--- [] alarm in [] has been cleared.", class, A.name), class, 0)
if (viewalerts) ai_alerts()
-
+
return has_alarm
/mob/living/silicon/ai/cancel_camera()