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"