/client/proc/add_admin_verbs() // NEW ADMIN VERBS SYSTEM SSadmin_verbs.assosciate_admin(src) /client/proc/remove_admin_verbs() // NEW ADMIN VERBS SYSTEM SSadmin_verbs.deassosciate_admin(src) ADMIN_VERB(hide_verbs, R_HOLDER, "Adminverbs - Hide All", "Hide all admin verbs.", ADMIN_CATEGORY_MISC) SSadmin_verbs.deassosciate_admin(user) add_verb(user, /client/proc/show_verbs) to_chat(user, span_filter_system(span_interface("Almost all of your adminverbs have been hidden."))) feedback_add_details("admin_verb","TAVVH") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! return /client/proc/show_verbs() set name = "Adminverbs - Show" set category = "Admin.Misc" if(!check_rights_for(src, R_HOLDER)) return remove_verb(src, /client/proc/show_verbs) add_admin_verbs() to_chat(src, span_filter_adminlog(span_interface("All of your adminverbs are now visible."))) feedback_add_details("admin_verb","TAVVS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! ADMIN_VERB(admin_ghost, R_HOLDER, "Aghost", "Ghost out of your body with the option to return at any time.", ADMIN_CATEGORY_GAME) var/build_mode if(user.buildmode) build_mode = tgui_alert(user, "You appear to be currently in buildmode. Do you want to re-enter buildmode after aghosting?", "Buildmode", list("Yes", "No")) if(build_mode != "Yes") to_chat(user, "Will not re-enter buildmode after switch.") var/mob/mob = user.mob if(isobserver(mob)) //re-enter var/mob/observer/dead/ghost = mob if(ghost.can_reenter_corpse) if(build_mode) togglebuildmode(mob) ghost.reenter_corpse() if(build_mode == "Yes") togglebuildmode(mob) else ghost.reenter_corpse() else to_chat(ghost, span_filter_system(span_warning("Error: Aghost: Can't reenter corpse."))) return feedback_add_details("admin_verb","P") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! else if(isnewplayer(mob)) to_chat(user, span_filter_system(span_warning("Error: Aghost: Can't admin-ghost whilst in the lobby. Join or Observe first."))) else //ghostize var/mob/body = mob var/mob/observer/dead/ghost if(build_mode) togglebuildmode(body) ghost = body.ghostize(1, TRUE) if(build_mode == "Yes") togglebuildmode(ghost) else ghost = body.ghostize(1, TRUE) user.init_verbs() if(body) body.teleop = ghost if(!body.key) body.key = "@[user.key]" //Haaaaaaaack. But the people have spoken. If it breaks; blame adminbus feedback_add_details("admin_verb","O") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! ADMIN_VERB(invisimin, R_ADMIN|R_MOD|R_EVENT, "Invisimin", "Toggles ghost-like invisibility (Don't abuse this).", ADMIN_CATEGORY_GAME) var/mob/mob = user.mob if(mob.invisibility > INVISIBILITY_OBSERVER) to_chat(user, span_warning("You can't use this, your current invisibility level ([mob.invisibility]) is above the observer level ([INVISIBILITY_OBSERVER]).")) return if(mob.invisibility == INVISIBILITY_OBSERVER) mob.invisibility = initial(mob.invisibility) to_chat(mob, span_filter_system(span_danger("Invisimin off. Invisibility reset."))) mob.alpha = max(mob.alpha + 100, 255) return mob.invisibility = INVISIBILITY_OBSERVER to_chat(mob, span_filter_system(span_boldnotice("Invisimin on. You are now as invisible as a ghost."))) mob.alpha = max(mob.alpha - 100, 0) ADMIN_VERB(list_bombers, R_ADMIN, "List Bombers", "Look at all bombs and their likely culprit.", ADMIN_CATEGORY_GAME) user.holder.list_bombers() //BLACKBOX_LOG_ADMIN_VERB("List Bombers") ADMIN_VERB(list_signalers, R_ADMIN, "List Signalers", "View all signalers.", ADMIN_CATEGORY_GAME) user.holder.list_signalers() //BLACKBOX_LOG_ADMIN_VERB("List Signalers") ADMIN_VERB(list_law_changes, R_ADMIN, "List Law Changes", "View all AI law changes.", ADMIN_CATEGORY_DEBUG_INVESTIGATE) user.holder.list_law_changes() //BLACKBOX_LOG_ADMIN_VERB("List Law Changes") ADMIN_VERB(show_manifest, R_ADMIN, "Show Manifest", "View the shift's Manifest.", ADMIN_CATEGORY_DEBUG_GAME) user.holder.show_manifest() //BLACKBOX_LOG_ADMIN_VERB("Show Manifest") ADMIN_VERB(player_panel, R_HOLDER, "Player Panel", "Open the player panel.", ADMIN_CATEGORY_GAME) user.holder.player_panel_old(user) feedback_add_details("admin_verb","PP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! ADMIN_VERB(player_panel_new, R_HOLDER, "Player Panel New", "Open the player panel.", ADMIN_CATEGORY_GAME) user.holder.player_panel_new(user) feedback_add_details("admin_verb","PPN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! ADMIN_VERB(check_antagonists, R_HOLDER, "Check Antagonists", "Open the antagonist panel.", ADMIN_CATEGORY_INVESTIGATE) user.holder.check_antagonists(user) log_admin("[key_name(user)] checked antagonists.") //for tsar~ feedback_add_details("admin_verb","CHA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! ADMIN_VERB(jobbans, R_BAN, "Display Job bans", "View job bans here.", ADMIN_CATEGORY_INVESTIGATE) if(CONFIG_GET(flag/ban_legacy_system)) user.holder.Jobbans() else user.holder.DB_ban_panel(user) feedback_add_details("admin_verb","VJB") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! 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(user) feedback_add_details("admin_verb","UBP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! ADMIN_VERB(game_panel, R_ADMIN|R_SERVER|R_FUN, "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! /// Returns this client's stealthed ckey /client/proc/getStealthKey() return GLOB.stealthminID[ckey] /client/proc/findStealthKey(txt) if(txt) for(var/P in GLOB.stealthminID) if(GLOB.stealthminID[P] == txt) return P txt = GLOB.stealthminID[ckey] return txt /client/proc/createStealthKey() var/num = (rand(0,1000)) var/i = 0 while(i == 0) i = 1 for(var/P in GLOB.stealthminID) if(num == GLOB.stealthminID[P]) num++ i = 0 GLOB.stealthminID["[ckey]"] = "@[num2text(num)]" ADMIN_VERB(stealth, R_STEALTH, "Stealth Mode", "Toggle stealth.", ADMIN_CATEGORY_GAME) if(user.holder.fakekey) user.holder.fakekey = null if(isnewplayer(user.mob)) user.mob.name = capitalize(user.ckey) else var/new_key = ckeyEx(tgui_input_text(user, "Enter your desired display name.", "Fake Key", user.key)) if(!new_key) return if(length(new_key) >= 26) new_key = copytext(new_key, 1, 26) user.holder.fakekey = new_key user.createStealthKey() if(isnewplayer(user.mob)) user.mob.name = new_key log_and_message_admins("has turned stealth mode [user.holder.fakekey ? "ON" : "OFF"]", usr) feedback_add_details("admin_verb","SM") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! #define MAX_WARNS 3 #define AUTOBANTIME 10 /client/proc/warn(warned_ckey) if(!check_rights(R_ADMIN)) return if(!warned_ckey || !istext(warned_ckey)) return if(warned_ckey in GLOB.admin_datums) to_chat(usr, span_warning("Error: warn(): You can't warn admins.")) return var/datum/preferences/D var/client/C = GLOB.directory[warned_ckey] if(C) D = C.prefs else D = GLOB.preferences_datums[warned_ckey] if(!D) to_chat(src, span_warning("Error: warn(): No such ckey found.")) return if(++D.warns >= MAX_WARNS) //uh ohhhh...you'reee iiiiin trouuuubble O:) ban_unban_log_save("[ckey] warned [warned_ckey], resulting in a [AUTOBANTIME] minute autoban.") if(C) message_admins("[key_name_admin(src)] has warned [key_name_admin(C)] resulting in a [AUTOBANTIME] minute ban.") to_chat(C, span_filter_system(span_danger("You have been autobanned due to a warning by [ckey].
This is a temporary ban, it will be removed in [AUTOBANTIME] minutes."))) del(C) else message_admins("[key_name_admin(src)] has warned [warned_ckey] resulting in a [AUTOBANTIME] minute ban.") AddBan(warned_ckey, D.last_id, "Autobanning due to too many formal warnings", ckey, 1, AUTOBANTIME) feedback_inc("ban_warn",1) else if(C) to_chat(C, span_filter_system(span_danger("You have been formally warned by an administrator.
Further warnings will result in an autoban."))) message_admins("[key_name_admin(src)] has warned [key_name_admin(C)]. They have [MAX_WARNS-D.warns] strikes remaining.") else message_admins("[key_name_admin(src)] has warned [warned_ckey] (DC). They have [MAX_WARNS-D.warns] strikes remaining.") feedback_add_details("admin_verb","WARN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! #undef MAX_WARNS #undef AUTOBANTIME ADMIN_VERB(drop_bomb, R_FUN, "Drop Bomb", "Cause an explosion of varying strength at your location.", ADMIN_CATEGORY_FUN_DO_NOT) // Some admin dickery that can probably be done better -- TLE var/turf/epicenter = user.mob.loc var/list/choices = list("Small Bomb", "Medium Bomb", "Big Bomb", "Maxcap Bomb", "SM Blast", "Custom Bomb", "Cancel") var/choice = tgui_input_list(user, "What size explosion would you like to produce?", "Explosion Choice", choices) switch(choice) if(null) return FALSE if("Cancel") return FALSE if("Small Bomb") explosion(epicenter, 1, 2, 3, 3) if("Medium Bomb") explosion(epicenter, 2, 3, 4, 4) if("Big Bomb") explosion(epicenter, 3, 5, 7, 5) if("Maxcap Bomb") // Being able to test what players can legally make themselves sounds good, no?~ explosion(epicenter, BOMBCAP_DVSTN_RADIUS, BOMBCAP_HEAVY_RADIUS, BOMBCAP_LIGHT_RADIUS, BOMBCAP_FLASH_RADIUS) if("SM Blast") explosion(epicenter, 8, 16, 24, 32) if("Custom Bomb") var/devastation_range = tgui_input_number(user, "Devastation range (in tiles):") var/heavy_impact_range = tgui_input_number(user, "Heavy impact range (in tiles):") var/light_impact_range = tgui_input_number(user, "Light impact range (in tiles):") var/flash_range = tgui_input_number(user, "Flash range (in tiles):") explosion(epicenter, devastation_range, heavy_impact_range, light_impact_range, flash_range) message_admins(span_blue("[user.ckey] creating an admin explosion at [epicenter.loc].")) feedback_add_details("admin_verb","DB") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! ADMIN_VERB(admin_give_modifier, R_EVENT, "Give Modifier", "Makes a mob weaker or stronger by adding a specific modifier to them.", ADMIN_CATEGORY_DEBUG_GAME, mob/living/living_target) if(!living_target) to_chat(user, span_warning("Looks like you didn't select a mob.")) return var/list/possible_modifiers = subtypesof(/datum/modifier) var/new_modifier_type = tgui_input_list(user, "What modifier should we add to [living_target]?", "Modifier Type", possible_modifiers) if(!new_modifier_type) return var/duration = tgui_input_number(user, "How long should the new modifier last, in seconds. To make it last forever, write '0'.", "Modifier Duration") if(duration == 0) duration = null else duration = duration SECONDS living_target.add_modifier(new_modifier_type, duration) log_and_message_admins("has given [key_name(living_target)] the modifer [new_modifier_type], with a duration of [duration ? "[duration / 600] minutes" : "forever"].", user) ADMIN_VERB_AND_CONTEXT_MENU(make_sound, R_FUN, "Make Sound", "Display a message to everyone who can hear the target.", ADMIN_CATEGORY_FUN_SOUNDS, obj/target_object in world) if(!target_object) return var/message = tgui_input_text(user, "What do you want the message to be?", "Make Sound", "", MAX_MESSAGE_LEN) if(!message) return target_object.audible_message(message) log_admin("[key_name(user)] made [target_object] at [target_object.x], [target_object.y], [target_object.z]. make a sound") message_admins(span_blue("[key_name_admin(user)] made [target_object] at [target_object.x], [target_object.y], [target_object.z]. make a sound.")) feedback_add_details("admin_verb","MS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! ADMIN_VERB_AND_CONTEXT_MENU(togglebuildmodeself, R_BUILDMODE, "Toggle Build Mode Self", "Toggles buildmode on oneself.", ADMIN_CATEGORY_DEBUG_EVENTS) togglebuildmode(user.mob) feedback_add_details("admin_verb","TBMS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! ADMIN_VERB(object_talk, R_FUN, "oSay", "Display a message to everyone who can hear the target.", ADMIN_CATEGORY_FUN_NARRATE, msg as text) var/mob/user_mob = user.mob if(!user_mob.control_object) return if(!msg) return for(var/mob/V in hearers(user_mob.control_object)) V.show_message(span_filter_say(span_bold("[user_mob.control_object.name]") + " says: \"[msg]\""), 2) feedback_add_details("admin_verb","OT") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! ADMIN_VERB(kill_air, R_SERVER, "Kill Air", "Toggle Air Processing.", ADMIN_CATEGORY_DEBUG_DANGEROUS) SSair.can_fire = !SSair.can_fire to_chat(user, span_filter_system(span_bold("[SSair.can_fire ? "En" : "Dis"]abled air processing."))) feedback_add_details("admin_verb","KA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! log_and_message_admins("used 'kill air'.", user) ADMIN_VERB(deadmin, R_NONE, "DeAdmin", "Shed your admin powers.", ADMIN_CATEGORY_MISC) user.holder.deactivate() to_chat(user, span_interface("You are now a normal player.")) log_admin("[key_name(user)] deadminned themselves.") message_admins("[key_name_admin(user)] 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(user.mob)) var/mob/observer/dead/our_mob = user.mob our_mob.visualnet?.removeVisibility(our_mob, user) ADMIN_VERB(toggle_log_hrefs, R_SERVER, "Toggle href logging", "Allows to toggle the logging of used hrefs.", ADMIN_CATEGORY_SERVER_CONFIG) if(!config) return CONFIG_SET(flag/log_hrefs, !CONFIG_GET(flag/log_hrefs)) message_admins(span_bold("[key_name_admin(user)] [CONFIG_GET(flag/log_hrefs) ? "started" : "stopped"] logging hrefs")) ADMIN_VERB(check_ai_laws, R_ADMIN|R_FUN|R_EVENT, "Check AI Laws", "Display the current AI laws.", ADMIN_CATEGORY_SILICON) user.holder.output_ai_laws() ADMIN_VERB(rename_silicon, R_ADMIN|R_FUN|R_EVENT, "Rename Silicon", "Rename a silicon mob.", ADMIN_CATEGORY_SILICON) var/mob/living/silicon/silicon_target = tgui_input_list(user, "Select silicon.", "Rename Silicon.", GLOB.silicon_mob_list) if(!silicon_target) return var/new_name = sanitizeSafe(tgui_input_text(user, "Enter new name. Leave blank or as is to cancel.", "[silicon_target.real_name] - Enter new silicon name", silicon_target.real_name, encode = FALSE)) if(new_name && new_name != silicon_target.real_name) log_and_message_admins("has renamed the silicon '[silicon_target.real_name]' to '[new_name]'") silicon_target.SetName(new_name) feedback_add_details("admin_verb","RAI") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! ADMIN_VERB(manage_silicon_laws, R_ADMIN|R_EVENT, "Manage Silicon Laws", "Allows to modify silicon laws.", ADMIN_CATEGORY_SILICON) var/mob/living/silicon/selected_silicon = tgui_input_list(user, "Select silicon.", "Manage Silicon Laws", GLOB.silicon_mob_list) if(!selected_silicon) return var/datum/tgui_module/law_manager/admin/law_interface = new(selected_silicon) law_interface.tgui_interact(user.mob) log_and_message_admins("has opened [selected_silicon]'s law manager.") feedback_add_details("admin_verb","MSL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! ADMIN_VERB(change_security_level, R_ADMIN|R_EVENT, "Set security level", "Sets the station security level.", ADMIN_CATEGORY_EVENTS) var/sec_level = tgui_input_list(user, "It's currently code [get_security_level()].", "Select Security Level", (list("green","yellow","violet","orange","blue","red","delta")-get_security_level())) if(!sec_level) return if(tgui_alert(user, "Switch from code [get_security_level()] to code [sec_level]?","Change security level?",list("Yes","No")) == "Yes") set_security_level(sec_level) log_admin("[key_name(user)] changed the security level to code [sec_level].") ADMIN_VERB(shuttle_panel, R_ADMIN|R_EVENT, "Shuttle Control Panel", "Access the shuttle control panel.", ADMIN_CATEGORY_EVENTS) var/datum/tgui_module/admin_shuttle_controller/A = new(src) A.tgui_interact(user.mob) log_and_message_admins("has opened the shuttle panel.", user) feedback_add_details("admin_verb","SHCP") ADMIN_VERB(free_slot, R_ADMIN|R_FUN|R_EVENT, "Free Job Slot", "Frees another job slot.", ADMIN_CATEGORY_EVENTS) var/list/jobs = list() for(var/datum/job/J in SSjob.occupations) if (J.current_positions >= J.total_positions && J.total_positions != -1) jobs += J.title if(!jobs.len) to_chat(usr, "There are no fully staffed jobs.") return var/job = tgui_input_list(usr, "Please select job slot to free", "Free job slot", jobs) if(job) SSjob.free_role(job) message_admins("A job slot for [job] has been opened by [key_name_admin(usr)]") return ADMIN_VERB(toggleghostwriters, R_ADMIN|R_FUN|R_EVENT, "Toggle ghost writers", "Toggles ghost writing.", ADMIN_CATEGORY_SERVER_GAME) if(!config) return CONFIG_SET(flag/cult_ghostwriter, !CONFIG_GET(flag/cult_ghostwriter)) message_admins("Admin [key_name_admin(user)] has [CONFIG_GET(flag/cult_ghostwriter) ? "en" : "dis"]abled ghost writers.") ADMIN_VERB(toggledrones, R_ADMIN|R_FUN|R_EVENT, "Toggle maintenance drones", "Toggles maintenance drone.", ADMIN_CATEGORY_SERVER_GAME) if(!config) return CONFIG_SET(flag/allow_drone_spawn, !CONFIG_GET(flag/allow_drone_spawn)) message_admins("Admin [key_name_admin(user)] has [CONFIG_GET(flag/allow_drone_spawn) ? "en" : "dis"]abled maintenance drones.") ADMIN_VERB(man_up, R_ADMIN|R_FUN, "Man Up", "Tells mob to man up and deal with it.", ADMIN_CATEGORY_FUN_DO_NOT) var/mob/living/living_target = tgui_input_list(user, "Who to tell to man up and deal with it.", "Man up", GLOB.mob_list) if(!living_target) return if(tgui_alert(user, "Are you sure you want to tell them to man up?", "Confirmation", list("Deal with it","No")) != "Deal with it") return to_chat(living_target, span_filter_system(span_boldnotice(span_large("Man up and deal with it.")))) to_chat(living_target, span_filter_system(span_notice("Move along."))) log_admin("[key_name(user)] told [key_name(living_target)] to man up and deal with it.") message_admins(span_blue("[key_name_admin(user)] told [key_name(living_target)] to man up and deal with it."), 1) ADMIN_VERB(global_man_up, R_ADMIN|R_FUN, "Man Up Global", "Tells everyone to man up and deal with it.", ADMIN_CATEGORY_FUN_DO_NOT) if(tgui_alert(user, "Are you sure you want to tell the whole server up?","Confirmation",list("Deal with it","No")) != "Deal with it") return for (var/mob/target_mob in GLOB.mob_list) to_chat(target_mob, "
" + span_filter_system(span_notice(span_bold(span_huge("Man up.
Deal with it.")) + "
Move along.")) + "

