From 14d7425cee1eb3a41e1272794d205bea8af6d4c9 Mon Sep 17 00:00:00 2001 From: Matt Atlas Date: Tue, 4 Mar 2025 18:02:49 +0100 Subject: [PATCH] Expanded admin powers for full moderators. (#20522) - Full moderators can now use rejuvenate. - Full moderators can now spawn atoms. - Full moderators can now remove/add languages. - Full moderators can now teleport mobs. - Repurposes R_BAN into a generic permission that full moderators and above have, and locks teleport behind it. None of these powers may be used for round-altering purposes. Pending review by the head admin and the host. To-do: check that Borealis and permissions in general don't explode with these changes. --------- Co-authored-by: realmattatlas --- code/__DEFINES/admin.dm | 32 +++++----- code/__HELPERS/type2type.dm | 32 +++++----- .../objects/effects/spawners/bombspawner.dm | 2 +- code/modules/admin/admin_ranks.dm | 6 +- code/modules/admin/admin_verbs.dm | 8 +-- code/modules/admin/buildmode/edit.dm | 2 +- .../admin/permissionverbs/permissionedit.dm | 8 ++- code/modules/admin/topic.dm | 24 +++---- code/modules/admin/verbs/modifyvariables.dm | 6 +- code/modules/admin/view_variables/topic.dm | 16 ++--- config/example/admin_ranks.json | 6 +- html/changelogs/mattatlas-itsneverenough.yml | 62 +++++++++++++++++++ 12 files changed, 134 insertions(+), 70 deletions(-) create mode 100644 html/changelogs/mattatlas-itsneverenough.yml diff --git a/code/__DEFINES/admin.dm b/code/__DEFINES/admin.dm index ac6095e211e..35c4cd5cf34 100644 --- a/code/__DEFINES/admin.dm +++ b/code/__DEFINES/admin.dm @@ -23,22 +23,22 @@ #define ROUNDSTART_LOGOUT_REPORT_TIME 6000 // Amount of time (in deciseconds) after the rounds starts, that the player disconnect report is issued. // Admin permissions. -#define R_BUILDMODE 0x1 -#define R_ADMIN 0x2 -#define R_BAN 0x4 -#define R_FUN 0x8 -#define R_SERVER 0x10 -#define R_DEBUG 0x20 -#define R_POSSESS 0x40 -#define R_PERMISSIONS 0x80 -#define R_STEALTH 0x100 -#define R_REJUVINATE 0x200 -#define R_VAREDIT 0x400 -#define R_SOUNDS 0x800 -#define R_SPAWN 0x1000 -#define R_MOD 0x2000 -#define R_DEV 0x4000 -#define R_CCIAA 0x8000 //higher than this will overflow +#define R_BUILDMODE BITFLAG(0) +#define R_ADMIN BITFLAG(1) +#define R_BAN BITFLAG(2) +#define R_FUN BITFLAG(3) +#define R_SERVER BITFLAG(4) +#define R_DEBUG BITFLAG(5) +#define R_POSSESS BITFLAG(6) +#define R_PERMISSIONS BITFLAG(7) +#define R_STEALTH BITFLAG(8) +#define R_REJUVENATE BITFLAG(9) +#define R_VAREDIT BITFLAG(10) +#define R_SOUNDS BITFLAG(11) +#define R_SPAWN BITFLAG(12) +#define R_MOD BITFLAG(13) +#define R_DEV BITFLAG(14) +#define R_CCIAA BITFLAG(15) //higher than this will overflow #define R_MAXPERMISSION 0x8000 // This holds the maximum value for a permission. It is used in iteration, so keep it updated. #define R_ALL 0x7FFF // All perms forever. diff --git a/code/__HELPERS/type2type.dm b/code/__HELPERS/type2type.dm index fbc7ac65c18..8a79a3c9827 100644 --- a/code/__HELPERS/type2type.dm +++ b/code/__HELPERS/type2type.dm @@ -135,22 +135,22 @@ // Converts a rights bitfield into a string /proc/rights2text(rights,seperator="") - if (rights & R_BUILDMODE) . += "[seperator]+BUILDMODE" - if (rights & R_ADMIN) . += "[seperator]+ADMIN" - if (rights & R_BAN) . += "[seperator]+BAN" - if (rights & R_FUN) . += "[seperator]+FUN" - if (rights & R_SERVER) . += "[seperator]+SERVER" - if (rights & R_DEBUG) . += "[seperator]+DEBUG" - if (rights & R_POSSESS) . += "[seperator]+POSSESS" - if (rights & R_PERMISSIONS) . += "[seperator]+PERMISSIONS" - if (rights & R_STEALTH) . += "[seperator]+STEALTH" - if (rights & R_REJUVINATE) . += "[seperator]+REJUVINATE" - if (rights & R_VAREDIT) . += "[seperator]+VAREDIT" - if (rights & R_SOUNDS) . += "[seperator]+SOUND" - if (rights & R_SPAWN) . += "[seperator]+SPAWN" - if (rights & R_MOD) . += "[seperator]+MODERATOR" - if (rights & R_DEV) . += "[seperator]+DEVELOPER" - if (rights & R_CCIAA) . += "[seperator]+CCIAA" + if (rights & R_BUILDMODE) . += "[seperator]+BUILDMODE" + if (rights & R_ADMIN) . += "[seperator]+ADMIN" + if (rights & R_BAN) . += "[seperator]+BAN" + if (rights & R_FUN) . += "[seperator]+FUN" + if (rights & R_SERVER) . += "[seperator]+SERVER" + if (rights & R_DEBUG) . += "[seperator]+DEBUG" + if (rights & R_POSSESS) . += "[seperator]+POSSESS" + if (rights & R_PERMISSIONS) . += "[seperator]+PERMISSIONS" + if (rights & R_STEALTH) . += "[seperator]+STEALTH" + if (rights & R_REJUVENATE) . += "[seperator]+REJUVENATE" + if (rights & R_VAREDIT) . += "[seperator]+VAREDIT" + if (rights & R_SOUNDS) . += "[seperator]+SOUND" + if (rights & R_SPAWN) . += "[seperator]+SPAWN" + if (rights & R_MOD) . += "[seperator]+MODERATOR" + if (rights & R_DEV) . += "[seperator]+DEVELOPER" + if (rights & R_CCIAA) . += "[seperator]+CCIAA" return . // heat2color functions. Adapted from: http://www.tannerhelland.com/4435/convert-temperature-rgb-algorithm-code/ diff --git a/code/game/objects/effects/spawners/bombspawner.dm b/code/game/objects/effects/spawners/bombspawner.dm index 2138048474e..4cd9495a6c4 100644 --- a/code/game/objects/effects/spawners/bombspawner.dm +++ b/code/game/objects/effects/spawners/bombspawner.dm @@ -3,7 +3,7 @@ set desc = "Spawn a tank transfer valve bomb" set name = "Instant TTV" - if(!check_rights(R_SPAWN)) return + if(!check_rights(R_FUN)) return var/obj/effect/spawner/newbomb/proto = /obj/effect/spawner/newbomb/radio/custom diff --git a/code/modules/admin/admin_ranks.dm b/code/modules/admin/admin_ranks.dm index bd3f19ecf74..9ae396a8323 100644 --- a/code/modules/admin/admin_ranks.dm +++ b/code/modules/admin/admin_ranks.dm @@ -34,8 +34,8 @@ var/list/forum_groupids_to_ranks = list() . |= R_POSSESS if ("r_stealth") . |= R_STEALTH - if ("r_rejuv","r_rejuvinate") - . |= R_REJUVINATE + if ("r_rejuv","r_rejuvenate") + . |= R_REJUVENATE if ("r_varedit") . |= R_VAREDIT if ("r_sound","r_sounds") @@ -49,7 +49,7 @@ var/list/forum_groupids_to_ranks = list() if ("r_cciaa") . |= R_CCIAA if ("r_everything","r_host","r_all") - . |= (R_BUILDMODE | R_ADMIN | R_BAN | R_FUN | R_SERVER | R_DEBUG | R_PERMISSIONS | R_POSSESS | R_STEALTH | R_REJUVINATE | R_VAREDIT | R_SOUNDS | R_SPAWN | R_MOD | R_CCIAA | R_DEV) + . |= (R_BUILDMODE | R_ADMIN | R_BAN | R_FUN | R_SERVER | R_DEBUG | R_PERMISSIONS | R_POSSESS | R_STEALTH | R_REJUVENATE | R_VAREDIT | R_SOUNDS | R_SPAWN | R_MOD | R_CCIAA | R_DEV) else crash_with("Unknown rank in file: [auth]") diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 633aecac08e..28a84a90003 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -71,7 +71,6 @@ GLOBAL_LIST_INIT(admin_verbs_admin, list( /datum/admins/proc/show_player_info, /client/proc/free_slot, //frees slot for chosen job, /client/proc/cmd_admin_change_custom_event, - /client/proc/cmd_admin_rejuvenate, /client/proc/toggleattacklogs, /client/proc/toggledebuglogs, /client/proc/toggleghostwriters, @@ -152,6 +151,7 @@ GLOBAL_LIST_INIT(admin_verbs_spawn, list( /datum/admins/proc/spawn_custom_item, /datum/admins/proc/spawn_plant, /datum/admins/proc/spawn_atom, // allows us to spawn instances, + /client/proc/cmd_admin_delete, // delete an instance/object/mob/etc, /client/proc/respawn_character, /client/proc/spawn_chemdisp_cartridge )) @@ -166,7 +166,6 @@ GLOBAL_LIST_INIT(admin_verbs_server, list( /datum/admins/proc/immreboot, /client/proc/everyone_random, /datum/admins/proc/toggleAI, - /client/proc/cmd_admin_delete, // delete an instance/object/mob/etc, /client/proc/cmd_debug_del_all, /datum/admins/proc/adrev, /datum/admins/proc/adspawn, @@ -263,7 +262,8 @@ GLOBAL_LIST_INIT(admin_verbs_permissions, list( )) GLOBAL_LIST_INIT(admin_verbs_rejuv, list( - /client/proc/respawn_character + /client/proc/respawn_character, + /client/proc/cmd_admin_rejuvenate )) @@ -532,7 +532,7 @@ GLOBAL_LIST_INIT(admin_verbs_cciaa, list( if(holder.rights & R_POSSESS) add_verb(src, GLOB.admin_verbs_possess) if(holder.rights & R_PERMISSIONS) add_verb(src, GLOB.admin_verbs_permissions) if(holder.rights & R_STEALTH) add_verb(src, /client/proc/stealth) - if(holder.rights & R_REJUVINATE) add_verb(src, GLOB.admin_verbs_rejuv) + if(holder.rights & R_REJUVENATE) add_verb(src, GLOB.admin_verbs_rejuv) if(holder.rights & R_SPAWN) add_verb(src, GLOB.admin_verbs_spawn) if(holder.rights & R_SOUNDS) add_verb(src, GLOB.admin_verbs_sounds) if(holder.rights & R_MOD) add_verb(src, GLOB.admin_verbs_mod) diff --git a/code/modules/admin/buildmode/edit.dm b/code/modules/admin/buildmode/edit.dm index 9755d4b8831..bc53d858c5c 100644 --- a/code/modules/admin/buildmode/edit.dm +++ b/code/modules/admin/buildmode/edit.dm @@ -45,7 +45,7 @@ if(var_to_edit in VVlocked) if(!check_rights(R_DEBUG)) return if(var_to_edit in VVckey_edit) - if(!check_rights(R_SPAWN|R_DEBUG)) return + if(!check_rights(R_DEBUG)) return if(var_to_edit in VVicon_edit_lock) if(!check_rights(R_FUN|R_DEBUG)) return if(!(var_to_edit in A.vars)) diff --git a/code/modules/admin/permissionverbs/permissionedit.dm b/code/modules/admin/permissionverbs/permissionedit.dm index bfdc82312c1..53bbba63ce6 100644 --- a/code/modules/admin/permissionverbs/permissionedit.dm +++ b/code/modules/admin/permissionverbs/permissionedit.dm @@ -89,6 +89,7 @@ new_rank = input("Please select a rank", "New rank", null, null) as null|anything in list("Game Master","Game Admin", "Trial Admin", "Admin Observer","*New Rank*") var/rights = D?.rights || 0 + var/datum/admin_rank/new_admin_rank_datum switch(new_rank) if(null, "") @@ -103,18 +104,19 @@ to_chat(usr, SPAN_ALERT("Error editing rank: invalid rank.")) return + if(admin_ranks.len) if(new_rank in admin_ranks) - rights = admin_ranks[new_rank] //we typed a rank which already exists, use its rights + new_admin_rank_datum = admin_ranks[new_rank] //we typed a rank which already exists, use its rights else admin_ranks[new_rank] = 0 //add the new rank to admin_ranks else - rights = admin_ranks[new_rank] //we input an existing rank, use its rights + new_admin_rank_datum = admin_ranks[new_rank] //we input an existing rank, use its rights if(D) D.disassociate() //remove adminverbs and unlink from client D.rank = new_rank //update the rank - D.rights = rights //update the rights based on admin_ranks (default: 0) + D.rights = new_admin_rank_datum.rights //update the rights based on admin_ranks (default: 0) else D = new /datum/admins(new_rank, rights, admin_ckey) diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 5dcce167d43..c0acd20ae29 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -141,7 +141,7 @@ else if(href_list["simplemake"]) - if(!check_rights(R_SPAWN)) + if(!check_rights(R_FUN)) return var/mob/M = locate(href_list["mob"]) @@ -474,7 +474,7 @@ psi.check_psionic_trigger(100, "outside intervention", redactive = TRUE) else if(href_list["monkeyone"]) - if(!check_rights(R_SPAWN)) + if(!check_rights(R_FUN)) return var/mob/living/carbon/human/H = locate(href_list["monkeyone"]) @@ -487,7 +487,7 @@ H.monkeyize() else if(href_list["corgione"]) - if(!check_rights(R_SPAWN)) + if(!check_rights(R_FUN)) return var/mob/living/carbon/human/H = locate(href_list["corgione"]) @@ -645,7 +645,7 @@ message_admins("[key_name_admin(usr)] has sent [key_name_admin(M)] to the thunderdome. (Observer.)", 1) else if(href_list["revive"]) - if(!check_rights(R_REJUVINATE)) + if(!check_rights(R_REJUVENATE)) return var/mob/living/L = locate(href_list["revive"]) @@ -661,7 +661,7 @@ to_chat(usr, "Admin Rejuvinates have been disabled") else if(href_list["makeai"]) - if(!check_rights(R_SPAWN)) + if(!check_rights(R_FUN)) return var/mob/living/carbon/human/H = locate(href_list["makeai"]) @@ -674,7 +674,7 @@ H.AIize() else if(href_list["makeslime"]) - if(!check_rights(R_SPAWN)) + if(!check_rights(R_FUN)) return var/mob/living/carbon/human/H = locate(href_list["makeslime"]) @@ -685,7 +685,7 @@ usr.client.cmd_admin_slimeize(H) else if(href_list["makerobot"]) - if(!check_rights(R_SPAWN)) + if(!check_rights(R_FUN)) return var/mob/living/carbon/human/H = locate(href_list["makerobot"]) @@ -696,7 +696,7 @@ usr.client.cmd_admin_robotize(H) else if(href_list["makeanimal"]) - if(!check_rights(R_SPAWN)) + if(!check_rights(R_FUN)) return var/mob/M = locate(href_list["makeanimal"]) @@ -707,7 +707,7 @@ usr.client.cmd_admin_animalize(M) else if(href_list["togmutate"]) - if(!check_rights(R_SPAWN)) + if(!check_rights(R_FUN)) return var/mob/living/carbon/human/H = locate(href_list["togmutate"]) @@ -1014,14 +1014,14 @@ return else if(href_list["jumpto"]) - if(!check_rights(R_ADMIN)) + if(!check_rights(R_BAN)) return var/mob/M = locate(href_list["jumpto"]) usr.client.jumptomob(M) else if(href_list["getmob"]) - if(!check_rights(R_ADMIN)) + if(!check_rights(R_BAN)) return if(alert(usr, "Confirm?", "Message", "Yes", "No") != "Yes") @@ -1030,7 +1030,7 @@ usr.client.Getmob(M) else if(href_list["sendmob"]) - if(!check_rights(R_ADMIN)) + if(!check_rights(R_BAN)) return var/mob/M = locate(href_list["sendmob"]) diff --git a/code/modules/admin/verbs/modifyvariables.dm b/code/modules/admin/verbs/modifyvariables.dm index d77dc74d763..56a8f01ce27 100644 --- a/code/modules/admin/verbs/modifyvariables.dm +++ b/code/modules/admin/verbs/modifyvariables.dm @@ -214,7 +214,7 @@ var/list/VVdynamic_lock = list( if(variable in VVlocked) if(!check_rights(R_DEBUG|R_DEV)) return if(variable in VVckey_edit) - if(!check_rights(R_SPAWN|R_DEBUG|R_DEV)) return + if(!check_rights(R_FUN|R_DEBUG|R_DEV)) return if(variable in VVicon_edit_lock) if(!check_rights(R_FUN|R_DEBUG|R_DEV)) return @@ -433,7 +433,7 @@ var/list/VVdynamic_lock = list( if(param_var_name in VVlocked) if(!check_rights(R_DEBUG|R_DEV)) return if(param_var_name in VVckey_edit) - if(!check_rights(R_SPAWN|R_DEBUG|R_DEV)) return + if(!check_rights(R_FUN|R_DEBUG|R_DEV)) return if(param_var_name in VVicon_edit_lock) if(!check_rights(R_FUN|R_DEBUG|R_DEV)) return if(VVdynamic_lock[variable]) @@ -498,7 +498,7 @@ var/list/VVdynamic_lock = list( if(variable in VVlocked) if(!check_rights(R_DEBUG|R_DEV)) return if(variable in VVckey_edit) - if(!check_rights(R_SPAWN|R_DEBUG|R_DEV)) return + if(!check_rights(R_FUN|R_DEBUG|R_DEV)) return if(variable in VVicon_edit_lock) if(!check_rights(R_FUN|R_DEBUG|R_DEV)) return if(VVdynamic_lock[variable]) diff --git a/code/modules/admin/view_variables/topic.dm b/code/modules/admin/view_variables/topic.dm index fb6e8bd2aab..4120db75371 100644 --- a/code/modules/admin/view_variables/topic.dm +++ b/code/modules/admin/view_variables/topic.dm @@ -93,7 +93,7 @@ href_list["datumrefresh"] = href_list["give_spell"] else if(href_list["godmode"]) - if(!check_rights(R_REJUVINATE)) return + if(!check_rights(R_FUN)) return var/mob/M = locate(href_list["godmode"]) if(!istype(M)) @@ -256,7 +256,7 @@ href_list["datumrefresh"] = href_list["rotatedatum"] else if(href_list["makemonkey"]) - if(!check_rights(R_SPAWN)) return + if(!check_rights(R_FUN)) return var/mob/living/carbon/human/H = locate(href_list["makemonkey"]) if(!istype(H)) @@ -270,7 +270,7 @@ holder.Topic(href, list("monkeyone"=href_list["makemonkey"])) else if(href_list["makerobot"]) - if(!check_rights(R_SPAWN)) return + if(!check_rights(R_FUN)) return var/mob/living/carbon/human/H = locate(href_list["makerobot"]) if(!istype(H)) @@ -284,7 +284,7 @@ holder.Topic(href, list("makerobot"=href_list["makerobot"])) else if(href_list["makeslime"]) - if(!check_rights(R_SPAWN)) return + if(!check_rights(R_FUN)) return var/mob/living/carbon/human/H = locate(href_list["makeslime"]) if(!istype(H)) @@ -298,7 +298,7 @@ holder.Topic(href, list("makeslime"=href_list["makeslime"])) else if(href_list["makeai"]) - if(!check_rights(R_SPAWN)) return + if(!check_rights(R_FUN)) return var/mob/living/carbon/human/H = locate(href_list["makeai"]) if(!istype(H)) @@ -312,7 +312,7 @@ holder.Topic(href, list("makeai"=href_list["makeai"])) else if(href_list["setspecies"]) - if(!check_rights(R_SPAWN)) return + if(!check_rights(R_FUN)) return var/mob/living/carbon/human/H = locate(href_list["setspecies"]) if(!istype(H)) @@ -426,7 +426,7 @@ remove_verb(H, verb) else if(href_list["addorgan"]) - if(!check_rights(R_SPAWN)) return + if(!check_rights(R_FUN)) return var/mob/living/carbon/M = locate(href_list["addorgan"]) if(!istype(M)) @@ -450,7 +450,7 @@ else if(href_list["remorgan"]) - if(!check_rights(R_SPAWN)) return + if(!check_rights(R_FUN)) return var/mob/living/carbon/M = locate(href_list["remorgan"]) if(!istype(M)) diff --git a/config/example/admin_ranks.json b/config/example/admin_ranks.json index b6cd5e9ed05..562fcb60021 100644 --- a/config/example/admin_ranks.json +++ b/config/example/admin_ranks.json @@ -11,7 +11,7 @@ "name": "Primary Administrator", "auths": [ "R_BUILDMODE", "R_ADMIN", "R_BAN", "R_FUN", "R_STEALTH", "R_SERVER", - "R_REJUVINATE", "R_VAREDIT", "R_SOUND", "R_SPAWN", "R_PERMISSIONS", + "R_REJUVENATE", "R_VAREDIT", "R_SOUND", "R_SPAWN", "R_PERMISSIONS", "R_MODERATOR", "R_DEVELOPER", "R_CCIAA", "R_DEBUG" ] }, @@ -20,7 +20,7 @@ "name": "Secondary Administrator", "auths": [ "R_BUILDMODE", "R_ADMIN", "R_BAN", "R_FUN", "R_STEALTH", "R_SERVER", - "R_REJUVINATE", "R_VAREDIT", "R_SOUND", "R_SPAWN", "R_MODERATOR", + "R_REJUVENATE", "R_VAREDIT", "R_SOUND", "R_SPAWN", "R_MODERATOR", "R_DEVELOPER", "R_CCIAA" ] }, @@ -28,7 +28,7 @@ "role_id": 6, "name": "Moderator", "auths": [ - "R_MODERATOR", "R_BAN" + "R_MODERATOR", "R_BAN", "R_SPAWN", "R_REJUVENATE" ] }, { diff --git a/html/changelogs/mattatlas-itsneverenough.yml b/html/changelogs/mattatlas-itsneverenough.yml new file mode 100644 index 00000000000..4cd5eace862 --- /dev/null +++ b/html/changelogs/mattatlas-itsneverenough.yml @@ -0,0 +1,62 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# - (fixes bugs) +# wip +# - (work in progress) +# qol +# - (quality of life) +# soundadd +# - (adds a sound) +# sounddel +# - (removes a sound) +# rscadd +# - (adds a feature) +# rscdel +# - (removes a feature) +# imageadd +# - (adds an image or sprite) +# imagedel +# - (removes an image or sprite) +# spellcheck +# - (fixes spelling or grammar) +# experiment +# - (experimental change) +# balance +# - (balance changes) +# code_imp +# - (misc internal code change) +# refactor +# - (refactors code) +# config +# - (makes a change to the config files) +# admin +# - (makes changes to administrator tools) +# server +# - (miscellaneous changes to server) +################################# + +# Your name. +author: MattAtlas + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, this gets changed to [] after reading. Just remove the brackets when you add new shit. +# Please surround your changes in double quotes ("). It works without them, but if you use certain characters it screws up compiling. The quotes will not show up in the changelog. +changes: + - admin: "Full moderators can now use rejuvenate." + - admin: "Full moderators can now spawn atoms." + - admin: "Full moderators can now remove/add languages." + - admin: "Full moderators can now teleport mobs." + - admin: "Repurposed R_BAN into a generic permission that full moderators and above have, and locks teleport behind it."