Files
vgstation13/code/modules/admin/admin_verbs.dm
2020-03-25 16:20:29 -03:00

1276 lines
48 KiB
Plaintext

//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(
// Everyone has +ADMIN so we don't actually need anything in here.
// Downside: The observers no longer have msay if we lack defaults.
/client/proc/deadmin_self, /*destroys our own admin datum so we can play as a regular player*/
)
var/list/admin_verbs_admin = list(
/datum/admins/proc/show_player_panel, /*shows an interface for individual players, with various links (links require additional flags*/
/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/check_antagonists, /*shows all antags*/
/client/proc/advwho, /*in addition to listing connected ckeys, shows character name and living/dead/antag status for each*/
/datum/admins/proc/checkCID,
/datum/admins/proc/checkCKEY,
// /client/proc/deadchat /*toggles deadchat on/off*/
/client/proc/set_base_turf,
/datum/admins/proc/delay,
/client/proc/SendCentcommFax, /*sends a fax to all fax machines*/
/client/proc/player_panel, /*shows an interface for all players, with links to various panels (old style)*/
/client/proc/player_panel_new, /*shows an interface for all players, with links to various panels*/
/client/proc/invisimin, /*allows our mob to go invisible/visible*/
/datum/admins/proc/show_role_panel, /*interface which shows a mob's mind*/
/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.*/
/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 (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_context_special, /*Currently only for blobs*/
/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*/
/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/getruntimelog, /*allows us to access runtime logs to somebody*/
/client/proc/getserverlog, /*allows us to fetch server logs (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/jumptomapelement, /*allows us to jump to a specific vault*/
/client/proc/admin_call_shuttle, /*allows us to call the emergency shuttle*/
/client/proc/admin_cancel_shuttle, /*allows us to cancel the emergency shuttle, sending it back to centcomm*/
/client/proc/cmd_admin_direct_narrate, /*send text directly to a player with no padding. Useful for narratives and fluff-text*/
/client/proc/cmd_admin_local_narrate, /*send text locally to all players in view, similar to direct narrate*/
/client/proc/cmd_admin_world_narrate, /*sends text to all players with no padding*/
/client/proc/cmd_admin_create_centcom_report,
/client/proc/check_ai_laws, /*shows AI and borg laws*/
/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/investigate_show, /*various admintools for investigation. Such as a singulo grief-log*/
/client/proc/secrets,
/client/proc/shuttle_magic,
/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*/
/client/proc/game_panel, /*game panel, allows to change game-mode etc*/
/client/proc/cmd_admin_say, /*admin-only ooc chat*/
/datum/admins/proc/PlayerNotes,
/client/proc/cmd_mod_say,
/client/proc/cmd_mod_window,
/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/check_customitem_activity,
// /client/proc/man_up,
// /client/proc/global_man_up,
/client/proc/toggle_antagHUD_use,
/client/proc/toggle_antagHUD_restrictions,
/client/proc/allow_character_respawn, /* Allows a ghost to respawn */
/client/proc/watchdog_force_restart, /*forces restart using watchdog feature*/
/client/proc/manage_religions,
/client/proc/set_veil_thickness,
/client/proc/credits_panel, /*allows you to customize the roundend credits before they happen*/
/client/proc/persistence_panel, /*lets you check out the kind of shit that will persist to the next round and say "holy fuck no"*/
/client/proc/diseases_panel,
/client/proc/climate_panel
)
var/list/admin_verbs_ban = list(
/client/proc/unban_panel,
/client/proc/jobbans,
/client/proc/unjobban_panel
// /client/proc/DB_ban_panel
)
var/list/admin_verbs_sounds = list(
/client/proc/play_local_sound,
/client/proc/play_sound
)
var/list/admin_verbs_fun = list(
/datum/admins/proc/media_stop_all,
/client/proc/object_talk,
/client/proc/cmd_admin_gib_self,
/client/proc/drop_bomb,
/client/proc/drop_emp,
/client/proc/cinematic,
/client/proc/one_click_antag,
//client/proc/antag_madness,
/datum/admins/proc/toggle_aliens,
// FUUUUCKED /client/proc/zombie_event, // ZOMBB-B-BIES
/client/proc/cmd_admin_add_freeform_ai_law,
/client/proc/cmd_admin_add_random_ai_law,
/client/proc/toggle_random_events,
/client/proc/set_ooc,
/client/proc/editappear,
/client/proc/commandname,
/client/proc/delete_all_adminbus,
/client/proc/delete_all_bomberman,
/client/proc/create_bomberman_arena,
/client/proc/control_bomberman_arena,
/client/proc/gib_money, // /vg/
/client/proc/smissmas,
/client/proc/achievement,
/client/proc/mommi_static,
/client/proc/makepAI,
/client/proc/set_blob_looks,
/client/proc/set_teleport_pref,
/client/proc/deadchat_singularity,
/client/proc/view_all_rods,
)
var/list/admin_verbs_spawn = list(
/datum/admins/proc/spawn_atom, // Allows us to spawn instances
/client/proc/spawn_datum, //Allows us to spawn datums to the marked datum buffer
/client/proc/respawn_character, //Allows us to re-spawn someone
/client/proc/debug_reagents, //Allows us to spawn reagents in mobs/containers
/client/proc/create_awaymission, //Allows us to summon away missions
/client/proc/create_map_element,
/client/proc/cmd_admin_equip_loadout //Allows us to equip sets of items to mobs
)
var/list/admin_verbs_server = list(
/client/proc/Set_Holiday,
/client/proc/ToRban,
/datum/admins/proc/startnow,
/datum/admins/proc/restart,
/datum/admins/proc/toggleaban,
/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,
/client/proc/toggle_random_events,
/client/proc/check_customitem_activity,
/client/proc/dump_chemreactions,
/client/proc/save_coordinates,
/datum/admins/proc/mass_delete_in_zone,
)
var/list/admin_verbs_debug = list(
/client/proc/gc_dump_hdl,
/client/proc/debug_pooling,
/client/proc/cmd_admin_list_open_jobs,
/proc/getbrokeninhands,
/client/proc/Debug2,
/client/proc/cmd_debug_make_powernets,
/client/proc/debug_controller,
/client/proc/cmd_debug_mob_lists,
/client/proc/cmd_admin_delete,
/client/proc/cmd_debug_del_all,
/client/proc/cmd_debug_tog_aliens,
/client/proc/reload_admins,
/client/proc/restart_controller,
/client/proc/enable_debug_verbs,
/client/proc/callproc,
/client/proc/cmd_admin_dump_instances, // /vg/
/client/proc/cmd_admin_dump_machine_type_list, // /vg/
/client/proc/disable_bloodvirii, // /vg
/client/proc/handle_paperwork, //this is completely experimental
/client/proc/reload_style_sheet,
/client/proc/reset_style_sheet,
/client/proc/test_movable_UI,
/client/proc/test_snap_UI,
/client/proc/configFood,
/client/proc/cmd_dectalk,
/client/proc/debug_reagents,
/client/proc/create_awaymission,
/client/proc/make_invulnerable,
/client/proc/cmd_admin_dump_delprofile,
/client/proc/mob_list,
/client/proc/cure_disease,
/client/proc/check_bomb,
/client/proc/check_convertables,
/client/proc/check_spiral,
/client/proc/check_striketeams,
/client/proc/cmd_admin_find_bad_blood_tracks,
/client/proc/debugNatureMapGenerator,
/client/proc/callatomproc,
/client/proc/view_runtimes,
/client/proc/cmd_mass_modify_object_variables,
/client/proc/emergency_shuttle_panel,
/client/proc/bee_count,
#if UNIT_TESTS_ENABLED
/client/proc/unit_test_panel,
#endif
)
var/list/admin_verbs_possess = list(
/proc/possess,
/proc/release
)
var/list/admin_verbs_permissions = list(
/client/proc/edit_admin_permissions
)
var/list/admin_verbs_rejuv = list(
/client/proc/respawn_character
)
var/list/admin_verbs_polling = list(
/client/proc/create_poll
)
//verbs which can be hidden - needs work
var/list/admin_verbs_hideable = list(
/client/proc/set_ooc,
/client/proc/deadmin_self,
/datum/admins/proc/show_role_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,
/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/play_local_sound,
/client/proc/play_sound,
/client/proc/object_talk,
/client/proc/cmd_admin_gib_self,
/client/proc/drop_bomb,
/client/proc/drop_emp,
/client/proc/cinematic,
/datum/admins/proc/toggle_aliens,
/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/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,
/client/proc/shuttle_magic,
/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/Debug2,
/client/proc/reload_admins,
/client/proc/cmd_debug_make_powernets,
/client/proc/debug_controller,
/client/proc/startSinglo,
/client/proc/cheat_power,
/client/proc/setup_atmos,
/client/proc/cmd_debug_mob_lists,
/client/proc/cmd_debug_del_all,
/client/proc/cmd_debug_tog_aliens,
/client/proc/enable_debug_verbs,
/client/proc/mob_list,
/proc/possess,
/proc/release,
/client/proc/gc_dump_hdl,
/client/proc/debug_pooling,
/client/proc/create_map_element
)
var/list/admin_verbs_mod = list(
/client/proc/cmd_admin_pm_context, /*right-click adminPM interface*/
/client/proc/cmd_admin_pm_context_special,
/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_mod_window,
/datum/admins/proc/show_player_info,
/client/proc/player_panel_new,
/client/proc/vv_marked_datum,
/datum/admins/proc/view_mob_attack_log /* Allow you to view attack logs since doing it in VV sucks */
)
/client/proc/add_admin_verbs()
if(holder)
verbs += admin_verbs_default
if(holder.rights & R_BUILDMODE)
verbs += /client/proc/togglebuildmodeself
if(holder.rights & R_ADMIN)
verbs += admin_verbs_admin
if(holder.rights & R_BAN)
verbs += admin_verbs_ban
if(holder.rights & R_FUN)
verbs += admin_verbs_fun
if(holder.rights & R_SERVER)
verbs += admin_verbs_server
if(holder.rights & R_DEBUG)
verbs += admin_verbs_debug
if(holder.rights & R_POSSESS)
verbs += admin_verbs_possess
if(holder.rights & R_PERMISSIONS)
verbs += admin_verbs_permissions
if(holder.rights & R_POLLING)
verbs += admin_verbs_polling
if(holder.rights & R_STEALTH)
verbs += /client/proc/stealth
if(holder.rights & R_REJUVINATE)
verbs += admin_verbs_rejuv
if(holder.rights & R_SOUNDS)
verbs += admin_verbs_sounds
if(holder.rights & R_SPAWN)
verbs += admin_verbs_spawn
if(holder.rights & R_MOD)
verbs += admin_verbs_mod
if(holder.rights & R_ADMINBUS)
verbs += /client/proc/secrets
/client/proc/remove_admin_verbs()
verbs.Remove(
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,
admin_verbs_mod,
/*Debug verbs added by "show debug verbs"*/
/client/proc/Cell,
/client/proc/pdiff,
/client/proc/do_not_use_these,
/client/proc/camera_view,
/client/proc/sec_camera_report,
/client/proc/intercom_view,
/client/proc/atmosscan,
/client/proc/powerdebug,
/client/proc/count_objects_on_z_level,
/client/proc/count_objects_all,
/client/proc/cmd_assume_direct_control,
/client/proc/startSinglo,
/client/proc/cheat_power,
/client/proc/setup_atmos,
/client/proc/ticklag,
/client/proc/cmd_admin_grantfullaccess,
/client/proc/kaboom,
/client/proc/rigvote,
/client/proc/splash,
/client/proc/cmd_admin_areatest,
/client/proc/readmin,
/proc/generateMiniMaps,
/client/proc/maprender
)
/client/proc/hide_most_verbs()//Allows you to keep some functionality while hiding some verbs
set name = "Adminverbs - Hide Most"
set category = "Admin"
verbs.Remove(/client/proc/hide_most_verbs, admin_verbs_hideable)
verbs += /client/proc/show_verbs
to_chat(src, "<span class='interface'>Most of your adminverbs have been hidden.</span>")
feedback_add_details("admin_verb","HMV") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
return
/client/proc/hide_verbs()
set name = "Adminverbs - Hide All"
set category = "Admin"
remove_admin_verbs()
verbs += /client/proc/show_verbs
to_chat(src, "<span class='interface'>Almost all of your adminverbs have been hidden.</span>")
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"
verbs -= /client/proc/show_verbs
add_admin_verbs()
to_chat(src, "<span class='interface'>All of your adminverbs are now visible.</span>")
feedback_add_details("admin_verb","TAVVS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/admin_ghost()
set category = "Admin"
set name = "Aghost"
if(!holder)
return
if(istype(mob,/mob/dead/observer))
//re-enter
var/mob/dead/observer/ghost = mob
ghost.can_reenter_corpse = 1 //just in-case.
ghost.reenter_corpse()
feedback_add_details("admin_verb","P") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
else if(istype(mob,/mob/new_player))
to_chat(src, "<span class='red'>Error: Aghost: Can't admin-ghost whilst in the lobby. Join or Observe first.</span>")
else
//ghostize
var/mob/body = mob
if(body.mind)
body.mind.isScrying = 1
body.ghostize(1)
if(body && !body.key)
body.key = "@[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!
/client/proc/invisimin()
set name = "Invisimin"
set category = "Admin"
set desc = "Toggles ghost-like invisibility (Don't abuse this)"
if(holder && mob)
if(mob.invisibility == INVISIBILITY_OBSERVER)
mob.invisibility = initial(mob.invisibility)
to_chat(mob, "<span class='danger'>Invisimin off. Invisibility reset.</span>")
mob.icon_state = "ghost"
mob.icon = 'icons/mob/human.dmi'
mob.update_icons()
else
mob.invisibility = INVISIBILITY_OBSERVER
to_chat(mob, "<span class='notice'><b>Invisimin on. You are now as invisible as a ghost.</b></span>")
mob.icon_state = "ghost"
mob.icon = 'icons/mob/mob.dmi'
/client/proc/player_panel()
set name = "Player Panel"
set category = "Admin"
if(holder)
holder.player_panel_old()
feedback_add_details("admin_verb","PP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
return
/client/proc/player_panel_new()
set name = "Player Panel New"
set category = "Admin"
if(holder)
holder.player_panel_new()
feedback_add_details("admin_verb","PPN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
return
/client/proc/check_antagonists()
set name = "Check Antagonists"
set category = "Admin"
if(holder)
holder.check_antagonists()
log_admin("[key_name(usr)] 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!
return
/client/proc/jobbans()
set name = "Display Job bans"
set category = "Admin"
if(holder)
if(config.ban_legacy_system)
holder.Jobbans()
else
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"
if(holder)
if(config.ban_legacy_system)
holder.unbanpanel()
else
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"
if(holder)
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"
set category = "Admin"
if (holder)
holder.Secrets()
feedback_add_details("admin_verb","S") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
return
/client/proc/colorooc()
set category = "Fun"
set name = "OOC Text Color"
if(!holder)
return
var/new_ooccolor = input(src, "Please select your OOC colour.", "OOC colour") as color|null
if(new_ooccolor)
prefs.ooccolor = new_ooccolor
prefs.save_preferences_sqlite(src, ckey)
feedback_add_details("admin_verb","OC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
return
/client/proc/stealth()
set category = "Admin"
set name = "Stealth Mode"
if(holder)
if(holder.fakekey)
holder.fakekey = null
else
var/new_key = ckeyEx(input("Enter your desired display name.", "Fake Key", key) as text|null)
if(!new_key)
return
if(length(new_key) >= 26)
new_key = copytext(new_key, 1, 26)
holder.fakekey = new_key
log_admin("[key_name(usr)] has turned stealth mode [holder.fakekey ? "ON" : "OFF"]")
message_admins("[key_name_admin(usr)] has turned stealth mode [holder.fakekey ? "ON" : "OFF"]", 1)
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 90
/client/proc/warn(warned_ckey)
var/reason = "Autobanning due to too many formal warnings"
if(!check_rights(R_ADMIN))
return
if(!warned_ckey || !istext(warned_ckey))
return
var/datum/preferences/D
var/client/C = directory[warned_ckey]
if(C)
D = C.prefs
else
D = preferences_datums[warned_ckey]
if(!D)
to_chat(src, "<span class='red'>Error: warn(): No such ckey found.</span>")
return
var/warn_reason = input("Reason for warning?", "Admin abuuuuuuuse") as null|text
if(!warn_reason)
return
notes_add(warned_ckey,warn_reason,src.mob)
if(++D.warns >= MAX_WARNS) //uh ohhhh...you'reee iiiiin trouuuubble O:)
var/bantime = AUTOBANTIME//= (++D.warnbans * AUTOBANTIME)
D.warns = 0
++D.warnbans
for(var/i = 1; i < D.warnbans; i++)
bantime *= 2
ban_unban_log_save("[ckey] warned [warned_ckey] - [warn_reason], resulting in a [bantime] minute autoban.")
if(C)
message_admins("[key_name_admin(src)] has warned [key_name_admin(C)] - [warn_reason], resulting in a [bantime] minute ban.")
to_chat(C, "<span class='danger'><BIG>You have been autobanned due to a warning by [ckey] - Reason: [warn_reason].</BIG></span><br>This is a temporary ban, it will be removed in [bantime] minutes.")
else
message_admins("[key_name_admin(src)] has warned [warned_ckey] - [warn_reason], resulting in a [bantime] minute ban.")
AddBan(warned_ckey, D.last_id, "Autobanning due to too many formal warnings - [warn_reason]", ckey, 1, bantime)
holder.DB_ban_record(BANTYPE_TEMP, null, bantime, "[reason] - [warn_reason]", , ,warned_ckey)
feedback_inc("ban_warn",1)
D.save_preferences_sqlite(C, C.ckey)
del(C)
else
if(C)
to_chat(C, "<span class='danger'><BIG>You have been formally warned by an administrator - Reason: [warn_reason].</span></BIG><br>Further warnings will result in an autoban.</font>")
message_admins("[key_name_admin(src)] has warned [key_name_admin(C)] - [warn_reason]. They have [MAX_WARNS-D.warns] strikes remaining. And have been warn banned [D.warnbans] [D.warnbans == 1 ? "time" : "times"]")
else
message_admins("[key_name_admin(src)] has warned [warned_ckey] (DC) - [warn_reason]. They have [MAX_WARNS-D.warns] strikes remaining. And have been warn banned [D.warnbans] [D.warnbans == 1 ? "time" : "times"]")
D.save_preferences_sqlite(C, C.ckey)
feedback_add_details("admin_verb","WARN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/unwarn(warned_ckey)
if(!check_rights(R_ADMIN))
return
if(!warned_ckey || !istext(warned_ckey))
return
/*if(warned_ckey in admin_datums)
to_chat(usr, "<span class='red'>Error: warn(): You can't warn admins.</span>")
return*/
var/datum/preferences/D
var/client/C = directory[warned_ckey]
if(C)
D = C.prefs
else
D = preferences_datums[warned_ckey]
if(!D)
to_chat(src, "<span class='red'>Error: unwarn(): No such ckey found.</span>")
return
if(D.warns == 0)
to_chat(src, "<span class='red'>Error: unwarn(): You can't unwarn someone with 0 warnings, you big dummy.</span>")
return
D.warns-=1
var/strikesleft = MAX_WARNS-D.warns
if(C)
to_chat(C, "<span class='red'><BIG><B>One of your warnings has been removed.</B></BIG><br>You currently have [strikesleft] strike\s left</span>")
message_admins("[key_name_admin(src)] has unwarned [key_name_admin(C)]. They have [strikesleft] strike(s) remaining, and have been warn banned [D.warnbans] [D.warnbans == 1 ? "time" : "times"]")
else
message_admins("[key_name_admin(src)] has unwarned [warned_ckey] (DC). They have [strikesleft] strike(s) remaining, and have been warn banned [D.warnbans] [D.warnbans == 1 ? "time" : "times"]")
D.save_preferences_sqlite(C, C.ckey)
feedback_add_details("admin_verb","UNWARN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
#undef MAX_WARNS
#undef AUTOBANTIME
/client/proc/drop_bomb() // Some admin dickery that can probably be done better -- TLE
set category = "Special Verbs"
set name = "Drop Bomb"
set desc = "Cause an explosion of varying strength at your location."
var/turf/epicenter = mob.loc
var/list/choices = list("Small Bomb (1,2,3)", "Medium Bomb (2,3,4)", "Big Bomb (3,5,7)", "Custom Bomb")
var/choice = input("What size explosion would you like to produce?") in choices | null
switch(choice)
if(null)
return 0
if("Small Bomb (1,2,3)")
explosion(epicenter, 1, 2, 3, 3)
if("Medium Bomb (2,3,4)")
explosion(epicenter, 2, 3, 4, 4)
if("Big Bomb (3,5,7)")
explosion(epicenter, 3, 5, 7, 5)
if("Custom Bomb")
var/devastation_range = input("Devastation range (in tiles):") as num
var/heavy_impact_range = input("Heavy impact range (in tiles):") as num
var/light_impact_range = input("Light impact range (in tiles):") as num
var/flash_range = input("Flash range (in tiles):") as num
explosion(epicenter, devastation_range, heavy_impact_range, light_impact_range, flash_range)
log_admin("[key_name(usr)] creating an admin explosion at [epicenter.loc] ([epicenter.x],[epicenter.y],[epicenter.z]).")
message_admins("<span class='notice'>[key_name_admin(src)] creating an admin explosion at [epicenter.loc] ([epicenter.x],[epicenter.y],[epicenter.z]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[epicenter.x];Y=[epicenter.y];Z=[epicenter.z]'>JMP</A>).</span>")
feedback_add_details("admin_verb","DB") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/drop_emp()
set category = "Special Verbs"
set name = "Drop EMP"
set desc = "Cause an EMP of varying strength at your location."
var/turf/epicenter = mob.loc
var/list/choices = list("Small EMP (1,2)", "Medium EMP (2,4)", "Big EMP (4,8)", "Custom EMP")
var/choice = input("What size EMP would you like to produce?") in choices | null
switch(choice)
if(null)
return 0
if("Small EMP (1,2)")
empulse(epicenter, 1, 2)
if("Medium EMP (2,4)")
empulse(epicenter, 2, 4)
if("Big EMP (4,8)")
empulse(epicenter, 4, 8)
if("Custom EMP")
var/heavy_impact_range = input("Heavy impact range (in tiles):") as num
var/light_impact_range = input("Light impact range (in tiles):") as num
empulse(epicenter, heavy_impact_range, light_impact_range)
log_admin("[key_name(usr)] creating an admin EMP at [epicenter.loc] ([epicenter.x],[epicenter.y],[epicenter.z]).")
message_admins("<span class='notice'>[key_name_admin(src)] creating an admin EMP at [epicenter.loc] ([epicenter.x],[epicenter.y],[epicenter.z]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[epicenter.x];Y=[epicenter.y];Z=[epicenter.z]'>JMP</A>).</span>")
feedback_add_details("admin_verb","DE") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/give_spell(mob/T as mob in mob_list) // -- Urist
set category = "Fun"
set name = "Give Spell"
set desc = "Gives a spell to a mob."
var/spell/S = input("Choose the spell to give to that guy", "ABRAKADABRA") as null|anything in spells
if(!S)
return
T.add_spell(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(T)] the spell [S].")
message_admins("<span class='notice'>[key_name_admin(usr)] gave [key_name(T)] the spell [S].</span>", 1)
/client/proc/toggle_invisible(mob/T as mob in mob_list)
set category = "Fun"
set name = "Toggle invisiblity"
set desc = "Make a mob completely invisible."
if (T.alphas["admin_invis"] == 0)
T.forced_density = 0
T.alphas -= "admin_invis"
else
T.alphas["admin_invis"] = 0
T.density = 0
T.forced_density = 1
to_chat(T, "<span class='notice'>Admin [key_name_admin(usr)] toggled your invisiblity.</span>")
feedback_add_details("admin_verb","MI") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
log_admin("[key_name(usr)] toggled [key_name(T)] invisibility.")
message_admins("<span class='notice'>[key_name_admin(usr)] toggled [key_name(T)] invisibility.</span>", 1)
/client/proc/give_disease(mob/T as mob in mob_list) // -- Giacom
set category = "Fun"
set name = "Give Disease"
set desc = "Gives a Disease to a mob."
var/datum/disease/D = input("Choose the disease to give to that guy", "ACHOO") as null|anything in diseases
if(!D)
return
T.contract_disease(new D, 1)
feedback_add_details("admin_verb","GD") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
log_admin("[key_name(usr)] gave [key_name(T)] the disease [D].")
message_admins("<span class='notice'>[key_name_admin(usr)] gave [key_name(T)] the disease [D].</span>", 1)
/client/proc/togglebuildmodeself()
set name = "Toggle Build Mode Self"
set category = "Special Verbs"
if(src.mob)
togglebuildmode(src.mob)
feedback_add_details("admin_verb","TBMS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/object_talk(var/obj/O in world) // -- TLE
set category = "Special Verbs"
set name = "OSay"
set desc = "Make an object say something"
var/message = input(usr, "What do you want the message to be?", "Make Sound") as text | null
if(!message)
return
var/mob/living/M
var/olduniv
if(ismob(O))
M = O
olduniv = M.universal_speak
M.universal_speak = 1
O.say(message)
if(M)
M.universal_speak = olduniv
log_admin("[key_name(usr)] made [O] at [O.x], [O.y], [O.z] say \"[message]\"")
message_admins("<span class='adminnotice'>[key_name_admin(usr)] made [O] at [O.x], [O.y], [O.z]. say \"[message]\"</span>", 1)
feedback_add_details("admin_verb","OT") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/deadmin_self()
set name = "De-admin self"
set category = "Admin"
if(holder)
if(alert("Are you sure you want to deadmin?","Deadmin","Yes","No")=="No")
return
log_admin("[src] deadminned themself.")
message_admins("[src] deadminned themself.")
deadmin()
verbs += /client/proc/readmin
deadmins += ckey
to_chat(src, "<span class='interface'>You are now a normal player.</span>")
feedback_add_details("admin_verb","DAS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/toggle_log_hrefs()
set name = "Toggle href logging"
set category = "Server"
if(!holder)
return
if(config)
if(config.log_hrefs)
config.log_hrefs = 0
to_chat(src, "<b>Stopped logging hrefs</b>")
else
config.log_hrefs = 1
to_chat(src, "<b>Started logging hrefs</b>")
/client/proc/check_ai_laws()
set name = "Check AI Laws"
set category = "Admin"
if(holder)
log_admin("[key_name(usr)] checked silicon laws.")
src.holder.output_ai_laws()
/client/proc/editappear(mob/living/carbon/human/M as mob in mob_list)
set name = "Edit Appearance"
set category = "Fun"
if(!check_rights(R_FUN))
return
if(!istype(M, /mob/living/carbon/human))
to_chat(usr, "<span class='warning'>You can only do this to humans!</span>")
return
switch(alert("Are you sure you wish to edit this mob's appearance? Skrell, Unathi, Vox and Tajaran can result in unintended consequences.",,"Yes","No"))
if("No")
return
var/new_facial = input("Please select facial hair color.", "Character Generation") as color
if(new_facial)
M.my_appearance.r_facial = hex2num(copytext(new_facial, 2, 4))
M.my_appearance.g_facial = hex2num(copytext(new_facial, 4, 6))
M.my_appearance.b_facial = hex2num(copytext(new_facial, 6, 8))
var/new_hair = input("Please select hair color.", "Character Generation") as color
if(new_facial)
M.my_appearance.r_hair = hex2num(copytext(new_hair, 2, 4))
M.my_appearance.g_hair = hex2num(copytext(new_hair, 4, 6))
M.my_appearance.b_hair = hex2num(copytext(new_hair, 6, 8))
var/new_eyes = input("Please select eye color.", "Character Generation") as color
if(new_eyes)
M.my_appearance.r_eyes = hex2num(copytext(new_eyes, 2, 4))
M.my_appearance.g_eyes = hex2num(copytext(new_eyes, 4, 6))
M.my_appearance.b_eyes = hex2num(copytext(new_eyes, 6, 8))
var/new_tone = input("Please select skin tone level: 1-220 (1=albino, 35=caucasian, 150=black, 220='very' black)", "Character Generation") as text
if (new_tone)
M.my_appearance.s_tone = max(min(round(text2num(new_tone)), 220), 1)
M.my_appearance.s_tone = -M.my_appearance.s_tone + 35
// hair
var/new_hstyle = input(usr, "Select a hair style", "Grooming") as null|anything in hair_styles_list
if(new_hstyle)
M.my_appearance.h_style = new_hstyle
// facial hair
var/new_fstyle = input(usr, "Select a facial hair style", "Grooming") as null|anything in facial_hair_styles_list
if(new_fstyle)
M.my_appearance.f_style = new_fstyle
var/new_gender = alert(usr, "Please select gender.", "Character Generation", "Male", "Female")
if (new_gender)
if(new_gender == "Male")
M.setGender(MALE)
else
M.setGender(FEMALE)
M.update_hair()
M.update_body()
M.check_dna(M)
/client/proc/playernotes()
set name = "Show Player Notes"
set category = "Admin"
if(holder)
holder.PlayerNotes()
return
/client/proc/free_slot()
set name = "Free Job Slot"
set category = "Admin"
if(holder)
var/list/jobs = list()
for (var/datum/job/J in job_master.occupations)
if (J.current_positions >= J.get_total_positions())
jobs += J.title
if (!jobs.len)
to_chat(usr, "There are no fully staffed jobs.")
return
var/job = input("Please select job slot to free", "Free job slot") as null|anything in jobs
if (job)
job_master.FreeRole(job, usr)
return
/client/proc/commandname()
set name = "Set Command Name"
set category = "Fun"
var/text = input(usr,"Please select a new Central Command name.", null)as text|null
if(text)
change_command_name(text)
/client/proc/man_up(mob/T as mob in mob_list)
set category = "Fun"
set name = "Man Up"
set desc = "Tells mob to man up and deal with it."
to_chat(T, "<span class='notice'><b><font size=3>Man up and deal with it.</font></b></span>")
to_chat(T, "<span class='notice'>Move on.</span>")
log_admin("[key_name(usr)] told [key_name(T)] to man up and deal with it.")
message_admins("<span class='notice'>[key_name_admin(usr)] told [key_name(T)] to man up and deal with it.</span>", 1)
/client/proc/readmin()
set name = "Re-admin self"
set category = "Admin"
set desc = "Regain your admin powers."
var/datum/admins/D = admin_datums[ckey]
if(config.admin_legacy_system)
to_chat(src, "<span class='notice'>Legacy admins is not supported yet</span>")
return
else
if(!dbcon.IsConnected())
message_admins("Warning, mysql database is not connected.")
to_chat(src, "Warning, mysql database is not connected.")
return
if(D)
to_chat(src, "You are already an admin.")
verbs -= /client/proc/readmin
return
var/sql_ckey = sanitizeSQL(ckey(ckey))
var/DBQuery/query = dbcon.NewQuery("SELECT ckey, rank, level, flags FROM erro_admin WHERE ckey = '[sql_ckey]'")
query.Execute()
while(query.NextRow())
var/dckey = query.item[1]
var/rank = query.item[2]
if(rank == "Removed")
continue //This person was de-adminned. They are only in the admin list for archive purposes.
var/rights = query.item[4]
if(istext(rights))
rights = text2num(rights)
D = new /datum/admins(rank, rights, dckey)
//find the client for a ckey if they are connected and associate them with the new admin datum
D.associate(src)
message_admins("[src] re-adminned themselves.")
log_admin("[src] re-adminned themselves.")
feedback_add_details("admin_verb","RAS")
verbs -= /client/proc/readmin
return
/client/proc/achievement()
set name = "Give Achievement"
set category = "Fun"
if(!check_rights(R_FUN))
return
var/achoice = "Cancel"
if(!player_list.len)
to_chat(usr, "player list is empty!")
return
var/mob/winner = input("Who's a winner?", "Achievement Winner", null) as null|anything in player_list
if(!winner)
return
var/name = input("What will you call your achievement?", "Achievement Winner", "New Achievement", null) as null|text
if(!name)
return
var/desc = input("What description will you give it?", "Achievement Description", "You Win", null) as null|text
if(!desc)
return
if(istype(winner, /mob/living))
achoice = alert("Are you sure you want to give them an award?","Achievement award", "Confirm", "Cancel")
if(achoice == "Cancel")
return
var/glob = alert("Announce the achievement globally? (Beware! Ruins immersion!)", "Announce To All Players", "No!","Yes!")
var/obj/item/award
achoice = alert("What award should they be given?","Award choice","Gold medal","Gold cup","Dunce cap")
if(achoice == "Gold cup")
award = new /obj/item/weapon/reagent_containers/food/drinks/golden_cup(get_turf(winner))
if(achoice == "Gold medal")
award = new /obj/item/clothing/accessory/medal/gold(get_turf(winner))
if(achoice == "Dunce cap")
award = new /obj/item/clothing/head/dunce_cap(get_turf(winner))
award.name = name
award.desc = desc
if(iscarbon(winner) && (winner.stat == CONSCIOUS))
winner.put_in_hands(award)
if(glob == "No!")
winner.client << sound('sound/misc/achievement.ogg', volume=35)
for(var/mob/dead/observer/O in player_list)
to_chat(O, "<span class='danger'>[bicon(award)] Attention all ghosts, <b>[winner.name]</b> wins \"<b>[name]</b>\"!</span>")
else
world << sound('sound/misc/achievement.ogg', volume=35)
to_chat(world, "<span class='danger'>[bicon(award)] <b>[winner.name]</b> wins \"<b>[name]</b>\"!</span>")
to_chat(winner, "<span class='danger'>[bicon(award)] Congratulations to you, <b>[winner.name]</b>! You have won \"<b>[name]</b>\"!</span>")
var/datum/achievement = new /datum/achievement(award, winner.key, winner.name, name, desc)
ticker.achievements.Add(achievement)
message_admins("[key_name_admin(usr)] has awarded <b>[winner.key]</b>([winner.name]) with the achievement \"<b>[name]</b>\"! \"[desc]\".", 1)
/client/proc/mommi_static()
set name = "Toggle MoMMI Static"
set desc = "Toggle whether MoMMIs can see mobs or if the mobs are cloaked in static"
set category = "Fun"
if(!holder || !config)
return
config.mommi_static = !config.mommi_static
log_admin("[key_name(src)] turned MoMMI static [config.mommi_static ? "on" : "off"].")
message_admins("[key_name(src)] turned MoMMI static [config.mommi_static ? "on" : "off"].")
for(var/mob/living/silicon/robot/mommi/M in player_list)
if(M.can_see_static())
M.add_static_overlays()
else
M.remove_static_overlays()
/client/proc/shuttle_magic()
set name = "Shuttle Magic"
set desc = "Open a menu with magic"
set category = "Admin"
if(!holder || !config)
return
holder.shuttle_magic()
/client/proc/set_blob_looks()
set name = "Set Blob Looks"
set category = "Fun"
var/to_choose_from = list("ADMINBUS (custom DMI upload)")
to_choose_from += blob_looks_admin
var/chosen = input("This will change the looks of every blob currently in the world.", "Blob Looks", blob_looks_admin[1]) as null|anything in to_choose_from
if(!chosen)
return
if(chosen == "ADMINBUS (custom DMI upload)")
adminblob_icon = input("Pick Icon:","Icon") as icon
if(!adminblob_icon)
return
adminblob_size = text2num(alert("Which size are those icons?","","64","32"))
if((adminblob_size == 64) && (alert("Do you want to use a custom Pulse soundfile?","","Yes","No") == "Yes"))
adminblob_beat = input("Pick Soundfile (DO NOT USE AN OVERLY LONG SOUNDFILE UNLESS YOU ARE READY TO FACE THE CONSEQUENCES):","(DO NOT USE AN OVERLY LONG SOUNDFILE UNLESS YOU ARE READY TO FACE THE CONSEQUENCES)") as file
else
adminblob_beat = 'sound/effects/blob_pulse.ogg'
blob_looks_admin["adminbus"] = adminblob_size
chosen = "adminbus"
else
adminblob_icon = null
for(var/obj/effect/blob/B in blobs)
B.looks = chosen
B.update_looks(1)
log_admin("[key_name(src)] set all blobs to use the \"[chosen]\" look.")
message_admins("<span class='notice'>[key_name_admin(src)] set all blobs to use the \"[chosen]\" look.</span>")
/datum/admins/proc/media_stop_all()
set name = "Stop all Media"
set desc = "Stops all music, video and admin sounds."
set category = "Fun"
if(!check_rights(R_FUN))
return
message_admins("[key_name_admin(usr)] has stopped all media.", 1)
stop_all_media()
/client/proc/SendCentcommFax()
set category = "Fun"
set name = "Send Fax"
set desc = "Sends a fax to all fax machines."
var/sent = input(src, "Please enter a message send via secure connection. NOTE: BBCode does not work, but HTML tags do! Use <br> for line breaks.", "Outgoing message from Centcomm", "") as message|null
if(!sent)
return
var/sentname = input(src, "Pick a title for the report", "Title") as text|null
SendFax(sent, sentname, centcomm = 1)
log_admin("[key_name(src)] sent a fax to all machines.: [sent]")
message_admins("[key_name_admin(src)] sent a fax to all machines.", 1)
/client/proc/create_map_element()
set category = "Admin"
set name = "Load Map Element"
set desc = "Loads a map element - a vault, an away mission or something else."
if(!check_rights(R_SPAWN))
return
var/datum/map_element/ME
var/mission_to_load = alert(usr, "How do you want to select the map element?", "Map element loading", "Choose a /datum/map_element object", "Load external .dmm file", "Cancel")
switch(mission_to_load)
if("Choose a /datum/map_element object")
var/new_map_element = input(usr, "Please select the map element object.", "Map element loading") as null|anything in typesof(/datum/map_element) - /datum/map_element
if(!new_map_element)
return
ME = new new_map_element
log_admin("[key_name(src)] is trying to load [ME.file_path].")
if("Load external .dmm file")
to_chat(src, "<span class='danger'>Do not load very large maps or files that aren't BYOND maps. If you want to be sure that your map won't hang up the game, try loading it on a local server first.</span>")
ME = new /datum/map_element
log_admin("[key_name(src)] is trying to load an external map file.")
var/new_file_path = input(usr, "Select a .dmm file. WARNING: Very large map files WILL crash the server. Loading them is punishable by death.", "Map element loading") as null|file
if(!new_file_path)
return
log_admin("[key_name(src)] has selected [new_file_path] for loading.")
ME.file_path = new_file_path
else
return
var/x_coord
var/y_coord
var/z_coord
#define ML_CURRENT_LOC "Use my current location"
#define ML_INPUT_COORDS "Input coordinates"
#define ML_LOAD_TO_Z2 "Find a suitable location at Z-level 2 (done automatically)"
var/static/list/choices = list(
ML_CURRENT_LOC,
ML_INPUT_COORDS,
ML_LOAD_TO_Z2
)
switch(input(usr, "Select a location for the new map element", "Map element loading") as null|anything in choices)
if(ML_CURRENT_LOC)
var/turf/new_location = get_turf(usr)
if(!new_location)
return
x_coord = new_location.x
y_coord = new_location.y
z_coord = new_location.z
if(ML_INPUT_COORDS)
x_coord = input(usr, "Input the X coordinate: ", "Map element loading") as null|num
if(x_coord == null)
return
y_coord = input(usr, "Input the Y coordinate (X = [x_coord]): ", "Map element loading") as null|num
if(y_coord == null)
return
z_coord = input(usr, "Input the Z coordinate. If it's higher than [world.maxz], a new Z-level will be created (X = [x_coord], Y = [y_coord]): ", "Map element loading") as null|num
if(z_coord == null)
return
x_coord = clamp(x_coord, 1, world.maxx)
y_coord = clamp(y_coord, 1, world.maxy)
if(ML_LOAD_TO_Z2)
if(!dungeon_area)
to_chat(src, "<span class='warning'>Dungeon area not defined! This map is missing the /obj/effect/landmark/dungeon_area object.</span>")
return
log_admin("[key_name(src)] is loading [ME.file_path] at z-level 2 (location chosen automatically).")
message_admins("[key_name_admin(src)] is loading [ME.file_path] at z-level 2 (location chosen automatically)")
load_dungeon(ME)
message_admins("[ME.file_path] loaded at [ME.location ? formatJumpTo(ME.location) : "[x_coord], [y_coord], [z_coord]"]")
return
log_admin("[key_name(src)] is loading [ME.file_path] at [x_coord], [y_coord], [z_coord]")
message_admins("[key_name_admin(src)] is loading [ME.file_path] at [x_coord], [y_coord], [z_coord]")
ME.load(x_coord - 1, y_coord - 1, z_coord) //Reduce X and Y by 1 because these arguments are actually offsets, and they're added to 1;1 in the map loader. Without this, spawning something at 1;1 would result in it getting spawned at 2;2
message_admins("[ME.file_path] loaded at [ME.location ? formatJumpTo(ME.location) : "[x_coord], [y_coord], [z_coord]"]")
/client/proc/create_awaymission()
set category = "Admin"
set name = "Create Away Mission"
set desc = "Creates an away mission and links it to the station's gateway."
//Check admin rights
if(!check_rights(R_SPAWN))
return
var/list/L = getRandomZlevels(1)
var/list/choices = list()
if(!L.len)
to_chat(src, "No away missions found.")
return
to_chat(src, "<span class='danger'>WARNING: Loading large away missions may temporarily hang up the server. Usually the lag will last for less than a minute.</span><hr>")
for(var/datum/map_element/away_mission/AM in L)
if(AM.name)
choices[AM.name] = AM
else
choices[AM.file_path] = AM
to_chat(src, "<b>[(AM.name ? AM.name : AM.file_path)]</b> - <span class='info'>[(AM.desc ? AM.desc : "No description")]</span>")
var/choice = input(src, "Select an away mission to load. See chat for descriptions!", "AWAY MISSIONS") as null|anything in choices
if(!choice)
return
log_admin("[key_name(src)] is loading an away mission: [choice]")
message_admins("[key_name_admin(src)] is loading an away mission: [choice]", 1)
var/datum/map_element/away_mission/AM = choices[choice]
var/override = 0
if(existing_away_missions.len)
var/continue_loading = alert(src, "There is already an away mission loaded. Do you want to load [AM.name] anyway? If there are more than two away mission gateways, the station gateway will be able to teleport its users to both of them.", "AWAY MISSIONS", "Yes", "No")
if(!continue_loading)
return
if(continue_loading == "Yes")
override = 1
to_chat(src, "Attempting to load [AM.name] ([AM.file_path])...")
createRandomZlevel(override, AM, usr)
to_chat(src, "The away mission has been generated on z-level [world.maxz] [AM.location ? "([formatJumpTo(AM.location)])" : ""]")
/client/proc/cmd_dectalk()
set name = "Dectalk"
set category = "Special Verbs"
set desc = "Sends a message as voice to all players"
set popup_menu = 0
if(!check_rights(R_DEBUG))
return 0
var/msg
if (args && args.len > 0)
msg = args[1]
msg = input(src, "Sends a message as voice to all players", "Dectalk", msg) as null|message
if (!msg)
return 0
var/audio = dectalk(msg)
if (audio && audio["audio"])
message_admins("[key_name(src)] has used the dectalk verb with message: [audio["message"]]")
log_admin("[key_name(src)] has used the dectalk verb with message: [audio["message"]]")
for (var/client/C in clients)
var/trigger = src.key
chatOutput.ehjax_send(C, "browseroutput", list("dectalk" = audio["audio"], "decTalkTrigger" = trigger))
return 1
else if (audio && audio["cooldown"])
alert(src, "There is a [nextDecTalkDelay] second global cooldown between uses of this verb. Please wait [((world.timeofday + nextDecTalkDelay * 10) - world.timeofday)/10] seconds.")
src.cmd_dectalk(msg)
return 0
else
alert(src, "An external server error has occurred. Please report this.")
return 0
/client/proc/credits_panel()
set name = "Credits Panel"
set category = "Admin"
if(holder)
holder.CreditsPanel()
feedback_add_details("admin_verb","CP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
return
/client/proc/persistence_panel()
set name = "Persistence Panel"
set category = "Admin"
if(holder)
holder.PersistencePanel()
feedback_add_details("admin_verb","PEP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
return
/client/proc/view_all_rods()
set name = "VIEW-ALL-RODS"
set category = "Fun"
if(holder)
holder.ViewAllRods()
feedback_add_details("admin_verb","V-ROD") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
return