") DIRECT_OUTPUT(target_mob, 'sound/voice/manup1.ogg') log_and_message_admins("told everyone to man up and deal with it.", user) ADMIN_VERB(give_spell, R_FUN, "Give Spell", ADMIN_VERB_NO_DESCRIPTION, ADMIN_CATEGORY_HIDDEN, mob/spell_recipient) var/datum/spell/S = tgui_input_list(user, "Choose the spell to give to that guy", "ABRAKADABRA", typesof(/datum/spell)) if(!S) return spell_recipient.spell_list += new S feedback_add_details("admin_verb","GS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! log_admin("[key_name(usr)] gave [key_name(spell_recipient)] the spell [S].") message_admins(span_blue("[key_name_admin(usr)] gave [key_name(spell_recipient)] the spell [S]."), 1) ADMIN_VERB(remove_spell, R_FUN, "Remove Spell", ADMIN_VERB_NO_DESCRIPTION, ADMIN_CATEGORY_HIDDEN, mob/removal_target) var/list/target_spell_list = list() for(var/datum/spell/spell in removal_target.spell_list) target_spell_list[spell.name] = spell if(!length(target_spell_list)) return var/chosen_spell = tgui_input_list(user, "Choose the spell to remove from [removal_target]", "ABRAKADABRA", sortList(target_spell_list)) if(isnull(chosen_spell)) return var/datum/spell/to_remove = target_spell_list[chosen_spell] if(!istype(to_remove)) return qdel(to_remove) log_admin("[key_name(user)] removed the spell [chosen_spell] from [key_name(removal_target)].") message_admins("[key_name_admin(user)] removed the spell [chosen_spell] from [key_name_admin(removal_target)].") feedback_add_details("admin_verb","RS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! //BLACKBOX_LOG_ADMIN_VERB("Remove Spell") ADMIN_VERB(debug_statpanel, R_DEBUG, "Debug Stat Panel", "Toggles local debug of the stat panel.", ADMIN_CATEGORY_DEBUG_MISC) user.stat_panel.send_message("create_debug") ADMIN_VERB(spawn_reagent, R_DEBUG|R_EVENT, "Spawn Reagent", "Spawn any reagent.", ADMIN_CATEGORY_DEBUG_GAME) var/datum/reagent/new_reagent = tgui_input_list(user, "Select a reagent to spawn", "Reagent Spawner", subtypesof(/datum/reagent)) if(!new_reagent) return var/mob/user_mob = user.mob var/obj/item/reagent_containers/glass/bottle/new_bottle = new(user_mob.loc) new_bottle.icon_state = "bottle-1" new_bottle.reagents.add_reagent(new_reagent.id, 60) new_bottle.name = "[new_bottle.name] of [new_reagent.name]" ADMIN_VERB(add_hidden_area, R_ADMIN|R_FUN, "Add Ghostsight Block Area", "Blocks ghost sight in the taget area.", ADMIN_CATEGORY_GAME) var/list/blocked_areas = list() for(var/type, value in GLOB.areas_by_type) var/area/current_area = value if(!current_area.flag_check(AREA_BLOCK_GHOST_SIGHT)) blocked_areas[current_area.name] = current_area blocked_areas = sortTim(blocked_areas, GLOBAL_PROC_REF(cmp_text_asc)) var/selected_area = tgui_input_list(user, "Pick an area to hide from ghost", "Select Area to hide", blocked_areas) var/area/target_area = blocked_areas[selected_area] if(!target_area) return target_area.flags |= AREA_BLOCK_GHOST_SIGHT GLOB.ghostnet.addArea(target_area) ADMIN_VERB(remove_hidden_area, R_ADMIN|R_FUN, "Remove Ghostsight Block Area", "Unblocks ghost sight in the taget area.", ADMIN_CATEGORY_GAME) var/list/blocked_areas = list() for(var/type, value in GLOB.areas_by_type) var/area/current_area = value if(current_area.flag_check(AREA_BLOCK_GHOST_SIGHT)) blocked_areas[current_area.name] = current_area blocked_areas = sortTim(blocked_areas, GLOBAL_PROC_REF(cmp_text_asc)) var/selected_area = tgui_input_list(user, "Pick a from ghost hidden area to let them see it again", "Select Hidden Area", blocked_areas) var/area/target_area = blocked_areas[selected_area] if(!target_area) return target_area.flags &= ~(AREA_BLOCK_GHOST_SIGHT) GLOB.ghostnet.removeArea(target_area) ADMIN_VERB(hide_motion_tracker_feedback, R_ADMIN|R_EVENT, "Toggle Motion Echos", "Hides or reveals motion tracker echos globally.", ADMIN_CATEGORY_EVENTS) SSmotiontracker.hide_all = !SSmotiontracker.hide_all log_admin("[key_name(user)] changed the motion echo visibility to [SSmotiontracker.hide_all ? "hidden" : "visible"].") ADMIN_VERB(adminorbit, R_FUN, "Orbit Things", "Makes something orbit around something else.", ADMIN_CATEGORY_FUN_EVENT_KIT) var/center var/atom/movable/orbiter var/input var/datum/marked_datum = user.holder.marked_datum if(marked_datum) input = tgui_alert(user, "You have \n[marked_datum] marked, should this be the center of the orbit, or the orbiter?", "Orbit", list("Center", "Orbiter", "Neither")) switch(input) if("Center") center = marked_datum if("Orbiter") orbiter = marked_datum var/list/possible_things = list() for(var/T as mob in view(user.view)) //Let's do mobs before objects if(ismob(T)) possible_things |= T for(var/T as obj in view(user.view)) if(isobj(T)) possible_things |= T if(!center) center = tgui_input_list(user, "What should act as the center of the orbit?", "Center", possible_things) possible_things -= center if(!orbiter) orbiter = tgui_input_list(user, "What should act as the orbiter of the orbit?", "Orbiter", possible_things) if(!center || !orbiter) to_chat(user, span_warning("A center of orbit and an orbiter must be configured. You can also do this by marking a target.")) return if(center == orbiter) to_chat(user, span_warning("The center of the orbit cannot also be the orbiter.")) return if(isturf(orbiter)) to_chat(user, span_warning("The orbiter cannot be a turf. It can only be used as a center.")) return var/distance = tgui_input_number(user, "How large will their orbit radius be? (In pixels. 32 is 'near around a character)", "Orbit Radius", 32) var/speed = tgui_input_number(user, "How fast will they orbit (negative numbers spin clockwise)", "Orbit Speed", 20) var/segments = tgui_input_number(user, "How many segments will they have in their orbit? (3 is a triangle, 36 is a circle, etc)", "Orbit Segments", 36) var/clock = FALSE if(!distance) distance = 32 if(!speed) speed = 20 else if (speed < 0) clock = TRUE speed *= -1 if(!segments) segments = 36 if(tgui_alert(user, "\The [orbiter] will orbit around [center]. Is this okay?", "Confirm Orbit", list("Yes", "No")) == "Yes") orbiter.orbit(center, distance, clock, speed, segments) ADMIN_VERB(removetickets, R_ADMIN, "Security Tickets", "Allows one to remove tickets from the global list.", ADMIN_CATEGORY_INVESTIGATE) if(GLOB.security_printer_tickets.len >= 1) var/input = tgui_input_list(user, "Which message?", "Security Tickets", GLOB.security_printer_tickets) if(!input) return 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]\"", user) else tgui_alert_async(user, "The ticket list is empty.","Empty") ADMIN_VERB(delbook, R_ADMIN, "Delete Book", "Permamently deletes a book from the database.", ADMIN_CATEGORY_GAME) var/obj/machinery/librarycomp/our_comp for(var/obj/machinery/librarycomp/l in world) our_comp = l break if(!our_comp) to_chat(user, span_warning("Unable to locate a library computer to use for book deleting.")) return var/dat = "Book Inventory Management\n" dat += "

ADMINISTRATIVE MANAGEMENT

" if(!SSdbcore.IsConnected()) dat += span_red(span_bold("ERROR") + ": Unable to contact External Archive. Please contact your system administrator for assistance.") else dat += {"(Order book by SS13BN)

" dat += "
TITLE\[Del\]" dat += "
" qdel(query) var/datum/browser/popup = new(user, "library", "Delete Book") popup.set_content(dat) popup.open() ADMIN_VERB(toggle_spawning_with_recolour, R_ADMIN|R_EVENT|R_FUN, "Toggle Simple/Robot recolour verb", "Makes it so new robots/simple_mobs spawn with a verb to recolour themselves for this round. You must set them separately.", ADMIN_CATEGORY_SERVER_GAME) var/which = tgui_alert(user, "Which do you want to toggle?", "Choose Recolour Toggle", list("Robot", "Simple Mob")) switch(which) if("Robot") CONFIG_SET(flag/allow_robot_recolor, !CONFIG_GET(flag/allow_robot_recolor)) to_chat(user, "You have [CONFIG_GET(flag/allow_robot_recolor) ? "enabled" : "disabled"] newly spawned cyborgs to spawn with the recolour verb") if("Simple Mob") CONFIG_SET(flag/allow_simple_mob_recolor, !CONFIG_GET(flag/allow_simple_mob_recolor)) to_chat(user, "You have [CONFIG_GET(flag/allow_simple_mob_recolor) ? "enabled" : "disabled"] newly spawned simple mobs to spawn with the recolour verb") ADMIN_VERB(modify_shift_end, (R_ADMIN|R_EVENT|R_SERVER), "Modify Shift End", "Modifies the hard shift end time.", ADMIN_CATEGORY_SERVER_GAME) SStransfer.modify_hard_end(user)