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/controllers/voting.dm b/code/controllers/voting.dm
index 7bc96b0c..23bac99c 100644
--- a/code/controllers/voting.dm
+++ b/code/controllers/voting.dm
@@ -312,15 +312,16 @@ datum/controller/vote
proc/interface(var/client/C)
if(!C) return
- var/admin = 0
var/trialmin = 0
+ var/modmin = 0
var/funmin = 0
if(C.holder)
- admin = 1
if(C.holder.rights & R_ADMIN)
trialmin = 1
else if(C.holder.rights & R_FUN)
funmin = 1
+ else if(C.holder.rights & R_MOD)
+ modmin = 1
voting |= C
. = "
Voting Panel"
@@ -337,7 +338,7 @@ datum/controller/vote
. += "[choices[i]] ([votes] votes)"
. += "
"
- if(admin)
+ if(trialmin||modmin)
. += "(Cancel Vote) "
else
. += "Start a vote:
- "
@@ -379,7 +380,7 @@ datum/controller/vote
usr << browse(null, "window=vote")
return
if("cancel")
- if(usr.client.holder)
+ if(usr.client.holder & (R_ADMIN|R_MOD))
reset()
if("toggle_restart")
if(usr.client.holder)
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/machinery/vending.dm b/code/game/machinery/vending.dm
index ab5f550d..eb1d5364 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -797,7 +797,7 @@
icon_state = "cigs"
products = list(/obj/item/weapon/storage/fancy/cigarettes = 10,/obj/item/weapon/storage/box/matches = 10,/obj/item/weapon/lighter/random = 4)
contraband = list(/obj/item/weapon/lighter/zippo = 4)
- premium = list(/obj/item/clothing/mask/cigarette/cigar/havana = 2)
+ premium = list(/obj/item/clothing/mask/cigarette/cigar/havana = 2, /obj/item/weapon/storage/fancy/cigars = 4)
prices = list(/obj/item/weapon/storage/fancy/cigarettes = 15,/obj/item/weapon/storage/box/matches = 1,/obj/item/weapon/lighter/random = 2)
diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm
index 1735d2d9..d72d9f2d 100644
--- a/code/game/objects/items/weapons/storage/fancy.dm
+++ b/code/game/objects/items/weapons/storage/fancy.dm
@@ -204,6 +204,47 @@
icon_state = "Dpacket"
item_state = "Dpacket"
+/*
+ * Cigar Cases
+ */
+
+/obj/item/weapon/storage/fancy/cigars //Complications here making it a subtype of cigarette packets, simpler to make a new type.
+ name = "\improper Cigar Case"
+ desc = "A thin, wooden case containing a selection of fine cigars, fit for a gentleman."
+ icon = 'icons/obj/cigarettes.dmi'
+ icon_state = "cigarcase"
+ item_state = "cigpacket"
+ w_class = 3
+ throwforce = 3
+ flags = TABLEPASS
+ storage_slots = 6
+ can_hold = list("/obj/item/clothing/mask/cigarette",
+ "/obj/item/weapon/lighter",
+ "/obj/item/weapon/reagent_containers/pill")
+ icon_type = "cigar"
+
+
+/obj/item/weapon/storage/fancy/cigars/New()
+ ..()
+ flags |= NOREACT
+ for(var/i = 1 to storage_slots)
+ new /obj/item/clothing/mask/cigarette/cigar/(src)
+ create_reagents(15 * storage_slots)//so people can inject cigarettes without opening a packet, now with being able to inject the whole one
+
+/obj/item/weapon/storage/fancy/cigars/Del()
+ del(reagents)
+ ..()
+
+
+/obj/item/weapon/storage/fancy/cigars/update_icon()
+ icon_state = "[initial(icon_state)][contents.len]"
+ return
+
+/obj/item/weapon/storage/fancy/cigars/remove_from_storage(obj/item/W as obj, atom/new_location)
+ var/obj/item/clothing/mask/cigarette/cigar/C = W
+ if(!istype(C)) return // what
+ reagents.trans_to(C, (reagents.total_volume/contents.len))
+
/*
* Vial Box
diff --git a/code/game/verbs/ooc.dm b/code/game/verbs/ooc.dm
index 28edeb4c..3fe441f5 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|R_FUN)))
+ 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,16 @@ var/global/normal_ooc_colour = "#002eb8"
return
if(holder)
+ if(holder.rights & R_DUTYOFF && !(holder.rights & (R_ADMIN|R_MOD|R_DEV)))
+ 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
if(holder.rights & R_DEV && !(holder.rights & R_ADMIN))
if(!looc_allowed && !looc_dev_allowed)
src << "\red LOOC is muted for developers"
@@ -171,13 +191,13 @@ var/global/normal_ooc_colour = "#002eb8"
var/display_name = src.key
if(holder)
if(holder.fakekey)
- if(C.holder && C.holder.rights & (R_ADMIN|R_MOD|R_DEV))
+ if(C.holder && C.holder.rights & (R_ADMIN|R_MOD))
display_name = "[holder.fakekey]/([src.key])"
else
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))
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..aa81c91c 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))
+ dutymsg += " - Observing"
+ else if(istype(C.mob,/mob/new_player))
+ dutymsg += " - Lobby"
+ else
+ dutymsg += " - Playing"
+
+ if(C.is_afk())
+ dutymsg += " (AFK)"
+ dutymsg += "\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..49001093 100644
--- a/code/modules/admin/permissionverbs/permsission lists.dm
+++ b/code/modules/admin/permissionverbs/permsission lists.dm
@@ -393,8 +393,9 @@ 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
+ /client/proc/returntobody
)
/client/proc/add_admin_verbs()
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..9a104d65 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)
@@ -135,18 +140,18 @@
W.registered_name = M.real_name
M.equip_if_possible(W, slot_wear_id)
- verbs += /client/verb/returntobody
+ verbs += /client/proc/returntobody
break
-/client/verb/returntobody()
+/client/proc/returntobody()
set name = "Return to mob"
set desc = "The Duty is done, return to your original mob"
set category = "Special Verbs"
if(!check_rights(0)) return
- if(mob.mind.special_role != "Duty Officer")
- verbs -= /client/verb/returntobody
+ if(!mob.mind || mob.mind.special_role != "Duty Officer")
+ verbs -= /client/proc/returntobody
return
if(!holder) return
@@ -159,14 +164,15 @@
if(holder.original_mob)
if(holder.original_mob == M)
- verbs -= /client/verb/returntobody
+ verbs -= /client/proc/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
mob.mind.admin_mob_placeholder = null
else
mob.ghostize(0)
- verbs -= /client/verb/returntobody
+ verbs -= /client/proc/returntobody
del(M)
\ No newline at end of file
diff --git a/code/modules/client/preferences_gear.dm b/code/modules/client/preferences_gear.dm
index 2461e068..e44a2bba 100644
--- a/code/modules/client/preferences_gear.dm
+++ b/code/modules/client/preferences_gear.dm
@@ -14,12 +14,6 @@ proc/populate_gear_list()
var/whitelisted //Term to check the whitelist for..
//Standard gear datums.
-/*
-/datum/gear/cards
- display_name = "deck of cards"
- path = /obj/item/weapon/deck
- cost = 2*/
-
/datum/gear/dice
display_name = "d20"
path = /obj/item/weapon/dice/d20
@@ -35,7 +29,6 @@ proc/populate_gear_list()
path = /obj/item/weapon/storage/wallet
cost = 2
-
/datum/gear/comb
display_name = "purple comb"
path = /obj/item/weapon/fluff/cado_keppel_1
@@ -186,28 +179,28 @@ proc/populate_gear_list()
/datum/gear/labcoat
display_name = "labcoat"
path = /obj/item/clothing/suit/storage/labcoat
- cost = 3
+ cost = 2
// slot = slot_wear_suit
/datum/gear/bluescrubs
display_name = "blue scrubs"
path = /obj/item/clothing/under/rank/medical/blue
- cost = 1
+ cost = 3
/datum/gear/purplescrubs
display_name = "purple scrubs"
path = /obj/item/clothing/under/rank/medical/purple
- cost = 1
+ cost = 3
/datum/gear/greenscrubs
display_name = "green scrubs"
path = /obj/item/clothing/under/rank/medical/green
- cost = 1
+ cost = 3
/datum/gear/surgeryapron
display_name = "surgical apron"
path = /obj/item/clothing/suit/apron/surgery
- cost = 1
+ cost = 2
/datum/gear/sandal
@@ -219,7 +212,7 @@ proc/populate_gear_list()
/datum/gear/work_boots
display_name = "work boots"
path = /obj/item/clothing/shoes/work_boots
- cost = 1
+ cost = 2
/datum/gear/leather
display_name = "leather shoes"
@@ -272,13 +265,13 @@ proc/populate_gear_list()
/datum/gear/green_gloves
display_name = "green gloves"
path = /obj/item/clothing/gloves/green
- cost = 2
+ cost = 1
// slot = slot_gloves
/datum/gear/white_gloves
display_name = "white gloves"
path = /obj/item/clothing/gloves/white
- cost = 2
+ cost = 1
// slot = slot_gloves
/datum/gear/black_shoes
@@ -338,7 +331,7 @@ proc/populate_gear_list()
/datum/gear/jackboots
display_name = "jackboots"
path = /obj/item/clothing/shoes/jackboots
- cost = 3
+ cost = 2
// slot = slot_shoes
/datum/gear/webbing
@@ -455,7 +448,6 @@ proc/populate_gear_list()
path = /obj/item/clothing/under/lawyer/oldman
cost = 3
-
//Security
/datum/gear/security
display_name = "Security HUD"
@@ -476,6 +468,12 @@ proc/populate_gear_list()
cost = 3
allowed_roles = list("Captain", "Head of Personnel", "Security Officer", "Head of Security", "Warden")
+/datum/gear/waist
+ display_name = "waist holster"
+ path = /obj/item/clothing/tie/holster/waist
+ cost = 3
+ allowed_roles = list("Captain", "Head of Personnel", "Security Officer", "Head of Security", "Warden")
+
/datum/gear/normal_beret
display_name = "beret"
@@ -489,6 +487,47 @@ proc/populate_gear_list()
// slot = slot_head
allowed_roles = list("Security Officer","Head of Security","Warden")
+/*
+// Disabled until there is an alt-uniform for each department
+// Uniforms cost 3 points.
+
+/datum/gear/formal_uni
+ display_name = "formal officer's uniform"
+ path = /obj/item/clothing/under/rank/security/formal
+ cost = 3
+ allowed_roles = list("Security Officer")
+
+/datum/gear/formal_cap
+ display_name = "officer's formal cap"
+ path = /obj/item/clothing/head/helmet/secfcap
+ cost = 2
+ allowed_roles = list("Security Officer","Head of Security","Warden")
+
+/datum/gear/formal_uniw
+ display_name = "formal warden's uniform"
+ path = /obj/item/clothing/under/rank/warden/formal
+ cost = 3
+ allowed_roles = list("Warden")
+
+/datum/gear/formal_jacketw
+ display_name = "formal warden's jacket"
+ path = /obj/item/clothing/suit/armor/vest/warden/jacket
+ cost = 2
+ allowed_roles = list("Warden")
+
+/datum/gear/formal_unihos
+ display_name = "formal Head of Security's uniform"
+ path = /obj/item/clothing/under/rank/head_of_security/formal
+ cost = 3
+ allowed_roles = list("Head of Security")
+
+/datum/gear/formal_jackethos
+ display_name = "formal Head of Security's jacket"
+ path = /obj/item/clothing/suit/armor/hos/formal
+ cost = 2
+ allowed_roles = list("Head of Security")
+*/
+
//Engineering
/datum/gear/eng_beret
display_name = "engineering beret"
@@ -549,3 +588,8 @@ proc/populate_gear_list()
cost = 2
// slot = slot_wear_suit
whitelisted = "Unathi"
+
+/datum/gear/cigar_case
+ display_name = "cigar case"
+ path = /obj/item/weapon/storage/fancy/cigars
+ cost = 3
diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm
index 67842318..fb88704c 100644
--- a/code/modules/customitems/item_defines.dm
+++ b/code/modules/customitems/item_defines.dm
@@ -995,4 +995,27 @@ obj/structure/stool/bed/chair/wheelchair/fluff/kit/handle_rotation()
if(3)
ink = 1
colour = "black"
- user << "You cycle the pen to use the black ink cartridge."
\ No newline at end of file
+ user << "You cycle the pen to use the black ink cartridge."
+
+/obj/structure/sign/shaw_degree //Xenonuerology Doctorate - Alexis Shaw - Tenenza
+ name = "\improper Xenonuerology degree"//Description trimmed down, summarized.
+ desc = "Certification for a doctorate in Xenonuerology, made out to Alexis Shaw by the St. Grahelm University of Beisel, authenticated by watermarking."
+ icon_state = "shaw_degree"
+
+
+/obj/item/clothing/suit/storage/fluff/dalton_coat //Black Overcoat - Robert Dalton - Valkrae
+ name = "black overcoat"
+ desc = " A black overcoat. It seems worn, and well-made. The coat smells of tobacco and smoke."
+ icon = 'icons/obj/custom_items.dmi'
+ icon_state = "dalton_coat"
+ item_state = "dalton_coat"
+
+
+/obj/item/clothing/suit/storage/rohitin_jacket //CSI Jacket - Ana Ro'hi'tin - SueTheCake
+ name = "CSI jacket"
+ desc = " A black jacket with the words 'CSI' printed in the back in bright, white letters."
+ icon_state = "rohitinjacket"
+ item_state = "rohitinjacket"
+ blood_overlay_type = "armor"
+ allowed = list(/obj/item/stack/medical, /obj/item/weapon/reagent_containers/dropper, /obj/item/weapon/reagent_containers/hypospray, /obj/item/weapon/reagent_containers/syringe, \
+ /obj/item/device/healthanalyzer, /obj/item/device/flashlight, /obj/item/device/radio, /obj/item/weapon/tank/emergency_oxygen)
\ 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 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
diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi
index e9ed7b7b..6229066b 100644
Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ
diff --git a/icons/obj/cigarettes.dmi b/icons/obj/cigarettes.dmi
index 59cab029..97d8268f 100644
Binary files a/icons/obj/cigarettes.dmi and b/icons/obj/cigarettes.dmi differ
diff --git a/icons/obj/custom_items.dmi b/icons/obj/custom_items.dmi
index 874c96de..d2e981d4 100644
Binary files a/icons/obj/custom_items.dmi and b/icons/obj/custom_items.dmi differ