diff --git a/code/WorkInProgress/kilakk/fax.dm b/code/WorkInProgress/kilakk/fax.dm
index bb65f14a..be3c5e6c 100644
--- a/code/WorkInProgress/kilakk/fax.dm
+++ b/code/WorkInProgress/kilakk/fax.dm
@@ -179,9 +179,9 @@ var/list/alldepartments = list("Central Command")
/proc/Centcomm_fax(var/sent, var/sentname, var/mob/Sender)
- var/msg = "\blue CENTCOMM FAX: [key_name(Sender, 1)] (PP) (VV) (SM) (JMP) (CA) (RPLY): Receiving '[sentname]' via secure connection ... view message"
+ 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)
- if((R_ADMIN & C.holder.rights) || (R_MOD & C.holder.rights) || (R_FUN & C.holder.rights))
+ if(C.holder.rights & (R_ADMIN|R_DUTYOFF|R_FUN))
C << msg
proc/SendFax(var/sent, var/sentname, var/mob/Sender, var/dpt)
diff --git a/code/__HELPERS/type2type.dm b/code/__HELPERS/type2type.dm
index 37bdf305..b15a1116 100644
--- a/code/__HELPERS/type2type.dm
+++ b/code/__HELPERS/type2type.dm
@@ -323,6 +323,7 @@ proc/tg_list2text(list/list, glue=",")
if(rights & R_SPAWN) . += "[seperator]+SPAWN"
if(rights & R_MOD) . += "[seperator]+MODERATOR"
if(rights & R_DEV) . += "[seperator]+DEVELOPER"
+ if(rights & R_DUTYOFF) . += "[seperator]+DUTYOFFICER"
return .
/proc/ui_style2icon(ui_style)
diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm
index 861d2941..60511952 100644
--- a/code/datums/datumvars.dm
+++ b/code/datums/datumvars.dm
@@ -12,6 +12,9 @@ client
usr << "\red You need to be an administrator to access this."
return
+ if(!holder.rights & (R_MOD|R_ADMIN|R_FUN|R_DEV))
+ usr << "\red You need to be an admin/dev to access this."
+ return
var/title = ""
var/body = ""
@@ -416,7 +419,9 @@ client
if( (usr.client != src) || !src.holder )
return
if(href_list["Vars"])
- debug_variables(locate(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"]))
//~CARN: for renaming mobs (updates their name, real_name, mind.name, their ID/PDA and datacore records).
else if(href_list["rename"])
@@ -532,7 +537,7 @@ client
href_list["datumrefresh"] = href_list["godmode"]
else if(href_list["gib"])
- if(!check_rights(0)) return
+ if(!check_rights(R_SPAWN)) return
var/mob/M = locate(href_list["gib"])
if(!istype(M))
@@ -564,7 +569,7 @@ client
usr.client.cmd_admin_drop_everything(M)
else if(href_list["direct_control"])
- if(!check_rights(0)) return
+ if(!check_rights(R_DEBUG|R_DEV)) return
var/mob/M = locate(href_list["direct_control"])
if(!istype(M))
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index 934cb1b9..e9ddd5eb 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -34,6 +34,7 @@ datum/mind
var/name //replaces mob/var/original_name
var/mob/living/current
var/mob/living/original //TODO: remove.not used in any meaningful way ~Carn. First I'll need to tweak the way silicon-mobs handle minds.
+ var/mob/living/admin_mob_placeholder = null //Used to return to your body without varedit -Sounds-
var/active = 0
var/memory
diff --git a/code/game/jobs/access.dm b/code/game/jobs/access.dm
index bd4d1ee8..5053ec59 100644
--- a/code/game/jobs/access.dm
+++ b/code/game/jobs/access.dm
@@ -184,6 +184,8 @@
return list(access_cent_general, access_cent_living)
if("Medical Officer")
return list(access_cent_general, access_cent_living, access_cent_medical)
+ if("Duty Officer")
+ return list(access_cent_general, access_cent_living, access_cent_medical, access_cent_captain)
if("Death Commando")
return list(access_cent_general, access_cent_specops, access_cent_living, access_cent_storage)
if("Research Officer")
diff --git a/code/game/verbs/ooc.dm b/code/game/verbs/ooc.dm
index 2e4e666c..28edeb4c 100644
--- a/code/game/verbs/ooc.dm
+++ b/code/game/verbs/ooc.dm
@@ -71,7 +71,7 @@ var/global/normal_ooc_colour = "#002eb8"
var/display_name = src.key
if(holder)
if(holder.fakekey)
- if(C.holder)
+ if(C.holder & (holder.rights & (R_ADMIN|R_MOD)))
display_name = "[holder.fakekey]/([src.key])"
else
display_name = holder.fakekey
@@ -164,18 +164,21 @@ var/global/normal_ooc_colour = "#002eb8"
continue
var/client/C = M.client
if (C in admins)
- continue //they are handled after that
+ if(C.holder.rights & (R_ADMIN|R_MOD|R_DEV))
+ continue //they are handled after that
if(C.prefs.toggles & CHAT_LOOC)
var/display_name = src.key
if(holder)
if(holder.fakekey)
- if(C.holder)
+ if(C.holder && C.holder.rights & (R_ADMIN|R_MOD|R_DEV))
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)))
+ continue
if(C.prefs.toggles & CHAT_LOOC)
var/prefix = "(R)LOOC"
if (C.mob in heard)
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index 09bb8085..c13ba057 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -46,6 +46,10 @@ var/global/floorIsLava = 0
usr << "Error: you are not an admin!"
return
+ if(!src.rights & (R_ADMIN|R_MOD|R_FUN|R_DEV))
+ usr << "Error: you are not an admin!"
+ return
+
var/body = "
Options for [M.key]"
body += "Options panel for [M]"
if(M.client)
@@ -122,98 +126,100 @@ var/global/floorIsLava = 0
"}
if (M.client)
- if(!istype(M, /mob/new_player))
- body += "
"
- body += "Transformation:"
- body += "
"
+ if(check_rights(R_ADMIN|R_MOD|R_FUN,0))
+ if(!istype(M, /mob/new_player))
+ body += "
"
+ body += "Transformation:"
+ body += "
"
- //Monkey
- if(ismonkey(M))
- body += "Monkeyized | "
- else
- body += "Monkeyize | "
+ //Monkey
+ if(ismonkey(M))
+ body += "Monkeyized | "
+ else
+ body += "Monkeyize | "
- //Corgi
- if(iscorgi(M))
- body += "Corgized | "
- else
- body += "Corgize | "
+ //Corgi
+ if(iscorgi(M))
+ body += "Corgized | "
+ else
+ body += "Corgize | "
- //AI / Cyborg
- if(isAI(M))
- body += "Is an AI "
- else if(ishuman(M))
- body += {"Make AI |
- Make Robot |
- Make slime |
- Make Alien(BROKEN) |
+ //AI / Cyborg
+ if(isAI(M))
+ body += "Is an AI "
+ else if(ishuman(M))
+ body += {"Make AI |
+ Make Robot |
+ Make slime |
+ Make Alien(BROKEN) |
+ "}
+
+ //Simple Animals
+ if(isanimal(M))
+ body += "Re-Animalize | "
+ else
+ body += "Animalize | "
+
+ // DNA2 - Admin Hax
+ if(M.dna && iscarbon(M))
+ body += "
"
+ body += "DNA Blocks:
| | 1 | 2 | 3 | 4 | 5 | "
+ var/bname
+ for(var/block=1;block<=DNA_SE_LENGTH;block++)
+ if(((block-1)%5)==0)
+ body += "
|---|
| [block-1] | "
+ bname = assigned_blocks[block]
+ body += ""
+ if(bname)
+ var/bstate=M.dna.GetSEState(block)
+ var/bcolor="[(bstate)?"#006600":"#ff0000"]"
+ body += "[bname][block]"
+ else
+ body += "[block]"
+ body+=" | "
+ body += "
|---|
"
+
+ body += {"
+ Rudimentary transformation:
These transformations only create a new mob type and copy stuff over. They do not take into account MMIs and similar mob-specific things. The buttons in 'Transformations' are preferred, when possible.
+ Observer |
+ Cyborg |
+ Human
+
+ Slime: Baby |
+ Adult
+
+ Animal: Monkey |
+ Cat |
+ Runtime |
+ Corgi |
+ Ian |
+ Crab |
+ Coffee |
+ Nymph
+
+ Construct: Armoured |
+ Builder |
+ Wraith |
+ Shade
+
+ Alien: Drone |
+ Hunter |
+ Queen |
+ Sentinel |
+ Larva
"}
- //Simple Animals
- if(isanimal(M))
- body += "Re-Animalize | "
- else
- body += "Animalize | "
-
- // DNA2 - Admin Hax
- if(M.dna && iscarbon(M))
- body += "
"
- body += "DNA Blocks:
| | 1 | 2 | 3 | 4 | 5 | "
- var/bname
- for(var/block=1;block<=DNA_SE_LENGTH;block++)
- if(((block-1)%5)==0)
- body += "
|---|
| [block-1] | "
- bname = assigned_blocks[block]
- body += ""
- if(bname)
- var/bstate=M.dna.GetSEState(block)
- var/bcolor="[(bstate)?"#006600":"#ff0000"]"
- body += "[bname][block]"
- else
- body += "[block]"
- body+=" | "
- body += "
|---|
"
-
- body += {"
- Rudimentary transformation:
These transformations only create a new mob type and copy stuff over. They do not take into account MMIs and similar mob-specific things. The buttons in 'Transformations' are preferred, when possible.
- Observer |
- Cyborg |
- Human
-
- Slime: Baby |
- Adult
-
- Animal: Monkey |
- Cat |
- Runtime |
- Corgi |
- Ian |
- Crab |
- Coffee |
- Nymph
-
- Construct: Armoured |
- Builder |
- Wraith |
- Shade
-
- Alien: Drone |
- Hunter |
- Queen |
- Sentinel |
- Larva
- "}
-
if (M.client)
- body += {"
- Other actions:
-
- Forcesay |
- Thunderdome 1 |
- Thunderdome 2 |
- Thunderdome Admin |
- Thunderdome Observer |
- "}
+ if(check_rights(R_ADMIN|R_FUN,0))
+ body += {"
+ Other actions:
+
+ Forcesay |
+ Thunderdome 1 |
+ Thunderdome 2 |
+ Thunderdome Admin |
+ Thunderdome Observer |
+ "}
body += {"
@@ -589,14 +595,16 @@ var/global/floorIsLava = 0
usr << browse(dat, "window=ban;size=400x400")
/datum/admins/proc/Game()
- if(!check_rights(0)) return
+ if(!check_rights(R_ADMIN|R_FUN)) return
- var/dat = {"
- Game Panel
\n
- Change Game Mode
- "}
- if(master_mode == "secret")
- dat += "(Force Secret Mode)
"
+ var/dat = ""
+ if(check_rights(R_ADMIN,0))
+ dat += {"
+ Game Panel
\n
+ Change Game Mode
+ "}
+ if(master_mode == "secret")
+ dat += "(Force Secret Mode)
"
dat += {"
@@ -604,10 +612,13 @@ var/global/floorIsLava = 0
Quick Create Object
Create Turf
Create Mob
-
Edit Airflow Settings
- Edit Plasma Settings
- Choose a default ZAS setting
"}
+ if(check_rights(R_ADMIN,0))
+ dat += {"
+
Edit Airflow Settings
+ Edit Plasma Settings
+ Choose a default ZAS setting
+ "}
usr << browse(dat, "window=admin2;size=210x280")
return
diff --git a/code/modules/admin/admin_ranks.dm b/code/modules/admin/admin_ranks.dm
index 9ba751a5..ab7ab6e4 100644
--- a/code/modules/admin/admin_ranks.dm
+++ b/code/modules/admin/admin_ranks.dm
@@ -42,6 +42,7 @@ var/list/admin_ranks = list() //list of all ranks with associated rights
if("spawn","create") rights |= R_SPAWN
if("mod") rights |= R_MOD
if("developer") rights |= R_DEV
+ if("dutyofficer") rights |= R_DUTYOFF
admin_ranks[rank] = rights
previous_rights = rights
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index 24de7b18..6f13fb68 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -1,5 +1,6 @@
+/*
//admin verb groups - They can overlap if you so wish. Only one of each verb will exist in the verbs list regardless
-var/list/admin_verbs_default = list(
+var/list/admin_verbs_default = list(
/client/proc/player_panel,
/client/proc/toggleadminhelpsound, /*toggles whether we hear a sound when adminhelps/PMs are used*/
/client/proc/deadmin_self, /*destroys our own admin datum so we can play as a regular player*/
@@ -101,6 +102,7 @@ var/list/admin_verbs_sounds = list(
var/list/admin_verbs_fun = list(
//Hey look it's in order of letters ^_^
/datum/admins/proc/access_news_network,
+ /datum/admins/proc/Game,
/datum/admins/proc/toggle_aliens,
/datum/admins/proc/toggle_space_ninja,
/client/proc/admin_ghost,
@@ -138,6 +140,7 @@ var/list/admin_verbs_fun = list(
/client/proc/send_space_ninja,
/client/proc/toggle_view_range
)
+
var/list/admin_verbs_dev = list(
/client/proc/dsay,
/client/proc/togglebuildmodeself,
@@ -388,6 +391,7 @@ var/list/admin_verbs_mod = list(
/client/proc/toggle_power_update_profiling,
/client/proc/atmos_toggle_debug
)
+*/
/client/proc/hide_most_verbs()//Allows you to keep some functionality while hiding some verbs
set name = "Adminverbs - Hide Most"
@@ -445,6 +449,9 @@ var/list/admin_verbs_mod = list(
else if(istype(mob,/mob/new_player))
src << "Error: Aghost: Can't admin-ghost whilst in the lobby. Join or Observe first."
else
+ //first lets see if this works
+ if(!holder.original_mob)
+ holder.original_mob = mob
//ghostize
var/mob/body = mob
body.ghostize(1)
diff --git a/code/modules/admin/holder2.dm b/code/modules/admin/holder2.dm
index 8bb9e0a7..90d683fd 100644
--- a/code/modules/admin/holder2.dm
+++ b/code/modules/admin/holder2.dm
@@ -8,6 +8,8 @@ var/list/admin_datums = list()
var/datum/marked_datum
+ var/mob/living/original_mob = null //used to return to body from Duty Officers
+
var/admincaster_screen = 0 //See newscaster.dm under machinery for a full description
var/datum/feed_message/admincaster_feed_message = new /datum/feed_message //These two will act as holders.
var/datum/feed_channel/admincaster_feed_channel = new /datum/feed_channel
diff --git a/code/modules/admin/permissionverbs/permsission lists.dm b/code/modules/admin/permissionverbs/permsission lists.dm
new file mode 100644
index 00000000..653994ea
--- /dev/null
+++ b/code/modules/admin/permissionverbs/permsission lists.dm
@@ -0,0 +1,417 @@
+//admin verb groups - They can overlap if you so wish. Only one of each verb will exist in the verbs list regardless
+var/list/admin_verbs_default = list(
+ /client/proc/deadmin_self, /*destroys our own admin datum so we can play as a regular player*/
+ /client/proc/hide_verbs, /*hides all our adminverbs*/
+ )
+
+var/list/admin_verbs_admin = list(
+// /datum/admins/proc/show_traitor_panel, /*interface which shows a mob's mind*/ -Removed due to rare practical use. Moved to debug verbs ~Errorage
+// /client/proc/sendmob, /*sends a mob somewhere*/ -Removed due to it needing two sorting procs to work, which were executed every time an admin right-clicked. ~Errorage
+// /client/proc/toggle_hear_deadcast, /*toggles whether we hear deadchat*/
+// /client/proc/deadchat /*toggles deadchat on/off*/
+ /datum/admins/proc/announce, /*priority announce something to all clients.*/
+ /datum/admins/proc/access_news_network, /*allows access of newscasters*/
+ /datum/admins/proc/PlayerNotes,
+ /datum/admins/proc/show_player_info,
+ /datum/admins/proc/show_player_panel, /*shows an interface for individual players, with various links (links require additional flags*/
+ /datum/admins/proc/show_skills,
+ /datum/admins/proc/toggleenter, /*toggles whether people can join the current game*/
+ /datum/admins/proc/toggleguests, /*toggles whether guests can join the current game*/
+ /datum/admins/proc/toggleooc, /*toggles ooc on/off for everyone*/
+ /datum/admins/proc/toggledevooc,
+ /datum/admins/proc/togglemodooc,
+ /datum/admins/proc/togglelooc,
+ /datum/admins/proc/togglemodlooc,
+ /datum/admins/proc/toggledevlooc,
+ /datum/admins/proc/toggleoocdead, /*toggles ooc on/off for everyone who is dead*/
+ /datum/admins/proc/toggledsay, /*toggles dsay on/off for everyone*/
+ /datum/admins/proc/view_atk_log, /*shows the server combat-log, doesn't do anything presently*/
+ /datum/admins/proc/view_txt_log, /*shows the server log (diary) for today*/
+ /client/proc/admin_call_shuttle, /*allows us to call the emergency shuttle*/
+ /client/proc/admin_cancel_shuttle, /*allows us to cancel the emergency shuttle, sending it back to centcomm*/
+ /client/proc/admin_ghost, /*allows us to ghost/reenter body at will*/
+ /client/proc/admin_memo, /*admin memo system. show/delete/write. +SERVER needed to delete admin memos of others*/
+ /client/proc/alertlevels,
+ /client/proc/allow_character_respawn, /* Allows a ghost to respawn */
+ /client/proc/check_ai_laws, /*shows AI and borg laws*/
+ /client/proc/check_antagonists,
+ /client/proc/check_customitem_activity,
+ /client/proc/check_words, /*displays cult-words*/
+ /client/proc/cleartox,
+ /client/proc/cmd_admin_check_contents, /*displays the contents of an instance*/
+ /client/proc/cmd_admin_create_centcom_report,
+ /client/proc/cmd_admin_change_custom_event,
+ /client/proc/cmd_admin_delete, /*delete an instance/object/mob/etc*/
+ /client/proc/cmd_admin_direct_narrate, /*send text directly to a player with no padding. Useful for narratives and fluff-text*/
+ /client/proc/cmd_admin_pm_context, /*right-click adminPM interface*/
+ /client/proc/cmd_admin_pm_panel, /*admin-pm list*/
+ /client/proc/cmd_admin_subtle_message, /*send an message to somebody as a 'voice in their head'*/
+ /client/proc/cmd_admin_say, /*admin-only ooc chat*/
+ /client/proc/cmd_admin_rejuvenate,
+ /client/proc/cmd_admin_unwind,
+ /client/proc/cmd_admin_wind,
+ /client/proc/cmd_admin_world_narrate, /*sends text to all players with no padding*/
+ /client/proc/cmd_duty_say,
+ /client/proc/cmd_mentor_check_new_players,
+ /client/proc/cmd_mod_say,
+ /client/proc/colorooc, /*allows us to set a custom colour for everythign we say in ooc*/
+ /client/proc/debug_variables, /*allows us to -see- the variables of any instance in the game. +VAREDIT needed to modify*/
+ /client/proc/dsay, /*talk in deadchat using our ckey/fakekey*/
+ /client/proc/free_slot, /*frees slot for chosen job*/
+ /client/proc/game_panel, /*game panel, allows to change game-mode etc*/
+ /client/proc/Getmob, /*teleports a mob to our location*/
+ /client/proc/Getkey, /*teleports a mob with a certain ckey to our location*/
+ /client/proc/getserverlog, /*allows us to fetch server logs (diary) for other days*/
+ /client/proc/giveruntimelog, /*allows us to give access to runtime logs to somebody*/
+ /client/proc/global_man_up,
+ /client/proc/hide_most_verbs, /*hides all our hideable adminverbs*/
+ /client/proc/investigate_show, /*various admintools for investigation. Such as a singulo grief-log*/
+ /client/proc/invisimin, /*allows our mob to go invisible/visible*/
+ /client/proc/Jump,
+ /client/proc/jumptocoord, /*we ghost and jump to a coordinate*/
+ /client/proc/jumptokey, /*allows us to jump to the location of a mob with a certain ckey*/
+ /client/proc/jumptomob, /*allows us to jump to a specific mob*/
+ /client/proc/jumptoturf, /*allows us to jump to a specific turf*/
+ /client/proc/man_up,
+ /client/proc/player_panel, /*shows an interface for all players, with links to various panels (old style)*/
+ /client/proc/player_panel_new, /*shows an interface for all players, with links to various panels*/
+ /client/proc/response_team, // Response Teams admin verb
+ /client/proc/toggleadminhelpsound, /*toggles whether we hear a sound when adminhelps/PMs are used*/
+ /client/proc/toggle_antagHUD_use,
+ /client/proc/toggle_antagHUD_restrictions,
+ /client/proc/toggleattacklogs,
+ /client/proc/toggledebuglogs,
+ /client/proc/toggleghostwriters,
+ /client/proc/toggle_hear_radio, /*toggles whether we hear the radio*/
+ /client/proc/toggledrones,
+ /client/proc/toggleprayers,
+ /client/proc/toggle_view_range, /*changes how far we can see*/
+ /client/proc/secrets,
+ /client/proc/set_ooc
+)
+
+var/list/admin_verbs_ban = list(
+ /client/proc/unban_panel,
+ /client/proc/jobbans,
+ /client/proc/warning_panel
+ )
+
+var/list/admin_verbs_sounds = list(
+ /client/proc/play_local_sound,
+ /client/proc/play_sound
+ )
+
+var/list/admin_verbs_fun = list(
+//Hey look it's in order of letters ^_^
+ /datum/admins/proc/access_news_network,
+ /datum/admins/proc/toggle_aliens,
+ /datum/admins/proc/toggle_space_ninja,
+ /client/proc/admin_ghost,
+ /client/proc/alertlevels,
+ /client/proc/check_ai_laws,
+ /client/proc/cinematic,
+ /client/proc/cmd_admin_add_freeform_ai_law,
+ /client/proc/cmd_admin_add_random_ai_law,
+ /client/proc/cmd_admin_change_custom_event,
+ /client/proc/cmd_admin_create_centcom_report,
+ /client/proc/cmd_admin_delete,
+ /client/proc/cmd_admin_direct_narrate,
+ /client/proc/cmd_admin_dress,
+ /client/proc/cmd_admin_gib_self,
+ /client/proc/cmd_admin_pm_context,
+ /client/proc/cmd_admin_pm_panel,
+ /client/proc/cmd_admin_subtle_message,
+ /client/proc/cmd_admin_world_narrate,
+ /client/proc/cmd_debug_tog_aliens,
+ /client/proc/cmd_mod_say,
+ /client/proc/debug_variables,
+ /client/proc/drop_bomb,
+ /client/proc/dsay,
+ /client/proc/editappear,
+ /client/proc/everyone_random,
+ /client/proc/game_panel,
+ /client/proc/Getmob,
+ /client/proc/Getkey,
+ /client/proc/hide_most_verbs,
+ /client/proc/Jump,
+ /client/proc/jumptokey,
+ /client/proc/jumptomob,
+ /client/proc/make_area_sound,
+ /client/proc/make_sound,
+ /client/proc/object_talk,
+ /client/proc/one_click_antag,
+ /client/proc/player_panel,
+ /client/proc/secrets,
+ /client/proc/send_space_ninja,
+ /client/proc/toggle_view_range
+ )
+
+var/list/admin_verbs_dev = list(
+ /datum/admins/proc/restart,
+ /client/proc/admin_ghost,
+ /client/proc/air_report,
+ /client/proc/enable_debug_verbs,
+ /client/proc/cmd_admin_delete,
+ /client/proc/cmd_admin_list_open_jobs,
+ /client/proc/cmd_debug_del_all,
+ /client/proc/cmd_debug_make_powernets,
+ /client/proc/cmd_debug_mob_lists,
+ /client/proc/cmd_dev_bst,
+ /client/proc/cmd_dev_say,
+ /client/proc/cmd_dev_reset_gravity,
+ /client/proc/cmd_dev_reset_floating,
+ /client/proc/Debug2,
+ /client/proc/debug_controller,
+ /client/proc/debug_variables,
+ /client/proc/dsay,
+ /client/proc/getruntimelog,
+ /client/proc/giveruntimelog,
+ /client/proc/hide_most_verbs,
+ /client/proc/kill_air,
+ /client/proc/kill_airgroup,
+ /client/proc/player_panel,
+ /client/proc/reload_admins,
+ /client/proc/restart_controller,
+ /client/proc/togglebuildmodeself,
+ /client/proc/toggledebuglogs,
+ /client/proc/togglescopeslogs,
+ /client/proc/ZASSettings
+)
+var/list/admin_verbs_spawn = list(
+ /datum/admins/proc/spawn_atom, /*allows us to spawn instances*/
+ /client/proc/respawn_character
+ )
+var/list/admin_verbs_server = list(
+ /datum/admins/proc/adrev,
+ /datum/admins/proc/adspawn,
+ /datum/admins/proc/adjump,
+ /datum/admins/proc/delay,
+ /datum/admins/proc/toggleaban,
+ /datum/admins/proc/toggleAI,
+ /datum/admins/proc/toggle_aliens,
+ /datum/admins/proc/toggle_space_ninja,
+ /datum/admins/proc/immreboot,
+ /datum/admins/proc/startnow,
+ /datum/admins/proc/restart,
+ /client/proc/check_customitem_activity,
+ /client/proc/cmd_admin_delete, /*delete an instance/object/mob/etc*/
+ /client/proc/cmd_debug_del_all,
+ /client/proc/everyone_random,
+ /client/proc/nanomapgen_DumpImage,
+ /client/proc/SDQL_query,
+ /client/proc/SDQL2_query,
+ /client/proc/Set_Holiday,
+ /client/proc/ToRban,
+ /client/proc/toggle_log_hrefs,
+ /client/proc/toggle_random_events
+ )
+
+var/list/admin_verbs_debug = list(
+ /datum/admins/proc/delay,
+ /datum/admins/proc/restart,
+ /client/proc/air_report,
+ /client/proc/callproc,
+ /client/proc/cmd_admin_delete,
+ /client/proc/cmd_admin_list_open_jobs,
+ /client/proc/cmd_debug_del_all,
+ /client/proc/cmd_debug_make_powernets,
+ /client/proc/cmd_debug_mob_lists,
+ /client/proc/cmd_debug_tog_aliens,
+ /client/proc/cmd_dev_reset_gravity,
+ /client/proc/cmd_dev_reset_floating,
+ /client/proc/Debug2,
+ /client/proc/debug_controller,
+ /client/proc/debug_variables,
+ /client/proc/enable_debug_verbs,
+ /client/proc/fillspace,
+ /client/proc/getruntimelog,
+ /client/proc/hide_activity,
+ /client/proc/kill_air,
+ /client/proc/kill_airgroup,
+ /client/proc/show_distribution_map,
+ /client/proc/toggledebuglogs,
+ /client/proc/reload_admins,
+ /client/proc/restart_controller,
+ /client/proc/remake_distribution_map,
+ /client/proc/ZASSettings,
+ )
+
+var/list/admin_verbs_possess = list(
+ /proc/possess,
+ /proc/release
+ )
+
+var/list/admin_verbs_permissions = list(
+ /client/proc/edit_admin_permissions
+ )
+
+var/list/admin_verbs_rejuv = list(
+ /client/proc/respawn_character
+ )
+
+var/list/admin_verbs_mod = list(
+ /datum/admins/proc/PlayerNotes,
+ /datum/admins/proc/show_player_info,
+ /datum/admins/proc/show_skills,
+ /datum/admins/proc/show_player_panel,
+ /client/proc/admin_ghost, /*allows us to ghost/reenter body at will*/
+ /client/proc/check_antagonists, /*shows all antags*/
+ /client/proc/check_ai_laws,
+ /client/proc/cmd_admin_check_contents,
+ /client/proc/cmd_admin_wind,
+ /client/proc/cmd_admin_unwind,
+ /client/proc/cmd_admin_pm_context, /*right-click adminPM interface*/
+ /client/proc/cmd_admin_pm_panel, /*admin-pm list*/
+ /client/proc/cmd_admin_subtle_message, /*send an message to somebody as a 'voice in their head'*/
+ /client/proc/cmd_mentor_check_new_players,
+ /client/proc/cmd_mod_say,
+ /client/proc/debug_variables, /*allows us to -see- the variables of any instance in the game.*/
+ /client/proc/dsay,
+ /client/proc/hide_most_verbs,
+ /client/proc/jobbans,
+ /client/proc/player_panel,
+ /client/proc/player_panel_new,
+ /client/proc/toggleadminhelpsound, /*toggles whether we hear a sound when adminhelps/PMs are used*/
+ /client/proc/toggleattacklogs,
+ /client/proc/toggledebuglogs,
+ /client/proc/toggleprayers
+)
+
+//verbs which can be hidden - needs work
+var/list/admin_verbs_hideable = list(
+ /datum/admins/proc/access_news_network,
+ /datum/admins/proc/adjump,
+ /datum/admins/proc/adrev,
+ /datum/admins/proc/adspawn,
+ /datum/admins/proc/announce,
+ /datum/admins/proc/delay,
+ /datum/admins/proc/immreboot,
+ /datum/admins/proc/restart,
+ /datum/admins/proc/show_traitor_panel,
+ /datum/admins/proc/startnow,
+ /datum/admins/proc/toggleaban,
+ /datum/admins/proc/toggleAI,
+ /datum/admins/proc/toggle_aliens,
+ /datum/admins/proc/toggleenter,
+ /datum/admins/proc/toggleguests,
+ /datum/admins/proc/toggle_space_ninja,
+ /datum/admins/proc/view_txt_log,
+ /datum/admins/proc/view_atk_log,
+ /client/proc/admin_call_shuttle,
+ /client/proc/admin_cancel_shuttle,
+ /client/proc/admin_ghost,
+ /client/proc/air_report,
+ /client/proc/callproc,
+ /client/proc/check_words,
+ /client/proc/cinematic,
+ /client/proc/cmd_admin_add_freeform_ai_law,
+ /client/proc/cmd_admin_add_random_ai_law,
+ /client/proc/cmd_admin_check_contents,
+ /client/proc/cmd_admin_create_centcom_report,
+ /client/proc/cmd_admin_direct_narrate,
+ /client/proc/cmd_admin_dress,
+ /client/proc/cmd_admin_gib_self,
+ /client/proc/cmd_admin_subtle_message,
+ /client/proc/cmd_admin_world_narrate,
+ /client/proc/cmd_debug_make_powernets,
+ /client/proc/cmd_debug_mob_lists,
+ /client/proc/cmd_admin_list_open_jobs,
+ /client/proc/cmd_debug_del_all,
+ /client/proc/cmd_debug_tog_aliens,
+ /client/proc/colorooc,
+// /client/proc/deadchat,
+ /client/proc/deadmin_self,
+ /client/proc/Debug2,
+ /client/proc/debug_controller,
+ /client/proc/drop_bomb,
+ /client/proc/enable_debug_verbs,
+ /client/proc/everyone_random,
+ /client/proc/kill_air,
+ /client/proc/kill_airgroup,
+ /client/proc/make_area_sound,
+ /client/proc/make_sound,
+ /client/proc/object_talk,
+ /client/proc/play_local_sound,
+ /client/proc/play_sound,
+ /client/proc/reload_admins,
+ /client/proc/restart_controller,
+ /client/proc/send_space_ninja,
+ /client/proc/Set_Holiday,
+ /client/proc/set_ooc,
+ /client/proc/startSinglo,
+ /client/proc/toggle_hear_radio,
+ /client/proc/toggle_log_hrefs,
+ /client/proc/toggleprayers,
+ /client/proc/toggle_random_events,
+ /client/proc/toggle_view_range,
+ /client/proc/ToRban,
+ /proc/possess,
+ /proc/release
+ )
+
+/client/proc/remove_admin_verbs()
+ verbs.Remove(
+ admin_verbs_default,
+ /client/proc/togglebuildmodeself,
+ /client/proc/stealth,
+ admin_verbs_admin,
+ admin_verbs_ban,
+ admin_verbs_fun,
+ admin_verbs_server,
+ admin_verbs_debug,
+ admin_verbs_possess,
+ admin_verbs_permissions,
+ admin_verbs_rejuv,
+ admin_verbs_sounds,
+ admin_verbs_spawn,
+ admin_verbs_dev,
+ admin_verbs_duty,
+ /*Debug verbs added by "show debug verbs"*/
+ /client/proc/Cell,
+ /client/proc/do_not_use_these,
+ /client/proc/camera_view,
+ /client/proc/sec_camera_report,
+ /client/proc/intercom_view,
+ /client/proc/air_status,
+ /client/proc/atmosscan,
+ /client/proc/powerdebug,
+ /client/proc/count_objects_on_z_level,
+ /client/proc/count_objects_all,
+ /client/proc/cmd_assume_direct_control,
+ /client/proc/jump_to_dead_group,
+ /client/proc/startSinglo,
+ /client/proc/ticklag,
+ /client/proc/cmd_admin_grantfullaccess,
+ /client/proc/kaboom,
+ /client/proc/splash,
+ /client/proc/cmd_admin_areatest,
+ /client/proc/view_power_update_stats_area,
+ /client/proc/view_power_update_stats_machines,
+ /client/proc/toggle_power_update_profiling,
+ /client/proc/atmos_toggle_debug
+ )
+
+var/list/admin_verbs_duty = list(
+ /client/proc/spawn_duty_officer,
+ /client/proc/cmd_duty_say,
+ /client/verb/returntobody
+)
+
+/client/proc/add_admin_verbs()
+ if(holder)
+ verbs += admin_verbs_default
+ if(holder.rights & R_BUILDMODE) verbs += /client/proc/togglebuildmodeself
+ if(holder.rights & R_ADMIN) verbs += admin_verbs_admin
+ if(holder.rights & R_BAN) verbs += admin_verbs_ban
+ if(holder.rights & R_FUN) verbs += admin_verbs_fun
+ if(holder.rights & R_SERVER) verbs += admin_verbs_server
+ if(holder.rights & R_DEBUG) verbs += admin_verbs_debug
+ if(holder.rights & R_POSSESS) verbs += admin_verbs_possess
+ if(holder.rights & R_PERMISSIONS) verbs += admin_verbs_permissions
+ if(holder.rights & R_STEALTH) verbs += /client/proc/stealth
+ if(holder.rights & R_REJUVINATE) verbs += admin_verbs_rejuv
+ if(holder.rights & R_SOUNDS) verbs += admin_verbs_sounds
+ if(holder.rights & R_SPAWN) verbs += admin_verbs_spawn
+ if(holder.rights & R_MOD) verbs += admin_verbs_mod
+ if(holder.rights & R_DEV) verbs += admin_verbs_dev
+ if(holder.rights & R_DUTYOFF) verbs += admin_verbs_duty //hehe duty
diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm
index f06e70c9..7dad83f5 100644
--- a/code/modules/admin/player_panel.dm
+++ b/code/modules/admin/player_panel.dm
@@ -333,6 +333,9 @@
for(var/mob/M in mobs)
if(!M.ckey) continue
+ if(M.client && M.client.holder && M.client.holder.fakekey)
+ if(!usr.client.holder.rights & (R_ADMIN|R_MOD))
+ continue
dat += "| [M.name] | "
if(isAI(M))
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index 3d2df43c..c88e92a6 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -1554,7 +1554,6 @@
src.owner << "Message reply to transmitted successfully."
log_admin("[key_name(src.owner)] replied to a fax message from [key_name(H)]: [input]")
message_admins("[key_name_admin(src.owner)] replied to a fax message from [key_name_admin(H)] view message", 1)
- message_mods("[key_name_admin(src.owner)] replied to a fax message from [key_name_admin(H)]")
else if(href_list["jumpto"])
diff --git a/code/modules/admin/verbs/adminsay.dm b/code/modules/admin/verbs/adminsay.dm
index e82effe2..1355e34a 100644
--- a/code/modules/admin/verbs/adminsay.dm
+++ b/code/modules/admin/verbs/adminsay.dm
@@ -49,7 +49,25 @@
log_admin("[key_name(src)] : [msg]")
if(check_rights(R_DEV,0))
- msg = "DEV: [key_name(usr, 1)]: [msg]"
+ msg = "DEV: [key_name(usr, 0, 1, 0)]: [msg]"
for(var/client/C in admins)
if(R_DEV & C.holder.rights)
C << msg
+
+/client/proc/cmd_duty_say(msg as text)
+ set category = "Admin"
+ set name = "Dosay"
+ set hidden = 1
+
+ if(!check_rights(R_DUTYOFF)) return
+
+ msg = copytext(sanitize(msg), 1, MAX_MESSAGE_LEN)
+ if(!msg) return
+
+ log_admin("[key_name(src)] : [msg]")
+
+ if(check_rights(R_DUTYOFF,0))
+ msg = "DOfficer: [key_name(usr, 0, 1, 0)]: [msg]"
+ for(var/client/C in admins)
+ if(C.holder.rights & (R_ADMIN|R_DUTYOFF))
+ C << msg
\ No newline at end of file
diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm
index 90c5cca9..090625b5 100644
--- a/code/modules/admin/verbs/pray.dm
+++ b/code/modules/admin/verbs/pray.dm
@@ -20,7 +20,7 @@
msg = "\blue \icon[cross] PRAY: [key_name(src, 1)] (?) (PP) (VV) (SM) (JMP) (CA) (SC): [msg]"
for(var/client/C in admins)
- if(((R_ADMIN & C.holder.rights) || (R_MOD & C.holder.rights)) || (R_FUN & C.holder.rights) && (C.prefs.toggles & CHAT_PRAYER))
+ if(C.holder.rights & (R_ADMIN|R_MOD|R_FUN) && (C.prefs.toggles & CHAT_PRAYER))
C << msg
usr << "Your prayers have been received by the gods."
@@ -35,12 +35,12 @@
else
msg = "\blue CENTCOMM[iamessage ? " IA" : ""]:[key_name(Sender, 1)] (PP) (VV) (SM) (JMP) (CA) (BSA) (RPLY): [msg]"
for(var/client/C in admins)
- if((R_ADMIN & C.holder.rights) || (R_MOD & C.holder.rights) || (R_FUN & C.holder.rights))
+ if(C.holder.rights & (R_ADMIN|R_DUTYOFF|R_FUN))
C << msg
/proc/Syndicate_announce(var/text , var/mob/Sender)
var/msg = copytext(sanitize(text), 1, MAX_MESSAGE_LEN)
msg = "\blue SYNDICATE:[key_name(Sender, 1)] (PP) (VV) (SM) (JMP) (CA) (BSA) (RPLY): [msg]"
for(var/client/C in admins)
- if((R_ADMIN & C.holder.rights) || (R_MOD & C.holder.rights) || (R_FUN & C.holder.rights))
+ if(C.holder.rights & (R_ADMIN|R_MOD|R_FUN))
C << msg
\ No newline at end of file
diff --git a/code/modules/aurora/bluespacetech.dm b/code/modules/aurora/bluespacetech.dm
index c4889e6d..de0a5e4d 100644
--- a/code/modules/aurora/bluespacetech.dm
+++ b/code/modules/aurora/bluespacetech.dm
@@ -27,6 +27,10 @@
src << "\red The game hasn't started yet!"
return
+ if(istype(mob, /mob/living))
+ if(!holder.original_mob)
+ holder.original_mob = mob
+
//I couldn't get the normal way to work so this works.
//This whole section looks like a hack, I don't like it.
var/T = get_turf(usr)
@@ -154,13 +158,15 @@
spawn(5)
del(s)
if(key)
- var/mob/dead/observer/ghost = new(src) //Transfer safety to observer spawning proc.
- ghost.key = key
- ghost.mind.name = "[ghost.key] BSTech"
- ghost.name = "[ghost.key] BSTech"
- ghost.real_name = "[ghost.key] BSTech"
- ghost.voice_name = "[ghost.key] BSTech"
-
+ if(client.holder && client.holder.original_mob)
+ client.holder.original_mob.key = key
+ else
+ var/mob/dead/observer/ghost = new(src) //Transfer safety to observer spawning proc.
+ ghost.key = key
+ ghost.mind.name = "[ghost.key] BSTech"
+ ghost.name = "[ghost.key] BSTech"
+ ghost.real_name = "[ghost.key] BSTech"
+ ghost.voice_name = "[ghost.key] BSTech"
del(src)
return
@@ -294,6 +300,17 @@
src.sleeping = 0
+ verb/bstquit()
+ set name = "Teleport out"
+ set desc = "Activate bluespace to leave (and return to your original mob(if you have one))"
+ set category = "BST"
+
+ var/client/C = src.client
+ if(C.holder && C.holder.original_mob)
+ C.holder.original_mob.key = key
+ C.holder.original_mob = null
+ suicide()
+
//Equipment. All should have canremove set to 0
//All items with a /bst need the attack_hand() proc overrided to stop people getting overpowered items.
diff --git a/code/modules/aurora/duty officer.dm b/code/modules/aurora/duty officer.dm
new file mode 100644
index 00000000..f0ddb525
--- /dev/null
+++ b/code/modules/aurora/duty officer.dm
@@ -0,0 +1,172 @@
+/client/proc/spawn_duty_officer()
+ set category = "Special Verbs"
+ set name = "Spawn Duty Officer"
+ set desc = "Spawns a Duty Officer to do Duty"
+
+ if(!check_rights(R_DUTYOFF)) return
+
+ if(!holder)
+ return //how did they get here?
+
+ if(!ticker)
+ alert("Wait until the game starts")
+ return
+
+ if(ticker.current_state < GAME_STATE_PLAYING)
+ src << "\red The game hasn't started yet!"
+ return
+
+ if(mob.mind.special_role == "Duty Officer")
+ src << "\red You are already a Duty Officer"
+ return
+
+ if(istype(mob, /mob/living))
+ holder.original_mob = mob
+
+ for (var/obj/effect/landmark/L in landmarks_list)
+ if(L.name == "DutyOfficer")
+ var/new_name = input(usr, "Pick a name","Name") as null|text
+ var/mob/living/carbon/human/M = new(null)
+
+ var/new_facial = input("Please select facial hair color.", "Character Generation") as color
+ if(new_facial)
+ M.r_facial = hex2num(copytext(new_facial, 2, 4))
+ M.g_facial = hex2num(copytext(new_facial, 4, 6))
+ M.b_facial = hex2num(copytext(new_facial, 6, 8))
+
+ var/new_hair = input("Please select hair color.", "Character Generation") as color
+ if(new_facial)
+ M.r_hair = hex2num(copytext(new_hair, 2, 4))
+ M.g_hair = hex2num(copytext(new_hair, 4, 6))
+ M.b_hair = hex2num(copytext(new_hair, 6, 8))
+
+ var/new_eyes = input("Please select eye color.", "Character Generation") as color
+ if(new_eyes)
+ M.r_eyes = hex2num(copytext(new_eyes, 2, 4))
+ M.g_eyes = hex2num(copytext(new_eyes, 4, 6))
+ M.b_eyes = hex2num(copytext(new_eyes, 6, 8))
+
+ var/new_tone = input("Please select skin tone level: 1-220 (1=albino, 35=caucasian, 150=black, 220='very' black)", "Character Generation") as text
+
+ if (!new_tone)
+ new_tone = 35
+ M.s_tone = max(min(round(text2num(new_tone)), 220), 1)
+ M.s_tone = -M.s_tone + 35
+
+ // hair
+ var/list/all_hairs = typesof(/datum/sprite_accessory/hair) - /datum/sprite_accessory/hair
+ var/list/hairs = list()
+
+ // loop through potential hairs
+ for(var/x in all_hairs)
+ var/datum/sprite_accessory/hair/H = new x
+ hairs.Add(H.name)
+ del(H)
+ //hair
+ var/new_hstyle = input(usr, "Select a hair style", "Grooming") as null|anything in hair_styles_list
+ if(new_hstyle)
+ M.h_style = new_hstyle
+
+ // facial hair
+ var/new_fstyle = input(usr, "Select a facial hair style", "Grooming") as null|anything in facial_hair_styles_list
+ if(new_fstyle)
+ M.f_style = new_fstyle
+
+ var/new_gender = alert(usr, "Please select gender.", "Character Generation", "Male", "Female")
+ if (new_gender)
+ if(new_gender == "Male")
+ M.gender = MALE
+ else
+ M.gender = FEMALE
+ //M.rebuild_appearance()
+ M.update_hair()
+ M.update_body()
+ M.check_dna(M)
+
+ M.real_name = new_name
+ M.name = new_name
+ M.age = input("Enter your characters age:","Num") as null|num
+ if(!M.age)
+ M.age = rand(35,50)
+ if(M.age < 33 || M.age > 60)
+ src << "\red The age you selected was not in a valid range for a Duty Officer"
+ if(M.age < 33)
+ M.age = 33
+ else
+ M.age = 60
+ src << "\red Your age has been set to [M.age]"
+
+ M.dna.ready_dna(M)
+
+ //Creates mind stuff.
+ M.mind = new
+ M.mind.current = M
+ M.mind.original = M
+ 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]"
+
+ 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)
+ M.equip_if_possible(new /obj/item/clothing/gloves/white(M), slot_gloves)
+ M.equip_if_possible(new /obj/item/device/radio/headset/ert(M), slot_l_ear)
+ M.equip_if_possible(new /obj/item/clothing/glasses/sunglasses/sechud(M), slot_glasses)
+ M.equip_if_possible(new /obj/item/clothing/head/beret/centcom/officer(M), slot_head)
+ M.equip_if_possible(new /obj/item/weapon/melee/telebaton(M), slot_l_store)
+ M.equip_if_possible(new /obj/item/device/taperecorder(M), slot_r_store)
+
+ var/obj/item/device/pda/central/pda = new(M)
+ pda.owner = M.real_name
+ pda.ownjob = "Central Command Duty Officer"
+ pda.name = "PDA-[M.real_name] ([pda.ownjob])"
+
+ M.equip_if_possible(pda, slot_belt)
+
+ var/obj/item/weapon/card/id/W = new(M)
+ W.name = "[M.real_name]'s ID Card"
+ W.icon_state = "centcom"
+ W.item_state = "id_inv"
+ W.access = get_all_accesses() + get_centcom_access("Duty Officer")
+ W.assignment = "Central Command Duty Officer"
+ W.registered_name = M.real_name
+ M.equip_if_possible(W, slot_wear_id)
+
+ verbs += /client/verb/returntobody
+ break
+
+/client/verb/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
+ return
+
+ if(!holder) return
+
+ var/mob/M = mob
+ var/area/A = get_area(M)
+ if(!is_type_in_list(A,centcom_areas))
+ src << "\red You need to be back at central to do this"
+ return
+
+ if(holder.original_mob)
+ if(holder.original_mob == M)
+ verbs -= /client/verb/returntobody
+ return
+ holder.original_mob.key = key
+ 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
+ del(M)
\ 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 5f100ac9..eab7dc34 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -243,6 +243,8 @@ 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)
+ client.holder.original_mob = null
mind.current.key = key
return 1
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 5705afeb..1304c790 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -710,24 +710,25 @@ note dizziness decrements automatically in the mob's Life() proc.
if(statpanel("Status")) //not looking at that panel
if(client && client.holder)
- stat(null,"Location:\t([x], [y], [z])")
- stat(null,"CPU:\t[world.cpu]")
- stat(null,"Instances:\t[world.contents.len]")
+ if(client.holder.rights & (R_ADMIN|R_MOD|R_DEV|R_FUN))
+ stat(null,"Location:\t([x], [y], [z])")
+ stat(null,"CPU:\t[world.cpu]")
+ stat(null,"Instances:\t[world.contents.len]")
- if(master_controller)
- stat(null,"MasterController-[last_tick_duration] ([master_controller.processing?"On":"Off"]-[controller_iteration])")
- stat(null,"Air-[master_controller.air_cost]\tSun-[master_controller.sun_cost]")
- stat(null,"Mob-[master_controller.mobs_cost]\t#[mob_list.len]")
- stat(null,"Dis-[master_controller.diseases_cost]\t#[active_diseases.len]")
- stat(null,"Mch-[master_controller.machines_cost]\t#[machines.len]")
- stat(null,"Obj-[master_controller.objects_cost]\t#[processing_objects.len]")
- stat(null,"Net-[master_controller.networks_cost]\tPnet-[master_controller.powernets_cost]")
- stat(null,"NanoUI-[master_controller.nano_cost]\t#[nanomanager.processing_uis.len]")
- stat(null,"Tick-[master_controller.ticker_cost]\tALL-[master_controller.total_cost]")
- else
- stat(null,"MasterController-ERROR")
- if(delta_level:active)
- stat(null,"Delta Countdown-[delta_level.timeleft()]")
+ if(master_controller)
+ stat(null,"MasterController-[last_tick_duration] ([master_controller.processing?"On":"Off"]-[controller_iteration])")
+ stat(null,"Air-[master_controller.air_cost]\tSun-[master_controller.sun_cost]")
+ stat(null,"Mob-[master_controller.mobs_cost]\t#[mob_list.len]")
+ stat(null,"Dis-[master_controller.diseases_cost]\t#[active_diseases.len]")
+ stat(null,"Mch-[master_controller.machines_cost]\t#[machines.len]")
+ stat(null,"Obj-[master_controller.objects_cost]\t#[processing_objects.len]")
+ stat(null,"Net-[master_controller.networks_cost]\tPnet-[master_controller.powernets_cost]")
+ stat(null,"NanoUI-[master_controller.nano_cost]\t#[nanomanager.processing_uis.len]")
+ stat(null,"Tick-[master_controller.ticker_cost]\tALL-[master_controller.total_cost]")
+ else
+ stat(null,"MasterController-ERROR")
+ if(delta_level:active)
+ stat(null,"Delta Countdown-[delta_level.timeleft()]")
if(!ooc_allowed)
stat(null,"OOC is globaly muted")
if(!looc_allowed)
@@ -739,7 +740,7 @@ note dizziness decrements automatically in the mob's Life() proc.
var/total = 0
var/staff = 0
for(var/client/C in clients)
- if(C.holder && (C.holder.rights & R_ADMIN || C.holder.rights & R_MOD))
+ if(C.holder && (C.holder.rights & (R_ADMIN|R_MOD)))
staff++
if(istype(C.mob, /mob/living))
players++
@@ -748,7 +749,7 @@ note dizziness decrements automatically in the mob's Life() proc.
if(istype(C.mob, /mob/new_player))
lobby++
total++
- stat(null, "Players: [total]\tModeration Staff: [staff]")
+ stat(null, "Players: [total]\t Moderation Staff: [staff]")
stat(null, "Living: [players]\tGhosts: [ghosts]\tLobby: [lobby]")
if(client)
stat(null, "Round Time: [round(world.time / 36000)]:[(world.time / 600 % 60) < 10 ? add_zero(world.time / 600 % 60, 1) : world.time / 600 % 60]")
diff --git a/code/setup.dm b/code/setup.dm
index a0d53434..9f687a5b 100644
--- a/code/setup.dm
+++ b/code/setup.dm
@@ -1,5 +1,4 @@
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31
-
#define DEBUG
#define PI 3.1415
@@ -629,8 +628,8 @@ var/list/liftable_structures = list(\
#define R_SPAWN 4096
#define R_MOD 8192
#define R_DEV 16384
-
-#define R_MAXPERMISSION 16384 //This holds the maximum value for a permission. It is used in iteration, so keep it updated.
+#define R_DUTYOFF 32768
+#define R_MAXPERMISSION 32768 //This holds the maximum value for a permission. It is used in iteration, so keep it updated.
#define R_HOST 65535
@@ -654,6 +653,13 @@ var/list/liftable_structures = list(\
#define TOGGLES_DEFAULT (SOUND_ADMINHELP|SOUND_MIDI|SOUND_AMBIENCE|SOUND_LOBBY|CHAT_OOC|CHAT_DEAD|CHAT_GHOSTEARS|CHAT_GHOSTSIGHT|CHAT_PRAYER|CHAT_RADIO|CHAT_ATTACKLOGS|CHAT_LOOC)
+//Status Menu toggles
+#define STAT_MENU_MC = 1
+#define STAT_MENU_PC = 2
+
+
+#define STAT_MENU_DEFAULT = (STAT_MENU_MC|STAT_MENU_PC)
+
#define BE_TRAITOR 1
#define BE_OPERATIVE 2
#define BE_CHANGELING 4
diff --git a/code/stylesheet.dm b/code/stylesheet.dm
index 2c3b1fb0..68719f5a 100644
--- a/code/stylesheet.dm
+++ b/code/stylesheet.dm
@@ -20,7 +20,7 @@ em {font-style: normal; font-weight: bold;}
.adminobserver {color: #996600; font-weight: bold;}
.admin {color: #386aff; font-weight: bold;}
.adminsay {color: #9611D4; font-weight: bold;}
-
+.dutysay {color: #C19A3B;}
.name { font-weight: bold;}
.say {}
@@ -61,6 +61,7 @@ h1.alert, h2.alert {color: #000000;}
.mod {color: #735638; font-weight: bold;}
.modooc {color: #184880; font-weight: bold;}
.adminmod {color: #402A14; font-weight: bold;}
+.devsay {color: #02280D;}
.tajaran {color: #803B56;}
.tajaran_signlang {color: #941C1C;}
.skrell {color: #00CED1;}