diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm
index d37012519a6..1b870b45e32 100644
--- a/code/game/gamemodes/nuclear/nuclearbomb.dm
+++ b/code/game/gamemodes/nuclear/nuclearbomb.dm
@@ -223,10 +223,10 @@ var/bomb_set
deployable = 1
return
-/obj/machinery/nuclearbomb/proc/is_auth(user as mob)
+/obj/machinery/nuclearbomb/proc/is_auth(var/mob/user)
if(auth)
return 1
- if(isobserver(user) && check_rights(R_ADMIN, 0, user))
+ else if(user.can_admin_interact())
return 1
else
return 0
diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm
index 83510cd8357..603d293dd55 100644
--- a/code/game/machinery/alarm.dm
+++ b/code/game/machinery/alarm.dm
@@ -821,8 +821,8 @@
ui.open()
ui.set_auto_update(1)
-/obj/machinery/alarm/proc/is_authenticated(mob/user as mob, href_list)
- if(isobserver(user) && check_rights(R_ADMIN, 0, user))
+/obj/machinery/alarm/proc/is_authenticated(var/mob/user, href_list)
+ if(user.can_admin_interact())
return 1
else if(isAI(user) || isrobot(user) || emagged || is_auth_rcon(href_list))
return 1
diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm
index f8e177a32d8..d255e4837e6 100644
--- a/code/game/machinery/computer/card.dm
+++ b/code/game/machinery/computer/card.dm
@@ -50,8 +50,8 @@ var/time_last_changed_position = 0
/obj/machinery/computer/card/proc/is_centcom()
return istype(src, /obj/machinery/computer/card/centcom)
-/obj/machinery/computer/card/proc/is_authenticated(user as mob)
- if(isobserver(user) && check_rights(R_ADMIN, 0, user))
+/obj/machinery/computer/card/proc/is_authenticated(var/mob/user)
+ if(user.can_admin_interact())
return 1
if(scan)
return check_access(scan)
diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm
index 19412baf4ae..207042aeb37 100644
--- a/code/game/machinery/computer/communications.dm
+++ b/code/game/machinery/computer/communications.dm
@@ -65,10 +65,10 @@ var/shuttle_call/shuttle_calls[0]
..()
crew_announcement.newscast = 1
-/obj/machinery/computer/communications/proc/is_authenticated(user as mob, var/message = 1)
+/obj/machinery/computer/communications/proc/is_authenticated(var/mob/user, var/message = 1)
if(authenticated == 2)
return 2
- else if(isobserver(user) && check_rights(R_ADMIN, 0, user))
+ else if(user.can_admin_interact())
return 2
else if(authenticated)
return 1
diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm
index 87450ae699b..86f81d0a3b7 100644
--- a/code/game/objects/items/devices/radio/intercom.dm
+++ b/code/game/objects/items/devices/radio/intercom.dm
@@ -85,10 +85,6 @@
add_fingerprint(user)
spawn(0)
attack_self(user)
-
-/obj/item/device/radio/intercom/attack_ghost(mob/user as mob)
- spawn(0)
- attack_self(user)
/obj/item/device/radio/intercom/attack_hand(mob/user as mob)
add_fingerprint(user)
diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm
index 29378d8a911..05cc51ca5ba 100644
--- a/code/game/objects/items/devices/radio/radio.dm
+++ b/code/game/objects/items/devices/radio/radio.dm
@@ -81,6 +81,9 @@ var/global/list/default_medbay_channels = list(
for (var/ch_name in channels)
secure_radio_connections[ch_name] = radio_controller.add_object(src, radiochannels[ch_name], RADIO_CHAT)
+/obj/item/device/radio/attack_ghost(mob/user)
+ interact(user)
+
/obj/item/device/radio/attack_self(mob/user as mob)
user.set_machine(src)
interact(user)
@@ -140,18 +143,19 @@ var/global/list/default_medbay_channels = list(
if(!(freq in internal_channels))
return 0
-
- if(isobserver(user) && check_rights(R_ADMIN,0))
- return 1
- var/list/access = list()
- if(issilicon(user))
- access = get_all_accesses()
- else
- var/obj/item/weapon/card/id/I = user.get_id_card()
- if(istype(I))
- access = I.access
- return has_access(list(), internal_channels[freq], access)
+ return user.has_internal_radio_channel_access(user, internal_channels[freq])
+
+/mob/proc/has_internal_radio_channel_access(var/mob/user, var/list/req_one_accesses)
+ var/obj/item/weapon/card/id/I = user.get_id_card()
+ return has_access(list(), req_one_accesses, I ? I.GetAccess() : list())
+
+/mob/living/silicon/has_internal_radio_channel_access(var/mob/user, var/list/req_one_accesses)
+ var/list/access = get_all_accesses()
+ return has_access(list(), req_one_accesses, access)
+
+/mob/dead/observer/has_internal_radio_channel_access(var/mob/user, var/list/req_one_accesses)
+ return can_admin_interact()
/obj/item/device/radio/proc/text_wires()
if (b_stat)
diff --git a/code/modules/economy/Accounts_DB.dm b/code/modules/economy/Accounts_DB.dm
index 4c40a9ef035..a4a27209d3b 100644
--- a/code/modules/economy/Accounts_DB.dm
+++ b/code/modules/economy/Accounts_DB.dm
@@ -14,8 +14,8 @@
light_color = LIGHT_COLOR_GREEN
-/obj/machinery/computer/account_database/proc/get_access_level(user as mob)
- if(isobserver(user) && check_rights(R_ADMIN, 0, user))
+/obj/machinery/computer/account_database/proc/get_access_level(var/mob/user)
+ if(user.can_admin_interact())
return 2
if (!held_card)
return 0
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index 3c61d7c2f6e..17e67c89b8a 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -517,9 +517,8 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
src << "\blue Temperature: [round(environment.temperature-T0C,0.1)]°C"
src << "\blue Heat Capacity: [round(environment.heat_capacity(),0.1)]"
-
-
-/mob/dead/observer/verb/view_manfiest()
+
+/mob/dead/observer/verb/view_manifest()
set name = "View Crew Manifest"
set category = "Ghost"
@@ -638,4 +637,9 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
client.images |= ghost_darkness_images
if (ghostimage)
client.images -= ghostimage //remove ourself
-
\ No newline at end of file
+
+/mob/proc/can_admin_interact()
+ return 0
+
+/mob/dead/observer/can_admin_interact()
+ return check_rights(R_ADMIN, 0, src)
\ No newline at end of file
diff --git a/code/modules/nano/interaction/default.dm b/code/modules/nano/interaction/default.dm
index a1498bf8189..deaae348d30 100644
--- a/code/modules/nano/interaction/default.dm
+++ b/code/modules/nano/interaction/default.dm
@@ -10,7 +10,7 @@
return STATUS_CLOSE // By default no mob can do anything with NanoUI
/mob/dead/observer/default_can_use_topic()
- if(check_rights(R_ADMIN, 0, src))
+ if(can_admin_interact())
return STATUS_INTERACTIVE // Admins are more equal
return STATUS_UPDATE // Ghosts can view updates
diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm
index c399fe4e969..dd0fbd2fc7e 100644
--- a/code/modules/power/apc.dm
+++ b/code/modules/power/apc.dm
@@ -836,8 +836,8 @@
return wires.IsIndexCut(wireIndex)
-/obj/machinery/power/apc/proc/can_use(mob/user as mob, var/loud = 0) //used by attack_hand() and Topic()
- if(isobserver(user) && check_rights(R_ADMIN, 0, user))
+/obj/machinery/power/apc/proc/can_use(var/mob/user, var/loud = 0) //used by attack_hand() and Topic()
+ if(user.can_admin_interact())
return 1
autoflag = 5
diff --git a/code/modules/shuttles/shuttle_console.dm b/code/modules/shuttles/shuttle_console.dm
index eb6ff7e1400..24434b119df 100644
--- a/code/modules/shuttles/shuttle_console.dm
+++ b/code/modules/shuttles/shuttle_console.dm
@@ -14,7 +14,7 @@
return
if(!allowed(user) && !isobserver(user))
- user << "Access Denied."
+ user << "Access denied."
return 1
ui_interact(user)