diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index 11d622b2550..0b524befec5 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -490,6 +490,8 @@
world.log << "## DEBUG: mind_initialize(): No ticker ready yet! Please inform Carn"
if(!mind.name) mind.name = real_name
mind.current = src
+ if(player_is_antag(mind))
+ src.client.verbs += /client/proc/aooc
//HUMAN
/mob/living/carbon/human/mind_initialize()
diff --git a/code/game/antagonist/antagonist.dm b/code/game/antagonist/antagonist.dm
index 44d32bfecb5..4b2afa1df38 100644
--- a/code/game/antagonist/antagonist.dm
+++ b/code/game/antagonist/antagonist.dm
@@ -79,6 +79,8 @@
Think through your actions and make the roleplay immersive! Please remember all \
rules aside from those without explicit exceptions apply to antagonists."
+ var/can_use_aooc = TRUE // If true, will be given the AOOC verb, along with the ability to use it.
+
/datum/antagonist/New()
..()
cur_max = hard_cap
diff --git a/code/game/antagonist/antagonist_add.dm b/code/game/antagonist/antagonist_add.dm
index e42888737f3..67eb7e2e726 100644
--- a/code/game/antagonist/antagonist_add.dm
+++ b/code/game/antagonist/antagonist_add.dm
@@ -36,6 +36,9 @@
and it otherwise has no bearing on your round."
player.current.verbs |= /mob/living/proc/write_ambition
+ if(can_use_aooc)
+ player.current.client.verbs += /client/proc/aooc
+
// Handle only adding a mind and not bothering with gear etc.
if(nonstandard_role_type)
faction_members |= player
@@ -58,6 +61,7 @@
BITSET(player.current.hud_updateflag, SPECIALROLE_HUD)
if(!is_special_character(player))
player.current.verbs -= /mob/living/proc/write_ambition
+ player.current.client.verbs -= /client/proc/aooc
player.ambitions = ""
return 1
return 0
\ No newline at end of file
diff --git a/code/game/antagonist/outsider/ert.dm b/code/game/antagonist/outsider/ert.dm
index b176df24674..c1aec2bcf82 100644
--- a/code/game/antagonist/outsider/ert.dm
+++ b/code/game/antagonist/outsider/ert.dm
@@ -25,6 +25,8 @@ var/datum/antagonist/ert/ert
initial_spawn_req = 5
initial_spawn_target = 7
+ can_use_aooc = FALSE // They're the good guys.
+
/datum/antagonist/ert/create_default(var/mob/source)
var/mob/living/carbon/human/M = ..()
if(istype(M)) M.age = rand(25,45)
diff --git a/code/game/antagonist/outsider/trader.dm b/code/game/antagonist/outsider/trader.dm
index aaf573cd202..9603b495238 100644
--- a/code/game/antagonist/outsider/trader.dm
+++ b/code/game/antagonist/outsider/trader.dm
@@ -24,6 +24,8 @@ var/datum/antagonist/trader/traders
initial_spawn_req = 5
initial_spawn_target = 7
+ can_use_aooc = FALSE // They're not real antags.
+
/datum/antagonist/trader/create_default(var/mob/source)
var/mob/living/carbon/human/M = ..()
if(istype(M)) M.age = rand(25,45)
diff --git a/code/game/antagonist/station/renegade.dm b/code/game/antagonist/station/renegade.dm
index 616080bfbf8..d9e36715460 100644
--- a/code/game/antagonist/station/renegade.dm
+++ b/code/game/antagonist/station/renegade.dm
@@ -59,6 +59,8 @@ var/datum/antagonist/renegade/renegades
list(/obj/item/weapon/gun/projectile/luger,/obj/item/weapon/gun/projectile/luger/brown)
)
+ can_use_aooc = FALSE // They aren't 'true' antags.
+
/datum/antagonist/renegade/New()
..()
renegades = src
diff --git a/code/modules/admin/verbs/antag-ooc.dm b/code/modules/admin/verbs/antag-ooc.dm
index 8c73591197d..f3a6ffc77ca 100644
--- a/code/modules/admin/verbs/antag-ooc.dm
+++ b/code/modules/admin/verbs/antag-ooc.dm
@@ -3,17 +3,40 @@
set name = "AOOC"
set desc = "Antagonist OOC"
- if(!check_rights(R_ADMIN|R_MOD)) return
+ var/is_admin = check_rights(R_ADMIN|R_MOD, show_msg = 0)
+ var/is_antag = usr.mind && usr.mind.special_role
+
+ if(!is_antag && !is_admin) // Non-antagonists and non-admins have no business using this.
+ to_chat(usr, "Sorry, but only certain antagonists or administrators can use this verb.")
+ return
+
+ else if(is_antag && !is_admin) // Is an antag, and not an admin, meaning we need to check if their antag type allows AOOC.
+ var/datum/antagonist/A = get_antag_data(usr.mind.special_role)
+ if(!A || !A.can_use_aooc)
+ to_chat(usr, "Sorry, but your antagonist type is not allowed to speak in AOOC.")
+ return
msg = sanitize(msg)
- if(!msg) return
+ if(!msg)
+ return
+ // Name shown to admins.
var/display_name = src.key
- if(holder && holder.fakekey)
- display_name = holder.fakekey
+ if(holder)
+ if(holder.fakekey)
+ display_name = usr.client.holder.fakekey
+
+ // Name shown to other players. Admins whom are not also antags have their rank displayed.
+ var/player_display = (is_admin && !is_antag) ? "[display_name]([usr.client.holder.rank])" : display_name
for(var/mob/M in mob_list)
- if((M.mind && M.mind.special_role && M.client) || check_rights((R_ADMIN|R_MOD), 0, M))
- M << "" + create_text_tag("aooc", "Antag-OOC:", M.client) + " [display_name]: [msg]"
+ if(check_rights(R_ADMIN|R_MOD, 0, M)) // Staff can see AOOC unconditionally, and with more details.
+ to_chat(M, "[create_text_tag("aooc", "Antag-OOC:", M.client)] [get_options_bar(src, 0, 1, 1)]([admin_jump_link(usr, M.client.holder)]): [msg]")
+ else if(M.client) // Players can only see AOOC if observing, or if they are an antag type allowed to use AOOC.
+ var/datum/antagonist/A = null
+ if(M.mind) // Observers don't have minds, but they should still see AOOC.
+ A = get_antag_data(M.mind.special_role)
+ if((M.mind && M.mind.special_role && A && A.can_use_aooc) || isobserver(M)) // Antags must have their type be allowed to AOOC to see AOOC. This prevents, say, ERT from seeing AOOC.
+ to_chat(M, "[create_text_tag("aooc", "Antag-OOC:", M.client)] [player_display]: [msg]")
log_ooc("(ANTAG) [key] : [msg]")
\ No newline at end of file
diff --git a/code/stylesheet.dm b/code/stylesheet.dm
index 32e69caea60..72e2357c0f8 100644
--- a/code/stylesheet.dm
+++ b/code/stylesheet.dm
@@ -24,6 +24,7 @@ em {font-style: normal;font-weight: bold;}
.ooc .moderator {color: #184880;}
.ooc .developer {color: #1b521f;}
.ooc .admin {color: #b82e00;}
+.ooc .aooc {color: #960018;}
/* Admin: Private Messages */
.pm .howto {color: #ff0000; font-weight: bold; font-size: 200%;}