diff --git a/code/WorkInProgress/kilakk/fax.dm b/code/WorkInProgress/kilakk/fax.dm
index be3c5e6c..1a1409f6 100644
--- a/code/WorkInProgress/kilakk/fax.dm
+++ b/code/WorkInProgress/kilakk/fax.dm
@@ -179,8 +179,15 @@ var/list/alldepartments = list("Central Command")
/proc/Centcomm_fax(var/sent, var/sentname, var/mob/Sender)
- var/msg = "\blue CENTCOMM FAX: [key_name(Sender,0,1,0)] (PP) (VV) (SM) (JMP) (CA) (RPLY): Receiving '[sentname]' via secure connection ... view message"
for(var/client/C in admins)
+ var/msg = "\blue CENTCOMM FAX: "
+ if(C.holder.rights & (R_ADMIN|R_FUN|R_MOD))
+ msg += "[key_name(Sender,1)] (PP) (VV) (SM) (JMP) (CA)"
+ else
+ msg += "[key_name(Sender,0,1,0)]"
+
+ msg += " (RPLY): Receiving '[sentname]' via secure connection ... view message"
+
if(C.holder.rights & (R_ADMIN|R_DUTYOFF|R_FUN))
C << msg
diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm
index 60511952..e81260d4 100644
--- a/code/datums/datumvars.dm
+++ b/code/datums/datumvars.dm
@@ -419,9 +419,7 @@ client
if( (usr.client != src) || !src.holder )
return
if(href_list["Vars"])
- if(!holder.rights & (R_ADMIN|R_MOD|R_FUN|R_DEV))
- usr << "This can only be used on instances of type /mob"
- debug_variables(locate(href_list["Vars"]))
+ debug_variables(locate(href_list["Vars"]))
//~CARN: for renaming mobs (updates their name, real_name, mind.name, their ID/PDA and datacore records).
else if(href_list["rename"])
diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm
index 0932b1fc..b4f69084 100644
--- a/code/game/gamemodes/game_mode.dm
+++ b/code/game/gamemodes/game_mode.dm
@@ -479,7 +479,8 @@ proc/display_roundstart_logout_report()
for(var/mob/M in mob_list)
if(M.client && M.client.holder)
- M << msg
+ if(M.client.holder.rights & (R_ADMIN|R_MOD|R_DEV))
+ M << msg
proc/get_nt_opposed()
diff --git a/code/game/verbs/ooc.dm b/code/game/verbs/ooc.dm
index 28edeb4c..76b91a15 100644
--- a/code/game/verbs/ooc.dm
+++ b/code/game/verbs/ooc.dm
@@ -40,6 +40,16 @@ var/global/normal_ooc_colour = "#002eb8"
return
if(holder)
+ if(holder.rights & R_DUTYOFF && !(holder.rights & (R_ADMIN|R_MOD|R_DEV)))
+ if(!ooc_allowed)
+ src << "\red OOC is globally muted"
+ return
+ if(!dooc_allowed && (mob.stat == DEAD))
+ usr << "\red OOC for dead mobs has been turned off."
+ return
+ if(prefs.muted & MUTE_OOC)
+ src << "\red You cannot use OOC (muted)."
+ return
if(holder.rights & R_DEV && !(holder.rights & R_ADMIN))
if(!ooc_allowed && !ooc_dev_allowed)
src << "\red OOC is muted for developers"
@@ -147,6 +157,19 @@ var/global/normal_ooc_colour = "#002eb8"
return
if(holder)
+ msg_scopes("holder")
+ if(holder.rights & R_DUTYOFF && !(holder.rights & (R_ADMIN|R_MOD|R_DEV)))
+ msg_scopes("holder 1")
+ if(!looc_allowed)
+ src << "\red LOOC is muted."
+ return
+ if(!dooc_allowed && (mob.stat == DEAD))
+ usr << "\red OOC for dead mobs has been turned off."
+ return
+ if(prefs.muted & MUTE_OOC)
+ src << "\red You cannot use OOC (muted)."
+ return
+ msg_scopes("holder 2")
if(holder.rights & R_DEV && !(holder.rights & R_ADMIN))
if(!looc_allowed && !looc_dev_allowed)
src << "\red LOOC is muted for developers"
@@ -177,7 +200,8 @@ var/global/normal_ooc_colour = "#002eb8"
display_name = holder.fakekey
C << "LOOC: [display_name]: [msg]"
for(var/client/C in admins)
- if(C.holder.rights & R_DUTYOFF && (!C.holder.rights & (R_ADMIN|R_MOD|R_DEV)))
+ if(!C.holder.rights & (R_ADMIN|R_MOD|R_DEV))
+ msg_scopes("holder 4")
continue
if(C.prefs.toggles & CHAT_LOOC)
var/prefix = "(R)LOOC"
diff --git a/code/game/verbs/who.dm b/code/game/verbs/who.dm
index a87caf20..df5febed 100644
--- a/code/game/verbs/who.dm
+++ b/code/game/verbs/who.dm
@@ -50,6 +50,8 @@
var/modmsg = ""
var/devmsg = ""
var/eventmsg = ""
+ var/dutymsg = ""
+ var/num_duty_online = 0
var/num_devs_online = 0
var/num_mods_online = 0
var/num_event_online = 0
@@ -120,6 +122,20 @@
devmsg += " (AFK)"
devmsg += "\n"
num_devs_online++
+ else if(R_DUTYOFF & C.holder.rights && !(C.holder.rights & (R_ADMIN|R_MOD)))
+ dutymsg += "\t[C]"
+
+ if(isobserver(C.mob))
+ devmsg += " - Observing"
+ else if(istype(C.mob,/mob/new_player))
+ devmsg += " - Lobby"
+ else
+ devmsg += " - Playing"
+
+ if(C.is_afk())
+ devmsg += " (AFK)"
+ devmsg += "\n"
+ num_duty_online++
else
for(var/client/C in admins)
@@ -141,5 +157,8 @@
if(num_event_online)
eventwho += "\n Current Event Hosts([num_event_online]):\n" + eventmsg
- msg = "Current Admins ([num_admins_online]):\n" + msg + "\n Current Moderators([num_mods_online]):\n" + modmsg + eventwho + "\n Current Developers([num_devs_online]):\n" + devmsg
+ if(num_duty_online)
+ dutymsg = "\n Current Duty Officers([num_event_online]):\n" + dutymsg
+
+ msg = "Current Admins ([num_admins_online]):\n" + msg + "\n Current Moderators([num_mods_online]):\n" + modmsg + eventwho + "\n Current Developers([num_devs_online]):\n" + devmsg + dutymsg
src << msg
\ No newline at end of file
diff --git a/code/modules/admin/permissionverbs/permissionedit.dm b/code/modules/admin/permissionverbs/permissionedit.dm
index a52e289d..be0509d4 100644
--- a/code/modules/admin/permissionverbs/permissionedit.dm
+++ b/code/modules/admin/permissionverbs/permissionedit.dm
@@ -80,9 +80,9 @@
var/flags
switch(new_rank)
if("Head Developer")
- flags = 32767
+ flags = 65535
if("Head Admin")
- flags = 32767
+ flags = 65535
if("Primary Admin")
flags = 8191
if("Secondary Admin")
@@ -97,6 +97,8 @@
flags = 5672
if("Retired Admin")
flags = 8194
+ if("Duty Officer")
+ flags = 32768
else
flags = 0
diff --git a/code/modules/admin/permissionverbs/permsission lists.dm b/code/modules/admin/permissionverbs/permsission lists.dm
index 653994ea..252e9b90 100644
--- a/code/modules/admin/permissionverbs/permsission lists.dm
+++ b/code/modules/admin/permissionverbs/permsission lists.dm
@@ -393,6 +393,7 @@ var/list/admin_verbs_hideable = list(
var/list/admin_verbs_duty = list(
/client/proc/spawn_duty_officer,
+ /client/proc/cmd_admin_create_centcom_report,
/client/proc/cmd_duty_say,
/client/verb/returntobody
)
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index c88e92a6..5788619c 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -155,7 +155,7 @@
if(admin_ranks.len)
new_rank = input("Please select a rank", "New rank", null, null) as null|anything in (admin_ranks|"*New Rank*")
else
- new_rank = input("Please select a rank", "New rank", null, null) as null|anything in list("Head Developer","Head Admin", "Primary Admin", "Secondary Admin", "Moderator", "Trial Moderator", "Event Host - Moderator", "Event Host", "Retired Admin", "*New Rank*")
+ new_rank = input("Please select a rank", "New rank", null, null) as null|anything in list("Head Developer","Head Admin", "Primary Admin", "Secondary Admin", "Moderator", "Trial Moderator", "Event Host - Moderator", "Event Host", "Retired Admin", "Duty Officer", "*New Rank*")
var/rights = 0
if(D)
diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm
index 090625b5..776c5355 100644
--- a/code/modules/admin/verbs/pray.dm
+++ b/code/modules/admin/verbs/pray.dm
@@ -30,13 +30,28 @@
//Stealing the second var because why not)
/proc/Centcomm_announce(var/text , var/mob/Sender , var/silicon = 0 , var/iamessage)
var/msg = copytext(sanitize(text), 1, MAX_MESSAGE_LEN)
+ var/modmin = " (PP) (VV) (SM) (JMP) (CA) (BSA)"
+ var/msg_start = "\blue CENTCOMM"
+ var/msg_end = ""
+
if(silicon)
- msg = "\blue CENTCOMM(A.L.I.C.E.):[key_name(Sender, 1)] (PP) (VV) (SM) (JMP) (CA) (BSA) (RPLY): [msg]"
+ msg_start += "(A.L.I.C.E.):"
+ msg_end = "(RPLY): [msg]"
else
- msg = "\blue CENTCOMM[iamessage ? " IA" : ""]:[key_name(Sender, 1)] (PP) (VV) (SM) (JMP) (CA) (BSA) (RPLY): [msg]"
+ msg_start += "[iamessage ? " IA" : ""]:"
+ msg_end = "(RPLY): [msg]"
+
for(var/client/C in admins)
- if(C.holder.rights & (R_ADMIN|R_DUTYOFF|R_FUN))
- C << msg
+ if(C.holder.rights & (R_ADMIN|R_MOD|R_FUN))
+ if(C.holder.rights & R_MOD && !C.holder.rights & R_DUTYOFF)
+ continue
+ C << "[msg_start][key_name(Sender, 1)][modmin][msg_end]"
+ continue
+ if(C.holder.rights & (R_DUTYOFF))
+ if(C.holder.rights & R_MOD)
+ C << "[msg_start][key_name(Sender, 1)][msg_end]"
+ else
+ C << "[msg_start][key_name(Sender, 0, 1, 0)][msg_end]"
/proc/Syndicate_announce(var/text , var/mob/Sender)
var/msg = copytext(sanitize(text), 1, MAX_MESSAGE_LEN)
diff --git a/code/modules/aurora/duty officer.dm b/code/modules/aurora/duty officer.dm
index f0ddb525..4702a0d0 100644
--- a/code/modules/aurora/duty officer.dm
+++ b/code/modules/aurora/duty officer.dm
@@ -16,12 +16,14 @@
src << "\red The game hasn't started yet!"
return
- if(mob.mind.special_role == "Duty Officer")
+ if(mob.mind && mob.mind.special_role == "Duty Officer")
src << "\red You are already a Duty Officer"
return
+ var/wasLiving = 0
if(istype(mob, /mob/living))
holder.original_mob = mob
+ wasLiving = 1
for (var/obj/effect/landmark/L in landmarks_list)
if(L.name == "DutyOfficer")
@@ -102,13 +104,16 @@
M.mind = new
M.mind.current = M
M.mind.original = M
- M.mind.admin_mob_placeholder = mob
+ if(wasLiving)
+ M.mind.admin_mob_placeholder = mob
M.mind.assigned_role = "Central Command Duty Officer"
M.mind.special_role = "Duty Officer"
M.loc = L.loc
M.key = key
- spawn(1)
- holder.original_mob.key = "@[key]"
+
+ if(wasLiving)
+ spawn(1)
+ holder.original_mob.key = "@[key]"
M.equip_if_possible(new /obj/item/clothing/under/rank/centcom/officer(M), slot_w_uniform)
M.equip_if_possible(new /obj/item/clothing/shoes/centcom(M), slot_shoes)
@@ -145,7 +150,7 @@
if(!check_rights(0)) return
- if(mob.mind.special_role != "Duty Officer")
+ if(!mob.mind || mob.mind.special_role != "Duty Officer")
verbs -= /client/verb/returntobody
return
@@ -162,6 +167,7 @@
verbs -= /client/verb/returntobody
return
holder.original_mob.key = key
+ holder.original_mob = null
else
if(mob.mind.admin_mob_placeholder)
mob.mind.admin_mob_placeholder.key = key
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index eab7dc34..3a3f6cdd 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -173,6 +173,14 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
else
var/response = alert(src, "Are you -sure- you want to ghost?\n(You are alive. If you ghost, you won't be able to play this round for another 30 minutes! You can't change your mind so choose wisely!)","Are you sure you want to ghost?","Ghost","Stay in body")
if(response != "Ghost") return //didn't want to ghost after-all
+ if(client.holder && mind.special_role == "DutyOfficer")
+ client.holder.original_mob = null
+ var/mob/dead/observer/ghost = ghostize(0)
+ ghost.timeofdeath = world.time
+ mind.admin_mob_placeholder = null
+ del(src)
+ return
+
resting = 1
var/turf/location = get_turf(src)
message_admins("[key_name_admin(usr)] has ghosted. (JMP)")
@@ -243,7 +251,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
usr << "The astral cord that ties your body and your spirit has been severed. You are likely to wander the realm beyond until your body is finally dead and thus reunited with you."
return
mind.current.ajourn=0
- if(mind.current == client.holder.original_mob)
+ if(client.holder && mind.current == client.holder.original_mob)
client.holder.original_mob = null
mind.current.key = key
return 1
diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm
index c7a968a1..ad2e5977 100644
--- a/code/modules/mob/say.dm
+++ b/code/modules/mob/say.dm
@@ -63,7 +63,8 @@
continue
if(M.client && M.client.holder && (M.client.prefs.toggles & CHAT_DEAD) ) // Show the message to admins/mods with deadchat toggled on
- M << rendered //Admins can hear deadchat, if they choose to, no matter if they're blind/deaf or not.
+ if(M.client.holder.rights & (R_MOD|R_ADMIN|R_DEV|R_FUN))
+ M << rendered //Admins can hear deadchat, if they choose to, no matter if they're blind/deaf or not.
return