diff --git a/baystation12.dme b/baystation12.dme index 1da3f22d662..5b7981584e1 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -847,6 +847,7 @@ #include "code\modules\mob\camera\camera.dm" #include "code\modules\mob\dead\death.dm" #include "code\modules\mob\dead\observer\hud.dm" +#include "code\modules\mob\dead\observer\login.dm" #include "code\modules\mob\dead\observer\logout.dm" #include "code\modules\mob\dead\observer\observer.dm" #include "code\modules\mob\dead\observer\say.dm" diff --git a/code/__HELPERS/type2type.dm b/code/__HELPERS/type2type.dm index 29d9d4a5e3a..f08cc9fd644 100644 --- a/code/__HELPERS/type2type.dm +++ b/code/__HELPERS/type2type.dm @@ -252,7 +252,7 @@ proc/tg_list2text(list/list, glue=",") //Converts a rights bitfield into a string /proc/rights2text(rights,seperator="") if(rights & R_BUILDMODE) . += "[seperator]+BUILDMODE" - if(rights & R_ADMIN) . += "[seperator]+ADMIN" + if(rights & R_BAN) . += "[seperator]+BAN" if(rights & R_FUN) . += "[seperator]+FUN" if(rights & R_SERVER) . += "[seperator]+SERVER" diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 3402a9b3c73..fc88483854e 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -872,7 +872,7 @@ var/using_new_click_proc = 0 //TODO ERRORAGE (This is temporary, while the DblCl var/parameters = params2list(params) if(parameters["shift"]){ - if(!isAI(usr)) + if(!isAI(usr) && !isAdminGhost(usr)) ShiftClick(usr) else AIShiftClick(usr) @@ -886,7 +886,7 @@ var/using_new_click_proc = 0 //TODO ERRORAGE (This is temporary, while the DblCl RobotAltClick(usr) else if(isovermind(usr)) OvermindAltClick(usr) - else if(!isAI(usr)) + else if(!isAI(usr) && !isAdminGhost(usr)) AltClick(usr) else AIAltClick(usr) @@ -898,7 +898,7 @@ var/using_new_click_proc = 0 //TODO ERRORAGE (This is temporary, while the DblCl if(parameters["ctrl"]){ if(isovermind(usr)) OvermindCtrlClick(usr) - else if(!isAI(usr)) + else if(!isAI(usr) && !isAdminGhost(usr)) CtrlClick(usr) else AICtrlClick(usr) @@ -908,7 +908,7 @@ var/using_new_click_proc = 0 //TODO ERRORAGE (This is temporary, while the DblCl // ------- MIDDLE-CLICK ------- if(parameters["middle"]){ - if(!isAI(usr)) + if(!isAI(usr) && !isAdminGhost(usr)) MiddleClick(usr) return } @@ -936,8 +936,8 @@ var/using_new_click_proc = 0 //TODO ERRORAGE (This is temporary, while the DblCl usr.update_inv_r_hand() return - // ------- PARALYSIS, STUN, WEAKENED, DEAD, (And not AI) ------- - if (((usr.paralysis || usr.stunned || usr.weakened) && !istype(usr, /mob/living/silicon/ai)) || usr.stat != 0) + // ------- PARALYSIS, STUN, WEAKENED, DEAD, (And not AI/AGhost) ------- + if ((((usr.paralysis || usr.stunned || usr.weakened) && !istype(usr, /mob/living/silicon/ai)) || usr.stat != 0) && !isobserver(usr)) return // ------- CLICKING STUFF IN CONTAINERS ------- @@ -1112,7 +1112,7 @@ var/using_new_click_proc = 0 //TODO ERRORAGE (This is temporary, while the DblCl src.attack_alien(usr, usr.hand) else if (istype(usr, /mob/living/carbon/alien/larva)) src.attack_larva(usr) - else if (istype(usr, /mob/living/silicon/ai) || istype(usr, /mob/living/silicon/robot)) + else if (istype(usr, /mob/living/silicon/ai) || istype(usr, /mob/living/silicon/robot) || isAdminGhost(usr)) src.attack_ai(usr, usr.hand) else if(istype(usr, /mob/living/carbon/slime)) src.attack_slime(usr) diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm index 3beaf951de6..6f879571564 100644 --- a/code/game/machinery/alarm.dm +++ b/code/game/machinery/alarm.dm @@ -770,7 +770,7 @@ /obj/machinery/alarm/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null) - if(user.stat) + if(user.stat && !isobserver(user)) return var/data[0] data["air"]=ui_air_status() @@ -1652,7 +1652,7 @@ FIRE ALARM update_icon() /obj/machinery/firealarm/attack_hand(mob/user as mob) - if(user.stat || stat & (NOPOWER|BROKEN)) + if((user.stat && !isobserver(user)) || stat & (NOPOWER|BROKEN)) return if (buildstage != 2) @@ -1850,7 +1850,7 @@ Code shamelessly copied from apc_frame return attack_hand(user) /obj/machinery/partyalarm/attack_hand(mob/user as mob) - if(user.stat || stat & (NOPOWER|BROKEN)) + if((user.stat && !isobserver(user)) || stat & (NOPOWER|BROKEN)) return user.machine = src diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm index 766ba47bb22..aa876caf8eb 100644 --- a/code/game/machinery/cryo.dm +++ b/code/game/machinery/cryo.dm @@ -33,7 +33,7 @@ var/obj/item/weapon/reagent_containers/glass/B = beaker if(beaker) B.loc = get_step(loc, SOUTH) //Beaker is carefully ejected from the wreckage of the cryotube - ..() + ..() /obj/machinery/atmospherics/unary/cryo_cell/initialize() if(node) return @@ -79,7 +79,7 @@ /obj/machinery/atmospherics/unary/cryo_cell/examine() ..() - + if(in_range(usr, src)) usr << "You can just about make out some loose objects floating in the murk:" for(var/obj/O in src) @@ -107,7 +107,7 @@ */ /obj/machinery/atmospherics/unary/cryo_cell/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null) - if(user == occupant || user.stat) + if(user == occupant || (user.stat && !isobserver(user))) return // this is the data which will be sent to the ui diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index 2afe2e70b5e..3d611e63f90 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -168,25 +168,26 @@ Class Procs: ..() if(stat & (NOPOWER|BROKEN)) return 1 - if(usr.restrained() || usr.lying || usr.stat) - return 1 - if ( ! (istype(usr, /mob/living/carbon/human) || \ - istype(usr, /mob/living/silicon) || \ - istype(usr, /mob/living/carbon/monkey) && ticker && ticker.mode.name == "monkey") ) - usr << "\red You don't have the dexterity to do this!" - return 1 - - var/norange = 0 - if(istype(usr, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = usr - if(istype(H.l_hand, /obj/item/tk_grab)) - norange = 1 - else if(istype(H.r_hand, /obj/item/tk_grab)) - norange = 1 - - if(!norange) - if ((!in_range(src, usr) || !istype(src.loc, /turf)) && !istype(usr, /mob/living/silicon)) + if(!isAdminGhost(usr)) + if(usr.restrained() || usr.lying || usr.stat) return 1 + if ( ! (istype(usr, /mob/living/carbon/human) || \ + istype(usr, /mob/living/silicon) || \ + istype(usr, /mob/living/carbon/monkey) && ticker && ticker.mode.name == "monkey") ) + usr << "\red You don't have the dexterity to do this!" + return 1 + + var/norange = 0 + if(istype(usr, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = usr + if(istype(H.l_hand, /obj/item/tk_grab)) + norange = 1 + else if(istype(H.r_hand, /obj/item/tk_grab)) + norange = 1 + + if(!norange) + if ((!in_range(src, usr) || !istype(src.loc, /turf)) && !istype(usr, /mob/living/silicon)) + return 1 src.add_fingerprint(usr) return 0 @@ -201,17 +202,22 @@ Class Procs: else return src.attack_hand(user) +/obj/machinery/attack_ghost(mob/user as mob) + src.add_hiddenprint(user) + return src.attack_hand(user) + /obj/machinery/attack_paw(mob/user as mob) return src.attack_hand(user) /obj/machinery/attack_hand(mob/user as mob) if(stat & (NOPOWER|BROKEN|MAINT)) return 1 - if(user.lying /*|| user.stat*/) // Ghost read-only + if(user.lying || (user.stat && !isobserver(user))) // Ghost read-only return 1 if(istype(usr,/mob/dead/observer)) return 0 + if ( ! (istype(usr, /mob/living/carbon/human) || \ istype(usr, /mob/living/silicon) || \ istype(usr, /mob/living/carbon/monkey) && ticker && ticker.mode.name == "monkey") ) diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm index 6e09677078e..bae0ca76f21 100644 --- a/code/game/machinery/newscaster.dm +++ b/code/game/machinery/newscaster.dm @@ -175,12 +175,12 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co /obj/machinery/newscaster/attack_hand(mob/user as mob) //########### THE MAIN BEEF IS HERE! And in the proc below this...############ if(!src.ispowered || src.isbroken) return - if(istype(user, /mob/living/carbon/human) || istype(user,/mob/living/silicon) ) - var/mob/living/human_or_robot_user = user + if(istype(user, /mob/living/carbon/human) || istype(user,/mob/living/silicon) || isobserver(user)) + var/mob/M = user var/dat dat = text("Newscaster

