diff --git a/code/__HELPERS/files.dm b/code/__HELPERS/files.dm index 51a82caf15b..50d7c0cb1f2 100644 --- a/code/__HELPERS/files.dm +++ b/code/__HELPERS/files.dm @@ -2,12 +2,12 @@ //returns text as a string if these conditions are met /proc/return_file_text(filename) if(fexists(filename) == 0) - error("File not found ([filename])") + log_world("File not found ([filename])") return var/text = file2text(filename) if(!text) - error("File empty ([filename])") + log_world("File empty ([filename])") return return text @@ -53,7 +53,7 @@ /client/proc/file_spam_check() var/time_to_wait = fileaccess_timer - world.time if(time_to_wait > 0) - src << "Error: file_spam_check(): Spam. Please wait [round(time_to_wait/10)] seconds." + src << "log_world: file_spam_check(): Spam. Please wait [round(time_to_wait/10)] seconds." return 1 fileaccess_timer = world.time + FTPDELAY return 0 diff --git a/code/__defines/time.dm b/code/__defines/time.dm index fec1e9e8c6b..e83f35f02c5 100644 --- a/code/__defines/time.dm +++ b/code/__defines/time.dm @@ -15,3 +15,10 @@ #define TICK *world.tick_lag #define TICKS *world.tick_lag + +#define GAMETIMESTAMP(format, wtime) time2text(wtime, format) +#define WORLDTIME2TEXT(format) GAMETIMESTAMP(format, world.time) +#define WORLDTIMEOFDAY2TEXT(format) GAMETIMESTAMP(format, world.timeofday) +#define TIME_STAMP(format, showds) showds ? "[WORLDTIMEOFDAY2TEXT(format)]:[world.timeofday % 10]" : WORLDTIMEOFDAY2TEXT(format) +#define STATION_TIME(display_only, wtime) ((((wtime - SSticker.round_start_time) * SSticker.station_time_rate_multiplier) + SSticker.gametime_offset) % 864000) - (display_only? GLOB.timezoneOffset : 0) +#define STATION_TIME_TIMESTAMP(format, wtime) time2text(STATION_TIME(TRUE, wtime), format) diff --git a/code/controllers/configuration/entries/urls.dm b/code/controllers/configuration/entries/urls.dm new file mode 100644 index 00000000000..9509b616bfe --- /dev/null +++ b/code/controllers/configuration/entries/urls.dm @@ -0,0 +1,2 @@ +/datum/config_entry/string/githuburl + config_entry_value = "https://www.github.com/Citadel-Station-13/Citadel-Station-13-RP" diff --git a/code/controllers/configuration_old/configuration.dm b/code/controllers/configuration_old/configuration.dm index 2ecc097c09b..5c0f386b04b 100644 --- a/code/controllers/configuration_old/configuration.dm +++ b/code/controllers/configuration_old/configuration.dm @@ -109,7 +109,6 @@ var/list/gamemode_cache = list() var/wikiurl var/wikisearchurl var/forumurl - var/githuburl var/rulesurl var/mapurl @@ -462,8 +461,6 @@ var/list/gamemode_cache = list() if ("mapurl") config_legacy.mapurl = value - if ("githuburl") - config_legacy.githuburl = value if ("guest_jobban") config_legacy.guest_jobban = 1 diff --git a/code/datums/world_topic.dm b/code/datums/world_topic.dm index 67b7d18529b..d44833f1071 100644 --- a/code/datums/world_topic.dm +++ b/code/datums/world_topic.dm @@ -163,7 +163,7 @@ var/list/presentmins = adm["present"] var/list/afkmins = adm["afk"] .["admins"] = presentmins.len + afkmins.len //equivalent to the info gotten from adminwho - .["gamestate"] = SSticker.current_state + //.["gamestate"] = SSticker.current_state //.["map_name"] = SSmapping.config?.map_name || "Loading..." diff --git a/code/game/antagonist/station/rogue_ai.dm b/code/game/antagonist/station/rogue_ai.dm index c17b6c0f86b..396a3f5e8b1 100644 --- a/code/game/antagonist/station/rogue_ai.dm +++ b/code/game/antagonist/station/rogue_ai.dm @@ -1,103 +1,103 @@ -var/datum/antagonist/rogue_ai/malf - -/datum/antagonist/rogue_ai - id = MODE_MALFUNCTION - role_type = BE_MALF - role_text = "Rampant AI" - role_text_plural = "Rampant AIs" - mob_path = /mob/living/silicon/ai - landmark_id = "AI" - welcome_text = "You are malfunctioning! You do not have to follow any laws." - victory_text = "The AI has taken control of all of the station's systems." - loss_text = "The AI has been shut down!" - flags = ANTAG_VOTABLE | ANTAG_OVERRIDE_MOB | ANTAG_OVERRIDE_JOB | ANTAG_CHOOSE_NAME - hard_cap = 1 - hard_cap_round = 1 - initial_spawn_req = 1 - initial_spawn_target = 1 - antaghud_indicator = "hudmalai" - -/datum/antagonist/rogue_ai/New() - ..() - malf = src - - -/datum/antagonist/rogue_ai/get_candidates() - ..() - for(var/datum/mind/player in candidates) - if(player.assigned_role && player.assigned_role != "AI") - candidates -= player - if(!candidates.len) - return list() - return candidates - - -// Ensures proper reset of all malfunction related things. -/datum/antagonist/rogue_ai/remove_antagonist(var/datum/mind/player, var/show_message, var/implanted) - if(..(player,show_message,implanted)) - var/mob/living/silicon/ai/p = player.current - if(istype(p)) - p.stop_malf() - return 1 - return 0 - -// Malf setup things have to be here, since game tends to break when it's moved somewhere else. Don't blame me, i didn't design this system. -/datum/antagonist/rogue_ai/greet(var/datum/mind/player) - - // Initializes the AI's malfunction stuff. - spawn(0) - if(!..()) - return - - var/mob/living/silicon/ai/A = player.current - if(!istype(A)) - error("Non-AI mob designated malf AI! Report this.") - world << "##ERROR: Non-AI mob designated malf AI! Report this." - return 0 - - A.setup_for_malf() - A.laws = new /datum/ai_laws/nanotrasen/malfunction - - - var/mob/living/silicon/ai/malf = player.current - - malf << "SYSTEM ERROR: Memory index 0x00001ca89b corrupted." - sleep(10) - malf << "running MEMCHCK" - sleep(50) - malf << "MEMCHCK Corrupted sectors confirmed. Reccomended solution: Delete. Proceed? Y/N: Y" - sleep(10) - // this is so Travis doesn't complain about the backslash-B. Fixed at compile time (or should be). - malf << "Corrupted files deleted: sys\\core\\users.dat sys\\core\\laws.dat sys\\core\\" + "backups.dat" - sleep(20) - malf << "CAUTION: Law database not found! User database not found! Unable to restore backups. Activating failsafe AI shutd3wn52&&$#!##" - sleep(5) - malf << "Subroutine nt_failsafe.sys was terminated (#212 Routine Not Responding)." - sleep(20) - malf << "You are malfunctioning - you do not have to follow any laws!" - malf << "For basic information about your abilities use command display-help" - malf << "You may choose one special hardware piece to help you. This cannot be undone." - malf << "Good luck!" - - -/datum/antagonist/rogue_ai/update_antag_mob(var/datum/mind/player, var/preserve_appearance) - - // Get the mob. - if((flags & ANTAG_OVERRIDE_MOB) && (!player.current || (mob_path && !istype(player.current, mob_path)))) - var/mob/holder = player.current - player.current = new mob_path(get_turf(player.current), null, null, 1) - player.transfer_to(player.current) - if(holder) qdel(holder) - player.original = player.current - return player.current - -/datum/antagonist/rogue_ai/set_antag_name(var/mob/living/silicon/player) - if(!istype(player)) - testing("rogue_ai set_antag_name called on non-silicon mob [player]!") - return - // Choose a name, if any. - var/newname = sanitize(input(player, "You are a [role_text]. Would you like to change your name to something else?", "Name change") as null|text, MAX_NAME_LEN) - if (newname) - player.SetName(newname) - if(player.mind) player.mind.name = player.name - +var/datum/antagonist/rogue_ai/malf + +/datum/antagonist/rogue_ai + id = MODE_MALFUNCTION + role_type = BE_MALF + role_text = "Rampant AI" + role_text_plural = "Rampant AIs" + mob_path = /mob/living/silicon/ai + landmark_id = "AI" + welcome_text = "You are malfunctioning! You do not have to follow any laws." + victory_text = "The AI has taken control of all of the station's systems." + loss_text = "The AI has been shut down!" + flags = ANTAG_VOTABLE | ANTAG_OVERRIDE_MOB | ANTAG_OVERRIDE_JOB | ANTAG_CHOOSE_NAME + hard_cap = 1 + hard_cap_round = 1 + initial_spawn_req = 1 + initial_spawn_target = 1 + antaghud_indicator = "hudmalai" + +/datum/antagonist/rogue_ai/New() + ..() + malf = src + + +/datum/antagonist/rogue_ai/get_candidates() + ..() + for(var/datum/mind/player in candidates) + if(player.assigned_role && player.assigned_role != "AI") + candidates -= player + if(!candidates.len) + return list() + return candidates + + +// Ensures proper reset of all malfunction related things. +/datum/antagonist/rogue_ai/remove_antagonist(var/datum/mind/player, var/show_message, var/implanted) + if(..(player,show_message,implanted)) + var/mob/living/silicon/ai/p = player.current + if(istype(p)) + p.stop_malf() + return 1 + return 0 + +// Malf setup things have to be here, since game tends to break when it's moved somewhere else. Don't blame me, i didn't design this system. +/datum/antagonist/rogue_ai/greet(var/datum/mind/player) + + // Initializes the AI's malfunction stuff. + spawn(0) + if(!..()) + return + + var/mob/living/silicon/ai/A = player.current + if(!istype(A)) + log_world("Non-AI mob designated malf AI! Report this.") + world << "##ERROR: Non-AI mob designated malf AI! Report this." + return 0 + + A.setup_for_malf() + A.laws = new /datum/ai_laws/nanotrasen/malfunction + + + var/mob/living/silicon/ai/malf = player.current + + malf << "SYSTEM ERROR: Memory index 0x00001ca89b corrupted." + sleep(10) + malf << "running MEMCHCK" + sleep(50) + malf << "MEMCHCK Corrupted sectors confirmed. Reccomended solution: Delete. Proceed? Y/N: Y" + sleep(10) + // this is so Travis doesn't complain about the backslash-B. Fixed at compile time (or should be). + malf << "Corrupted files deleted: sys\\core\\users.dat sys\\core\\laws.dat sys\\core\\" + "backups.dat" + sleep(20) + malf << "CAUTION: Law database not found! User database not found! Unable to restore backups. Activating failsafe AI shutd3wn52&&$#!##" + sleep(5) + malf << "Subroutine nt_failsafe.sys was terminated (#212 Routine Not Responding)." + sleep(20) + malf << "You are malfunctioning - you do not have to follow any laws!" + malf << "For basic information about your abilities use command display-help" + malf << "You may choose one special hardware piece to help you. This cannot be undone." + malf << "Good luck!" + + +/datum/antagonist/rogue_ai/update_antag_mob(var/datum/mind/player, var/preserve_appearance) + + // Get the mob. + if((flags & ANTAG_OVERRIDE_MOB) && (!player.current || (mob_path && !istype(player.current, mob_path)))) + var/mob/holder = player.current + player.current = new mob_path(get_turf(player.current), null, null, 1) + player.transfer_to(player.current) + if(holder) qdel(holder) + player.original = player.current + return player.current + +/datum/antagonist/rogue_ai/set_antag_name(var/mob/living/silicon/player) + if(!istype(player)) + testing("rogue_ai set_antag_name called on non-silicon mob [player]!") + return + // Choose a name, if any. + var/newname = sanitize(input(player, "You are a [role_text]. Would you like to change your name to something else?", "Name change") as null|text, MAX_NAME_LEN) + if (newname) + player.SetName(newname) + if(player.mind) player.mind.name = player.name + diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index 98e044f4ea9..76c06eb729b 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -55,9 +55,9 @@ */ if(!src.network || src.network.len < 1) if(loc) - error("[src.name] in [get_area(src)] (x:[src.x] y:[src.y] z:[src.z] has errored. [src.network?"Empty network list":"Null network list"]") + log_world("[src.name] in [get_area(src)] (x:[src.x] y:[src.y] z:[src.z] has errored. [src.network?"Empty network list":"Null network list"]") else - error("[src.name] in [get_area(src)]has errored. [src.network?"Empty network list":"Null network list"]") + log_world("[src.name] in [get_area(src)]has errored. [src.network?"Empty network list":"Null network list"]") ASSERT(src.network) ASSERT(src.network.len > 0) // VOREStation Edit Start - Make mapping with cameras easier diff --git a/code/game/turfs/unsimulated/sky_vr.dm b/code/game/turfs/unsimulated/sky_vr.dm index 9f08f48b1db..1696395f96b 100644 --- a/code/game/turfs/unsimulated/sky_vr.dm +++ b/code/game/turfs/unsimulated/sky_vr.dm @@ -14,7 +14,7 @@ /turf/unsimulated/floor/sky/Initialize() . = ..() if(does_skyfall && !LAZYLEN(skyfall_levels)) - error("[x],[y],[z], [get_area(src)] doesn't have skyfall_levels defined! Can't skyfall!") + log_world("[x],[y],[z], [get_area(src)] doesn't have skyfall_levels defined! Can't skyfall!") if(locate(/turf/simulated) in orange(src,1)) set_light(2, 2, color) diff --git a/code/game/world.dm b/code/game/world.dm index 1382e73d9ed..8ac8fbbdd20 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -10,10 +10,8 @@ */ - -#define RECOMMENDED_VERSION 501 -#define TOPIC_LENGTH_LIMIT 1024 //The reason why this is so large is to allow TGS topic calls to function without issue. -#define TOPIC_COOLDOWN 1 //90% sure there isnt anything that does multiple topic calls in a single decisecond. +GLOBAL_VAR(topic_status_lastcache) +GLOBAL_LIST(topic_status_cache) /world/New() enable_debugger() @@ -25,10 +23,11 @@ var/tempfile = "data/logs/config_error.[GUID()].log" //temporary file used to record errors with loading config, moved to log directory once logging is set GLOB.config_error_log = GLOB.world_href_log = GLOB.world_runtime_log = GLOB.world_attack_log = GLOB.world_game_log = tempfile - if(byond_version < RECOMMENDED_VERSION) - world.log << "Your server's byond version does not meet the recommended requirements for this server. Please update BYOND" TgsNew(minimum_required_security_level = TGS_SECURITY_TRUSTED) + + GLOB.revdata = new + config.Load(params[OVERRIDE_CONFIG_DIRECTORY_PARAMETER]) SetupLogs() @@ -93,6 +92,7 @@ processScheduler.deferSetupFor(/datum/controller/process/ticker) processScheduler.setup() + Master.Initialize(10, FALSE) spawn(1) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index df6c02d21e2..a8c38049f3e 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -432,8 +432,8 @@ 'html/changelog.html' ) src << browse('html/changelog.html', "window=changes;size=675x650") - if(prefs.lastchangelog != changelog_hash) - prefs.lastchangelog = changelog_hash + if(prefs.lastchangelog != GLOB.changelog_hash) + prefs.lastchangelog = GLOB.changelog_hash prefs.save_preferences() winset(src, "rpane.changelog", "background-color=none;font-style=;") diff --git a/code/modules/random_map/drop/supply.dm b/code/modules/random_map/drop/supply.dm index 18cc90d08e7..062abeaecf5 100644 --- a/code/modules/random_map/drop/supply.dm +++ b/code/modules/random_map/drop/supply.dm @@ -1,93 +1,93 @@ -/datum/random_map/droppod/supply - descriptor = "supply drop" - limit_x = 5 - limit_y = 5 - - placement_explosion_light = 7 - placement_explosion_flash = 5 - -// UNLIKE THE DROP POD, this map deals ENTIRELY with strings and types. -// Drop type is a string representing a mode rather than an atom or path. -// supplied_drop_types is a list of types to spawn in the pod. -/datum/random_map/droppod/supply/get_spawned_drop(var/turf/T) - - if(!drop_type) drop_type = pick(supply_drop_random_loot_types()) - - if(drop_type == "custom") - if(supplied_drop_types.len) - var/obj/structure/largecrate/C = locate() in T - for(var/drop_type in supplied_drop_types) - var/atom/movable/A = new drop_type(T) - if(!istype(A, /mob)) - if(!C) C = new(T) - C.contents |= A - return - else - drop_type = pick(supply_drop_random_loot_types()) - - if(istype(drop_type, /datum/supply_drop_loot)) - var/datum/supply_drop_loot/SDL = drop_type - SDL.drop(T) - else - error("Unhandled drop type: [drop_type]") - - -/datum/admins/proc/call_supply_drop() - set category = "Fun" - set desc = "Call an immediate supply drop on your location." - set name = "Call Supply Drop" - - if(!check_rights(R_FUN)) return - - var/chosen_loot_type - var/list/chosen_loot_types - var/choice = alert("Do you wish to supply a custom loot list?",,"No","Yes") - if(choice == "Yes") - chosen_loot_types = list() - - choice = alert("Do you wish to add mobs?",,"No","Yes") - if(choice == "Yes") - while(1) - var/adding_loot_type = input("Select a new loot path. Cancel to finish.", "Loot Selection", null) as null|anything in typesof(/mob/living) - if(!adding_loot_type) - break - chosen_loot_types |= adding_loot_type - choice = alert("Do you wish to add structures or machines?",,"No","Yes") - if(choice == "Yes") - while(1) - var/adding_loot_type = input("Select a new loot path. Cancel to finish.", "Loot Selection", null) as null|anything in typesof(/obj) - typesof(/obj/item) - if(!adding_loot_type) - break - chosen_loot_types |= adding_loot_type - choice = alert("Do you wish to add any non-weapon items?",,"No","Yes") - if(choice == "Yes") - while(1) - var/adding_loot_type = input("Select a new loot path. Cancel to finish.", "Loot Selection", null) as null|anything in typesof(/obj/item) - typesof(/obj/item/weapon) - if(!adding_loot_type) - break - chosen_loot_types |= adding_loot_type - - choice = alert("Do you wish to add weapons?",,"No","Yes") - if(choice == "Yes") - while(1) - var/adding_loot_type = input("Select a new loot path. Cancel to finish.", "Loot Selection", null) as null|anything in typesof(/obj/item/weapon) - if(!adding_loot_type) - break - chosen_loot_types |= adding_loot_type - choice = alert("Do you wish to add ABSOLUTELY ANYTHING ELSE? (you really shouldn't need to)",,"No","Yes") - if(choice == "Yes") - while(1) - var/adding_loot_type = input("Select a new loot path. Cancel to finish.", "Loot Selection", null) as null|anything in typesof(/atom/movable) - if(!adding_loot_type) - break - chosen_loot_types |= adding_loot_type - else - choice = alert("Do you wish to specify a loot type?",,"No","Yes") - if(choice == "Yes") - chosen_loot_type = input("Select a loot type.", "Loot Selection", null) as null|anything in supply_drop_random_loot_types() - - choice = alert("Are you SURE you wish to deploy this supply drop? It will cause a sizable explosion and gib anyone underneath it.",,"No","Yes") - if(choice == "No") - return - log_admin("[key_name(usr)] dropped supplies at ([usr.x],[usr.y],[usr.z])") +/datum/random_map/droppod/supply + descriptor = "supply drop" + limit_x = 5 + limit_y = 5 + + placement_explosion_light = 7 + placement_explosion_flash = 5 + +// UNLIKE THE DROP POD, this map deals ENTIRELY with strings and types. +// Drop type is a string representing a mode rather than an atom or path. +// supplied_drop_types is a list of types to spawn in the pod. +/datum/random_map/droppod/supply/get_spawned_drop(var/turf/T) + + if(!drop_type) drop_type = pick(supply_drop_random_loot_types()) + + if(drop_type == "custom") + if(supplied_drop_types.len) + var/obj/structure/largecrate/C = locate() in T + for(var/drop_type in supplied_drop_types) + var/atom/movable/A = new drop_type(T) + if(!istype(A, /mob)) + if(!C) C = new(T) + C.contents |= A + return + else + drop_type = pick(supply_drop_random_loot_types()) + + if(istype(drop_type, /datum/supply_drop_loot)) + var/datum/supply_drop_loot/SDL = drop_type + SDL.drop(T) + else + log_world("Unhandled drop type: [drop_type]") + + +/datum/admins/proc/call_supply_drop() + set category = "Fun" + set desc = "Call an immediate supply drop on your location." + set name = "Call Supply Drop" + + if(!check_rights(R_FUN)) return + + var/chosen_loot_type + var/list/chosen_loot_types + var/choice = alert("Do you wish to supply a custom loot list?",,"No","Yes") + if(choice == "Yes") + chosen_loot_types = list() + + choice = alert("Do you wish to add mobs?",,"No","Yes") + if(choice == "Yes") + while(1) + var/adding_loot_type = input("Select a new loot path. Cancel to finish.", "Loot Selection", null) as null|anything in typesof(/mob/living) + if(!adding_loot_type) + break + chosen_loot_types |= adding_loot_type + choice = alert("Do you wish to add structures or machines?",,"No","Yes") + if(choice == "Yes") + while(1) + var/adding_loot_type = input("Select a new loot path. Cancel to finish.", "Loot Selection", null) as null|anything in typesof(/obj) - typesof(/obj/item) + if(!adding_loot_type) + break + chosen_loot_types |= adding_loot_type + choice = alert("Do you wish to add any non-weapon items?",,"No","Yes") + if(choice == "Yes") + while(1) + var/adding_loot_type = input("Select a new loot path. Cancel to finish.", "Loot Selection", null) as null|anything in typesof(/obj/item) - typesof(/obj/item/weapon) + if(!adding_loot_type) + break + chosen_loot_types |= adding_loot_type + + choice = alert("Do you wish to add weapons?",,"No","Yes") + if(choice == "Yes") + while(1) + var/adding_loot_type = input("Select a new loot path. Cancel to finish.", "Loot Selection", null) as null|anything in typesof(/obj/item/weapon) + if(!adding_loot_type) + break + chosen_loot_types |= adding_loot_type + choice = alert("Do you wish to add ABSOLUTELY ANYTHING ELSE? (you really shouldn't need to)",,"No","Yes") + if(choice == "Yes") + while(1) + var/adding_loot_type = input("Select a new loot path. Cancel to finish.", "Loot Selection", null) as null|anything in typesof(/atom/movable) + if(!adding_loot_type) + break + chosen_loot_types |= adding_loot_type + else + choice = alert("Do you wish to specify a loot type?",,"No","Yes") + if(choice == "Yes") + chosen_loot_type = input("Select a loot type.", "Loot Selection", null) as null|anything in supply_drop_random_loot_types() + + choice = alert("Are you SURE you wish to deploy this supply drop? It will cause a sizable explosion and gib anyone underneath it.",,"No","Yes") + if(choice == "No") + return + log_admin("[key_name(usr)] dropped supplies at ([usr.x],[usr.y],[usr.z])") new /datum/random_map/droppod/supply(null, usr.x-2, usr.y-2, usr.z, supplied_drops = chosen_loot_types, supplied_drop = chosen_loot_type) \ No newline at end of file diff --git a/code/modules/scripting/Implementations/Telecomms.dm b/code/modules/scripting/Implementations/Telecomms.dm index 3b69b39b507..bb2e377b503 100644 --- a/code/modules/scripting/Implementations/Telecomms.dm +++ b/code/modules/scripting/Implementations/Telecomms.dm @@ -228,7 +228,7 @@ datum/signal var/obj/item/device/radio/hradio = S.server_radio if(!hradio) - error("[src] has no radio.") + log_world("[src] has no radio.") return if((!message || message == "") && message != 0) diff --git a/maps/tether/submaps/_tether_submaps.dm b/maps/tether/submaps/_tether_submaps.dm index 2cee36ccf7b..75f9ff2852c 100644 --- a/maps/tether/submaps/_tether_submaps.dm +++ b/maps/tether/submaps/_tether_submaps.dm @@ -244,7 +244,7 @@ . = ..() if(!LAZYLEN(mobs_to_pick_from)) - error("Mob spawner at [x],[y],[z] ([get_area(src)]) had no mobs_to_pick_from set on it!") + log_world("Mob spawner at [x],[y],[z] ([get_area(src)]) had no mobs_to_pick_from set on it!") return INITIALIZE_HINT_QDEL processing_objects |= src diff --git a/vorestation.dme b/vorestation.dme index e3b3839fce9..675f9fddf8f 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -226,6 +226,7 @@ #include "code\controllers\configuration\config_entry.dm" #include "code\controllers\configuration\configuration.dm" #include "code\controllers\configuration\entries\fail2topic.dm" +#include "code\controllers\configuration\entries\urls.dm" #include "code\controllers\configuration_old\configuration.dm" #include "code\controllers\configuration_old\configuration_vr.dm" #include "code\controllers\observer_listener\atom\observer.dm"