diff --git a/code/defines/mob/dead/observer.dm b/code/defines/mob/dead/observer.dm
index da90fc6d22..4fb812720d 100644
--- a/code/defines/mob/dead/observer.dm
+++ b/code/defines/mob/dead/observer.dm
@@ -12,4 +12,5 @@
// var/mob/corpse = null // observer mode //we use mind.current as the 'corpse' now
var/can_reenter_corpse
var/datum/hud/living/carbon/hud = null // hud
- var/bootime = 0
\ No newline at end of file
+ var/bootime = 0
+ var/started_as_observer //This variable is set to 1 when you enter the game as an observer. If you died in the game and are a ghsot - this will remain as null. Note that this is not a reliable way to determine if admins started as observers, since they change mobs a lot.
\ No newline at end of file
diff --git a/code/game/machinery/hydroponics.dm b/code/game/machinery/hydroponics.dm
index 61fb1becaa..66a6cd3345 100644
--- a/code/game/machinery/hydroponics.dm
+++ b/code/game/machinery/hydroponics.dm
@@ -218,9 +218,8 @@ obj/machinery/hydroponics/proc/weedinvasion() // If a weed growth is sufficient,
src.harvest = 0
src.weedlevel = 0 // Reset
src.pestlevel = 0 // Reset
- spawn(5) // Wait a while
src.updateicon()
- src.visible_message("\red[src] has been overtaken by \blue [src.myseed.plantname]!")
+ src.visible_message("\blue [src] has been overtaken by [src.myseed.plantname].")
return
diff --git a/code/game/verbs/who.dm b/code/game/verbs/who.dm
index 102d7236ab..15fe7d38cf 100644
--- a/code/game/verbs/who.dm
+++ b/code/game/verbs/who.dm
@@ -26,10 +26,32 @@ proc/get_all_admin_clients()
var/list/peeps = list()
for (var/client/C in client_list)
+ var/entry = ""
if (C.stealth && !usr.client.holder)
- peeps += "\t[C.fakekey]"
+ entry += "\t[C.fakekey]"
else
- peeps += "\t[C.key][C.stealth ? " (as [C.fakekey])" : ""]"
+ entry += "\t[C.key][C.stealth ? " (as [C.fakekey])" : ""]"
+
+ if(usr.client.holder)
+ var/mob/M = C.mob
+ entry += " - Playing as [M.real_name]"
+ switch(M.stat)
+ if(UNCONSCIOUS)
+ entry += " - Unconscious"
+ if(DEAD)
+ if(isobserver(M))
+ var/mob/dead/observer/O = M
+ if(O.started_as_observer)
+ entry += " - Observing"
+ else
+ entry += " - DEAD"
+ else
+ entry += " - DEAD"
+ if(is_special_character(C.mob))
+ entry += " - Antagonist"
+ entry += " (?)"
+
+ peeps += entry
peeps = sortList(peeps)
diff --git a/code/modules/admin/verbs/mapping.dm b/code/modules/admin/verbs/mapping.dm
index d0de3660df..9f684d77fb 100644
--- a/code/modules/admin/verbs/mapping.dm
+++ b/code/modules/admin/verbs/mapping.dm
@@ -34,183 +34,184 @@ var/intercom_range_display_status = 0
icon = 'icons/turf/areas.dmi'
icon_state = "yellow"
-/client/proc
+/obj/effect/debugging/marker/Move()
+ return 0
- do_not_use_these()
- set category = "Mapping"
- set name = "-None of these are for ingame use!!"
+/client/proc/do_not_use_these()
+ set category = "Mapping"
+ set name = "-None of these are for ingame use!!"
- ..()
+ ..()
- camera_view()
- set category = "Mapping"
- set name = "Camera Range Display"
+/client/proc/camera_view()
+ set category = "Mapping"
+ set name = "Camera Range Display"
- if(camera_range_display_status)
- camera_range_display_status = 0
- else
- camera_range_display_status = 1
+ if(camera_range_display_status)
+ camera_range_display_status = 0
+ else
+ camera_range_display_status = 1
- for(var/obj/effect/debugging/camera_range/C in world)
- del(C)
-
- if(camera_range_display_status)
- for(var/obj/machinery/camera/C in Cameras)
- new/obj/effect/debugging/camera_range(C.loc)
- feedback_add_details("admin_verb","mCRD") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
-
-
-
- sec_camera_report()
- set category = "Mapping"
- set name = "Camera Report"
-
- if(!master_controller)
- alert(usr,"Master_controller not found.","Sec Camera Report")
- return 0
-
- var/list/obj/machinery/camera/CL = list()
+ for(var/obj/effect/debugging/camera_range/C in world)
+ del(C)
+ if(camera_range_display_status)
for(var/obj/machinery/camera/C in Cameras)
- CL += C
+ new/obj/effect/debugging/camera_range(C.loc)
+ feedback_add_details("admin_verb","mCRD") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
- var/output = {"CAMERA ANNOMALITIES REPORT
+
+
+/client/proc/sec_camera_report()
+ set category = "Mapping"
+ set name = "Camera Report"
+
+ if(!master_controller)
+ alert(usr,"Master_controller not found.","Sec Camera Report")
+ return 0
+
+ var/list/obj/machinery/camera/CL = list()
+
+ for(var/obj/machinery/camera/C in Cameras)
+ CL += C
+
+ var/output = {"CAMERA ANNOMALITIES REPORT
The following annomalities have been detected. The ones in red need immediate attention: Some of those in black may be intentional.
"}
- for(var/obj/machinery/camera/C1 in CL)
- for(var/obj/machinery/camera/C2 in CL)
- if(C1 != C2)
- if(C1.c_tag == C2.c_tag)
- output += "- c_tag match for sec. cameras at \[[C1.x], [C1.y], [C1.z]\] ([C1.loc.loc]) and \[[C2.x], [C2.y], [C2.z]\] ([C2.loc.loc]) - c_tag is [C1.c_tag]
"
- if(C1.loc == C2.loc && C1.dir == C2.dir && C1.pixel_x == C2.pixel_x && C1.pixel_y == C2.pixel_y)
- output += "- FULLY overlapping sec. cameras at \[[C1.x], [C1.y], [C1.z]\] ([C1.loc.loc]) Networks: [C1.network] and [C2.network]
"
- if(C1.loc == C2.loc)
- output += "- overlapping sec. cameras at \[[C1.x], [C1.y], [C1.z]\] ([C1.loc.loc]) Networks: [C1.network] and [C2.network]
"
- var/turf/T = get_step(C1,turn(C1.dir,180))
- if(!T || !isturf(T) || !T.density )
- if(!(locate(/obj/structure/grille,T)))
- var/window_check = 0
- for(var/obj/structure/window/W in T)
- if (W.dir == turn(C1.dir,180) || W.dir in list(5,6,9,10) )
- window_check = 1
- break
- if(!window_check)
- output += "- Camera not connected to wall at \[[C1.x], [C1.y], [C1.z]\] ([C1.loc.loc]) Network: [C1.network]
"
-
- output += "
"
- usr << browse(output,"window=airreport;size=1000x500")
- feedback_add_details("admin_verb","mCRP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
-
- intercom_view()
- set category = "Mapping"
- set name = "Intercom Range Display"
-
- if(intercom_range_display_status)
- intercom_range_display_status = 0
- else
- intercom_range_display_status = 1
-
- for(var/obj/effect/debugging/marker/M in world)
- del(M)
-
- if(intercom_range_display_status)
- for(var/obj/item/device/radio/intercom/I in world)
- for(var/turf/T in orange(7,I))
- var/obj/effect/debugging/marker/F = new/obj/effect/debugging/marker(T)
- if (!(F in view(7,I.loc)))
- del(F)
- feedback_add_details("admin_verb","mIRD") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
-
- enable_debug_verbs()
- set category = "Debug"
- set name = "Debug verbs"
- src.verbs += /client/proc/do_not_use_these //-errorage
- src.verbs += /client/proc/camera_view //-errorage
- src.verbs += /client/proc/sec_camera_report //-errorage
- src.verbs += /client/proc/intercom_view //-errorage
- src.verbs += /client/proc/air_status //Air things
- src.verbs += /client/proc/Cell //More air things
- src.verbs += /client/proc/atmosscan //check plumbing
- src.verbs += /client/proc/powerdebug //check power
- src.verbs += /client/proc/count_objects_on_z_level
- src.verbs += /client/proc/count_objects_all
- src.verbs += /client/proc/cmd_assume_direct_control //-errorage
- src.verbs += /client/proc/jump_to_dead_group
- src.verbs += /client/proc/startSinglo
- src.verbs += /client/proc/ticklag //allows you to set the ticklag.
- src.verbs += /client/proc/cmd_admin_grantfullaccess
- //src.verbs += /client/proc/cmd_admin_rejuvenate
-
- feedback_add_details("admin_verb","mDV") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
-
- count_objects_on_z_level()
- set category = "Mapping"
- set name = "Count Objects On Level"
- var/level = input("Which z-level?","Level?") as text
- if(!level) return
- var/num_level = text2num(level)
- if(!num_level) return
- if(!isnum(num_level)) return
-
- var/type_text = input("Which type path?","Path?") as text
- if(!type_text) return
- var/type_path = text2path(type_text)
- if(!type_path) return
-
- var/count = 0
-
- var/list/atom/atom_list = list()
-
- for(var/atom/A in world)
- if(istype(A,type_path))
- var/atom/B = A
- while(!(isturf(B.loc)))
- if(B && B.loc)
- B = B.loc
- else
+ for(var/obj/machinery/camera/C1 in CL)
+ for(var/obj/machinery/camera/C2 in CL)
+ if(C1 != C2)
+ if(C1.c_tag == C2.c_tag)
+ output += "c_tag match for sec. cameras at \[[C1.x], [C1.y], [C1.z]\] ([C1.loc.loc]) and \[[C2.x], [C2.y], [C2.z]\] ([C2.loc.loc]) - c_tag is [C1.c_tag]"
+ if(C1.loc == C2.loc && C1.dir == C2.dir && C1.pixel_x == C2.pixel_x && C1.pixel_y == C2.pixel_y)
+ output += "FULLY overlapping sec. cameras at \[[C1.x], [C1.y], [C1.z]\] ([C1.loc.loc]) Networks: [C1.network] and [C2.network]"
+ if(C1.loc == C2.loc)
+ output += "overlapping sec. cameras at \[[C1.x], [C1.y], [C1.z]\] ([C1.loc.loc]) Networks: [C1.network] and [C2.network]"
+ var/turf/T = get_step(C1,turn(C1.dir,180))
+ if(!T || !isturf(T) || !T.density )
+ if(!(locate(/obj/structure/grille,T)))
+ var/window_check = 0
+ for(var/obj/structure/window/W in T)
+ if (W.dir == turn(C1.dir,180) || W.dir in list(5,6,9,10) )
+ window_check = 1
break
- if(B)
- if(B.z == num_level)
- count++
- atom_list += A
- /*
- var/atom/temp_atom
- for(var/i = 0; i <= (atom_list.len/10); i++)
- var/line = ""
- for(var/j = 1; j <= 10; j++)
- if(i*10+j <= atom_list.len)
- temp_atom = atom_list[i*10+j]
- line += " no.[i+10+j]@\[[temp_atom.x], [temp_atom.y], [temp_atom.z]\]; "
- world << line*/
+ if(!window_check)
+ output += "Camera not connected to wall at \[[C1.x], [C1.y], [C1.z]\] ([C1.loc.loc]) Network: [C1.network]"
- world << "There are [count] objects of type [type_path] on z-level [num_level]"
- feedback_add_details("admin_verb","mOBJZ") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+ output += ""
+ usr << browse(output,"window=airreport;size=1000x500")
+ feedback_add_details("admin_verb","mCRP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
- count_objects_all()
- set category = "Mapping"
- set name = "Count Objects All"
+/client/proc/intercom_view()
+ set category = "Mapping"
+ set name = "Intercom Range Display"
- var/type_text = input("Which type path?","") as text
- if(!type_text) return
- var/type_path = text2path(type_text)
- if(!type_path) return
+ if(intercom_range_display_status)
+ intercom_range_display_status = 0
+ else
+ intercom_range_display_status = 1
- var/count = 0
+ for(var/obj/effect/debugging/marker/M in world)
+ del(M)
- for(var/atom/A in world)
- if(istype(A,type_path))
- count++
- /*
- var/atom/temp_atom
- for(var/i = 0; i <= (atom_list.len/10); i++)
- var/line = ""
- for(var/j = 1; j <= 10; j++)
- if(i*10+j <= atom_list.len)
- temp_atom = atom_list[i*10+j]
- line += " no.[i+10+j]@\[[temp_atom.x], [temp_atom.y], [temp_atom.z]\]; "
- world << line*/
+ if(intercom_range_display_status)
+ for(var/obj/item/device/radio/intercom/I in world)
+ for(var/turf/T in orange(7,I))
+ var/obj/effect/debugging/marker/F = new/obj/effect/debugging/marker(T)
+ if (!(F in view(7,I.loc)))
+ del(F)
+ feedback_add_details("admin_verb","mIRD") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
- world << "There are [count] objects of type [type_path] in the game world"
- feedback_add_details("admin_verb","mOBJ") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
\ No newline at end of file
+/client/proc/enable_debug_verbs()
+ set category = "Debug"
+ set name = "Debug verbs"
+ src.verbs += /client/proc/do_not_use_these //-errorage
+ src.verbs += /client/proc/camera_view //-errorage
+ src.verbs += /client/proc/sec_camera_report //-errorage
+ src.verbs += /client/proc/intercom_view //-errorage
+ src.verbs += /client/proc/air_status //Air things
+ src.verbs += /client/proc/Cell //More air things
+ src.verbs += /client/proc/atmosscan //check plumbing
+ src.verbs += /client/proc/powerdebug //check power
+ src.verbs += /client/proc/count_objects_on_z_level
+ src.verbs += /client/proc/count_objects_all
+ src.verbs += /client/proc/cmd_assume_direct_control //-errorage
+ src.verbs += /client/proc/jump_to_dead_group
+ src.verbs += /client/proc/startSinglo
+ src.verbs += /client/proc/ticklag //allows you to set the ticklag.
+ src.verbs += /client/proc/cmd_admin_grantfullaccess
+ //src.verbs += /client/proc/cmd_admin_rejuvenate
+
+ feedback_add_details("admin_verb","mDV") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+
+/client/proc/count_objects_on_z_level()
+ set category = "Mapping"
+ set name = "Count Objects On Level"
+ var/level = input("Which z-level?","Level?") as text
+ if(!level) return
+ var/num_level = text2num(level)
+ if(!num_level) return
+ if(!isnum(num_level)) return
+
+ var/type_text = input("Which type path?","Path?") as text
+ if(!type_text) return
+ var/type_path = text2path(type_text)
+ if(!type_path) return
+
+ var/count = 0
+
+ var/list/atom/atom_list = list()
+
+ for(var/atom/A in world)
+ if(istype(A,type_path))
+ var/atom/B = A
+ while(!(isturf(B.loc)))
+ if(B && B.loc)
+ B = B.loc
+ else
+ break
+ if(B)
+ if(B.z == num_level)
+ count++
+ atom_list += A
+ /*
+ var/atom/temp_atom
+ for(var/i = 0; i <= (atom_list.len/10); i++)
+ var/line = ""
+ for(var/j = 1; j <= 10; j++)
+ if(i*10+j <= atom_list.len)
+ temp_atom = atom_list[i*10+j]
+ line += " no.[i+10+j]@\[[temp_atom.x], [temp_atom.y], [temp_atom.z]\]; "
+ world << line*/
+
+ world << "There are [count] objects of type [type_path] on z-level [num_level]"
+ feedback_add_details("admin_verb","mOBJZ") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+
+/client/proc/count_objects_all()
+ set category = "Mapping"
+ set name = "Count Objects All"
+
+ var/type_text = input("Which type path?","") as text
+ if(!type_text) return
+ var/type_path = text2path(type_text)
+ if(!type_path) return
+
+ var/count = 0
+
+ for(var/atom/A in world)
+ if(istype(A,type_path))
+ count++
+ /*
+ var/atom/temp_atom
+ for(var/i = 0; i <= (atom_list.len/10); i++)
+ var/line = ""
+ for(var/j = 1; j <= 10; j++)
+ if(i*10+j <= atom_list.len)
+ temp_atom = atom_list[i*10+j]
+ line += " no.[i+10+j]@\[[temp_atom.x], [temp_atom.y], [temp_atom.z]\]; "
+ world << line*/
+
+ world << "There are [count] objects of type [type_path] in the game world"
+ feedback_add_details("admin_verb","mOBJ") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
\ No newline at end of file
diff --git a/code/modules/mob/death.dm b/code/modules/mob/death.dm
index 4cbf91a010..5f50e4f06b 100644
--- a/code/modules/mob/death.dm
+++ b/code/modules/mob/death.dm
@@ -50,31 +50,6 @@
/mob/proc/death(gibbed)
timeofdeath = world.time
- var/cancel = 0
- for(var/mob/M in player_list)
- if(M.stat != DEAD)
- cancel = 1
- break
- if(!cancel)
- world << "Everyone is dead! Resetting in 30 seconds!"
-
- spawn(300)
- for(var/mob/M in player_list)
- if(M.stat != DEAD)
- world << "Aborting world restart!"
- return
-
- feedback_set_details("end_error","no live players")
-
- if(blackbox)
- blackbox.save_all_data_to_sql()
-
- sleep(50)
-
- log_game("Rebooting because of no live players")
- world.Reboot()
- return
-
living_mob_list -= src
dead_mob_list += src
return ..(gibbed)
diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm
index bef760134f..1be3bc1eed 100644
--- a/code/modules/mob/new_player/new_player.dm
+++ b/code/modules/mob/new_player/new_player.dm
@@ -130,6 +130,7 @@
spawning = 1
src << sound(null, repeat = 0, wait = 0, volume = 85, channel = 1) // MAD JAMS cant last forever yo
+ observer.started_as_observer = 1
close_spawn_windows()
var/obj/O = locate("landmark*Observer-Start")
src << "\blue Now teleporting."