Newscaster Unit #[src.unit_no]

") - src.scan_user(human_or_robot_user) //Newscaster scans you + src.scan_user(M) //Newscaster scans you switch(screen) if(0) @@ -200,7 +200,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
Submit new Feed story
Print newspaper
Re-scan User -

Exit"} +

Exit"} // END AUTOFIX if(src.securityCaster) var/wanted_already = 0 @@ -513,8 +513,8 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co dat+="I'm sorry to break your immersion. This shit's bugged. Report this bug to Agouri, polyxenitopalidou@gmail.com" - human_or_robot_user << browse(dat, "window=newscaster_main;size=400x600") - onclose(human_or_robot_user, "newscaster_main") + M << browse(dat, "window=newscaster_main;size=400x600") + onclose(M, "newscaster_main") /*if(src.isbroken) //debugging shit return @@ -525,11 +525,13 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co /obj/machinery/newscaster/Topic(href, href_list) - if(..()) - return - if ((usr.contents.Find(src) || ((get_dist(src, usr) <= 1) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon))) + //if(..()) + // return + if ((usr.contents.Find(src) || ((get_dist(src, usr) <= 1) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon) || isobserver(usr))) usr.set_machine(src) if(href_list["set_channel_name"]) + if(isobserver(usr) && !isAdminGhost(usr)) + usr << "\red You can't do that." src.channel_name = strip_html_simple(input(usr, "Provide a Feed Channel Name", "Network Channel Handler", "")) while (findtext(src.channel_name," ") == 1) src.channel_name = copytext(src.channel_name,2,lentext(src.channel_name)+1) @@ -537,11 +539,15 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co //src.update_icon() else if(href_list["set_channel_lock"]) + if(isobserver(usr) && !isAdminGhost(usr)) + usr << "\red You can't do that." src.c_locked = !src.c_locked src.updateUsrDialog() //src.update_icon() else if(href_list["submit_new_channel"]) + if(isobserver(usr) && !isAdminGhost(usr)) + usr << "\red You can't do that." //var/list/existing_channels = list() //OBSOLETE var/list/existing_authors = list() for(var/datum/feed_channel/FC in news_network.network_channels) @@ -573,6 +579,8 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co //src.update_icon() else if(href_list["set_channel_receiving"]) + if(isobserver(usr) && !isAdminGhost(usr)) + usr << "\red You can't do that." //var/list/datum/feed_channel/available_channels = list() var/list/available_channels = list() for(var/datum/feed_channel/F in news_network.network_channels) @@ -582,16 +590,22 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co src.updateUsrDialog() else if(href_list["set_new_message"]) + if(isobserver(usr) && !isAdminGhost(usr)) + usr << "\red You can't do that." src.msg = strip_html(input(usr, "Write your Feed story", "Network Channel Handler", "")) while (findtext(src.msg," ") == 1) src.msg = copytext(src.msg,2,lentext(src.msg)+1) src.updateUsrDialog() else if(href_list["set_attachment"]) + if(isobserver(usr) && !isAdminGhost(usr)) + usr << "\red You can't do that." AttachPhoto(usr) src.updateUsrDialog() else if(href_list["submit_new_message"]) + if(isobserver(usr) && !isAdminGhost(usr)) + usr << "\red You can't do that." if(src.msg =="" || src.msg=="\[REDACTED\]" || src.scanned_user == "Unknown" || src.channel_name == "" ) src.screen=6 else @@ -612,17 +626,25 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co src.updateUsrDialog() else if(href_list["create_channel"]) + if(isobserver(usr) && !isAdminGhost(usr)) + usr << "\red You can't do that." src.screen=2 src.updateUsrDialog() else if(href_list["create_feed_story"]) + if(isobserver(usr) && !isAdminGhost(usr)) + usr << "\red You can't do that." src.screen=3 src.updateUsrDialog() else if(href_list["menu_paper"]) + if(isobserver(usr) && !isAdminGhost(usr)) + usr << "\red You can't do that." src.screen=8 src.updateUsrDialog() else if(href_list["print_paper"]) + if(isobserver(usr) && !isAdminGhost(usr)) + usr << "\red You can't do that." if(!src.paper_remaining) src.screen=21 else @@ -631,14 +653,20 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co src.updateUsrDialog() else if(href_list["menu_censor_story"]) + if(isobserver(usr) && !isAdminGhost(usr)) + usr << "\red You can't do that." src.screen=10 src.updateUsrDialog() else if(href_list["menu_censor_channel"]) + if(isobserver(usr) && !isAdminGhost(usr)) + usr << "\red You can't do that." src.screen=11 src.updateUsrDialog() else if(href_list["menu_wanted"]) + if(isobserver(usr) && !isAdminGhost(usr)) + usr << "\red You can't do that." var/already_wanted = 0 if(news_network.wanted_issue) already_wanted = 1 @@ -650,18 +678,24 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co src.updateUsrDialog() else if(href_list["set_wanted_name"]) + if(isobserver(usr) && !isAdminGhost(usr)) + usr << "\red You can't do that." src.channel_name = strip_html(input(usr, "Provide the name of the Wanted person", "Network Security Handler", "")) while (findtext(src.channel_name," ") == 1) src.channel_name = copytext(src.channel_name,2,lentext(src.channel_name)+1) src.updateUsrDialog() else if(href_list["set_wanted_desc"]) + if(isobserver(usr) && !isAdminGhost(usr)) + usr << "\red You can't do that." src.msg = strip_html(input(usr, "Provide the a description of the Wanted person and any other details you deem important", "Network Security Handler", "")) while (findtext(src.msg," ") == 1) src.msg = copytext(src.msg,2,lentext(src.msg)+1) src.updateUsrDialog() else if(href_list["submit_wanted"]) + if(isobserver(usr) && !isAdminGhost(usr)) + usr << "\red You can't do that." var/input_param = text2num(href_list["submit_wanted"]) if(src.msg == "" || src.channel_name == "" || src.scanned_user == "Unknown") src.screen = 16 @@ -709,6 +743,8 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co src.screen=18 src.updateUsrDialog() else if(href_list["censor_channel_author"]) + if(isobserver(usr) && !isAdminGhost(usr)) + usr << "\red You can't do that." var/datum/feed_channel/FC = locate(href_list["censor_channel_author"]) if(FC.is_admin_channel) alert("This channel was created by a Nanotrasen Officer. You cannot censor it.","Ok") @@ -721,6 +757,8 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co src.updateUsrDialog() else if(href_list["censor_channel_story_author"]) + if(isobserver(usr) && !isAdminGhost(usr)) + usr << "\red You can't do that." var/datum/feed_message/MSG = locate(href_list["censor_channel_story_author"]) if(MSG.is_admin_message) alert("This message was created by a Nanotrasen Officer. You cannot censor its author.","Ok") @@ -733,6 +771,8 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co src.updateUsrDialog() else if(href_list["censor_channel_story_body"]) + if(isobserver(usr) && !isAdminGhost(usr)) + usr << "\red You can't do that." var/datum/feed_message/MSG = locate(href_list["censor_channel_story_body"]) if(MSG.is_admin_message) alert("This channel was created by a Nanotrasen Officer. You cannot censor it.","Ok") @@ -750,12 +790,16 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co src.updateUsrDialog() else if(href_list["pick_d_notice"]) + if(isobserver(usr) && !isAdminGhost(usr)) + usr << "\red You can't do that." var/datum/feed_channel/FC = locate(href_list["pick_d_notice"]) src.viewing_channel = FC src.screen=13 src.updateUsrDialog() else if(href_list["toggle_d_notice"]) + if(isobserver(usr) && !isAdminGhost(usr)) + usr << "\red You can't do that." var/datum/feed_channel/FC = locate(href_list["toggle_d_notice"]) if(FC.is_admin_channel) alert("This channel was created by a Nanotrasen Officer. You cannot place a D-Notice upon it.","Ok") @@ -892,7 +936,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co obj/item/weapon/newspaper/attack_self(mob/user as mob) if(ishuman(user)) - var/mob/living/carbon/human/human_user = user + //var/mob/living/carbon/human/human_user = user var/dat src.pages = 0 switch(screen) @@ -921,7 +965,7 @@ obj/item/weapon/newspaper/attack_self(mob/user as mob) dat+="" if(scribble_page==curr_page) dat+="
There is a small scribble near the end of this page... It reads: \"[src.scribble]\"" - dat+= "
Next Page
Done reading
" + dat+= "
Next Page
Done reading
" if(1) // X channel pages inbetween. for(var/datum/feed_channel/NP in src.news_content) src.pages++ //Let's get it right again. @@ -972,15 +1016,15 @@ obj/item/weapon/newspaper/attack_self(mob/user as mob) dat+="I'm sorry to break your immersion. This shit's bugged. Report this bug to Agouri, polyxenitopalidou@gmail.com" dat+="

