diff --git a/code/controllers/voting.dm b/code/controllers/voting.dm
index f2596cd5f20..2cf82f11233 100644
--- a/code/controllers/voting.dm
+++ b/code/controllers/voting.dm
@@ -167,8 +167,11 @@ datum/controller/vote
proc/interface(var/client/C)
if(!C) return
var/admin = 0
+ var/trialmin = 0
if(C.holder)
admin = 1
+ if (C.holder.level >= 3)
+ trialmin = 1
voting |= C
. = "
Voting Panel"
@@ -186,24 +189,24 @@ datum/controller/vote
else
. += "Start a vote:
"
. += "Close"
diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm
index a36117bbd0e..fba1e04b19c 100644
--- a/code/datums/datumvars.dm
+++ b/code/datums/datumvars.dm
@@ -8,8 +8,8 @@ client
//set src in world
- if(!usr.client || !usr.client.holder || !(usr.client.holder.level >= 2) ) //admin candidate and up.
- usr << "\red You need to be a higher level administrator to access this."
+ if(!usr.client || !usr.client.holder)
+ usr << "\red You need to be an administrator to access this."
return
@@ -408,6 +408,7 @@ client
else if (href_list["rename"])
var/mob/M = locate(href_list["rename"])
if(!istype(M)) return
+ if(!admin_rank_check(src.holder.level, 3)) return
var/new_name = copytext(sanitize(input(usr,"What would you like to name this mob?","Input a name",M.real_name) as text|null),1,MAX_NAME_LEN)
if( !new_name || !M ) return
@@ -473,6 +474,7 @@ client
return
if(!src.holder)
return
+ if(!admin_rank_check(src.holder.level, 3)) return
src.give_spell(MOB)
href_list["datumrefresh"] = href_list["give_spell"]
else if (href_list["ninja"])
@@ -485,6 +487,7 @@ client
return
if(!src.holder)
return
+ if(!admin_rank_check(src.holder.level, 3)) return
src.cmd_admin_ninjafy(MOB)
href_list["datumrefresh"] = href_list["ninja"]
else if (href_list["godmode"])
@@ -497,6 +500,7 @@ client
return
if(!src.holder)
return
+ if(!admin_rank_check(src.holder.level, 3)) return
src.cmd_admin_godmode(MOB)
href_list["datumrefresh"] = href_list["godmode"]
else if (href_list["gib"])
@@ -509,6 +513,7 @@ client
return
if(!src.holder)
return
+ if(!admin_rank_check(src.holder.level, 3)) return
src.cmd_admin_gib(MOB)
else if (href_list["build_mode"])
@@ -521,6 +526,7 @@ client
return
if(!src.holder)
return
+ if(!admin_rank_check(src.holder.level, 3)) return
togglebuildmode(MOB)
href_list["datumrefresh"] = href_list["build_mode"]
@@ -536,6 +542,7 @@ client
return
if(usr.client)
+ if(!admin_rank_check(src.holder.level, 3)) return
usr.client.cmd_admin_drop_everything(MOB)
else if (href_list["direct_control"])
@@ -550,6 +557,7 @@ client
return
if(usr.client)
+ if(!admin_rank_check(src.holder.level, 3)) return
usr.client.cmd_assume_direct_control(MOB)
else if (href_list["make_skeleton"])
@@ -564,6 +572,7 @@ client
return
if(ishuman(MOB))
+ if(!admin_rank_check(src.holder.level, 3)) return
var/mob/living/carbon/human/HUMANMOB = MOB
HUMANMOB.makeSkeleton()
@@ -571,6 +580,7 @@ client
if(!href_list["delall"])
return
var/atom/A = locate(href_list["delall"])
+ if(!admin_rank_check(src.holder.level, 3)) return
if(!A)
return
if(!isobj(A))
@@ -617,6 +627,7 @@ client
return
if(!isobj(A) && !ismob(A) && !isturf(A))
return
+ if(!admin_rank_check(src.holder.level, 3)) return
src.cmd_admin_explosion(A)
href_list["datumrefresh"] = href_list["explode"]
else if (href_list["emp"])
@@ -627,6 +638,7 @@ client
return
if(!isobj(A) && !ismob(A) && !isturf(A))
return
+ if(!admin_rank_check(src.holder.level, 3)) return
src.cmd_admin_emp(A)
href_list["datumrefresh"] = href_list["emp"]
else if (href_list["mark_object"])
@@ -637,9 +649,11 @@ client
return
if(!src.holder)
return
+ if(!admin_rank_check(src.holder.level, 3)) return
src.holder.marked_datum = D
href_list["datumrefresh"] = href_list["mark_object"]
else if (href_list["rotatedatum"])
+ if(!admin_rank_check(src.holder.level, 3)) return
if(!href_list["rotatedir"])
return
var/atom/A = locate(href_list["rotatedatum"])
@@ -660,6 +674,7 @@ client
var/mob/M = locate(href_list["makemonkey"])
if(!M)
return
+ if(!admin_rank_check(src.holder.level, 3)) return
if(!ishuman(M))
usr << "This can only be done to objects of type /mob/living/carbon/human"
return
@@ -677,6 +692,7 @@ client
var/mob/M = locate(href_list["makerobot"])
if(!M)
return
+ if(!admin_rank_check(src.holder.level, 3)) return
if(!ishuman(M))
usr << "This can only be done to objects of type /mob/living/carbon/human"
return
@@ -694,6 +710,7 @@ client
var/mob/M = locate(href_list["makealien"])
if(!M)
return
+ if(!admin_rank_check(src.holder.level, 3)) return
if(!ishuman(M))
usr << "This can only be done to objects of type /mob/living/carbon/human"
return
@@ -711,6 +728,7 @@ client
var/mob/M = locate(href_list["makemetroid"])
if(!M)
return
+ if(!admin_rank_check(src.holder.level, 3)) return
if(!ishuman(M))
usr << "This can only be done to objects of type /mob/living/carbon/human"
return
@@ -728,6 +746,7 @@ client
var/mob/M = locate(href_list["makeai"])
if(!M)
return
+ if(!admin_rank_check(src.holder.level, 3)) return
if(!ishuman(M))
usr << "This can only be done to objects of type /mob/living/carbon/human"
return
@@ -743,6 +762,7 @@ client
holder.Topic(href, list("makeai"=href_list["makeai"]))
else if (href_list["setmutantrace"])
var/mob/living/carbon/human/H = locate(href_list["setmutantrace"])
+ if(!admin_rank_check(src.holder.level, 3)) return
if(!istype(H))
usr << "This can only be done to objects of type /mob/living/carbon/human"
return
@@ -761,6 +781,7 @@ client
H.update_mutantrace()
else if (href_list["regenerateicons"])
var/mob/M = locate(href_list["regenerateicons"])
+ if(!admin_rank_check(src.holder.level, 3)) return
if(!istype(M))
usr << "This can only be done to objects of type /mob"
return
@@ -775,6 +796,8 @@ client
if(!isliving(M)) return
var/mob/living/L = M
+ if(!admin_rank_check(src.holder.level, 3)) return
+
var/amount = input("Deal how much damage to mob? (Negative values here heal)","Adjust [Text]loss",0) as num
if(Text == "brute")
L.adjustBruteLoss(amount)
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index e3a62571cb5..3710c3b76b4 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -340,6 +340,10 @@ datum/mind
log_admin("[key_name(usr)] tried to access [current]'s mind without authorization.")
return
+ if (!(usr.client.holder in list("Trial Admin", "Badmin", "Game Admin", "Game Master")))
+ alert("You cannot perform this action. You must be of a higher administrative rank!")
+ return
+
if (href_list["role_edit"])
var/new_role = input("Select new role", "Assigned role", assigned_role) as null|anything in get_all_jobs()
if (!new_role) return
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index bd66109623e..98e5f9c90c0 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -16,6 +16,12 @@
// verbs += /client/proc/air_status //Air things
// verbs += /client/proc/Cell //More air things
+/client/proc/admin_rank_check(var/rank, var/requested)
+ if(rank < requested)
+ alert("You cannot perform this action. You must be of a higher administrative rank!", null, null, null, null, null)
+ return(0)
+ return(1)
+
/client/proc/update_admins(var/rank)
if(!holder)
holder = new /datum/admins(rank)
@@ -55,7 +61,6 @@
if ("Trial Admin")
holder.level = 3
if(holder.state == 2) // if observing
- verbs += /client/proc/debug_variables
verbs += /client/proc/cmd_modify_ticker_variables
verbs += /client/proc/toggle_view_range
verbs += /client/proc/Getmob
@@ -89,6 +94,8 @@
if ("Admin Observer")
holder.level = -1
+ if(holder.state == 2) // if observing
+ verbs += /client/proc/debug_variables
// if ("Banned")
// holder.level = -2
@@ -106,6 +113,7 @@
if (holder.level >= -1)
verbs += /client/proc/cmd_admin_say
verbs += /client/proc/deadmin_self
+ verbs += /client/proc/admin_ghost
else return
//Moderator
@@ -123,7 +131,6 @@
verbs += /client/proc/cmd_admin_pm_panel
verbs += /client/proc/cmd_admin_subtle_message
verbs += /client/proc/dsay
- verbs += /client/proc/admin_ghost
verbs += /client/proc/game_panel
verbs += /client/proc/player_panel
verbs += /client/proc/player_panel_new
diff --git a/code/modules/admin/holder2.dm b/code/modules/admin/holder2.dm
index 7949e046dca..3b96ba378e1 100644
--- a/code/modules/admin/holder2.dm
+++ b/code/modules/admin/holder2.dm
@@ -181,6 +181,10 @@ var/list/admin_datums = list()
if(href_list["simplemake"])
+ if (!(src.rank in list("Trial Admin", "Badmin", "Game Admin", "Game Master")))
+ alert("You cannot perform this action. You must be of a higher administrative rank!")
+ return
+
if(!href_list["mob"])
usr << "Invalid mob"
return
diff --git a/code/modules/admin/verbs/massmodvar.dm b/code/modules/admin/verbs/massmodvar.dm
index 0acf6863021..b5e15dc6d20 100644
--- a/code/modules/admin/verbs/massmodvar.dm
+++ b/code/modules/admin/verbs/massmodvar.dm
@@ -5,6 +5,8 @@
var/method = 0 //0 means strict type detection while 1 means this type and all subtypes (IE: /obj/item with this set to 1 will set it to ALL itms)
+ if(!admin_rank_check(src.holder.level, 3)) return
+
if(A && A.type)
if(typesof(A.type))
switch(input("Strict object type detection?") as null|anything in list("Strictly this type","This type and subtypes", "Cancel"))
diff --git a/code/modules/admin/verbs/modifyvariables.dm b/code/modules/admin/verbs/modifyvariables.dm
index 877fd47182e..6771f00f9b4 100644
--- a/code/modules/admin/verbs/modifyvariables.dm
+++ b/code/modules/admin/verbs/modifyvariables.dm
@@ -269,6 +269,7 @@ var/list/forbidden_varedit_object_types = list(
if(!src.holder)
src << "Only administrators may use this command."
return
+ if(!admin_rank_check(src.holder.level, 3)) return
for(var/p in forbidden_varedit_object_types)
if( istype(O,p) )