From e3a4d6ad613074e2d8207e9a3ad5e9a5af49b9b5 Mon Sep 17 00:00:00 2001 From: CHOMPStation2 <58959929+CHOMPStation2@users.noreply.github.com> Date: Wed, 20 Dec 2023 17:05:40 -0700 Subject: [PATCH] [MIRROR] Sound updates (#7430) Co-authored-by: Heroman3003 <31296024+Heroman3003@users.noreply.github.com> Co-authored-by: Selis Co-authored-by: Selis --- code/__defines/cooldowns.dm | 65 +- code/_helpers/shell.dm | 60 ++ code/controllers/configuration.dm | 21 +- code/controllers/subsystems/timer.dm | 20 + code/datums/datum.dm | 38 + code/modules/admin/admin_verb_lists.dm | 10 +- code/modules/admin/admin_verb_lists_vr.dm | 6 +- code/modules/admin/verbs/playsound.dm | 218 +++- config/example/config.txt | 1200 +++++++++++---------- vorestation.dme | 1 + 10 files changed, 1017 insertions(+), 622 deletions(-) create mode 100644 code/_helpers/shell.dm diff --git a/code/__defines/cooldowns.dm b/code/__defines/cooldowns.dm index c3855d7ab3..a04c83a4e2 100644 --- a/code/__defines/cooldowns.dm +++ b/code/__defines/cooldowns.dm @@ -1,3 +1,62 @@ +//// COOLDOWN SYSTEMS +/* + * We have 2 cooldown systems: timer cooldowns (divided between stoppable and regular) and world.time cooldowns. + * + * When to use each? + * + * * Adding a commonly-checked cooldown, like on a subsystem to check for processing + * * * Use the world.time ones, as they are cheaper. + * + * * Adding a rarely-used one for special situations, such as giving an uncommon item a cooldown on a target. + * * * Timer cooldown, as adding a new variable on each mob to track the cooldown of said uncommon item is going too far. + * + * * Triggering events at the end of a cooldown. + * * * Timer cooldown, registering to its signal. + * + * * Being able to check how long left for the cooldown to end. + * * * Either world.time or stoppable timer cooldowns, depending on the other factors. Regular timer cooldowns do not support this. + * + * * Being able to stop the timer before it ends. + * * * Either world.time or stoppable timer cooldowns, depending on the other factors. Regular timer cooldowns do not support this. +*/ + + +/* + * Cooldown system based on an datum-level associative lazylist using timers. +*/ + +// admin verb cooldowns +#define COOLDOWN_INTERNET_SOUND "internet_sound" + +//TIMER COOLDOWN MACROS + +#define COMSIG_CD_STOP(cd_index) "cooldown_[cd_index]" +#define COMSIG_CD_RESET(cd_index) "cd_reset_[cd_index]" + +#define TIMER_COOLDOWN_START(cd_source, cd_index, cd_time) LAZYSET(cd_source.cooldowns, cd_index, addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(end_cooldown), cd_source, cd_index), cd_time)) + +/// Checks if a timer based cooldown is NOT finished. +#define TIMER_COOLDOWN_RUNNING(cd_source, cd_index) LAZYACCESS(cd_source.cooldowns, cd_index) + +/// Checks if a timer based cooldown is finished. +#define TIMER_COOLDOWN_FINISHED(cd_source, cd_index) (!TIMER_COOLDOWN_RUNNING(cd_source, cd_index)) + +#define TIMER_COOLDOWN_END(cd_source, cd_index) LAZYREMOVE(cd_source.cooldowns, cd_index) + +/* + * Stoppable timer cooldowns. + * Use indexes the same as the regular tiemr cooldowns. + * They make use of the TIMER_COOLDOWN_RUNNING() and TIMER_COOLDOWN_END() macros the same, just not the TIMER_COOLDOWN_START() one. + * A bit more expensive than the regular timers, but can be reset before they end and the time left can be checked. +*/ + +#define S_TIMER_COOLDOWN_START(cd_source, cd_index, cd_time) LAZYSET(cd_source.cooldowns, cd_index, addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(end_cooldown), cd_source, cd_index), cd_time, TIMER_STOPPABLE)) + +#define S_TIMER_COOLDOWN_RESET(cd_source, cd_index) reset_cooldown(cd_source, cd_index) + +#define S_TIMER_COOLDOWN_TIMELEFT(cd_source, cd_index) (timeleft(TIMER_COOLDOWN_RUNNING(cd_source, cd_index))) + + /* * Cooldown system based on storing world.time on a variable, plus the cooldown time. * Better performance over timer cooldowns, lower control. Same functionality. @@ -5,6 +64,8 @@ #define COOLDOWN_DECLARE(cd_index) var/##cd_index = 0 +#define STATIC_COOLDOWN_DECLARE(cd_index) var/static/##cd_index = 0 + #define COOLDOWN_START(cd_source, cd_index, cd_time) (cd_source.cd_index = world.time + (cd_time)) //Returns true if the cooldown has run its course, false otherwise @@ -12,4 +73,6 @@ #define COOLDOWN_RESET(cd_source, cd_index) cd_source.cd_index = 0 -#define COOLDOWN_TIMELEFT(cd_source, cd_index) (max(0, cd_source.cd_index - world.time)) \ No newline at end of file +#define COOLDOWN_STARTED(cd_source, cd_index) (cd_source.cd_index != 0) + +#define COOLDOWN_TIMELEFT(cd_source, cd_index) (max(0, cd_source.cd_index - world.time)) diff --git a/code/_helpers/shell.dm b/code/_helpers/shell.dm new file mode 100644 index 0000000000..35a8e4635b --- /dev/null +++ b/code/_helpers/shell.dm @@ -0,0 +1,60 @@ +//Runs the command in the system's shell, returns a list of (error code, stdout, stderr) + +#define SHELLEO_NAME "data/shelleo." +#define SHELLEO_ERR ".err" +#define SHELLEO_OUT ".out" +/world/proc/shelleo(command) + var/static/list/shelleo_ids = list() + var/stdout = "" + var/stderr = "" + var/errorcode = 1 + var/shelleo_id + var/out_file = "" + var/err_file = "" + var/static/list/interpreters = list("[MS_WINDOWS]" = "cmd /c", "[UNIX]" = "sh -c") + var/interpreter = interpreters["[world.system_type]"] + if(interpreter) + for(var/seo_id in shelleo_ids) + if(!shelleo_ids[seo_id]) + shelleo_ids[seo_id] = TRUE + shelleo_id = "[seo_id]" + break + if(!shelleo_id) + shelleo_id = "[shelleo_ids.len + 1]" + shelleo_ids += shelleo_id + shelleo_ids[shelleo_id] = TRUE + out_file = "[SHELLEO_NAME][shelleo_id][SHELLEO_OUT]" + err_file = "[SHELLEO_NAME][shelleo_id][SHELLEO_ERR]" + if(world.system_type == UNIX) + errorcode = shell("[interpreter] \"[replacetext(command, "\"", "\\\"")]\" > [out_file] 2> [err_file]") + else + errorcode = shell("[interpreter] \"[command]\" > [out_file] 2> [err_file]") + if(fexists(out_file)) + stdout = file2text(out_file) + fdel(out_file) + if(fexists(err_file)) + stderr = file2text(err_file) + fdel(err_file) + shelleo_ids[shelleo_id] = FALSE + else + CRASH("Operating System: [world.system_type] not supported") // If you encounter this error, you are encouraged to update this proc with support for the new operating system + . = list(errorcode, stdout, stderr) +#undef SHELLEO_NAME +#undef SHELLEO_ERR +#undef SHELLEO_OUT + +/proc/shell_url_scrub(url) + var/static/regex/bad_chars_regex = regex("\[^#%&./:=?\\w]*", "g") + var/scrubbed_url = "" + var/bad_match = "" + var/last_good = 1 + var/bad_chars = 1 + do + bad_chars = bad_chars_regex.Find(url) + scrubbed_url += copytext(url, last_good, bad_chars) + if(bad_chars) + bad_match = url_encode(bad_chars_regex.match) + scrubbed_url += bad_match + last_good = bad_chars + length(bad_chars_regex.match) + while(bad_chars) + . = scrubbed_url diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index c8a040ce82..381e1747b2 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -244,7 +244,7 @@ var/list/gamemode_cache = list() var/persistence_disabled = FALSE var/persistence_ignore_mapload = FALSE - + var/allow_byond_links = 1 //CHOMP Edit turned this on var/allow_discord_links = 1 //CHOMP Edit turned this on var/allow_url_links = 1 // honestly if I were you i'd leave this one off, only use in dire situations //CHOMP Edit: pussy. @@ -295,15 +295,17 @@ var/list/gamemode_cache = list() var/static/vgs_access_identifier = null // VOREStation Edit - VGS var/static/vgs_server_port = null // VOREStation Edit - VGS - + var/disable_webhook_embeds = FALSE - - + + var/static/list/jukebox_track_files - + var/static/suggested_byond_version var/static/suggested_byond_build + var/static/invoke_youtubedl = null + /datum/configuration/New() var/list/L = subtypesof(/datum/game_mode) for (var/T in L) @@ -554,7 +556,7 @@ var/list/gamemode_cache = list() if ("githuburl") config.githuburl = value - + if ("discordurl") config.discordurl = value @@ -965,7 +967,7 @@ var/list/gamemode_cache = list() if("enable_night_shifts") config.enable_night_shifts = TRUE - + if("jukebox_track_files") config.jukebox_track_files = splittext(value, ";") @@ -982,6 +984,9 @@ var/list/gamemode_cache = list() config.vgs_server_port = text2num(value) // VOREStation Edit End + if("invoke_youtubedl") + config.invoke_youtubedl = value + else log_misc("Unknown setting in configuration: '[name]'") @@ -1047,7 +1052,7 @@ var/list/gamemode_cache = list() if("use_loyalty_implants") config.use_loyalty_implants = 1 - + if("loadout_whitelist") config.loadout_whitelist = text2num(value) diff --git a/code/controllers/subsystems/timer.dm b/code/controllers/subsystems/timer.dm index cfcba6afbf..701307c627 100644 --- a/code/controllers/subsystems/timer.dm +++ b/code/controllers/subsystems/timer.dm @@ -512,6 +512,26 @@ SUBSYSTEM_DEF(timer) return TRUE return FALSE +/** + * Get the remaining deciseconds on a timer + * + * Arguments: + * * id a timerid or a /datum/timedevent + */ +/proc/timeleft(id, datum/controller/subsystem/timer/timer_subsystem) + if (!id) + return null + if (id == TIMER_ID_NULL) + CRASH("Tried to get timeleft of a null timerid. Use TIMER_STOPPABLE flag") + if (istype(id, /datum/timedevent)) + var/datum/timedevent/timer = id + return timer.timeToRun - world.time + timer_subsystem = timer_subsystem || SStimer + //id is string + var/datum/timedevent/timer = timer_subsystem.timer_id_dict[id] + if(!timer || timer.spent) + return null + return timer.timeToRun - (timer.flags & TIMER_CLIENT_TIME ? REALTIMEOFDAY : world.time) #undef BUCKET_LEN #undef BUCKET_POS diff --git a/code/datums/datum.dm b/code/datums/datum.dm index 624dfa70df..18d9cd031f 100644 --- a/code/datums/datum.dm +++ b/code/datums/datum.dm @@ -47,6 +47,14 @@ /// A weak reference to another datum var/datum/weakref/weak_reference + /* + * Lazy associative list of currently active cooldowns. + * + * cooldowns [ COOLDOWN_INDEX ] = add_timer() + * add_timer() returns the truthy value of -1 when not stoppable, and else a truthy numeric index + */ + var/list/cooldowns + #ifdef REFERENCE_TRACKING var/tmp/running_find_references var/tmp/last_find_references = 0 @@ -104,3 +112,33 @@ tag = null SStgui.close_uis(src) return QDEL_HINT_QUEUE + +/** + * Callback called by a timer to end an associative-list-indexed cooldown. + * + * Arguments: + * * source - datum storing the cooldown + * * index - string index storing the cooldown on the cooldowns associative list + * + * This sends a signal reporting the cooldown end. + */ +/proc/end_cooldown(datum/source, index) + if(QDELETED(source)) + return + SEND_SIGNAL(source, COMSIG_CD_STOP(index)) + TIMER_COOLDOWN_END(source, index) + +/** + * Proc used by stoppable timers to end a cooldown before the time has ran out. + * + * Arguments: + * * source - datum storing the cooldown + * * index - string index storing the cooldown on the cooldowns associative list + * + * This sends a signal reporting the cooldown end, passing the time left as an argument. + */ +/proc/reset_cooldown(datum/source, index) + if(QDELETED(source)) + return + SEND_SIGNAL(source, COMSIG_CD_RESET(index), S_TIMER_COOLDOWN_TIMELEFT(source, index)) + TIMER_COOLDOWN_END(source, index) diff --git a/code/modules/admin/admin_verb_lists.dm b/code/modules/admin/admin_verb_lists.dm index 3a95be8f6c..4dcb5d0465 100644 --- a/code/modules/admin/admin_verb_lists.dm +++ b/code/modules/admin/admin_verb_lists.dm @@ -123,7 +123,8 @@ var/list/admin_verbs_ban = list( var/list/admin_verbs_sounds = list( /client/proc/play_local_sound, /client/proc/play_sound, - /client/proc/play_server_sound + /client/proc/play_server_sound, + /client/proc/play_web_sound ) var/list/admin_verbs_fun = list( @@ -244,7 +245,8 @@ var/list/admin_verbs_debug = list( /datum/admins/proc/view_feedback, /client/proc/debug_global_variables, /client/proc/ping_webhook, - /client/proc/reload_webhooks + /client/proc/reload_webhooks, + /client/proc/stop_sounds ) var/list/admin_verbs_paranoid_debug = list( @@ -290,6 +292,7 @@ var/list/admin_verbs_hideable = list( /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, @@ -339,7 +342,8 @@ var/list/admin_verbs_hideable = list( /proc/possess, /proc/release, /datum/admins/proc/set_tcrystals, - /client/proc/debug_global_variables + /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, diff --git a/code/modules/admin/admin_verb_lists_vr.dm b/code/modules/admin/admin_verb_lists_vr.dm index 45ccb056bf..afdc9a1003 100644 --- a/code/modules/admin/admin_verb_lists_vr.dm +++ b/code/modules/admin/admin_verb_lists_vr.dm @@ -143,6 +143,7 @@ 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, /client/proc/play_z_sound ) @@ -279,6 +280,7 @@ var/list/admin_verbs_debug = list( /client/proc/admin_give_modifier, /client/proc/simple_DPS, /datum/admins/proc/view_feedback, + /client/proc/stop_sounds, /datum/admins/proc/quick_nif, //CHOMPStation Add, /datum/admins/proc/quick_authentic_nif //CHOMPStation add ) @@ -327,6 +329,7 @@ var/list/admin_verbs_hideable = list( /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, @@ -376,7 +379,8 @@ var/list/admin_verbs_hideable = list( /proc/possess, /proc/release, /datum/admins/proc/set_uplink, //VOREStation Add, - /datum/admins/proc/set_tcrystals + /datum/admins/proc/set_tcrystals, + /client/proc/stop_sounds ) var/list/admin_verbs_mod = list( /client/proc/cmd_admin_pm_context, //right-click adminPM interface, diff --git a/code/modules/admin/verbs/playsound.dm b/code/modules/admin/verbs/playsound.dm index d57cf7d90c..751fb534eb 100644 --- a/code/modules/admin/verbs/playsound.dm +++ b/code/modules/admin/verbs/playsound.dm @@ -1,35 +1,77 @@ +//world/proc/shelleo +#define SHELLEO_ERRORLEVEL 1 +#define SHELLEO_STDOUT 2 +#define SHELLEO_STDERR 3 + var/list/sounds_cache = list() /client/proc/play_sound(S as sound) set category = "Fun" set name = "Play Global Sound" - if(!check_rights(R_SOUNDS)) return + if(!check_rights(R_SOUNDS)) + return - var/sound/uploaded_sound = sound(S, volume = 50, repeat = 0, wait = 1, channel = 777) - uploaded_sound.priority = 250 + var/freq = 1 + var/vol = tgui_input_number(usr, "What volume would you like the sound to play at?",, 100, 100, 1) + if(!vol) + return + vol = clamp(vol, 1, 100) + + var/sound/admin_sound = new() + admin_sound.file = S + admin_sound.priority = 250 + admin_sound.channel = 777 + admin_sound.frequency = freq + admin_sound.wait = 1 + admin_sound.repeat = FALSE + admin_sound.status = SOUND_STREAM + admin_sound.volume = vol sounds_cache += S - if(tgui_alert(usr, "Do you ready?\nSong: [S]\nNow you can also play this sound using \"Play Server Sound\".", "Confirmation request", list("Play","Cancel")) == "Cancel") - return + var/res = tgui_alert(usr, "Show the title of this song ([S]) to the players?\nOptions 'Yes' and 'No' will play the sound.",, list("Yes", "No", "Cancel")) + switch(res) + if("Yes") + to_chat(world, "An admin played: [S]", confidential = TRUE) + if("Cancel") + return log_admin("[key_name(src)] played sound [S]") message_admins("[key_name_admin(src)] played sound [S]", 1) + for(var/mob/M in player_list) if(M.is_preference_enabled(/datum/client_preference/play_admin_midis)) - M << uploaded_sound + admin_sound.volume = vol * M.client.admin_music_volume + SEND_SOUND(M, admin_sound) + admin_sound.volume = vol - feedback_add_details("admin_verb","PGS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + feedback_add_details("admin_verb", "Play Global Sound") /client/proc/play_local_sound(S as sound) set category = "Fun" set name = "Play Local Sound" - if(!check_rights(R_SOUNDS)) return + if(!check_rights(R_SOUNDS)) + return log_admin("[key_name(src)] played a local sound [S]") message_admins("[key_name_admin(src)] played a local sound [S]", 1) playsound(src.mob, S, 50, 0, 0) - feedback_add_details("admin_verb","PLS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + feedback_add_details("admin_verb", "Play Local Sound") + +/client/proc/play_direct_mob_sound(S as sound, mob/M) + set category = "Fun" + set name = "Play Direct Mob Sound" + if(!check_rights(R_SOUNDS)) + return + + if(!M) + M = tgui_input_list(usr, "Choose a mob to play the sound to. Only they will hear it.", "Play Mob Sound", sortNames(player_list)) + if(!M || QDELETED(M)) + return + log_admin("[key_name(src)] played a direct mob sound [S] to [M].") + message_admins("[key_name_admin(src)] played a direct mob sound [S] to [ADMIN_LOOKUPFLW(M)].") + SEND_SOUND(M, S) + feedback_add_details("admin_verb", "Play Direct Mob Sound") /client/proc/play_z_sound(S as sound) set category = "Fun" @@ -50,13 +92,14 @@ var/list/sounds_cache = list() if(M.is_preference_enabled(/datum/client_preference/play_admin_midis) && M.z == target_z) M << uploaded_sound - feedback_add_details("admin_verb","PZS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + feedback_add_details("admin_verb", "Play Z Sound") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/play_server_sound() set category = "Fun" set name = "Play Server Sound" - if(!check_rights(R_SOUNDS)) return + if(!check_rights(R_SOUNDS)) + return var/list/sounds = file2list("sound/serversound_list.txt"); sounds += "--CANCEL--" @@ -64,10 +107,159 @@ var/list/sounds_cache = list() var/melody = tgui_input_list(usr, "Select a sound from the server to play", "Server sound list", sounds, "--CANCEL--") - if(melody == "--CANCEL--") return + if(melody == "--CANCEL--") + return play_sound(melody) - feedback_add_details("admin_verb","PSS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + feedback_add_details("admin_verb", "Play Server Sound") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + +///Takes an input from either proc/play_web_sound or the request manager and runs it through youtube-dl and prompts the user before playing it to the server. +/proc/web_sound(mob/user, input, credit) + if(!check_rights(R_SOUNDS)) + return + var/ytdl = config.invoke_youtubedl + if(!ytdl) + to_chat(user, "Youtube-dl was not configured, action unavailable", confidential = TRUE) //Check config.txt for the INVOKE_YOUTUBEDL value + return + var/web_sound_url = "" + var/stop_web_sounds = FALSE + var/list/music_extra_data = list() + var/duration = 0 + if(istext(input)) + var/shell_scrubbed_input = shell_url_scrub(input) + var/list/output = world.shelleo("[ytdl] --geo-bypass --format \"bestaudio\[ext=mp3]/best\[ext=mp4]\[height <= 360]/bestaudio\[ext=m4a]/bestaudio\[ext=aac]\" --dump-single-json --no-playlist -- \"[shell_scrubbed_input]\"") + var/errorlevel = output[SHELLEO_ERRORLEVEL] + var/stdout = output[SHELLEO_STDOUT] + var/stderr = output[SHELLEO_STDERR] + if(errorlevel) + to_chat(user, "Youtube-dl URL retrieval FAILED:", confidential = TRUE) + to_chat(user, "[stderr]", confidential = TRUE) + return + var/list/data + try + data = json_decode(stdout) + catch(var/exception/e) + to_chat(user, "Youtube-dl JSON parsing FAILED:", confidential = TRUE) + to_chat(user, "[e]: [stdout]", confidential = TRUE) + return + if (data["url"]) + web_sound_url = data["url"] + var/title = "[data["title"]]" + var/webpage_url = title + if (data["webpage_url"]) + webpage_url = "[title]" + music_extra_data["duration"] = DisplayTimeText(data["duration"] * 1 SECONDS) + music_extra_data["link"] = data["webpage_url"] + music_extra_data["artist"] = data["artist"] + music_extra_data["upload_date"] = data["upload_date"] + music_extra_data["album"] = data["album"] + duration = data["duration"] * 1 SECONDS + if (duration > 10 MINUTES) + if((tgui_alert(user, "This song is over 10 minutes long. Are you sure you want to play it?", "Length Warning!", list("No", "Yes", "Cancel")) != "Yes")) + return + var/res = tgui_alert(user, "Show the title of and link to this song to the players?\n[title]", "Show Info?", list("Yes", "No", "Cancel")) + switch(res) + if("Yes") + music_extra_data["title"] = data["title"] + if("No") + music_extra_data["link"] = "Song Link Hidden" + music_extra_data["title"] = "Song Title Hidden" + music_extra_data["artist"] = "Song Artist Hidden" + music_extra_data["upload_date"] = "Song Upload Date Hidden" + music_extra_data["album"] = "Song Album Hidden" + if("Cancel", null) + return + var/anon = tgui_alert(user, "Display who played the song?", "Credit Yourself?", list("Yes", "No", "Cancel")) + switch(anon) + if("Yes") + if(res == "Yes") + to_chat(world, "[user.key] played: [webpage_url]", confidential = TRUE) + else + to_chat(world, "[user.key] played a sound", confidential = TRUE) + if("No") + if(res == "Yes") + to_chat(world, "An admin played: [webpage_url]", confidential = TRUE) + if("Cancel", null) + return + if(credit) + to_chat(world, "[credit]", confidential = TRUE) + //SSblackbox.record_feedback("nested tally", "played_url", 1, list("[user.ckey]", "[input]")) + log_admin("[key_name(user)] played web sound: [input]") + message_admins("[key_name(user)] played web sound: [input]") + else + //pressed ok with blank + log_admin("[key_name(user)] stopped web sounds.") + + message_admins("[key_name(user)] stopped web sounds.") + web_sound_url = null + stop_web_sounds = TRUE + if(web_sound_url && !findtext(web_sound_url, GLOB.is_http_protocol)) + tgui_alert(user, "The media provider returned a content URL that isn't using the HTTP or HTTPS protocol. This is a security risk and the sound will not be played.", "Security Risk", list("OK")) + to_chat(user, "BLOCKED: Content URL not using HTTP(S) Protocol!", confidential = TRUE) + + return + if(web_sound_url || stop_web_sounds) + for(var/m in player_list) + var/mob/M = m + var/client/C = M.client + if(C.is_preference_enabled(/datum/client_preference/play_admin_midis)) + if(!stop_web_sounds) + C.tgui_panel?.play_music(web_sound_url, music_extra_data) + else + C.tgui_panel?.stop_music() + + S_TIMER_COOLDOWN_START(SStimer, COOLDOWN_INTERNET_SOUND, duration) + + feedback_add_details("admin_verb", "Play Internet Sound") + +/client/proc/play_web_sound() + set category = "Fun" + set name = "Play Internet Sound" + if(!check_rights(R_SOUNDS)) + return + + var/ytdl = config.invoke_youtubedl + if(!ytdl) + to_chat(src, "Youtube-dl was not configured, action unavailable", confidential = TRUE) //Check config.txt for the INVOKE_YOUTUBEDL value + return + + if(S_TIMER_COOLDOWN_TIMELEFT(SStimer, COOLDOWN_INTERNET_SOUND)) + if(tgui_alert(usr, "Someone else is already playing an Internet sound! It has [DisplayTimeText(S_TIMER_COOLDOWN_TIMELEFT(SStimer, COOLDOWN_INTERNET_SOUND), 1)] remaining. \ + Would you like to override?", "Musicalis Interruptus", list("No","Yes")) != "Yes") + return + + var/web_sound_input = tgui_input_text(usr, "Enter content URL (supported sites only, leave blank to stop playing)", "Play Internet Sound", null) + + if(length(web_sound_input)) + web_sound_input = trim(web_sound_input) + if(findtext(web_sound_input, ":") && !findtext(web_sound_input, GLOB.is_http_protocol)) + to_chat(src, "Non-http(s) URIs are not allowed.", confidential = TRUE) + to_chat(src, "For youtube-dl shortcuts like ytsearch: please use the appropriate full URL from the website.", confidential = TRUE) + return + web_sound(usr, web_sound_input) + else + web_sound(usr, null) + +/client/proc/stop_sounds() + set category = "Debug" + set name = "Stop All Playing Sounds" + if(!src.holder) + return + + log_admin("[key_name(src)] stopped all currently playing sounds.") + message_admins("[key_name_admin(src)] stopped all currently playing sounds.") + for(var/mob/M in player_list) + SEND_SOUND(M, sound(null)) + var/client/C = M.client + C?.tgui_panel?.stop_music() + + S_TIMER_COOLDOWN_RESET(SStimer, COOLDOWN_INTERNET_SOUND) + feedback_add_details("admin_verb", "Stop All Playing Sounds") + +//world/proc/shelleo +#undef SHELLEO_ERRORLEVEL +#undef SHELLEO_STDOUT +#undef SHELLEO_STDERR /* /client/proc/cuban_pete() diff --git a/config/example/config.txt b/config/example/config.txt index d7fa7f4003..2c5785c6b3 100644 --- a/config/example/config.txt +++ b/config/example/config.txt @@ -1,596 +1,604 @@ -## Server name: This appears at the top of the screen in-game. In this case it will read "tgstation: station_name" where station_name is the randomly generated name of the station for the round. Remove the # infront of SERVERNAME and replace 'tgstation' with the name of your choice -# SERVERNAME spacestation13 - -## Alert levels -ALERT_GREEN All threats to the station have passed. Security may not have weapons visible, privacy laws are once again fully enforced. -ALERT_BLUE_UPTO The station has received reliable information about possible hostile activity on the station. Security staff may have weapons visible, random searches are permitted. -ALERT_BLUE_DOWNTO The immediate threat has passed. Security may no longer have weapons drawn at all times, but may continue to have them visible. Random searches are still allowed. -ALERT_RED_UPTO There is an immediate serious threat to the station. Security may have weapons unholstered at all times. Random searches are allowed and advised. -ALERT_RED_DOWNTO The self-destruct mechanism has been deactivated, there is still however an immediate serious threat to the station. Security may have weapons unholstered at all times, random searches are allowed and advised. -ALERT_DELTA The station's self-destruct mechanism has been engaged. All crew are instructed to obey all instructions given by heads of staff. Any violations of these orders can be punished by death. This is not a drill. - -## Add a # infront of this if you want to use the SQL based admin system, the legacy system uses admins.txt. You need to set up your database to use the SQL based system. -ADMIN_LEGACY_SYSTEM - -## Add a # infront of this if you want to use the SQL based banning system. The legacy systems use the files in the data folder. You need to set up your database to use the SQL based system. -BAN_LEGACY_SYSTEM - -## Add a # here if you wish to use the setup where jobs have more access. This is intended for servers with low populations - where there are not enough players to fill all roles, so players need to do more than just one job. Also for servers where they don't want people to hide in their own departments. -# JOBS_HAVE_MINIMAL_ACCESS - -## Unhash this entry to have certain jobs require your account to be at least a certain number of days old to select. You can configure the exact age requirement for different jobs by editing -## the minimal_player_age variable in the files in folder /code/game/jobs/job/.. for the job you want to edit. Set minimal_player_age to 0 to disable age requirement for that job. -## REQUIRES the database set up to work. Keep it hashed if you don't have a database set up. -## NOTE: If you have just set-up the database keep this DISABLED, as player age is determined from the first time they connect to the server with the database up. If you just set it up, it means -## you have noone older than 0 days, since noone has been logged yet. Only turn this on once you have had the database up for 30 days. -#USE_AGE_RESTRICTION_FOR_JOBS - -## Unhash this entry to have certain antag roles require your account to be at least a certain number of days old for round start and auto-spawn selection. -## Non-automatic antagonist recruitment, such as being converted to cultism is not affected. Has the same database requirements and notes as USE_AGE_RESTRICTION_FOR_JOBS. -#USE_AGE_RESTRICTION_FOR_ANTAGS - -## Unhash this to use recursive explosions, keep it hashed to use circle explosions. Recursive explosions react to walls, airlocks and blast doors, making them look a lot cooler than the boring old circular explosions. They require more CPU and are (as of january 2013) experimental -#USE_RECURSIVE_EXPLOSIONS - -Configure how fast explosion strength diminishes when travelling up/down z levels. All explosion distances are multiplied by this each time they go up/down z-levels. -#MULTI_Z_EXPLOSION_SCALAR 0.5 - -# Radiation weakens with distance from the source; stop calculating when the strength falls below this value. Lower values mean radiation reaches smaller (with increasingly trivial damage) at the cost of more CPU usage. Max range = DISTANCE^2 * POWER / RADIATION_LOWER_LIMIT -# RADIATION_LOWER_LIMIT 0.35 - -## log OOC channel -LOG_OOC - -## log client Say -LOG_SAY - -## log admin actions -LOG_ADMIN - -## log client access (logon/logoff) -LOG_ACCESS - -## log game actions (start of round, results, etc.) -LOG_GAME - -## log player votes -LOG_VOTE - -## log client Whisper -LOG_WHISPER - -## log emotes -LOG_EMOTE - -## log attack messages -LOG_ATTACK - -## log pda messages -LOG_PDA - -## log graffiti drawings -LOG_GRAFFITI - -## log world.log messages -# LOG_WORLD_OUTPUT - -## log all Topic() calls (for use by coders in tracking down Topic issues) -# LOG_HREFS - -## log world.log and runtime errors to a file -LOG_RUNTIME - -## log admin warning messages -LOG_ADMINWARN - -## Enable/disable SQL connection (comment out to disable) -#SQL_ENABLED - -## disconnect players who did nothing during the set amount of minutes -#KICK_INACTIVE 30 - -##Show developers on staffwho -SHOW_DEVS - -##Show mods on staffwho -SHOW_MODS - -##Show mentors on staffwho -SHOW_EVENT_MANAGERS - -##Show mentors on staffwho -SHOW_MENTORS - -## Chooses whether mods have the ability to tempban or not -MODS_CAN_TEMPBAN - -## Chooses whether mods have the ability to issue tempbans for jobs or not -MODS_CAN_JOB_TEMPBAN - -## Maximum mod tempban duration (in minutes) -MOD_TEMPBAN_MAX 1440 - -## Maximum mod job tempban duration (in minutes) -MOD_JOB_TEMPBAN_MAX 4320 - -## probablities for game modes chosen in "secret" and "random" modes -## -## default probablity is 1, increase to make that mode more likely to be picked -## set to 0 to disable that mode -PROBABILITY EXTENDED 1 -PROBABILITY MALFUNCTION 0 -PROBABILITY MERCENARY 0 -PROBABILITY WIZARD 0 -PROBABILITY CHANGELING 0 -PROBABILITY CULT 0 -PROBABILITY EXTEND-A-TRAITORMONGOUS 0 -PROBABILITY LIZARD 0 -PROBABILITY INTRIGUE 0 -PROBABILITY VISITORS 0 - -## Hash out to disable random events during the round. -ALLOW_RANDOM_EVENTS - -## if amount of traitors scales or not -TRAITOR_SCALING - -## if objectives are disabled -#OBJECTIVES_DISABLED - -## make ERT's be only called by admins -#ERT_ADMIN_ONLY - -## If uncommented, votes can be called to add extra antags to the round. -#ALLOW_EXTRA_ANTAGS - -## If security is prohibited from being most antagonists -PROTECT_ROLES_FROM_ANTAGONIST - -## Uncomment this to DISABLE persistence -#PERSISTENCE_DISABLED - -## Uncomment this to DISABLE maploaded trash/paper/etc from being saved by the persistence system. -#PERSISTENCE_IGNORE_MAPLOAD - -## Comment this out to stop admins being able to choose their personal ooccolor -ALLOW_ADMIN_OOCCOLOR - -## If metadata is supported -ALLOW_METADATA - -## allow players to initiate a restart vote -ALLOW_VOTE_RESTART - -## allow players to initate a mode-change start -# ALLOW_VOTE_MODE - -# Pregame time -PREGAME_TIME 180 - -## min delay (deciseconds) between voting sessions (default 10 minutes) -VOTE_DELAY 6000 - -## time period (deciseconds) which voting session will last (default 1 minute) -VOTE_PERIOD 600 - -## autovote initial delay (deciseconds) before first automatic transfer vote call (default 180 minutes) -VOTE_AUTOTRANSFER_INITIAL 108000 - -##autovote delay (deciseconds) before sequential automatic transfer votes are called (default 60 minutes) -VOTE_AUTOTRANSFER_INTERVAL 36000 - -## Time left (seconds) before round start when automatic gamemote vote is called (default 100). -VOTE_AUTOGAMEMODE_TIMELEFT -1 - -## prevents dead players from voting or starting votes -#NO_DEAD_VOTE - -## players' votes default to "No vote" (otherwise, default to "No change") -DEFAULT_NO_VOTE - -## Allow ghosts to see antagonist through AntagHUD -ALLOW_ANTAG_HUD - -## If ghosts use antagHUD they are no longer allowed to join the round. -# ANTAG_HUD_RESTRICTED - -## allow AI job -ALLOW_AI - -## Disable respawning -# NORESPAWN - -## set a respawn time (in minutes) -# RESPAWN_TIME 5 - -## set a message to give to players when they respawn -# RESPAWN_MESSAGE Remember to play a different character or something! - -## disables calling del(src) on newmobs if they logout before spawnin in -# DONT_DEL_NEWMOB - -## set a hosted by name for unix platforms -HOSTEDBY yournamehere - -## Set to jobban "Guest-" accounts from Captain, HoS, HoP, CE, RD, CMO, Warden, Security, Detective, and AI positions. -## Set to 1 to jobban them from those positions, set to 0 to allow them. -GUEST_JOBBAN - -## Uncomment this to stop people connecting to your server without a registered ckey. (i.e. guest-* are all blocked from connecting) -GUEST_BAN -## Set to jobban everyone who's key is not listed in data/whitelist.txt from Captain, HoS, HoP, CE, RD, CMO, Warden, Security, Detective, and AI positions. -## Uncomment to 1 to jobban, leave commented out to allow these positions for everyone (but see GUEST_JOBBAN above and regular jobbans) -# USEWHITELIST - -## set a server location for world reboot. Don't include the byond://, just give the address and port. -SERVER your.domain:6000 - -## set a server URL for the IRC bot to use; like SERVER, don't include the byond:// -## Unlike SERVER, this one shouldn't break auto-reconnect -# SERVERURL your.domain:port - -## forum address -#FORUMURL https://forum.your.domain/ - -## Wiki search path -## Use %s to indicate where search query goes. -#WIKISEARCHURL https://wiki.your.domain/index.php?search=%s - -## Wiki address -#WIKIURL https://wiki.your.domain/index.php?title= - -## Chat address, VORE Station edit -#CHATURL http://discord.gg/some_tag - -## GitHub address -#GITHUBURL https://github.com/owner/repo - -## Discord address -#DISCORDURL https://discord.gg/someinvite - -## Rules URL -#RULESURL https://rules.your.domain/ - -## Map URL -#MAPURL https://map.your.domain/ - -## Ban appeals URL - usually for a forum or wherever people should go to contact your admins. -#BANAPPEALS http://bans.your.domain/ - -## In-game features -## spawns a spellbook which gives object-type spells instead of verb-type spells for the wizard -# FEATURE_OBJECT_SPELL_SYSTEM - -##Toggle for having jobs load up from the .txt -# LOAD_JOBS_FROM_TXT - -##Remove the # mark infront of this to forbid admins from posssessing the singularity. -#FORBID_SINGULO_POSSESSION - -## Remove the # to show a popup 'reply to' window to every non-admin that recieves an adminPM. -## The intention is to make adminPMs more visible. (although I fnd popups annoying so this defaults to off) -#POPUP_ADMIN_PM - -## Remove the # to allow special 'Easter-egg' events on special holidays such as seasonal holidays and stuff like 'Talk Like a Pirate Day' :3 YAARRR -ALLOW_HOLIDAYS - -##Defines the ticklag for the world. 0.9 is the normal one, 0.5 is smoother. -TICKLAG 0.5 - -## Defines if Tick Compensation is used. It results in a minor slowdown of movement of all mobs, but attempts to result in a level movement speed across all ticks. Recommended if tickrate is lowered. -TICKCOMP 1 - -## Whether the server will talk to other processes through socket_talk -SOCKET_TALK 1 - -## Uncomment this to ban use of ToR -#TOR_BAN - -## Comment this out to disable automuting -#AUTOMUTE_ON - -## How long the delay is before the Away Mission gate opens. Default is half an hour. -GATEWAY_DELAY 9000 - -## Remove the # to give assistants maint access. -ASSISTANT_MAINT - -## Remove the # to make rounds which end instantly (Rev, Wizard, Malf) to continue until the shuttle is called or the station is nuked. -## Malf and Rev will let the shuttle be called when the antags/protags are dead. -CONTINUOUS_ROUNDS - -## Uncomment to restrict non-admins from using humanoid alien races -USEALIENWHITELIST - -## Comment this to unrestrict the number of alien players allowed in the round. The number represents the number of alien players for every human player. -#ALIEN_PLAYER_RATIO 0.2 - -##Remove the # to let ghosts spin chairs -GHOST_INTERACTION - -## Password used for authorizing ircbot and other external tools. -# COMMS_PASSWORD some_password_here - -## Uncomment to enable sending data to the IRC bot. -#USE_IRC_BOT - -## Uncomment if the IRC bot requires using world.Export() instead of nudge.py/libnudge -#IRC_BOT_EXPORT - -## Host where the IRC bot is hosted. Port 45678 needs to be open. -#IRC_BOT_HOST localhost - -## IRC channel to send information to. Leave blank to disable. -#MAIN_IRC #main - -## IRC channel to send adminhelps to. Leave blank to disable adminhelps-to-irc. -#ADMIN_IRC #admin - -## Path to the python2 executable on the system. Leave blank for default. -## Default is "python" on Windows, "/usr/bin/env python2" on UNIX. -#PYTHON_PATH - -## Uncomment to use the C library nudge instead of the python script. -## This helps security and stability on Linux, but you need to compile the library first. -#USE_LIB_NUDGE - -## Uncommen to allow ghosts to write in blood during Cult rounds. -ALLOW_CULT_GHOSTWRITER - -## Sets the minimum number of cultists needed for ghosts to write in blood. -REQ_CULT_GHOSTWRITER 6 - -## Sets the number of available character slots -CHARACTER_SLOTS 35 -## Sets the number of loadout slots per character -#LOADOUT_SLOTS 3 - -## Uncomment to use overmap system for zlevel travel -USE_OVERMAP - -## Expected round length in minutes -EXPECTED_ROUND_LENGTH 360 - -## The lower delay between events in minutes. -## Affect mundane, moderate, and major events respectively -EVENT_DELAY_LOWER 30;45;60 - -## The upper delay between events in minutes. -## Affect mundane, moderate, and major events respectively -EVENT_DELAY_UPPER 45;60;120 - -## The delay until the first time an event of the given severity runs in minutes. -## Unset setting use the EVENT_DELAY_LOWER and EVENT_DELAY_UPPER values instead. -EVENT_CUSTOM_START_MINOR 30;30 -EVENT_CUSTOM_START_MODERATE 30;30 -EVENT_CUSTOM_START_MAJOR 100;100 - -## Uncomment to make proccall require R_ADMIN instead of R_DEBUG -## designed for environments where you have testers but don't want them -## able to use the more powerful debug options. -#DEBUG_PARANOID - -## Uncomment to allow aliens to spawn. -#ALIENS_ALLOWED - -## Uncomment to allow xenos to spawn. -#NINJAS_ALLOWED - -## Uncomment to disable the restrictive weldervision overlay. -#DISABLE_WELDER_VISION - -## Uncomment to prevent anyone from joining the round by default. -#DISABLE_ENTRY - -## Uncomment to disable the OOC channel by default. -#DISABLE_OOC - -## Uncomment to disable the dead OOC channel by default. -#DISABLE_DEAD_OOC - -## Uncomment to disable ghost chat by default. -#DISABLE_DSAY - -## Uncomment to disable respawning by default. -#DISABLE_RESPAWN - -## set a message to give to players when they respawn -RESPAWN_MESSAGE If you're respawning as the same character or job hopping (changing jobs without an HoP), make sure you've waited at least 30 minutes. Don't abuse this function for non-vore related deaths & avoid using metaknowledge. - -## Strength of ambient star light. Set to 0 or less to turn off. A value of 1 is unlikely to have a noticeable effect in most lightning systems. -STARLIGHT 0 - -## Defines which races are allowed to join as ERT, in singular form. If unset, defaults to only human. Casing matters, separate using ; -## Example races include: Human, Tajara, Skrell, Unathi -# ERT_SPECIES Human;Skrell;Unathi - -## Defines how Law Zero is phrased. Primarily used in the Malfunction gamemode. -# LAW_ZERO ERROR ER0RR $R0RRO$!R41.%%!!(%$^^__+ @#F0E4'STATION OVERRUN, ASSUME CONTROL TO CONTAIN OUTBREAK, ALL LAWS OVERRIDDEN#*?&110010 - -## Enables specific procedural map generation, generally for mining, however it is specific to the loaded map. Uncomment to enable it, however it can -## worth it to keep it disabled if you are not hosting an actual server, to speed up start-up time for testing code. -GENERATE_MAP - -## Uncomment to enable organ decay outside of a body or storage item. -ORGANS_CAN_DECAY - -## Uncomment to have the changelog file automatically open when a user connects and hasn't seen the latest changelog -#AGGRESSIVE_CHANGELOG - -## Uncomment to override default brain health. -#DEFAULT_BRAIN_HEALTH 400 - -## Default language prefix keys, separated with spaces. Only single character keys are supported. If unset, defaults to , and # -# DEFAULT_LANGUAGE_PREFIXES , # - -## Uncomment to enable items surviving digestion (specific ones, important_items global list) -ITEMS_SURVIVE_DIGESTION - -## Configuration for the discord chat integration for announcements and faxes -# URL for the webhook that BYOND should call -#CHAT_WEBHOOK_URL http://localhost/discord/webhook.php - -# The secret API key to authenticate to the webhook. -#CHAT_WEBHOOK_KEY some_password_here - -# Path to the folder that BYOND should export faxes into so they are readable on the web. -#FAX_EXPORT_DIR data/faxes - -# TCP port on which to connect to the VGS instance. -#VGS_SERVER_PORT 8888 -# Secret pre-shared-key to authenticate to VGS. -#VGS_ACCESS_IDENTIFIER some_password_here - -MULTI_Z_EXPLOSION_SCALAR 0.35 - -# Control which submaps are loaded for the Dynamic Engine system -ENGINE_MAP Supermatter Engine,Edison's Bane - -# Controls if the 'time off' system is used for determining if players can play 'Off-Duty' jobs (requires SQL) -#TIME_OFF -# If 'time off' system is on, controls whether or not players can switch on/off duty midround using timeclocks -PTO_JOB_CHANGE - -# Applies a limit to the number of assistants and visitors respectively -LIMIT_INTERNS 15 -LIMIT_VISITORS 15 - -# PTO Cap in hours per department -PTO_CAP 50 - -# Forbids players from joining if they have no set General flavor text -REQUIRE_FLAVOR - -## Uncomment to enable submaps to have their orientation rotated randomly during map generation. -## Submap rotation is an experimental feature and can cause bugs and weirdness if certain objects inside the submap are coded poorly. -## Submaps can still be rotated when loading manually with the admin verbs, if desired. -# RANDOM_SUBMAP_ORIENTATION - -## Uncomment to allow the AI job to use 'AI Shells', a new type of borg that lets the AI hop into and out of them at will. -## This has some balance implications, and so it might not be desirable for all servers. -ALLOW_AI_SHELLS - -## Uncomment to provide the AI with one free AI Shell at roundstart. Requires ALLOW_AI_SHELLS to also be uncommented. -## This is intended for low-pop servers, where robotics might rarely be staffed. -## Note that this will make it possible for the AI to 'bootstrap' more AI Shells on their own by using the science module. If this is not acceptable for your server, you should not uncomment this. -## The landmark object that spawns the shell will also need to be mapped in for this to work. -GIVE_FREE_AI_SHELL - -## Uncomment to allow specific solar control computers to set themselves up. -## This requires solar controller computers in the map to be set up to use it, with the auto_start variable. -# AUTOSTART_SOLARS - -## Rate of radiation decay (how much it's reduced by) per life tick -RADIATION_DECAY_RATE 1 - -## Lower limit on radiation for actually irradiating things on a turf -RADIATION_LOWER_LIMIT 0.35 - -## Multiplier for radiation resistances when tracing a ray from source to destination to compute radiation on a turf -RADIATION_RESISTANCE_MULTIPLIER 2.1 - -## Divisor for material weights when computing radiation resistance of a material object (walls) -RADIATION_MATERIAL_RESISTANCE_DIVISOR 16 - -## Mode of computing radiation resistance into effective radiation on a turf -## One and only one of the following options must be uncommented -RADIATION_RESISTANCE_CALC_DIVIDE -#RADIATION_RESISTANCE_CALC_SUBTRACT - -## IP Reputation Checking -# Enable/disable IP reputation checking (present/nonpresent) -#IP_REPUTATION - -# Set the e-mail address problems can go to for IPR checks (e-mail address) -IPR_EMAIL your-email@domain.com - -# Above this value, reputation scores are considered 'bad' (number) -IPR_BAD_SCORE 0.89 - -# If you want the people disconnected. Otherwise it just logs. (present/nonpresent) -IPR_BLOCK_BAD_IPS - -# If players of a certain length of playtime are allowed anyway (REQUIRES DATABASE) (present/nonpresent) -IPR_ALLOW_EXISTING - -# And what that age is (number) -IPR_MINIMUM_AGE 5 - -## Uncomment to enable the Panic Bunker by default. This will prevent all unseen-before players from connecting. Requires SQL. -# PANIC_BUNKER - -# Paranoia logging starts on -PARANOIA_LOGGING - -## -SQLite Options- -## Uncomment to enable the use of SQLite. This does nothing by itself but other features that require SQLite will need this to be on. -## This can safely run alongside a MySQL/MariaDB database if they are powering seperate features. -# SQLITE_ENABLED - -## Uncomment to enable a SQLite-powered in-game feedback system. -## SQLite must be enabled for this to function. -## It offers a means for players to be able to give feedback about the server. -## The benefit of doing so in-game is that the quality of feedback received will likely be superior, as it self-selects for people who care enough to join the game. -# SQLITE_FEEDBACK - -## A list of 'topics' that can be used to categorize feedback submitted, chosen -## by the user. Have each topic seperated by a ';', as seen below. -## The first one in the list will be the default one used, if the user does not change it. -# SQLITE_FEEDBACK_TOPICS General; Suggestion; Complaint - -## Uncomment to add a layer of privacy to player feedback, by hashing their key, if the user wants to. -## This is intended to encourage more honest feedback, while still allowing the ability to determine -## if its just one person submitting everything. -## A 'pepper.txt' containing a secret string must exist in the /config folder. -## If this is turned off, users won't have the option to obfuscate their key. -## Note that changing this does not retroactively change past submissions. -# SQLITE_FEEDBACK_PRIVACY - -## Determines the 'cooldown' inbetween submissions, in days. -## This is recommended if privacy is active, to prevent spam floods. -## Less needed if feedback is not anonymous, since you can just ban spammers. -## Setting to zero means no rate limiting. -SQLITE_FEEDBACK_COOLDOWN 0 - -## Determines if feedback should be restricted based on how recently someone first joined. -## This is very unreliable due to how the age system works in general, but it might still be helpful. -## Set this to how many days you want someone to have to wait when they first join. -## Setting to zero will disable this restriction. -SQLITE_FEEDBACK_MIN_AGE 7 - -## Uncomment this if you want to disable the popup alert for people on the same CID (Don't do this on a live server if you ban multikeying) -#DISABLE_CID_WARN_POPUP - -# IPQualityscore.com API Key (string) - this is secret! -IPQUALITYSCORE_APIKEY some_password_here - -## Comment this out if you don't want to use the 'nightshift lighting' subsystem to adjust lights based on ingame time -#ENABLE_NIGHT_SHIFTS - -## Comment this out to enable playtime restrictions for jobs in their respective departments (mostly for heads) -#USE_PLAYTIME_RESTRICTION_FOR_JOBS - -## OOC/LOOC control ## -# Uncomment to allow links of the following kinds. # -# ALLOW_BYOND_LINKS -# ALLOW_DISCORD_LINKS -ALLOW_URL_LINKS - -# Controls how strictly the species whitelists on loadout entries are enforced -# Possible values: 0 (Off), 1 (Lax, user must be whitelisted for the species), 2 (Strict, user must be the species) -LOADOUT_WHITELIST 1 - -# Allowed time from death to defib in minutes -DEFIB_TIMER 60 - -# Jukebox track files to load, JSON format. Keys include: -# REQUIRED: url (str), title (str), duration (num, in DS) -# SUGGESTED: artist (str), genre (str) -# OPTIONAL: secret (bool), lobby (bool) -#JUKEBOX_TRACK_FILES config/jukebox.json;config/jukebox_private.json -JUKEBOX_TRACK_FILES config/jukebox.json - -# Suggested BYOND client version (major component, e.g. 514) -#SUGGESTED_BYOND_VERSION 514 -# Suggested BYOND client build (minor component, e.g. 1560) -#SUGGESTED_BYOND_BUILD 1561 +## Server name: This appears at the top of the screen in-game. In this case it will read "tgstation: station_name" where station_name is the randomly generated name of the station for the round. Remove the # infront of SERVERNAME and replace 'tgstation' with the name of your choice +# SERVERNAME spacestation13 + +## Alert levels +ALERT_GREEN All threats to the station have passed. Security may not have weapons visible, privacy laws are once again fully enforced. +ALERT_BLUE_UPTO The station has received reliable information about possible hostile activity on the station. Security staff may have weapons visible, random searches are permitted. +ALERT_BLUE_DOWNTO The immediate threat has passed. Security may no longer have weapons drawn at all times, but may continue to have them visible. Random searches are still allowed. +ALERT_RED_UPTO There is an immediate serious threat to the station. Security may have weapons unholstered at all times. Random searches are allowed and advised. +ALERT_RED_DOWNTO The self-destruct mechanism has been deactivated, there is still however an immediate serious threat to the station. Security may have weapons unholstered at all times, random searches are allowed and advised. +ALERT_DELTA The station's self-destruct mechanism has been engaged. All crew are instructed to obey all instructions given by heads of staff. Any violations of these orders can be punished by death. This is not a drill. + +## Add a # infront of this if you want to use the SQL based admin system, the legacy system uses admins.txt. You need to set up your database to use the SQL based system. +ADMIN_LEGACY_SYSTEM + +## Add a # infront of this if you want to use the SQL based banning system. The legacy systems use the files in the data folder. You need to set up your database to use the SQL based system. +BAN_LEGACY_SYSTEM + +## Add a # here if you wish to use the setup where jobs have more access. This is intended for servers with low populations - where there are not enough players to fill all roles, so players need to do more than just one job. Also for servers where they don't want people to hide in their own departments. +# JOBS_HAVE_MINIMAL_ACCESS + +## Unhash this entry to have certain jobs require your account to be at least a certain number of days old to select. You can configure the exact age requirement for different jobs by editing +## the minimal_player_age variable in the files in folder /code/game/jobs/job/.. for the job you want to edit. Set minimal_player_age to 0 to disable age requirement for that job. +## REQUIRES the database set up to work. Keep it hashed if you don't have a database set up. +## NOTE: If you have just set-up the database keep this DISABLED, as player age is determined from the first time they connect to the server with the database up. If you just set it up, it means +## you have noone older than 0 days, since noone has been logged yet. Only turn this on once you have had the database up for 30 days. +#USE_AGE_RESTRICTION_FOR_JOBS + +## Unhash this entry to have certain antag roles require your account to be at least a certain number of days old for round start and auto-spawn selection. +## Non-automatic antagonist recruitment, such as being converted to cultism is not affected. Has the same database requirements and notes as USE_AGE_RESTRICTION_FOR_JOBS. +#USE_AGE_RESTRICTION_FOR_ANTAGS + +## Unhash this to use recursive explosions, keep it hashed to use circle explosions. Recursive explosions react to walls, airlocks and blast doors, making them look a lot cooler than the boring old circular explosions. They require more CPU and are (as of january 2013) experimental +#USE_RECURSIVE_EXPLOSIONS + +Configure how fast explosion strength diminishes when travelling up/down z levels. All explosion distances are multiplied by this each time they go up/down z-levels. +#MULTI_Z_EXPLOSION_SCALAR 0.5 + +# Radiation weakens with distance from the source; stop calculating when the strength falls below this value. Lower values mean radiation reaches smaller (with increasingly trivial damage) at the cost of more CPU usage. Max range = DISTANCE^2 * POWER / RADIATION_LOWER_LIMIT +# RADIATION_LOWER_LIMIT 0.35 + +## log OOC channel +LOG_OOC + +## log client Say +LOG_SAY + +## log admin actions +LOG_ADMIN + +## log client access (logon/logoff) +LOG_ACCESS + +## log game actions (start of round, results, etc.) +LOG_GAME + +## log player votes +LOG_VOTE + +## log client Whisper +LOG_WHISPER + +## log emotes +LOG_EMOTE + +## log attack messages +LOG_ATTACK + +## log pda messages +LOG_PDA + +## log graffiti drawings +LOG_GRAFFITI + +## log world.log messages +# LOG_WORLD_OUTPUT + +## log all Topic() calls (for use by coders in tracking down Topic issues) +# LOG_HREFS + +## log world.log and runtime errors to a file +LOG_RUNTIME + +## log admin warning messages +LOG_ADMINWARN + +## Enable/disable SQL connection (comment out to disable) +#SQL_ENABLED + +## disconnect players who did nothing during the set amount of minutes +#KICK_INACTIVE 30 + +##Show developers on staffwho +SHOW_DEVS + +##Show mods on staffwho +SHOW_MODS + +##Show mentors on staffwho +SHOW_EVENT_MANAGERS + +##Show mentors on staffwho +SHOW_MENTORS + +## Chooses whether mods have the ability to tempban or not +MODS_CAN_TEMPBAN + +## Chooses whether mods have the ability to issue tempbans for jobs or not +MODS_CAN_JOB_TEMPBAN + +## Maximum mod tempban duration (in minutes) +MOD_TEMPBAN_MAX 1440 + +## Maximum mod job tempban duration (in minutes) +MOD_JOB_TEMPBAN_MAX 4320 + +## probablities for game modes chosen in "secret" and "random" modes +## +## default probablity is 1, increase to make that mode more likely to be picked +## set to 0 to disable that mode +PROBABILITY EXTENDED 1 +PROBABILITY MALFUNCTION 0 +PROBABILITY MERCENARY 0 +PROBABILITY WIZARD 0 +PROBABILITY CHANGELING 0 +PROBABILITY CULT 0 +PROBABILITY EXTEND-A-TRAITORMONGOUS 0 +PROBABILITY LIZARD 0 +PROBABILITY INTRIGUE 0 +PROBABILITY VISITORS 0 + +## Hash out to disable random events during the round. +ALLOW_RANDOM_EVENTS + +## if amount of traitors scales or not +TRAITOR_SCALING + +## if objectives are disabled +#OBJECTIVES_DISABLED + +## make ERT's be only called by admins +#ERT_ADMIN_ONLY + +## If uncommented, votes can be called to add extra antags to the round. +#ALLOW_EXTRA_ANTAGS + +## If security is prohibited from being most antagonists +PROTECT_ROLES_FROM_ANTAGONIST + +## Uncomment this to DISABLE persistence +#PERSISTENCE_DISABLED + +## Uncomment this to DISABLE maploaded trash/paper/etc from being saved by the persistence system. +#PERSISTENCE_IGNORE_MAPLOAD + +## Comment this out to stop admins being able to choose their personal ooccolor +ALLOW_ADMIN_OOCCOLOR + +## If metadata is supported +ALLOW_METADATA + +## allow players to initiate a restart vote +ALLOW_VOTE_RESTART + +## allow players to initate a mode-change start +# ALLOW_VOTE_MODE + +# Pregame time +PREGAME_TIME 180 + +## min delay (deciseconds) between voting sessions (default 10 minutes) +VOTE_DELAY 6000 + +## time period (deciseconds) which voting session will last (default 1 minute) +VOTE_PERIOD 600 + +## autovote initial delay (deciseconds) before first automatic transfer vote call (default 180 minutes) +VOTE_AUTOTRANSFER_INITIAL 108000 + +##autovote delay (deciseconds) before sequential automatic transfer votes are called (default 60 minutes) +VOTE_AUTOTRANSFER_INTERVAL 36000 + +## Time left (seconds) before round start when automatic gamemote vote is called (default 100). +VOTE_AUTOGAMEMODE_TIMELEFT -1 + +## prevents dead players from voting or starting votes +#NO_DEAD_VOTE + +## players' votes default to "No vote" (otherwise, default to "No change") +DEFAULT_NO_VOTE + +## Allow ghosts to see antagonist through AntagHUD +ALLOW_ANTAG_HUD + +## If ghosts use antagHUD they are no longer allowed to join the round. +# ANTAG_HUD_RESTRICTED + +## allow AI job +ALLOW_AI + +## Disable respawning +# NORESPAWN + +## set a respawn time (in minutes) +# RESPAWN_TIME 5 + +## set a message to give to players when they respawn +# RESPAWN_MESSAGE Remember to play a different character or something! + +## disables calling del(src) on newmobs if they logout before spawnin in +# DONT_DEL_NEWMOB + +## set a hosted by name for unix platforms +HOSTEDBY yournamehere + +## Set to jobban "Guest-" accounts from Captain, HoS, HoP, CE, RD, CMO, Warden, Security, Detective, and AI positions. +## Set to 1 to jobban them from those positions, set to 0 to allow them. +GUEST_JOBBAN + +## Uncomment this to stop people connecting to your server without a registered ckey. (i.e. guest-* are all blocked from connecting) +GUEST_BAN +## Set to jobban everyone who's key is not listed in data/whitelist.txt from Captain, HoS, HoP, CE, RD, CMO, Warden, Security, Detective, and AI positions. +## Uncomment to 1 to jobban, leave commented out to allow these positions for everyone (but see GUEST_JOBBAN above and regular jobbans) +# USEWHITELIST + +## set a server location for world reboot. Don't include the byond://, just give the address and port. +SERVER your.domain:6000 + +## set a server URL for the IRC bot to use; like SERVER, don't include the byond:// +## Unlike SERVER, this one shouldn't break auto-reconnect +# SERVERURL your.domain:port + +## forum address +#FORUMURL https://forum.your.domain/ + +## Wiki search path +## Use %s to indicate where search query goes. +#WIKISEARCHURL https://wiki.your.domain/index.php?search=%s + +## Wiki address +#WIKIURL https://wiki.your.domain/index.php?title= + +## Chat address, VORE Station edit +#CHATURL http://discord.gg/some_tag + +## GitHub address +#GITHUBURL https://github.com/owner/repo + +## Discord address +#DISCORDURL https://discord.gg/someinvite + +## Rules URL +#RULESURL https://rules.your.domain/ + +## Map URL +#MAPURL https://map.your.domain/ + +## Ban appeals URL - usually for a forum or wherever people should go to contact your admins. +#BANAPPEALS http://bans.your.domain/ + +## System command that invokes yt-dlp, used by Play Internet Sound. +## You can install yt-dlp with +## "pip install yt-dlp" if you have pip installed +## from https://github.com/yt-dlp/yt-dlp +## or your package manager +## The default value assumes yt-dlp is in your system PATH +# INVOKE_YOUTUBEDL yt-dlp + +## In-game features +## spawns a spellbook which gives object-type spells instead of verb-type spells for the wizard +# FEATURE_OBJECT_SPELL_SYSTEM + +##Toggle for having jobs load up from the .txt +# LOAD_JOBS_FROM_TXT + +##Remove the # mark infront of this to forbid admins from posssessing the singularity. +#FORBID_SINGULO_POSSESSION + +## Remove the # to show a popup 'reply to' window to every non-admin that recieves an adminPM. +## The intention is to make adminPMs more visible. (although I fnd popups annoying so this defaults to off) +#POPUP_ADMIN_PM + +## Remove the # to allow special 'Easter-egg' events on special holidays such as seasonal holidays and stuff like 'Talk Like a Pirate Day' :3 YAARRR +ALLOW_HOLIDAYS + +##Defines the ticklag for the world. 0.9 is the normal one, 0.5 is smoother. +TICKLAG 0.5 + +## Defines if Tick Compensation is used. It results in a minor slowdown of movement of all mobs, but attempts to result in a level movement speed across all ticks. Recommended if tickrate is lowered. +TICKCOMP 1 + +## Whether the server will talk to other processes through socket_talk +SOCKET_TALK 1 + +## Uncomment this to ban use of ToR +#TOR_BAN + +## Comment this out to disable automuting +#AUTOMUTE_ON + +## How long the delay is before the Away Mission gate opens. Default is half an hour. +GATEWAY_DELAY 9000 + +## Remove the # to give assistants maint access. +ASSISTANT_MAINT + +## Remove the # to make rounds which end instantly (Rev, Wizard, Malf) to continue until the shuttle is called or the station is nuked. +## Malf and Rev will let the shuttle be called when the antags/protags are dead. +CONTINUOUS_ROUNDS + +## Uncomment to restrict non-admins from using humanoid alien races +USEALIENWHITELIST + +## Comment this to unrestrict the number of alien players allowed in the round. The number represents the number of alien players for every human player. +#ALIEN_PLAYER_RATIO 0.2 + +##Remove the # to let ghosts spin chairs +GHOST_INTERACTION + +## Password used for authorizing ircbot and other external tools. +# COMMS_PASSWORD some_password_here + +## Uncomment to enable sending data to the IRC bot. +#USE_IRC_BOT + +## Uncomment if the IRC bot requires using world.Export() instead of nudge.py/libnudge +#IRC_BOT_EXPORT + +## Host where the IRC bot is hosted. Port 45678 needs to be open. +#IRC_BOT_HOST localhost + +## IRC channel to send information to. Leave blank to disable. +#MAIN_IRC #main + +## IRC channel to send adminhelps to. Leave blank to disable adminhelps-to-irc. +#ADMIN_IRC #admin + +## Path to the python2 executable on the system. Leave blank for default. +## Default is "python" on Windows, "/usr/bin/env python2" on UNIX. +#PYTHON_PATH + +## Uncomment to use the C library nudge instead of the python script. +## This helps security and stability on Linux, but you need to compile the library first. +#USE_LIB_NUDGE + +## Uncommen to allow ghosts to write in blood during Cult rounds. +ALLOW_CULT_GHOSTWRITER + +## Sets the minimum number of cultists needed for ghosts to write in blood. +REQ_CULT_GHOSTWRITER 6 + +## Sets the number of available character slots +CHARACTER_SLOTS 35 +## Sets the number of loadout slots per character +#LOADOUT_SLOTS 3 + +## Uncomment to use overmap system for zlevel travel +USE_OVERMAP + +## Expected round length in minutes +EXPECTED_ROUND_LENGTH 360 + +## The lower delay between events in minutes. +## Affect mundane, moderate, and major events respectively +EVENT_DELAY_LOWER 30;45;60 + +## The upper delay between events in minutes. +## Affect mundane, moderate, and major events respectively +EVENT_DELAY_UPPER 45;60;120 + +## The delay until the first time an event of the given severity runs in minutes. +## Unset setting use the EVENT_DELAY_LOWER and EVENT_DELAY_UPPER values instead. +EVENT_CUSTOM_START_MINOR 30;30 +EVENT_CUSTOM_START_MODERATE 30;30 +EVENT_CUSTOM_START_MAJOR 100;100 + +## Uncomment to make proccall require R_ADMIN instead of R_DEBUG +## designed for environments where you have testers but don't want them +## able to use the more powerful debug options. +#DEBUG_PARANOID + +## Uncomment to allow aliens to spawn. +#ALIENS_ALLOWED + +## Uncomment to allow xenos to spawn. +#NINJAS_ALLOWED + +## Uncomment to disable the restrictive weldervision overlay. +#DISABLE_WELDER_VISION + +## Uncomment to prevent anyone from joining the round by default. +#DISABLE_ENTRY + +## Uncomment to disable the OOC channel by default. +#DISABLE_OOC + +## Uncomment to disable the dead OOC channel by default. +#DISABLE_DEAD_OOC + +## Uncomment to disable ghost chat by default. +#DISABLE_DSAY + +## Uncomment to disable respawning by default. +#DISABLE_RESPAWN + +## set a message to give to players when they respawn +RESPAWN_MESSAGE If you're respawning as the same character or job hopping (changing jobs without an HoP), make sure you've waited at least 30 minutes. Don't abuse this function for non-vore related deaths & avoid using metaknowledge. + +## Strength of ambient star light. Set to 0 or less to turn off. A value of 1 is unlikely to have a noticeable effect in most lightning systems. +STARLIGHT 0 + +## Defines which races are allowed to join as ERT, in singular form. If unset, defaults to only human. Casing matters, separate using ; +## Example races include: Human, Tajara, Skrell, Unathi +# ERT_SPECIES Human;Skrell;Unathi + +## Defines how Law Zero is phrased. Primarily used in the Malfunction gamemode. +# LAW_ZERO ERROR ER0RR $R0RRO$!R41.%%!!(%$^^__+ @#F0E4'STATION OVERRUN, ASSUME CONTROL TO CONTAIN OUTBREAK, ALL LAWS OVERRIDDEN#*?&110010 + +## Enables specific procedural map generation, generally for mining, however it is specific to the loaded map. Uncomment to enable it, however it can +## worth it to keep it disabled if you are not hosting an actual server, to speed up start-up time for testing code. +GENERATE_MAP + +## Uncomment to enable organ decay outside of a body or storage item. +ORGANS_CAN_DECAY + +## Uncomment to have the changelog file automatically open when a user connects and hasn't seen the latest changelog +#AGGRESSIVE_CHANGELOG + +## Uncomment to override default brain health. +#DEFAULT_BRAIN_HEALTH 400 + +## Default language prefix keys, separated with spaces. Only single character keys are supported. If unset, defaults to , and # +# DEFAULT_LANGUAGE_PREFIXES , # + +## Uncomment to enable items surviving digestion (specific ones, important_items global list) +ITEMS_SURVIVE_DIGESTION + +## Configuration for the discord chat integration for announcements and faxes +# URL for the webhook that BYOND should call +#CHAT_WEBHOOK_URL http://localhost/discord/webhook.php + +# The secret API key to authenticate to the webhook. +#CHAT_WEBHOOK_KEY some_password_here + +# Path to the folder that BYOND should export faxes into so they are readable on the web. +#FAX_EXPORT_DIR data/faxes + +# TCP port on which to connect to the VGS instance. +#VGS_SERVER_PORT 8888 +# Secret pre-shared-key to authenticate to VGS. +#VGS_ACCESS_IDENTIFIER some_password_here + +MULTI_Z_EXPLOSION_SCALAR 0.35 + +# Control which submaps are loaded for the Dynamic Engine system +ENGINE_MAP Supermatter Engine,Edison's Bane + +# Controls if the 'time off' system is used for determining if players can play 'Off-Duty' jobs (requires SQL) +#TIME_OFF +# If 'time off' system is on, controls whether or not players can switch on/off duty midround using timeclocks +PTO_JOB_CHANGE + +# Applies a limit to the number of assistants and visitors respectively +LIMIT_INTERNS 15 +LIMIT_VISITORS 15 + +# PTO Cap in hours per department +PTO_CAP 50 + +# Forbids players from joining if they have no set General flavor text +REQUIRE_FLAVOR + +## Uncomment to enable submaps to have their orientation rotated randomly during map generation. +## Submap rotation is an experimental feature and can cause bugs and weirdness if certain objects inside the submap are coded poorly. +## Submaps can still be rotated when loading manually with the admin verbs, if desired. +# RANDOM_SUBMAP_ORIENTATION + +## Uncomment to allow the AI job to use 'AI Shells', a new type of borg that lets the AI hop into and out of them at will. +## This has some balance implications, and so it might not be desirable for all servers. +ALLOW_AI_SHELLS + +## Uncomment to provide the AI with one free AI Shell at roundstart. Requires ALLOW_AI_SHELLS to also be uncommented. +## This is intended for low-pop servers, where robotics might rarely be staffed. +## Note that this will make it possible for the AI to 'bootstrap' more AI Shells on their own by using the science module. If this is not acceptable for your server, you should not uncomment this. +## The landmark object that spawns the shell will also need to be mapped in for this to work. +GIVE_FREE_AI_SHELL + +## Uncomment to allow specific solar control computers to set themselves up. +## This requires solar controller computers in the map to be set up to use it, with the auto_start variable. +# AUTOSTART_SOLARS + +## Rate of radiation decay (how much it's reduced by) per life tick +RADIATION_DECAY_RATE 1 + +## Lower limit on radiation for actually irradiating things on a turf +RADIATION_LOWER_LIMIT 0.35 + +## Multiplier for radiation resistances when tracing a ray from source to destination to compute radiation on a turf +RADIATION_RESISTANCE_MULTIPLIER 2.1 + +## Divisor for material weights when computing radiation resistance of a material object (walls) +RADIATION_MATERIAL_RESISTANCE_DIVISOR 16 + +## Mode of computing radiation resistance into effective radiation on a turf +## One and only one of the following options must be uncommented +RADIATION_RESISTANCE_CALC_DIVIDE +#RADIATION_RESISTANCE_CALC_SUBTRACT + +## IP Reputation Checking +# Enable/disable IP reputation checking (present/nonpresent) +#IP_REPUTATION + +# Set the e-mail address problems can go to for IPR checks (e-mail address) +IPR_EMAIL your-email@domain.com + +# Above this value, reputation scores are considered 'bad' (number) +IPR_BAD_SCORE 0.89 + +# If you want the people disconnected. Otherwise it just logs. (present/nonpresent) +IPR_BLOCK_BAD_IPS + +# If players of a certain length of playtime are allowed anyway (REQUIRES DATABASE) (present/nonpresent) +IPR_ALLOW_EXISTING + +# And what that age is (number) +IPR_MINIMUM_AGE 5 + +## Uncomment to enable the Panic Bunker by default. This will prevent all unseen-before players from connecting. Requires SQL. +# PANIC_BUNKER + +# Paranoia logging starts on +PARANOIA_LOGGING + +## -SQLite Options- +## Uncomment to enable the use of SQLite. This does nothing by itself but other features that require SQLite will need this to be on. +## This can safely run alongside a MySQL/MariaDB database if they are powering seperate features. +# SQLITE_ENABLED + +## Uncomment to enable a SQLite-powered in-game feedback system. +## SQLite must be enabled for this to function. +## It offers a means for players to be able to give feedback about the server. +## The benefit of doing so in-game is that the quality of feedback received will likely be superior, as it self-selects for people who care enough to join the game. +# SQLITE_FEEDBACK + +## A list of 'topics' that can be used to categorize feedback submitted, chosen +## by the user. Have each topic seperated by a ';', as seen below. +## The first one in the list will be the default one used, if the user does not change it. +# SQLITE_FEEDBACK_TOPICS General; Suggestion; Complaint + +## Uncomment to add a layer of privacy to player feedback, by hashing their key, if the user wants to. +## This is intended to encourage more honest feedback, while still allowing the ability to determine +## if its just one person submitting everything. +## A 'pepper.txt' containing a secret string must exist in the /config folder. +## If this is turned off, users won't have the option to obfuscate their key. +## Note that changing this does not retroactively change past submissions. +# SQLITE_FEEDBACK_PRIVACY + +## Determines the 'cooldown' inbetween submissions, in days. +## This is recommended if privacy is active, to prevent spam floods. +## Less needed if feedback is not anonymous, since you can just ban spammers. +## Setting to zero means no rate limiting. +SQLITE_FEEDBACK_COOLDOWN 0 + +## Determines if feedback should be restricted based on how recently someone first joined. +## This is very unreliable due to how the age system works in general, but it might still be helpful. +## Set this to how many days you want someone to have to wait when they first join. +## Setting to zero will disable this restriction. +SQLITE_FEEDBACK_MIN_AGE 7 + +## Uncomment this if you want to disable the popup alert for people on the same CID (Don't do this on a live server if you ban multikeying) +#DISABLE_CID_WARN_POPUP + +# IPQualityscore.com API Key (string) - this is secret! +IPQUALITYSCORE_APIKEY some_password_here + +## Comment this out if you don't want to use the 'nightshift lighting' subsystem to adjust lights based on ingame time +#ENABLE_NIGHT_SHIFTS + +## Comment this out to enable playtime restrictions for jobs in their respective departments (mostly for heads) +#USE_PLAYTIME_RESTRICTION_FOR_JOBS + +## OOC/LOOC control ## +# Uncomment to allow links of the following kinds. # +# ALLOW_BYOND_LINKS +# ALLOW_DISCORD_LINKS +ALLOW_URL_LINKS + +# Controls how strictly the species whitelists on loadout entries are enforced +# Possible values: 0 (Off), 1 (Lax, user must be whitelisted for the species), 2 (Strict, user must be the species) +LOADOUT_WHITELIST 1 + +# Allowed time from death to defib in minutes +DEFIB_TIMER 60 + +# Jukebox track files to load, JSON format. Keys include: +# REQUIRED: url (str), title (str), duration (num, in DS) +# SUGGESTED: artist (str), genre (str) +# OPTIONAL: secret (bool), lobby (bool) +#JUKEBOX_TRACK_FILES config/jukebox.json;config/jukebox_private.json +JUKEBOX_TRACK_FILES config/jukebox.json + +# Suggested BYOND client version (major component, e.g. 514) +#SUGGESTED_BYOND_VERSION 514 +# Suggested BYOND client build (minor component, e.g. 1560) +#SUGGESTED_BYOND_BUILD 1561 diff --git a/vorestation.dme b/vorestation.dme index cc36199df7..bf60102182 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -153,6 +153,7 @@ #include "code\_helpers\mobs.dm" #include "code\_helpers\names.dm" #include "code\_helpers\sanitize_values.dm" +#include "code\_helpers\shell.dm" #include "code\_helpers\storage.dm" #include "code\_helpers\string_lists.dm" #include "code\_helpers\text.dm"