[src.curr_page+1]
" - human_user << browse(dat, "window=newspaper_main;size=300x400") - onclose(human_user, "newspaper_main") + usr << browse(dat, "window=newspaper_main;size=300x400") + onclose(usr, "newspaper_main") else user << "The paper is full of intelligible symbols!" obj/item/weapon/newspaper/Topic(href, href_list) - var/mob/living/U = usr - ..() + var/mob/U = usr + //..() // Allow ghosts to do pretty much everything except add shit if ((src in U.contents) || ( istype(loc, /turf) && in_range(src, U) )) U.set_machine(src) if(href_list["next_page"]) @@ -1030,7 +1074,7 @@ obj/item/weapon/newspaper/attackby(obj/item/weapon/W as obj, mob/user as mob) ////////////////////////////////////helper procs -/obj/machinery/newscaster/proc/scan_user(mob/living/user as mob) +/obj/machinery/newscaster/proc/scan_user(mob/user) if(istype(user,/mob/living/carbon/human)) //User is a human var/mob/living/carbon/human/human_user = user if(human_user.wear_id) //Newscaster scans you @@ -1047,9 +1091,12 @@ obj/item/weapon/newspaper/attackby(obj/item/weapon/W as obj, mob/user as mob) src.scanned_user ="Unknown" else src.scanned_user ="Unknown" - else + else if (isAI(user)) var/mob/living/silicon/ai_user = user src.scanned_user = "[ai_user.name] ([ai_user.job])" + else if (isobserver(user)) + var/mob/dead/observer/dead_guy = user + src.scanned_user = "Ghost of [dead_guy.name]" /obj/machinery/newscaster/proc/print_paper() diff --git a/code/modules/admin/holder2.dm b/code/modules/admin/holder2.dm index 2f0a38f985b..81254492df0 100644 --- a/code/modules/admin/holder2.dm +++ b/code/modules/admin/holder2.dm @@ -67,6 +67,18 @@ you will have to do something like if(client.rights & R_ADMIN) yourself. usr << "Error: You are not an admin." return 0 +// Making this a bit less of a roaring asspain. - N3X +/mob/proc/check_rights(rights_required) + if(src && src.client) + if(rights_required) + if(src.client.holder) + if(rights_required & src.client.holder.rights) + return 1 + else + if(src.client.holder) + return 1 + return 0 + //probably a bit iffy - will hopefully figure out a better solution /proc/check_if_greater_rights_than(client/other) if(usr && usr.client) diff --git a/code/modules/mob/dead/observer/login.dm b/code/modules/mob/dead/observer/login.dm index ce0dbe3d57f..4da62876986 100644 --- a/code/modules/mob/dead/observer/login.dm +++ b/code/modules/mob/dead/observer/login.dm @@ -1,2 +1,5 @@ /mob/dead/observer/Login() - ..() \ No newline at end of file + ..() + + if(src.check_rights(R_ADMIN|R_FUN)) + src << "You are now an admin ghost. Think of yourself as an AI that doesn't show up anywhere and cannot speak. You can access any console or machine by standing next to it and clicking on it. Abuse of this privilege may result in hilarity or removal of your flags, so caution is recommended." \ No newline at end of file diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index bcc87e54695..892fcec1d99 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -13,6 +13,10 @@ blinded = 0 anchored = 1 // don't get pushed around invisibility = INVISIBILITY_OBSERVER + + // For Aghosts dicking with telecoms equipment. + var/obj/item/device/multitool/ghostMulti = null + var/can_reenter_corpse var/datum/hud/living/carbon/hud = null // hud var/bootime = 0 @@ -54,6 +58,9 @@ if(!name) //To prevent nameless ghosts name = capitalize(pick(first_names_male)) + " " + capitalize(pick(last_names)) real_name = name + + ghostMulti = new(src) + ..() /mob/dead/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) @@ -69,6 +76,7 @@ Works together with spawning an observer, noted above. ghost.can_reenter_corpse = can_reenter_corpse ghost.timeofdeath = timeofdeath //BS12 EDIT ghost.key = key + return ghost /* diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index eae5ed931ee..109525b1d43 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -115,6 +115,12 @@ return 1 return 0 +/proc/isAdminGhost(A) + if(isobserver(A)) + var/mob/dead/observer/O = A + if(O.check_rights(R_ADMIN|R_FUN)) + return 1 + return 0 /proc/isliving(A) if(istype(A, /mob/living)) return 1 diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index c7fe17c443b..baaa3076cf1 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -782,7 +782,7 @@ Environmental:[add_lspace(lastused_environ, 6)] W :"} src.updateDialog() /obj/machinery/power/apc/proc/can_use(mob/user as mob, var/loud = 0) //used by attack_hand() and Topic() - if (user.stat) + if (user.stat && !isobserver(user)) user << "\red You must be conscious to use this [src]!" return 0 if(!user.client) diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm index d8382cf8a30..b8a66b47ed4 100644 --- a/code/modules/reagents/Chemistry-Machinery.dm +++ b/code/modules/reagents/Chemistry-Machinery.dm @@ -99,7 +99,7 @@ */ /obj/machinery/chem_dispenser/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null) if(stat & (BROKEN|NOPOWER)) return - if(user.stat || user.restrained()) return + if((user.stat && !isobserver(user)) || user.restrained()) return // this is the data which will be sent to the ui var/data[0] diff --git a/html/changelog.html b/html/changelog.html index 577831e10bd..72fde34ebdd 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -79,6 +79,7 @@

N3X15 updated