From 47b5d56db126545c9b89adff356672addb149031 Mon Sep 17 00:00:00 2001 From: Selis <12716288+ItsSelis@users.noreply.github.com> Date: Fri, 6 Jun 2025 08:22:31 +0200 Subject: [PATCH] Enables admin verb subsystem (#17793) --- code/controllers/subsystems/admin_verbs.dm | 150 ++++++ code/modules/admin/admin_verb_lists.dm | 554 --------------------- code/modules/admin/admin_verb_lists_vr.dm | 53 -- code/modules/admin/admin_verbs.dm | 122 +++-- vorestation.dme | 1 + 5 files changed, 220 insertions(+), 660 deletions(-) create mode 100644 code/controllers/subsystems/admin_verbs.dm delete mode 100644 code/modules/admin/admin_verb_lists.dm diff --git a/code/controllers/subsystems/admin_verbs.dm b/code/controllers/subsystems/admin_verbs.dm new file mode 100644 index 00000000000..b4bfcf487c0 --- /dev/null +++ b/code/controllers/subsystems/admin_verbs.dm @@ -0,0 +1,150 @@ +GENERAL_PROTECT_DATUM(/datum/controller/subsystem/admin_verbs) + +SUBSYSTEM_DEF(admin_verbs) + name = "Admin Verbs" + flags = SS_NO_FIRE + //init_stage = INITSTAGE_EARLY + /// A list of all admin verbs indexed by their type. + var/list/datum/admin_verb/admin_verbs_by_type = list() + /// A list of all admin verbs indexed by their visibility flag. + var/list/list/datum/admin_verb/admin_verbs_by_visibility_flag = list() + /// A map of all assosciated admins and their visibility flags. + var/list/admin_visibility_flags = list() + /// A list of all admins that are pending initialization of this SS. + var/list/admins_pending_subsytem_init = list() + +/datum/controller/subsystem/admin_verbs/Initialize() + setup_verb_list() + process_pending_admins() + return SS_INIT_SUCCESS + +/datum/controller/subsystem/admin_verbs/Recover() + admin_verbs_by_type = SSadmin_verbs.admin_verbs_by_type + +/datum/controller/subsystem/admin_verbs/stat_entry(msg) + return "[..()] | V: [length(admin_verbs_by_type)]" + +/datum/controller/subsystem/admin_verbs/proc/process_pending_admins() + var/list/pending_admins = admins_pending_subsytem_init + admins_pending_subsytem_init = null + for(var/admin_ckey in pending_admins) + assosciate_admin(GLOB.directory[admin_ckey]) + +/datum/controller/subsystem/admin_verbs/proc/setup_verb_list() + if(length(admin_verbs_by_type)) + CRASH("Attempting to setup admin verbs twice!") + for(var/datum/admin_verb/verb_type as anything in subtypesof(/datum/admin_verb)) + var/datum/admin_verb/verb_singleton = new verb_type + if(!verb_singleton.__avd_check_should_exist()) + qdel(verb_singleton, force = TRUE) + continue + + admin_verbs_by_type[verb_type] = verb_singleton + if(verb_singleton.visibility_flag) + if(!(verb_singleton.visibility_flag in admin_verbs_by_visibility_flag)) + admin_verbs_by_visibility_flag[verb_singleton.visibility_flag] = list() + admin_verbs_by_visibility_flag[verb_singleton.visibility_flag] |= list(verb_singleton) + +/datum/controller/subsystem/admin_verbs/proc/get_valid_verbs_for_admin(client/admin) + if(isnull(admin.holder)) + CRASH("Why are we checking a non-admin for their valid... ahem... admin verbs?") + + var/list/has_permission = list() + for(var/permission_flag in GLOB.bitflags) + if(admin.holder.check_for_rights(permission_flag)) + has_permission["[permission_flag]"] = TRUE + + var/list/valid_verbs = list() + for(var/datum/admin_verb/verb_type as anything in admin_verbs_by_type) + var/datum/admin_verb/verb_singleton = admin_verbs_by_type[verb_type] + if(!verify_visibility(admin, verb_singleton)) + continue + + var/verb_permissions = verb_singleton.permissions + if(verb_permissions == R_NONE) + valid_verbs |= list(verb_singleton) + else for(var/permission_flag in bitfield_to_list(verb_permissions)) + if(!has_permission["[permission_flag]"]) + continue + valid_verbs |= list(verb_singleton) + + return valid_verbs + +/datum/controller/subsystem/admin_verbs/proc/verify_visibility(client/admin, datum/admin_verb/verb_singleton) + var/needed_flag = verb_singleton.visibility_flag + return !needed_flag || (needed_flag in admin_visibility_flags[admin.ckey]) + +/datum/controller/subsystem/admin_verbs/proc/update_visibility_flag(client/admin, flag, state) + if(state) + admin_visibility_flags[admin.ckey] |= list(flag) + assosciate_admin(admin) + return + + admin_visibility_flags[admin.ckey] -= list(flag) + // they lost the flag, iterate over verbs with that flag and yoink em + for(var/datum/admin_verb/verb_singleton as anything in admin_verbs_by_visibility_flag[flag]) + verb_singleton.unassign_from_client(admin) + admin.init_verbs() + +/datum/controller/subsystem/admin_verbs/proc/dynamic_invoke_verb(client/admin, datum/admin_verb/verb_type, ...) + if(IsAdminAdvancedProcCall()) + message_admins("PERMISSION ELEVATION: [key_name_admin(admin)] attempted to dynamically invoke admin verb '[verb_type]'.") + return + + if(ismob(admin)) + var/mob/mob = admin + admin = mob.client + + if(!ispath(verb_type, /datum/admin_verb) || verb_type == /datum/admin_verb) + CRASH("Attempted to dynamically invoke admin verb with invalid typepath '[verb_type]'.") + if(isnull(admin.holder)) + CRASH("Attempted to dynamically invoke admin verb '[verb_type]' with a non-admin.") + + var/list/verb_args = args.Copy() + verb_args.Cut(2, 3) + var/datum/admin_verb/verb_singleton = admin_verbs_by_type[verb_type] // this cannot be typed because we need to use `:` + if(isnull(verb_singleton)) + CRASH("Attempted to dynamically invoke admin verb '[verb_type]' that doesn't exist.") + + if(!admin.holder.check_for_rights(verb_singleton.permissions)) + to_chat(admin, span_adminnotice("You lack the permissions to do this.")) + return + + var/old_usr = usr + usr = admin.mob + // THE MACRO ENSURES THIS EXISTS. IF IT EVER DOESNT EXIST SOMEONE DIDNT USE THE DAMN MACRO! + verb_singleton.__avd_do_verb(arglist(verb_args)) + usr = old_usr + //SSblackbox.record_feedback("tally", "dynamic_admin_verb_invocation", 1, "[verb_type]") + +/** + * Assosciates and/or resyncs an admin with their accessible admin verbs. + */ +/datum/controller/subsystem/admin_verbs/proc/assosciate_admin(client/admin) + if(IsAdminAdvancedProcCall()) + return + + if(!isnull(admins_pending_subsytem_init)) // if the list exists we are still initializing + to_chat(admin, span_large(span_green("Admin Verbs are still initializing. Please wait and you will be automatically assigned your verbs when it is complete."))) + admins_pending_subsytem_init |= list(admin.ckey) + return + + // refresh their verbs + admin_visibility_flags[admin.ckey] ||= list() + for(var/datum/admin_verb/verb_singleton as anything in get_valid_verbs_for_admin(admin)) + verb_singleton.assign_to_client(admin) + admin.init_verbs() + +/** + * Unassosciates an admin from their admin verbs. + * Goes over all admin verbs because we don't know which ones are assigned to the admin's mob without a bunch of extra bookkeeping. + * This might be a performance issue in the future if we have a lot of admin verbs. + */ +/datum/controller/subsystem/admin_verbs/proc/deassosciate_admin(client/admin) + if(IsAdminAdvancedProcCall()) + return + + UnregisterSignal(admin, COMSIG_CLIENT_MOB_LOGIN) + for(var/datum/admin_verb/verb_type as anything in admin_verbs_by_type) + admin_verbs_by_type[verb_type].unassign_from_client(admin) + admin_visibility_flags -= list(admin.ckey) diff --git a/code/modules/admin/admin_verb_lists.dm b/code/modules/admin/admin_verb_lists.dm deleted file mode 100644 index e839498111b..00000000000 --- a/code/modules/admin/admin_verb_lists.dm +++ /dev/null @@ -1,554 +0,0 @@ -//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( - /datum/admins/proc/show_player_panel, //shows an interface for individual players, with various links (links require additional flags, - /client/proc/player_panel_new, //shows an interface for all players, with links to various panels, - /client/proc/player_panel, - /client/proc/deadmin, //destroys our own admin datum so we can play as a regular player, - /client/proc/hide_verbs, //hides all our adminverbs, - /client/proc/hide_most_verbs, //hides all our hideable adminverbs, - /client/proc/debug_variables, //allows us to -see- the variables of any instance in the game. +VAREDIT needed to modify, - /client/proc/mark_datum_mapview, - /client/proc/cmd_check_new_players, //allows us to see every new player -// /client/proc/check_antagonists, //shows all antags, -// /client/proc/cmd_mod_say, -// /client/proc/deadchat //toggles deadchat on/off, -// /client/proc/toggle_ahelp_sound, - /client/proc/debugstatpanel, - ) - -var/list/admin_verbs_admin = list( - /datum/admins/proc/set_tcrystals, - /datum/admins/proc/add_tcrystals, - /client/proc/invisimin, //allows our mob to go invisible/visible, - /datum/admins/proc/show_traitor_panel, //interface which shows a mob's mind., - /datum/admins/proc/show_game_mode, //Configuration window for the current game mode., - /datum/admins/proc/force_mode_latespawn, //Force the mode to try a latespawn proc, - /datum/admins/proc/force_antag_latespawn, //Force a specific template to try a latespawn proc, - /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/announce, //priority announce something to all clients., - /datum/admins/proc/intercom, //send a fake intercom message, like an arrivals announcement, - /datum/admins/proc/intercom_convo, //send a fake intercom conversation, like an ATC exchange, - /client/proc/colorooc, //allows us to set a custom colour for everythign we say in ooc, - /client/proc/admin_ghost, //allows us to ghost/reenter body at will, - /client/proc/toggle_view_range, //changes how far we can see, - /datum/admins/proc/view_txt_log, //shows the server log (GLOB.diary) for today, - /datum/admins/proc/view_atk_log, //shows the server combat-log, doesn't do anything presently, - /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_delete, //delete an instance/object/mob/etc, - /client/proc/cmd_admin_check_contents, //displays the contents of an instance, - /client/proc/cmd_admin_check_player_logs, //checks a player's attack logs, - /client/proc/cmd_admin_check_dialogue_logs, //checks a player's dialogue logs, - /datum/admins/proc/access_news_network, //allows access of newscasters, - /client/proc/giveruntimelog, //allows us to give access to runtime logs to somebody, - /client/proc/getserverlog, //allows us to fetch server logs (GLOB.diary) for other days, - /client/proc/jumptocoord, //we ghost and jump to a coordinate, - /client/proc/Getmob, //teleports a mob to our location, - /client/proc/Getkey, //teleports a mob with a certain ckey to our location, -// /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/Jump, - /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/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 CentCom, - /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_world_narrate, //sends text to all players with no padding, - /client/proc/cmd_admin_create_centcom_report, - /client/proc/check_words, //displays cult-words, - /client/proc/check_ai_laws, //shows AI and borg laws, - /client/proc/rename_silicon, //properly renames silicons, - /client/proc/manage_silicon_laws, // Allows viewing and editing silicon laws. , - /client/proc/shuttle_panel, // Allows controlling all shuttles remotely. - /client/proc/check_antagonists, - /client/proc/admin_memo, //admin memo system. show/delete/write. +SERVER needed to delete admin memos of others, - /client/proc/dsay, //talk in deadchat using our ckey/fakekey, -// /client/proc/toggle_hear_deadcast, //toggles whether we hear deadchat, - /client/proc/investigate_show, //various admintools for investigation. Such as a singulo grief-log, - /client/proc/secrets, - /datum/admins/proc/toggleooc, //toggles ooc on/off for everyone, - /datum/admins/proc/togglelooc, //toggles looc on/off for everyone, - /datum/admins/proc/toggleoocdead, //toggles ooc on/off for everyone who is dead, - /datum/admins/proc/togglehubvisibility, //toggles visibility on the BYOND Hub., - /datum/admins/proc/toggledsay, //toggles dsay on/off for everyone, - /client/proc/game_panel, //game panel, allows to change game-mode etc, - /client/proc/cmd_admin_say, //admin-only ooc chat, - /client/proc/cmd_mod_say, - /client/proc/cmd_event_say, - /datum/admins/proc/PlayerNotes, - /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/toggleghostwriters, - /client/proc/toggledrones, - /client/proc/check_customitem_activity, - /client/proc/man_up, - /client/proc/global_man_up, - /client/proc/response_team, // Response Teams admin verb, - /client/proc/trader_ship, // Trader ship admin verb, - /client/proc/toggle_antagHUD_use, - /client/proc/toggle_antagHUD_restrictions, - /client/proc/allow_character_respawn, // Allows a ghost to respawn , - /client/proc/event_manager_panel, - /client/proc/empty_ai_core_toggle_latejoin, - /client/proc/empty_ai_core_toggle_latejoin, - /client/proc/aooc, - /client/proc/change_human_appearance_admin, // Allows an admin to change the basic appearance of human-based mobs , - /client/proc/change_human_appearance_self, // Allows the human-based mob itself change its basic appearance , - /client/proc/change_security_level, - /client/proc/view_chemical_reaction_logs, - /client/proc/makePAI, - /client/proc/toggle_debug_logs, - /client/proc/toggle_attack_logs, - /datum/admins/proc/paralyze_mob, - /client/proc/fixatmos, - /datum/admins/proc/sendFax, - /client/proc/despawn_player, - /datum/admins/proc/view_feedback, - /client/proc/debug_global_variables, - /client/proc/hide_motion_tracker_feedback - ) - -var/list/admin_verbs_ban = list( - /client/proc/unban_panel, - /client/proc/jobbans - ) - -var/list/admin_verbs_sounds = list( - /client/proc/play_local_sound, - /client/proc/play_sound, - /client/proc/play_server_sound, - /client/proc/play_web_sound - ) - -var/list/admin_verbs_fun = list( - /client/proc/object_talk, - /datum/admins/proc/cmd_admin_dress, - /client/proc/cmd_admin_gib_self, - /client/proc/drop_bomb, - /client/proc/everyone_random, - /client/proc/cinematic, - /datum/admins/proc/toggle_aliens, - /datum/admins/proc/toggle_space_ninja, - /client/proc/cmd_admin_add_freeform_ai_law, - /client/proc/cmd_admin_add_random_ai_law, - /client/proc/make_sound, - /client/proc/toggle_random_events, - /client/proc/editappear, - /client/proc/roll_dices, - /datum/admins/proc/call_supply_drop, - /datum/admins/proc/call_drop_pod, - /client/proc/smite, - /client/proc/admin_lightning_strike, - /client/proc/cmd_admin_droppod_deploy - ) - -var/list/admin_verbs_spawn = list( - /datum/admins/proc/spawn_fruit, - /datum/admins/proc/spawn_custom_item, - /datum/admins/proc/check_custom_items, - /datum/admins/proc/spawn_plant, - /datum/admins/proc/spawn_atom, //allows us to spawn instances, - /client/proc/cmd_admin_droppod_spawn, - /client/proc/respawn_character, - /client/proc/virus2_editor, - /client/proc/spawn_chemdisp_cartridge, - /client/proc/map_template_load, - /client/proc/map_template_upload, - /client/proc/map_template_load_on_new_z - ) - -var/list/admin_verbs_server = list( - /datum/admins/proc/capture_map, - /client/proc/Set_Holiday, - /client/proc/ToRban, - /datum/admins/proc/startnow, - /datum/admins/proc/restart, - /datum/admins/proc/delay, - /datum/admins/proc/toggleaban, - /datum/admins/proc/togglepersistence, - /client/proc/cmd_mod_say, - /client/proc/toggle_log_hrefs, - /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, - /datum/admins/proc/adjump, - /datum/admins/proc/toggle_aliens, - /datum/admins/proc/toggle_space_ninja, - /client/proc/toggle_random_events, - /client/proc/check_customitem_activity, - /client/proc/nanomapgen_DumpImage, - /client/proc/modify_server_news, - /client/proc/recipe_dump, - /client/proc/panicbunker, - /client/proc/paranoia_logging, - /client/proc/ip_reputation, - /client/proc/debug_global_variables, - /client/proc/dbcon_fix - ) - -var/list/admin_verbs_debug = list( - /client/proc/getruntimelog, //allows us to access runtime logs to somebody, - /client/proc/cmd_admin_list_open_jobs, - /client/proc/Debug2, - /client/proc/kill_air, - /client/proc/ZASSettings, - /client/proc/cmd_debug_make_powernets, - /client/proc/kill_airgroup, - /client/proc/debug_controller, - /client/proc/debug_antagonist_template, - /client/proc/cmd_debug_mob_lists, - /client/proc/cmd_debug_using_map, - /client/proc/cmd_admin_delete, - /client/proc/cmd_debug_del_all, - /client/proc/cmd_debug_tog_aliens, - /client/proc/cmd_display_del_log, - /client/proc/cmd_display_init_log, - /client/proc/cmd_display_overlay_log, - /client/proc/air_report, - /client/proc/reload_admins, - /client/proc/reload_eventMs, - /client/proc/restart_controller, - /datum/admins/proc/restart, - /client/proc/print_random_map, - /client/proc/create_random_map, - /client/proc/apply_random_map, - /client/proc/overlay_random_map, - /client/proc/delete_random_map, - /client/proc/show_plant_genes, - /client/proc/enable_debug_verbs, - /client/proc/callproc, - /client/proc/callproc_datum, - /client/proc/SDQL2_query, - /client/proc/Jump, - /client/proc/jumptomob, - /client/proc/jumptocoord, - /client/proc/dsay, - /client/proc/toggle_debug_logs, - /client/proc/admin_ghost, //allows us to ghost/reenter body at will, - /datum/admins/proc/view_runtimes, - /client/proc/show_gm_status, - /datum/admins/proc/change_weather, - /datum/admins/proc/change_time, - /client/proc/cmd_regenerate_asset_cache, - /client/proc/cmd_clear_smart_asset_cache, - /client/proc/cmd_reload_robot_sprite_test, - /client/proc/admin_give_modifier, - /client/proc/simple_DPS, - /datum/admins/proc/view_feedback, - /client/proc/debug_global_variables, - /client/proc/ping_webhook, - /client/proc/reload_webhooks, - /client/proc/stop_sounds - ) - -var/list/admin_verbs_paranoid_debug = list( - /client/proc/callproc, - /client/proc/callproc_datum, - /client/proc/debug_controller - ) - -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 - ) - -//verbs which can be hidden - needs work -var/list/admin_verbs_hideable = list( - /client/proc/deadmin, -// /client/proc/deadchat, - /datum/admins/proc/show_traitor_panel, - /datum/admins/proc/toggleenter, - /datum/admins/proc/toggleguests, - /datum/admins/proc/announce, - /client/proc/colorooc, - /client/proc/admin_ghost, - /client/proc/toggle_view_range, - /datum/admins/proc/view_txt_log, - /datum/admins/proc/view_atk_log, - /client/proc/cmd_admin_subtle_message, - /client/proc/cmd_admin_check_contents, - /client/proc/cmd_admin_check_player_logs, - /client/proc/cmd_admin_check_dialogue_logs, - /datum/admins/proc/access_news_network, - /client/proc/admin_call_shuttle, - /client/proc/admin_cancel_shuttle, - /client/proc/cmd_admin_direct_narrate, - /client/proc/cmd_admin_world_narrate, - /client/proc/check_words, - /client/proc/play_local_sound, - /client/proc/play_sound, - /client/proc/play_server_sound, - /client/proc/play_web_sound, - /client/proc/object_talk, - /datum/admins/proc/cmd_admin_dress, - /client/proc/cmd_admin_gib_self, - /client/proc/drop_bomb, - /client/proc/cinematic, - /datum/admins/proc/toggle_aliens, - /datum/admins/proc/toggle_space_ninja, - /client/proc/cmd_admin_add_freeform_ai_law, - /client/proc/cmd_admin_add_random_ai_law, - /client/proc/cmd_admin_create_centcom_report, - /client/proc/make_sound, - /client/proc/toggle_random_events, - /client/proc/cmd_admin_add_random_ai_law, - /client/proc/Set_Holiday, - /client/proc/ToRban, - /datum/admins/proc/startnow, - /datum/admins/proc/restart, - /datum/admins/proc/delay, - /datum/admins/proc/toggleaban, - /client/proc/toggle_log_hrefs, - /datum/admins/proc/immreboot, - /client/proc/everyone_random, - /datum/admins/proc/toggleAI, - /datum/admins/proc/adrev, - /datum/admins/proc/adspawn, - /datum/admins/proc/adjump, - /client/proc/restart_controller, - /client/proc/cmd_admin_list_open_jobs, - /client/proc/callproc, - /client/proc/callproc_datum, - /client/proc/Debug2, - /client/proc/reload_admins, - /client/proc/kill_air, - /client/proc/cmd_debug_make_powernets, - /client/proc/kill_airgroup, - /client/proc/debug_controller, - /client/proc/startSinglo, - /client/proc/simple_DPS, - /client/proc/cmd_debug_mob_lists, - /client/proc/cmd_debug_using_map, - /client/proc/cmd_debug_del_all, - /client/proc/cmd_debug_tog_aliens, - /client/proc/cmd_display_del_log, - /client/proc/air_report, - /client/proc/enable_debug_verbs, - /client/proc/roll_dices, - /proc/possess, - /proc/release, - /datum/admins/proc/set_tcrystals, - /client/proc/debug_global_variables, - /client/proc/stop_sounds - ) -var/list/admin_verbs_mod = list( - /client/proc/cmd_admin_pm_context, //right-click adminPM interface, - /client/proc/cmd_admin_pm_panel, //admin-pm list, - /client/proc/debug_variables, //allows us to -see- the variables of any instance in the game., - /datum/admins/proc/PlayerNotes, - /client/proc/admin_ghost, //allows us to ghost/reenter body at will, - /client/proc/cmd_mod_say, - /client/proc/cmd_event_say, - /datum/admins/proc/show_player_info, - /datum/admins/proc/show_traitor_panel, - /client/proc/colorooc, - /client/proc/player_panel_new, - /client/proc/dsay, - /datum/admins/proc/show_player_panel, - /client/proc/check_antagonists, - /client/proc/aooc, - /client/proc/jobbans, - /client/proc/toggle_attack_logs, - /client/proc/cmd_admin_subtle_message, //send an message to somebody as a 'voice in their head', - /datum/admins/proc/paralyze_mob, - /client/proc/cmd_admin_direct_narrate, - /client/proc/allow_character_respawn, // Allows a ghost to respawn , - /datum/admins/proc/sendFax, - /client/proc/getserverlog, //allows us to fetch server logs (GLOB.diary) for other days, - /datum/admins/proc/view_persistent_data, - /datum/admins/proc/view_txt_log, //shows the server log (GLOB.diary) for today, - /datum/admins/proc/view_atk_log //shows the server combat-log, doesn't do anything presently, -) - -var/list/admin_verbs_event_manager = list( - /client/proc/cmd_event_say, - /client/proc/cmd_admin_pm_context, - /client/proc/cmd_admin_pm_panel, - /client/proc/admin_ghost, - /datum/admins/proc/show_player_info, - /client/proc/dsay, - /client/proc/cmd_admin_subtle_message, - /client/proc/debug_variables, - /client/proc/check_antagonists, - /client/proc/aooc, - /datum/admins/proc/paralyze_mob, - /client/proc/cmd_admin_direct_narrate, - /client/proc/allow_character_respawn, - /datum/admins/proc/sendFax, - /client/proc/respawn_character, - /proc/possess, - /proc/release, - /datum/admins/proc/change_weather, - /datum/admins/proc/change_time, - /client/proc/cmd_regenerate_asset_cache, - /client/proc/cmd_clear_smart_asset_cache, - /client/proc/cmd_reload_robot_sprite_test, - /client/proc/admin_give_modifier, - /client/proc/Jump, - /client/proc/jumptomob, - /client/proc/jumptocoord, - /client/proc/cmd_admin_delete, - /datum/admins/proc/delay, - /client/proc/Set_Holiday, - /client/proc/make_sound, - /client/proc/toggle_random_events, - /datum/admins/proc/cmd_admin_dress, - /client/proc/cmd_admin_gib_self, - /client/proc/drop_bomb, - /client/proc/cmd_admin_add_freeform_ai_law, - /client/proc/cmd_admin_add_random_ai_law, - /client/proc/make_sound, - /client/proc/toggle_random_events, - /client/proc/editappear, - /client/proc/roll_dices, - /datum/admins/proc/call_supply_drop, - /datum/admins/proc/call_drop_pod, - /datum/admins/proc/PlayerNotes, - /client/proc/callproc, - /client/proc/callproc_datum, - /client/proc/debug_controller, - /client/proc/show_gm_status, - /datum/admins/proc/change_weather, - /datum/admins/proc/change_time, - /client/proc/cmd_regenerate_asset_cache, - /client/proc/cmd_clear_smart_asset_cache, - /client/proc/cmd_reload_robot_sprite_test, - /client/proc/admin_give_modifier, - /datum/admins/proc/cmd_admin_dress, - /client/proc/cmd_admin_gib_self, - /datum/admins/proc/set_tcrystals, - /datum/admins/proc/add_tcrystals, - /client/proc/invisimin, //allows our mob to go invisible/visible, - /datum/admins/proc/show_traitor_panel, //interface which shows a mob's mind., - /datum/admins/proc/show_game_mode, //Configuration window for the current game mode., - /datum/admins/proc/force_mode_latespawn, //Force the mode to try a latespawn proc, - /datum/admins/proc/force_antag_latespawn, //Force a specific template to try a latespawn proc, - /datum/admins/proc/announce, //priority announce something to all clients., - /datum/admins/proc/intercom, //send a fake intercom message, like an arrivals announcement, - /datum/admins/proc/intercom_convo, //send a fake intercom conversation, like an ATC exchange, - /client/proc/colorooc, //allows us to set a custom colour for everythign we say in ooc, - /client/proc/admin_ghost, //allows us to ghost/reenter body at will, - /client/proc/toggle_view_range, //changes how far we can see, - /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_delete, //delete an instance/object/mob/etc, - /client/proc/cmd_admin_check_contents, //displays the contents of an instance, - /client/proc/cmd_admin_check_player_logs, //checks a player's attack logs, - /client/proc/cmd_admin_check_dialogue_logs, //checks a player's dialogue logs, - /datum/admins/proc/access_news_network, //allows access of newscasters, - /client/proc/jumptocoord, //we ghost and jump to a coordinate, - /client/proc/Getmob, //teleports a mob to our location, - /client/proc/Getkey, //teleports a mob with a certain ckey to our location, - /client/proc/Jump, - /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/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 CentCom, - /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_world_narrate, //sends text to all players with no padding, - /client/proc/cmd_admin_create_centcom_report, - /client/proc/check_words, //displays cult-words, - /client/proc/check_ai_laws, //shows AI and borg laws, - /client/proc/rename_silicon, //properly renames silicons, - /client/proc/manage_silicon_laws, // Allows viewing and editing silicon laws. , - /client/proc/shuttle_panel, // Allows controlling all shuttles remotely. - /client/proc/check_antagonists, - /client/proc/admin_memo, //admin memo system. show/delete/write. +SERVER needed to delete admin memos of others, - /client/proc/dsay, //talk in deadchat using our ckey/fakekey, - /client/proc/secrets, - /client/proc/game_panel, //game panel, allows to change game-mode etc, - /client/proc/cmd_mod_say, - /client/proc/cmd_event_say, - /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/toggleghostwriters, - /client/proc/man_up, - /client/proc/global_man_up, - /client/proc/response_team, // Response Teams admin verb, - /client/proc/trader_ship, // Trader ship admin verb, - /client/proc/allow_character_respawn, // Allows a ghost to respawn , - /client/proc/event_manager_panel, - /client/proc/aooc, - /client/proc/change_human_appearance_admin, // Allows an admin to change the basic appearance of human-based mobs , - /client/proc/change_human_appearance_self, // Allows the human-based mob itself change its basic appearance , - /client/proc/change_security_level, - /client/proc/makePAI, - /client/proc/toggle_debug_logs, - /client/proc/toggle_attack_logs, - /datum/admins/proc/paralyze_mob, - /client/proc/fixatmos, - /datum/admins/proc/sendFax, - /client/proc/despawn_player, - /datum/admins/proc/view_feedback, - /datum/admins/proc/capture_map, - /client/proc/Set_Holiday, - /datum/admins/proc/startnow, - /datum/admins/proc/restart, - /datum/admins/proc/delay, - /client/proc/cmd_mod_say, - /datum/admins/proc/immreboot, - /client/proc/everyone_random, - /client/proc/cmd_admin_delete, //delete an instance/object/mob/etc, - /client/proc/cmd_debug_del_all, - /client/proc/toggle_random_events, - /client/proc/modify_server_news, - /client/proc/debug_global_variables, - /client/proc/hide_motion_tracker_feedback -) - -/client/proc/add_admin_verbs() - if(holder) - add_verb(src, admin_verbs_default) - if(holder.rights & R_BUILDMODE) add_verb(src, /client/proc/togglebuildmodeself) - if(holder.rights & R_ADMIN) add_verb(src, admin_verbs_admin) - if(holder.rights & R_BAN) add_verb(src, admin_verbs_ban) - if(holder.rights & R_FUN) add_verb(src, admin_verbs_fun) - if(holder.rights & R_SERVER) add_verb(src, admin_verbs_server) - if(holder.rights & R_DEBUG) - add_verb(src, admin_verbs_debug) - if(config.debugparanoid && !(holder.rights & R_ADMIN)) - remove_verb(src, admin_verbs_paranoid_debug) //Right now it's just callproc but we can easily add others later on. - if(holder.rights & R_POSSESS) add_verb(src, admin_verbs_possess) - if(holder.rights & R_PERMISSIONS) add_verb(src, admin_verbs_permissions) - if(holder.rights & R_STEALTH) add_verb(src, /client/proc/stealth) - if(holder.rights & R_REJUVINATE) add_verb(src, admin_verbs_rejuv) - if(holder.rights & R_SOUNDS) add_verb(src, admin_verbs_sounds) - if(holder.rights & R_SPAWN) add_verb(src, admin_verbs_spawn) - if(holder.rights & R_MOD) add_verb(src, admin_verbs_mod) - if(holder.rights & R_EVENT) add_verb(src, admin_verbs_event_manager) - -/client/proc/remove_admin_verbs() - remove_verb(src, list( - admin_verbs_default, - /client/proc/togglebuildmodeself, - admin_verbs_admin, - admin_verbs_ban, - admin_verbs_fun, - admin_verbs_server, - admin_verbs_debug, - admin_verbs_possess, - admin_verbs_permissions, - /client/proc/stealth, - admin_verbs_rejuv, - admin_verbs_sounds, - admin_verbs_spawn, - debug_verbs - )) diff --git a/code/modules/admin/admin_verb_lists_vr.dm b/code/modules/admin/admin_verb_lists_vr.dm index 532d961e38a..492117b0d11 100644 --- a/code/modules/admin/admin_verb_lists_vr.dm +++ b/code/modules/admin/admin_verb_lists_vr.dm @@ -3,7 +3,6 @@ var/list/admin_verbs_default = list( // /datum/admins/proc/show_player_panel, //shows an interface for individual players, with various links (links require additional flags, //VOREStation Remove, // /client/proc/player_panel_new, //shows an interface for all players, with links to various panels, //VOREStation Remove, // /client/proc/player_panel, //VOREStation Remove, - /client/proc/deadmin, //destroys our own admin datum so we can play as a regular player, /client/proc/cmd_admin_say, //VOREStation Add, /client/proc/cmd_mod_say, //VOREStation Add, /client/proc/cmd_event_say, //VOREStation Add, @@ -84,7 +83,6 @@ var/list/admin_verbs_admin = list( /datum/admins/proc/toggleoocdead, //toggles ooc on/off for everyone who is dead, /datum/admins/proc/togglehubvisibility, //toggles visibility on the BYOND Hub., /datum/admins/proc/toggledsay, //toggles dsay on/off for everyone, - /client/proc/game_panel, //game panel, allows to change game-mode etc, /client/proc/cmd_admin_say, //admin-only ooc chat, /client/proc/cmd_mod_say, /client/proc/cmd_event_say, @@ -121,19 +119,12 @@ var/list/admin_verbs_admin = list( /datum/admins/proc/view_feedback, /client/proc/make_mentor, /client/proc/unmake_mentor, - /client/proc/removetickets, /client/proc/delbook, /client/proc/toggle_spawning_with_recolour, - /client/proc/modify_shift_end, /client/proc/start_vote, /client/proc/hide_motion_tracker_feedback ) -var/list/admin_verbs_ban = list( - /client/proc/unban_panel, - /client/proc/jobbans - ) - var/list/admin_verbs_sounds = list( /client/proc/play_local_sound, /client/proc/play_sound, @@ -308,7 +299,6 @@ var/list/admin_verbs_rejuv = list( //verbs which can be hidden - needs work var/list/admin_verbs_hideable = list( - /client/proc/deadmin, // /client/proc/deadchat, /datum/admins/proc/show_traitor_panel, /datum/admins/proc/toggleenter, @@ -406,7 +396,6 @@ var/list/admin_verbs_mod = list( /datum/admins/proc/show_player_panel, /client/proc/check_antagonists, /client/proc/aooc, - /client/proc/jobbans, /client/proc/cmd_admin_subtle_message, //send an message to somebody as a 'voice in their head', /datum/admins/proc/paralyze_mob, /client/proc/cmd_admin_direct_narrate, @@ -526,7 +515,6 @@ var/list/admin_verbs_event_manager = list( /client/proc/admin_memo, //admin memo system. show/delete/write. +SERVER needed to delete admin memos of others, /client/proc/dsay, //talk in deadchat using our ckey/fakekey, /client/proc/secrets, - /client/proc/game_panel, //game panel, allows to change game-mode etc, /client/proc/cmd_mod_say, /client/proc/cmd_event_say, /datum/admins/proc/show_player_info, @@ -563,7 +551,6 @@ var/list/admin_verbs_event_manager = list( /client/proc/toggle_random_events, /client/proc/modify_server_news, /client/proc/toggle_spawning_with_recolour, - /client/proc/modify_shift_end, /client/proc/start_vote, /client/proc/AdminCreateVirus, /client/proc/ReleaseVirus, @@ -573,43 +560,3 @@ var/list/admin_verbs_event_manager = list( /client/proc/modify_event_collector, /client/proc/induce_malfunction ) - -/client/proc/add_admin_verbs() - if(holder) - var/rights = holder.rank_flags() - add_verb(src, admin_verbs_default) - if(rights & R_BUILDMODE) add_verb(src, /client/proc/togglebuildmodeself) - if(rights & R_ADMIN) add_verb(src, admin_verbs_admin) - if(rights & R_BAN) add_verb(src, admin_verbs_ban) - if(rights & R_FUN) add_verb(src, admin_verbs_fun) - if(rights & R_SERVER) add_verb(src, admin_verbs_server) - if(rights & R_DEBUG) - add_verb(src, admin_verbs_debug) - if(CONFIG_GET(flag/debugparanoid) && !(rights & R_ADMIN)) - remove_verb(src, admin_verbs_paranoid_debug) //Right now it's just callproc but we can easily add others later on. - if(rights & R_POSSESS) add_verb(src, admin_verbs_possess) - if(rights & R_PERMISSIONS) add_verb(src, admin_verbs_permissions) - if(rights & R_STEALTH) add_verb(src, /client/proc/stealth) - if(rights & R_REJUVINATE) add_verb(src, admin_verbs_rejuv) - if(rights & R_SOUNDS) add_verb(src, admin_verbs_sounds) - if(rights & R_SPAWN) add_verb(src, admin_verbs_spawn) - if(rights & R_MOD) add_verb(src, admin_verbs_mod) - if(rights & R_EVENT) add_verb(src, admin_verbs_event_manager) - -/client/proc/remove_admin_verbs() - remove_verb(src, list( - admin_verbs_default, - /client/proc/togglebuildmodeself, - admin_verbs_admin, - admin_verbs_ban, - admin_verbs_fun, - admin_verbs_server, - admin_verbs_debug, - admin_verbs_possess, - admin_verbs_permissions, - /client/proc/stealth, - admin_verbs_rejuv, - admin_verbs_sounds, - admin_verbs_spawn, - debug_verbs - )) diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 49659e30d4d..95e520a97c3 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -1,3 +1,49 @@ +/client/proc/add_admin_verbs() + // OLD ADMIN VERB SYSTEM + if(holder) + var/rights = holder.rank_flags() + add_verb(src, admin_verbs_default) + if(rights & R_BUILDMODE) add_verb(src, /client/proc/togglebuildmodeself) + if(rights & R_ADMIN) add_verb(src, admin_verbs_admin) + if(rights & R_FUN) add_verb(src, admin_verbs_fun) + if(rights & R_SERVER) add_verb(src, admin_verbs_server) + if(rights & R_DEBUG) + add_verb(src, admin_verbs_debug) + if(CONFIG_GET(flag/debugparanoid) && !(rights & R_ADMIN)) + remove_verb(src, admin_verbs_paranoid_debug) //Right now it's just callproc but we can easily add others later on. + if(rights & R_POSSESS) add_verb(src, admin_verbs_possess) + if(rights & R_PERMISSIONS) add_verb(src, admin_verbs_permissions) + if(rights & R_STEALTH) add_verb(src, /client/proc/stealth) + if(rights & R_REJUVINATE) add_verb(src, admin_verbs_rejuv) + if(rights & R_SOUNDS) add_verb(src, admin_verbs_sounds) + if(rights & R_SPAWN) add_verb(src, admin_verbs_spawn) + if(rights & R_MOD) add_verb(src, admin_verbs_mod) + if(rights & R_EVENT) add_verb(src, admin_verbs_event_manager) + + // NEW ADMIN VERBS SYSTEM + SSadmin_verbs.assosciate_admin(src) + +/client/proc/remove_admin_verbs() + // OLD ADMIN VERB SYSTEM + remove_verb(src, list( + admin_verbs_default, + /client/proc/togglebuildmodeself, + admin_verbs_admin, + admin_verbs_fun, + admin_verbs_server, + admin_verbs_debug, + admin_verbs_possess, + admin_verbs_permissions, + /client/proc/stealth, + admin_verbs_rejuv, + admin_verbs_sounds, + admin_verbs_spawn, + debug_verbs + )) + + // NEW ADMIN VERBS SYSTEM + SSadmin_verbs.deassosciate_admin(src) + /client/proc/hide_most_verbs()//Allows you to keep some functionality while hiding some verbs set name = "Adminverbs - Hide Most" set category = "Admin.Misc" @@ -125,35 +171,23 @@ feedback_add_details("admin_verb","CHA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! return -/client/proc/jobbans() - set name = "Display Job bans" - set category = "Admin.Investigate" - if(holder) - if(CONFIG_GET(flag/ban_legacy_system)) - holder.Jobbans() - else - holder.DB_ban_panel() +ADMIN_VERB(jobbans, R_BAN, "Display Job bans", "View job bans here.", "Admin.Investigate") + if(CONFIG_GET(flag/ban_legacy_system)) + user.holder.Jobbans() + else + user.holder.DB_ban_panel() feedback_add_details("admin_verb","VJB") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - return -/client/proc/unban_panel() - set name = "Unban Panel" - set category = "Admin.Game" - if(holder) - if(CONFIG_GET(flag/ban_legacy_system)) - holder.unbanpanel() - else - holder.DB_ban_panel() +ADMIN_VERB(unban_panel, R_BAN, "Unbanning Panel", "Unban players here.", ADMIN_CATEGORY_GAME) + if(CONFIG_GET(flag/ban_legacy_system)) + user.holder.unbanpanel() + else + user.holder.DB_ban_panel() feedback_add_details("admin_verb","UBP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - return -/client/proc/game_panel() - set name = "Game Panel" - set category = "Admin.Game" - if(holder) - holder.Game() +ADMIN_VERB(game_panel, R_ADMIN, "Game Panel", "Look at the state of the game.", ADMIN_CATEGORY_GAME) + user.holder.Game() feedback_add_details("admin_verb","GP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - return /client/proc/secrets() set name = "Secrets" @@ -339,20 +373,16 @@ log_admin("[key_name(usr)] used 'kill air'.") message_admins(span_blue("[key_name_admin(usr)] used 'kill air'."), 1) -/client/proc/deadmin() - set name = "DeAdmin" - set category = "Admin.Misc" - set desc = "Shed your admin powers." - - src.holder.deactivate() +ADMIN_VERB(deadmin, R_NONE, "DeAdmin", "Shed your admin powers.", ADMIN_CATEGORY_MAIN) + user.holder.deactivate() to_chat(src, span_interface("You are now a normal player.")) log_admin("[key_name(src)] deadminned themselves.") message_admins("[key_name_admin(src)] deadminned themselves.") //BLACKBOX_LOG_ADMIN_VERB("Deadmin") feedback_add_details("admin_verb","DAS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - if(isobserver(mob)) - var/mob/observer/dead/our_mob = mob + if(isobserver(user.mob)) + var/mob/observer/dead/our_mob = user.mob our_mob.visualnet?.removeVisibility(our_mob, src) /client/proc/toggle_log_hrefs() @@ -632,24 +662,17 @@ if(tgui_alert(usr, "\The [orbiter] will orbit around [center]. Is this okay?", "Confirm Orbit", list("Yes", "No")) == "Yes") orbiter.orbit(center, distance, clock, speed, segments) -/client/proc/removetickets() - set name = "Security Tickets" - set category = "Admin.Investigate" - set desc = "Allows one to remove tickets from the global list." - - if(!check_rights(R_ADMIN)) - return - +ADMIN_VERB(removetickets, R_ADMIN, "Security Tickets", "Allows one to remove tickets from the global list.", "Admin.Investigate") if(GLOB.security_printer_tickets.len >= 1) - var/input = tgui_input_list(usr, "Which message?", "Security Tickets", GLOB.security_printer_tickets) + var/input = tgui_input_list(user, "Which message?", "Security Tickets", GLOB.security_printer_tickets) if(!input) return - if(tgui_alert(usr, "Do you want to remove the following message from the global list? \"[input]\"", "Remove Ticket", list("Yes", "No")) == "Yes") + if(tgui_alert(user, "Do you want to remove the following message from the global list? \"[input]\"", "Remove Ticket", list("Yes", "No")) == "Yes") GLOB.security_printer_tickets -= input - log_and_message_admins("removed a security ticket from the global list: \"[input]\"", usr) + log_and_message_admins("removed a security ticket from the global list: \"[input]\"", user) else - tgui_alert_async(usr, "The ticket list is empty.","Empty") + tgui_alert_async(user, "The ticket list is empty.","Empty") /client/proc/delbook() set name = "Delete Book" @@ -716,12 +739,5 @@ CONFIG_SET(flag/allow_simple_mob_recolor, !CONFIG_GET(flag/allow_simple_mob_recolor)) to_chat(usr, "You have [CONFIG_GET(flag/allow_simple_mob_recolor) ? "enabled" : "disabled"] newly spawned simple mobs to spawn with the recolour verb") -/client/proc/modify_shift_end() - set name = "Modify Shift End" - set desc = "Modifies the hard shift end time." - set category = "Server.Game" - - if(!check_rights_for(src, R_ADMIN|R_EVENT|R_SERVER)) - return - - transfer_controller.modify_hard_end(src) +ADMIN_VERB(modify_shift_end, (R_ADMIN|R_EVENT|R_SERVER), "Modify Shift End", "Modifies the hard shift end time.", "Server.Game") + transfer_controller.modify_hard_end(user) diff --git a/vorestation.dme b/vorestation.dme index 2e57fa9b609..0725f5c048b 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -370,6 +370,7 @@ #include "code\controllers\configuration\entries\resources.dm" #include "code\controllers\configuration\entries\vorestation.dm" #include "code\controllers\observer_listener\atom\observer.dm" +#include "code\controllers\subsystems\admin_verbs.dm" #include "code\controllers\subsystems\ai.dm" #include "code\controllers\subsystems\aifast.dm" #include "code\controllers\subsystems\air.dm"