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.
" - 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."