diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index ed76f6fd3ff..ac0972850ea 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -45,7 +45,8 @@ // Subsystems shutdown in the reverse of the order they initialize in // The numbers just define the ordering, they are meaningless otherwise. #define INIT_ORDER_PROFILER 101 -#define INIT_ORDER_TITLE 100 // Load this quickly so people dont see a blank lobby screen +#define INIT_ORDER_QUEUE 100 // Load this quickly so people cant queue skip +#define INIT_ORDER_TITLE 99 // Load this quickly so people dont see a blank lobby screen #define INIT_ORDER_GARBAGE 21 #define INIT_ORDER_DBCORE 20 #define INIT_ORDER_BLACKBOX 19 diff --git a/code/_globalvars/misc.dm b/code/_globalvars/misc.dm index 40dfb374170..49bef9c90cd 100644 --- a/code/_globalvars/misc.dm +++ b/code/_globalvars/misc.dm @@ -50,8 +50,6 @@ GLOBAL_VAR_INIT(copier_items_printed_logged, FALSE) GLOBAL_DATUM_INIT(data_core, /datum/datacore, new) // Station datacore, manifest, etc -GLOBAL_VAR_INIT(panic_bunker_enabled, FALSE) // Is the panic bunker enabled - GLOBAL_LIST_EMPTY(ability_verbs) // Create-level abilities GLOBAL_LIST_INIT(pipe_colors, list("grey" = PIPE_COLOR_GREY, "red" = PIPE_COLOR_RED, "blue" = PIPE_COLOR_BLUE, "cyan" = PIPE_COLOR_CYAN, "green" = PIPE_COLOR_GREEN, "yellow" = PIPE_COLOR_YELLOW, "purple" = PIPE_COLOR_PURPLE)) diff --git a/code/controllers/configuration/sections/general_configuration.dm b/code/controllers/configuration/sections/general_configuration.dm index 296304c28b7..816775fa6d9 100644 --- a/code/controllers/configuration/sections/general_configuration.dm +++ b/code/controllers/configuration/sections/general_configuration.dm @@ -14,8 +14,6 @@ var/lobby_time = 240 /// Ban all Guest BYOND accounts var/guest_ban = TRUE - /// Player threshold to automatically enable panic bunker - var/panic_bunker_threshold = 150 /// Allow players to use AntagHUD? var/allow_antag_hud = TRUE /// Forbid players from rejoining if they use AntagHUD? @@ -121,7 +119,6 @@ // Numbers CONFIG_LOAD_NUM(lobby_time, data["lobby_time"]) - CONFIG_LOAD_NUM(panic_bunker_threshold, data["panic_bunker_threshold"]) CONFIG_LOAD_NUM(base_loadout_points, data["base_loadout_points"]) CONFIG_LOAD_NUM(cryo_penalty_period, data["cryo_penalty_period"]) CONFIG_LOAD_NUM(minimum_client_build, data["minimum_client_build"]) diff --git a/code/controllers/subsystem/server_queue.dm b/code/controllers/subsystem/server_queue.dm new file mode 100644 index 00000000000..7855c870918 --- /dev/null +++ b/code/controllers/subsystem/server_queue.dm @@ -0,0 +1,45 @@ +#define QUEUE_DATA_FILE "data/queue_data.json" +// These are defines for the sake of making sure we get the right keys +#define QUEUE_DATA_FILE_THRESHOLD_KEY "threshold" +#define QUEUE_DATA_FILE_ENABLED_KEY "enabled" +#define QUEUE_DATA_FILE_PERSISTENT_KEY "persistent" + +SUBSYSTEM_DEF(queue) + name = "Server Queue" + init_order = INIT_ORDER_QUEUE // 100 + flags = SS_NO_FIRE + /// Threshold of players to queue new people + var/queue_threshold = 0 + /// Whether the queue is enabled or not + var/queue_enabled = FALSE + /// Whether to persist these settings over multiple rounds + var/persist_queue = FALSE + /// List of ckeys allowed to bypass queue this round + var/list/queue_bypass_list = list() + /// Last world.time we let a ckey in. 3 second delay between each letin to avoid a mass bubble + var/last_letin_time = 0 + +/datum/controller/subsystem/queue/Initialize(start_timeofday) + if(fexists(QUEUE_DATA_FILE)) + try + var/F = file2text(QUEUE_DATA_FILE) + var/list/data = json_decode(F) + queue_threshold = data[QUEUE_DATA_FILE_THRESHOLD_KEY] + queue_enabled = data[QUEUE_DATA_FILE_ENABLED_KEY] + persist_queue = data[QUEUE_DATA_FILE_PERSISTENT_KEY] + catch + stack_trace("Failed to load [QUEUE_DATA_FILE] from disk due to malformed JSON. You may need to setup the queue again.") + + return ..() + +/datum/controller/subsystem/queue/Shutdown() + // Save if persistent + if(persist_queue) + if(fexists(QUEUE_DATA_FILE)) + fdel(QUEUE_DATA_FILE) + var/data = list() + data[QUEUE_DATA_FILE_THRESHOLD_KEY] = queue_threshold + data[QUEUE_DATA_FILE_ENABLED_KEY] = queue_enabled + data[QUEUE_DATA_FILE_PERSISTENT_KEY] = persist_queue + var/json_data = json_encode(data) + text2file(json_data, QUEUE_DATA_FILE) diff --git a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm index a0519fcbe56..08dbec69279 100644 --- a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm +++ b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm @@ -358,6 +358,7 @@ item_state = "alienpistol" origin_tech = "combat=4;magnets=7;powerstorage=3;abductor=3" trigger_guard = TRIGGER_GUARD_ALLOW_ALL + can_holster = TRUE /obj/item/paper/abductor name = "Dissection Guide" diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 92e2c4115fe..c617860643e 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -16,12 +16,21 @@ GLOBAL_LIST_INIT(metal_recipes, list( new /datum/stack_recipe("stool", /obj/structure/chair/stool, one_per_turf = 1, on_floor = 1), new /datum/stack_recipe("barstool", /obj/structure/chair/stool/bar, one_per_turf = 1, on_floor = 1), - new /datum/stack_recipe("chair", /obj/structure/chair, one_per_turf = 1, on_floor = 1), + new /datum/stack_recipe("chair (dark)", /obj/structure/chair, one_per_turf = 1, on_floor = 1), + new /datum/stack_recipe("chair (light)", /obj/structure/chair/light, one_per_turf = 1, on_floor = 1), new /datum/stack_recipe("shuttle seat", /obj/structure/chair/comfy/shuttle, 2, one_per_turf = 1, on_floor = 1), - new /datum/stack_recipe("sofa (middle)", /obj/structure/chair/sofa, one_per_turf = 1, on_floor = 1), - new /datum/stack_recipe("sofa (left)", /obj/structure/chair/sofa/left, one_per_turf = 1, on_floor = 1), - new /datum/stack_recipe("sofa (right)", /obj/structure/chair/sofa/right, one_per_turf = 1, on_floor = 1), - new /datum/stack_recipe("sofa (corner)", /obj/structure/chair/sofa/corner, one_per_turf = 1, on_floor = 1), + new /datum/stack_recipe_list("sofas", list( + new /datum/stack_recipe("sofa (middle)", /obj/structure/chair/sofa, 1, one_per_turf = TRUE, on_floor = TRUE), + new /datum/stack_recipe("sofa (left)", /obj/structure/chair/sofa/left, 1, one_per_turf = TRUE, on_floor = TRUE), + new /datum/stack_recipe("sofa (right)", /obj/structure/chair/sofa/right, 1, one_per_turf = TRUE, on_floor = TRUE), + new /datum/stack_recipe("sofa (corner)", /obj/structure/chair/sofa/corner, 1, one_per_turf = TRUE, on_floor = TRUE) + )), \ + new /datum/stack_recipe_list("corporate sofas", list( \ + new /datum/stack_recipe("sofa (middle)", /obj/structure/chair/sofa/corp, 1, one_per_turf = TRUE, on_floor = TRUE), \ + new /datum/stack_recipe("sofa (left)", /obj/structure/chair/sofa/corp/left, 1, one_per_turf = TRUE, on_floor = TRUE), \ + new /datum/stack_recipe("sofa (right)", /obj/structure/chair/sofa/corp/right, 1, one_per_turf = TRUE, on_floor = TRUE), \ + new /datum/stack_recipe("sofa (corner)", /obj/structure/chair/sofa/corp/corner, 1, one_per_turf = TRUE, on_floor = TRUE), \ + )), \ new /datum/stack_recipe("barber chair", /obj/structure/chair/barber, one_per_turf = 1, on_floor = 1), new /datum/stack_recipe("wheelchair", /obj/structure/chair/wheelchair, 15, one_per_turf = 1, on_floor = 1), new /datum/stack_recipe("bed", /obj/structure/bed, 2, one_per_turf = 1, on_floor = 1), @@ -176,6 +185,11 @@ GLOBAL_LIST_INIT(wood_recipes, list( new /datum/stack_recipe("wood floor tile", /obj/item/stack/tile/wood, 1, 4, 20), new /datum/stack_recipe("wood table frame", /obj/structure/table_frame/wood, 2, time = 10), \ new /datum/stack_recipe("wooden chair", /obj/structure/chair/wood, 3, time = 10, one_per_turf = 1, on_floor = 1), + new /datum/stack_recipe_list("pews", list( + new /datum/stack_recipe("pew (middle)", /obj/structure/chair/sofa/pew, 1, one_per_turf = TRUE, on_floor = TRUE), + new /datum/stack_recipe("pew (left)", /obj/structure/chair/sofa/pew/left, 1, one_per_turf = TRUE, on_floor = TRUE), + new /datum/stack_recipe("pew (right)", /obj/structure/chair/sofa/pew/right, 1, one_per_turf = TRUE, on_floor = TRUE), + )), \ new /datum/stack_recipe("wooden barricade", /obj/structure/barricade/wooden, 5, time = 50, one_per_turf = 1, on_floor = 1), new /datum/stack_recipe("bookcase", /obj/structure/bookcase, 5, time = 50, one_per_turf = 1, on_floor = 1), new /datum/stack_recipe("dresser", /obj/structure/dresser, 30, time = 50, one_per_turf = 1, on_floor = 1), diff --git a/code/game/objects/items/weapons/storage/bible.dm b/code/game/objects/items/weapons/storage/bible.dm index 9200a58d65a..d5d4a636599 100644 --- a/code/game/objects/items/weapons/storage/bible.dm +++ b/code/game/objects/items/weapons/storage/bible.dm @@ -97,9 +97,8 @@ "May the power of [deity_name] compel you to be healed!") playsound(loc, "punch", 25, 1, -1) else - if(!istype(H.head, /obj/item/clothing/head/helmet)) - M.adjustBrainLoss(10) - to_chat(M, "You feel dumber.") + M.adjustBrainLoss(10) + to_chat(M, "You feel dumber.") H.visible_message("[user] beats [H == user ? "[user.p_them()]self" : "[H]"] over the head with [src]!") playsound(src.loc, "punch", 25, 1, -1) else diff --git a/code/game/objects/items/weapons/storage/firstaid.dm b/code/game/objects/items/weapons/storage/firstaid.dm index ec00a0c4c08..a1fa336212e 100644 --- a/code/game/objects/items/weapons/storage/firstaid.dm +++ b/code/game/objects/items/weapons/storage/firstaid.dm @@ -84,7 +84,7 @@ /obj/item/storage/firstaid/toxin/Initialize(mapload) . = ..() - icon_state = pick("antitoxin", "antitoxfirstaid", "antitoxfirstaid2", "antitoxfirstaid3") + icon_state = pick("antitoxin", "antitoxfirstaid", "antitoxfirstaid2") /obj/item/storage/firstaid/toxin/populate_contents() for(var/I in 1 to 3) diff --git a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm index 1318be1d310..43dad2c7ccd 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm @@ -137,6 +137,12 @@ rotate() // Chair types +/obj/structure/chair/light + name = "chair" + icon_state = "chair_greyscale" + resistance_flags = FLAMMABLE + item_chair = /obj/item/chair/light + /obj/structure/chair/wood name = "wooden chair" desc = "Old is never too old to not be in fashion." @@ -268,6 +274,33 @@ anchored = TRUE item_chair = null buildstackamount = 1 + var/image/armrest = null + +/obj/structure/chair/sofa/Initialize(mapload) + armrest = GetArmrest() + armrest.layer = ABOVE_MOB_LAYER + return ..() + +/obj/structure/chair/sofa/proc/GetArmrest() + return mutable_appearance('icons/obj/chairs.dmi', "[icon_state]_armrest") + +/obj/structure/chair/sofa/Destroy() + QDEL_NULL(armrest) + return ..() + +/obj/structure/chair/sofa/post_buckle_mob(mob/living/M) + . = ..() + update_armrest() + +/obj/structure/chair/sofa/post_unbuckle_mob(mob/living/M) + . = ..() + update_armrest() + +/obj/structure/chair/sofa/proc/update_armrest() + if(has_buckled_mobs()) + add_overlay(armrest) + else + cut_overlay(armrest) /obj/structure/chair/sofa/left icon_state = "sofaend_left" @@ -278,6 +311,32 @@ /obj/structure/chair/sofa/corner icon_state = "sofacorner" +/obj/structure/chair/sofa/corp + name = "sofa" + desc = "Soft and cushy." + icon_state = "corp_sofamiddle" + +/obj/structure/chair/sofa/corp/left + icon_state = "corp_sofaend_left" + +/obj/structure/chair/sofa/corp/right + icon_state = "corp_sofaend_right" + +/obj/structure/chair/sofa/corp/corner + icon_state = "corp_sofacorner" + +/obj/structure/chair/sofa/pew + name = "pew" + desc = "Rigid and uncomfortable, perfect for keeping you awake and alert." + icon_state = "pewmiddle" + buildstacktype = /obj/item/stack/sheet/wood + +/obj/structure/chair/sofa/pew/left + icon_state = "pewend_left" + +/obj/structure/chair/sofa/pew/right + icon_state = "pewend_right" + /obj/structure/chair/stool name = "stool" desc = "Apply butt." @@ -309,6 +368,10 @@ var/break_chance = 5 //Likely hood of smashing the chair. var/obj/structure/chair/origin_type = /obj/structure/chair +/obj/item/chair/light + icon_state = "chair_greyscale_toppled" + origin_type = /obj/structure/chair/light + /obj/item/chair/stool name = "stool" icon = 'icons/obj/chairs.dmi' diff --git a/code/modules/admin/IsBanned.dm b/code/modules/admin/IsBanned.dm index 15decbb6848..aadb658470f 100644 --- a/code/modules/admin/IsBanned.dm +++ b/code/modules/admin/IsBanned.dm @@ -97,10 +97,9 @@ qdel(exist_query) else if(!exist_query.NextRow()) // If there isnt a row, they aint been seen before - if(GLOB.panic_bunker_enabled) + if(SSqueue?.queue_enabled && (length(GLOB.clients) > SSqueue.queue_threshold) && !(ckey in SSqueue.queue_bypass_list)) qdel(exist_query) - var/threshold = GLOB.configuration.general.panic_bunker_threshold - return list("reason" = "panic bunker", "desc" = "Server is not accepting connections from never-before-seen players until player count is less than [threshold]. Please try again later.") + return list("reason" = "server queue", "desc" = "You seem to have managed to skip the server queue, possibly due to connecting during a restart. Please reconnect in 10 minutes. If you still cannot connect, please inform the server host.") qdel(exist_query) diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 598705668ae..485b0f22cc3 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -137,7 +137,9 @@ GLOBAL_LIST_INIT(admin_verbs_server, list( /client/proc/toggle_antagHUD_restrictions, /client/proc/set_ooc, /client/proc/reset_ooc, - /client/proc/set_next_map + /client/proc/set_next_map, + /client/proc/manage_queue, + /client/proc/add_queue_server_bypass )) GLOBAL_LIST_INIT(admin_verbs_debug, list( /client/proc/cmd_admin_list_open_jobs, diff --git a/code/modules/admin/verbs/manage_queue.dm b/code/modules/admin/verbs/manage_queue.dm new file mode 100644 index 00000000000..09d40c9dde2 --- /dev/null +++ b/code/modules/admin/verbs/manage_queue.dm @@ -0,0 +1,61 @@ +/client/proc/manage_queue() + set name = "Manage Queue Server" + set desc = "Manage the queue server and its settings" + set category = "Server" + + if(!check_rights(R_SERVER)) + return + + var/list/choices = list("Show Status", "Toggle Queue Server", "Set Threshold", "Toggle Setting Persistence") + var/choice = input(usr, "Please, select an option", "Queue Server Manipulation") as null|anything in choices + + switch(choice) + if("Show Status") + to_chat(usr, "Queue Server Status") + to_chat(usr, "Enabled: [SSqueue.queue_enabled ? "Yes" : "No"]") + to_chat(usr, "Queue Threshold: [SSqueue.queue_threshold]") + to_chat(usr, "Setting Persistence: [SSqueue.persist_queue ? "Yes" : "No"]") + if("Toggle Queue Server") + SSqueue.queue_enabled = !SSqueue.queue_enabled + to_chat(usr, "Queue server is now [SSqueue.queue_enabled ? "Enabled" : "Disabled"]") + message_admins("[key_name_admin(usr)] has [SSqueue.queue_enabled ? "enabled" : "disabled"] the server queue.") + log_admin("[key_name(usr)] has [SSqueue.queue_enabled ? "enabled" : "disabled"] the server queue.") + SSdiscord.send2discord_simple(DISCORD_WEBHOOK_ADMIN, "**\[Queue Server]** `[usr.ckey]` has now **[SSqueue.queue_enabled ? "enabled" : "disabled"]** the queue server.") + if("Set Threshold") + var/new_threshold = input(usr, "Enter new threshold", "Queue Server Manipulation", SSqueue.queue_threshold) as num|null + if(!new_threshold) + return + SSqueue.queue_threshold = new_threshold + to_chat(usr, "Queue threshold is now [SSqueue.queue_threshold]") + message_admins("[key_name_admin(usr)] has set the queue threshold to [SSqueue.queue_threshold].") + log_admin("[key_name(usr)] has set the queue threshold to [SSqueue.queue_threshold].") + SSdiscord.send2discord_simple(DISCORD_WEBHOOK_ADMIN, "**\[Queue Server]** `[usr.ckey]` has set the queue threshold to **[SSqueue.queue_threshold]**.") + if("Toggle Setting Persistence") + SSqueue.persist_queue = !SSqueue.persist_queue + to_chat(usr, "Queue server setting persistence is now [SSqueue.persist_queue ? "Enabled" : "Disabled"]") + message_admins("[key_name_admin(usr)] has [SSqueue.persist_queue ? "enabled" : "disabled"] the server queue settings persistence.") + log_admin("[key_name(usr)] has [SSqueue.persist_queue ? "enabled" : "disabled"] the server queue settings persistence.") + SSdiscord.send2discord_simple(DISCORD_WEBHOOK_ADMIN, "**\[Queue Server]** `[usr.ckey]` has now **[SSqueue.persist_queue ? "enabled" : "disabled"]** server queue settings persistence.") + +/client/proc/add_queue_server_bypass() + set name = "Add Queue Server Bypass" + set desc = "Allow a ckey to bypass the server queue" + set category = "Server" + + if(!check_rights(R_SERVER)) + return + + var/bypass_ckey = input(usr, "Please, enter a ckey", "Queue Server Bypass") + + if(!bypass_ckey) + return + + var/clean_ckey = ckey(bypass_ckey) + + if(!clean_ckey) + to_chat(usr, "Invalid ckey supplied") + return + + SSqueue.queue_bypass_list.Add(clean_ckey) + message_admins("[key_name_admin(usr)] has added the ckey [clean_ckey] to the queue bypass list.") + log_admin("[key_name(usr)] has added the ckey [clean_ckey] to the queue bypass list.") diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index 073e74caf26..8c7dc4963f6 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -379,23 +379,15 @@ if(M.client) playercount += 1 - // Update the state of the panic bunker based on current playercount - var/threshold = GLOB.configuration.general.panic_bunker_threshold - - if((playercount > threshold) && (GLOB.panic_bunker_enabled == FALSE)) - GLOB.panic_bunker_enabled = TRUE - message_admins("Panic bunker has been automatically enabled due to playercount rising above [threshold]") - - if((playercount < threshold) && (GLOB.panic_bunker_enabled == TRUE)) - GLOB.panic_bunker_enabled = FALSE - message_admins("Panic bunker has been automatically disabled due to playercount dropping below [threshold]") - // Tell clients about active testmerges if(world.TgsAvailable() && length(GLOB.revision_info.testmerges)) to_chat(src, GLOB.revision_info.get_testmerge_chatmessage(TRUE)) INVOKE_ASYNC(src, .proc/cid_count_check) + if(check_rights(R_ADMIN, FALSE, mob)) // Mob is required. Dont even try without it. + to_chat(src, "The queue server is currently [SSqueue.queue_enabled ? "enabled" : "disabled"], with a threshold of [SSqueue.queue_threshold]. This [SSqueue.persist_queue ? "will" : "will not"] persist through rounds.") + /client/proc/is_connecting_from_localhost() var/localhost_addresses = list("127.0.0.1", "::1") // Adresses diff --git a/code/modules/food_and_drinks/food/foods/bread.dm b/code/modules/food_and_drinks/food/foods/bread.dm index 23921a43608..7565b5b30a7 100644 --- a/code/modules/food_and_drinks/food/foods/bread.dm +++ b/code/modules/food_and_drinks/food/foods/bread.dm @@ -17,7 +17,6 @@ name = "meatbread slice" desc = "A slice of delicious meatbread." icon_state = "meatbreadslice" - trash = /obj/item/trash/plate filling_color = "#FF7575" /obj/item/reagent_containers/food/snacks/sliceable/xenomeatbread @@ -34,7 +33,6 @@ name = "xenomeatbread slice" desc = "A slice of delicious meatbread. Extra Heretical." icon_state = "xenobreadslice" - trash = /obj/item/trash/plate filling_color = "#8AFF75" /obj/item/reagent_containers/food/snacks/sliceable/spidermeatbread @@ -49,8 +47,7 @@ /obj/item/reagent_containers/food/snacks/spidermeatbreadslice name = "spider meat bread slice" desc = "A slice of meatloaf made from an animal that most likely still wants you dead." - icon_state = "xenobreadslice" - trash = /obj/item/trash/plate + icon_state = "spidermeatslice" list_reagents = list("toxin" = 2) /obj/item/reagent_containers/food/snacks/sliceable/bananabread @@ -67,7 +64,6 @@ name = "banana-nut bread slice" desc = "A slice of delicious banana bread." icon_state = "bananabreadslice" - trash = /obj/item/trash/plate filling_color = "#EDE5AD" tastes = list("bread" = 10) @@ -85,7 +81,6 @@ name = "tofubread slice" desc = "A slice of delicious tofubread." icon_state = "tofubreadslice" - trash = /obj/item/trash/plate filling_color = "#F7FFE0" /obj/item/reagent_containers/food/snacks/sliceable/bread @@ -102,7 +97,6 @@ name = "bread slice" desc = "A slice of home." icon_state = "breadslice" - trash = /obj/item/trash/plate filling_color = "#D27332" list_reagents = list("nutriment" = 2, "bread" = 5) tastes = list("bread" = 10) @@ -121,7 +115,6 @@ name = "cream cheese bread slice" desc = "A slice of yum!" icon_state = "creamcheesebreadslice" - trash = /obj/item/trash/plate filling_color = "#FFF896" list_reagents = list("nutriment" = 4, "vitamin" = 1) tastes = list("bread" = 10, "cheese" = 10) @@ -140,7 +133,6 @@ name = "banarnarbread slice" desc = "A slice of delicious mah'weyh pleggh at e'ntrath!" icon_state = "banarnarbreadslice" - trash = /obj/item/trash/plate filling_color = "#6F0000" list_reagents = list("nutriment" = 4, "vitamin" = 1) tastes = list("heresy" = 10, "banana" = 10) @@ -200,7 +192,6 @@ name = "jellied toast" desc = "A slice of bread covered with delicious jam." icon_state = "jellytoast" - trash = /obj/item/trash/plate filling_color = "#B572AB" bitesize = 3 tastes = list("toast" = 1, "jelly" = 1) diff --git a/code/modules/food_and_drinks/food/foods/sandwiches.dm b/code/modules/food_and_drinks/food/foods/sandwiches.dm index 216e56af9f9..f0e49305175 100644 --- a/code/modules/food_and_drinks/food/foods/sandwiches.dm +++ b/code/modules/food_and_drinks/food/foods/sandwiches.dm @@ -165,7 +165,6 @@ name = "sandwich" desc = "A grand creation of meat, cheese, bread, and several leaves of lettuce! Arthur Dent would be proud." icon_state = "sandwich" - trash = /obj/item/trash/plate filling_color = "#D9BE29" list_reagents = list("nutriment" = 6, "vitamin" = 1) tastes = list("meat" = 2, "cheese" = 1, "bread" = 2, "lettuce" = 1) @@ -174,7 +173,6 @@ name = "toasted sandwich" desc = "Now if you only had a pepper bar." icon_state = "toastedsandwich" - trash = /obj/item/trash/plate filling_color = "#D9BE29" list_reagents = list("nutriment" = 6, "carbon" = 2) tastes = list("toast" = 1) @@ -183,7 +181,6 @@ name = "grilled cheese sandwich" desc = "Goes great with tomato soup!" icon_state = "toastedsandwich" - trash = /obj/item/trash/plate filling_color = "#D9BE29" list_reagents = list("nutriment" = 7, "vitamin" = 1) //why make a regualr sandwhich when you can make grilled cheese, with this nutriment value? tastes = list("toast" = 1, "grilled cheese" = 1) @@ -192,7 +189,6 @@ name = "jelly sandwich" desc = "You wish you had some peanut butter to go with this..." icon_state = "jellysandwich" - trash = /obj/item/trash/plate filling_color = "#9E3A78" bitesize = 3 tastes = list("toast" = 1, "jelly" = 1) diff --git a/code/modules/paperwork/faxmachine.dm b/code/modules/paperwork/faxmachine.dm index 624a4ddd099..76a5dd4dc03 100644 --- a/code/modules/paperwork/faxmachine.dm +++ b/code/modules/paperwork/faxmachine.dm @@ -10,6 +10,7 @@ GLOBAL_LIST_EMPTY(fax_blacklist) icon = 'icons/obj/library.dmi' icon_state = "fax" insert_anim = "faxsend" + var/receive_anim = "faxsend" pass_flags = PASSTABLE var/fax_network = "Local Fax Network" /// If true, prevents fax machine from sending messages to NT machines @@ -51,11 +52,17 @@ GLOBAL_LIST_EMPTY(fax_blacklist) /obj/machinery/photocopier/faxmachine/longrange name = "long range fax machine" + icon_state = "longfax" + insert_anim = "longfaxsend" + receive_anim = "longfaxreceive" fax_network = "Central Command Quantum Entanglement Network" long_range_enabled = TRUE /obj/machinery/photocopier/faxmachine/longrange/syndie name = "syndicate long range fax machine" + icon_state = "fax" + insert_anim = "faxsend" + receive_anim = "faxsend" emagged = TRUE syndie_restricted = TRUE req_one_access = list(ACCESS_SYNDICATE) @@ -293,7 +300,7 @@ GLOBAL_LIST_EMPTY(fax_blacklist) if(department == "Unknown") return FALSE //You can't send faxes to "Unknown" - flick("faxreceive", src) + flick(receive_anim, src) playsound(loc, 'sound/goonstation/machines/printer_dotmatrix.ogg', 50, 1) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 69a67c5ffc6..fc650f1810f 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -56,7 +56,7 @@ var/knife_x_offset = 0 var/knife_y_offset = 0 - var/can_holster = TRUE + var/can_holster = FALSE // Anything that can be holstered should be manually set var/list/upgrades = list() diff --git a/code/modules/projectiles/guns/energy/nuclear.dm b/code/modules/projectiles/guns/energy/nuclear.dm index 4fac1c96828..d4cb1b03244 100644 --- a/code/modules/projectiles/guns/energy/nuclear.dm +++ b/code/modules/projectiles/guns/energy/nuclear.dm @@ -35,6 +35,7 @@ can_flashlight = 0 // Can't attach or detach the flashlight, and override it's icon update actions_types = list(/datum/action/item_action/toggle_gunlight) shaded_charge = FALSE + can_holster = TRUE // Pistol sized, so it should fit into a holster /obj/item/gun/energy/gun/mini/Initialize(mapload, ...) gun_light = new /obj/item/flashlight/seclite(src) @@ -57,6 +58,7 @@ ammo_x_offset = 4 resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF shaded_charge = FALSE + can_holster = TRUE /obj/item/gun/energy/gun/blueshield name = "advanced stun revolver" @@ -67,6 +69,7 @@ ammo_type = list(/obj/item/ammo_casing/energy/electrode/hos, /obj/item/ammo_casing/energy/laser/hos) ammo_x_offset = 1 shaded_charge = TRUE + can_holster = TRUE /obj/item/gun/energy/gun/blueshield/pdw9 name = "PDW-9 taser pistol" diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index 5801a1daa59..e2323765f82 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -37,6 +37,7 @@ origin_tech = "combat=4;materials=4;biotech=5;plasmatech=6" ammo_type = list(/obj/item/ammo_casing/energy/declone) ammo_x_offset = 1 + can_holster = TRUE /obj/item/gun/energy/decloner/update_icon() ..() @@ -56,6 +57,7 @@ modifystate = 1 ammo_x_offset = 1 selfcharge = 1 + can_holster = TRUE // Meteor Gun // /obj/item/gun/energy/meteorgun @@ -109,6 +111,7 @@ can_flashlight = 0 max_mod_capacity = 0 empty_state = null + can_holster = TRUE /obj/item/gun/energy/kinetic_accelerator/crossbow/detailed_examine() return "This is an energy weapon. To fire the weapon, have your gun mode set to 'fire', \ @@ -159,6 +162,7 @@ force = 12 sharp = 1 can_charge = 0 + can_holster = TRUE /obj/item/gun/energy/plasmacutter/examine(mob/user) . = ..() @@ -297,6 +301,7 @@ clumsy_check = 0 selfcharge = 1 ammo_x_offset = 3 + can_holster = TRUE // you'll never see it coming /obj/item/gun/energy/toxgun name = "plasma pistol" @@ -308,6 +313,7 @@ origin_tech = "combat=4;magnets=4;powerstorage=3" ammo_type = list(/obj/item/ammo_casing/energy/toxplasma) shaded_charge = 1 + can_holster = TRUE // Energy Sniper // /obj/item/gun/energy/sniperrifle @@ -636,6 +642,7 @@ selfcharge = 1 ammo_x_offset = 3 var/mimic_type = /obj/item/gun/projectile/automatic/pistol //Setting this to the mimicgun type does exactly what you think it will. + can_holster = TRUE /obj/item/gun/energy/mimicgun/newshot() var/obj/item/ammo_casing/energy/mimic/M = ammo_type[select] diff --git a/code/modules/projectiles/guns/energy/stun.dm b/code/modules/projectiles/guns/energy/stun.dm index 7e5657e0099..75b22634d99 100644 --- a/code/modules/projectiles/guns/energy/stun.dm +++ b/code/modules/projectiles/guns/energy/stun.dm @@ -6,6 +6,7 @@ origin_tech = "combat=3" ammo_type = list(/obj/item/ammo_casing/energy/electrode) ammo_x_offset = 3 + can_holster = TRUE // Pistol size /obj/item/gun/energy/shock_revolver name = "tesla revolver" @@ -16,6 +17,8 @@ ammo_type = list(/obj/item/ammo_casing/energy/shock_revolver) can_flashlight = 0 shaded_charge = FALSE + can_holster = TRUE + /obj/item/gun/energy/gun/advtaser name = "hybrid taser" @@ -26,6 +29,7 @@ ammo_x_offset = 2 flight_x_offset = 15 shaded_charge = FALSE + can_holster = TRUE // Pistol size /obj/item/gun/energy/gun/advtaser/detailed_examine() return "This is an energy weapon. To recharge this weapon, use a weapon recharger. \ @@ -49,6 +53,7 @@ origin_tech = "combat=3" ammo_type = list(/obj/item/ammo_casing/energy/disabler) ammo_x_offset = 3 + can_holster = TRUE /obj/item/gun/energy/disabler/cyborg name = "cyborg disabler" diff --git a/code/modules/projectiles/guns/magic.dm b/code/modules/projectiles/guns/magic.dm index 05a0134ded6..b03bd121615 100644 --- a/code/modules/projectiles/guns/magic.dm +++ b/code/modules/projectiles/guns/magic.dm @@ -18,6 +18,7 @@ origin_tech = null clumsy_check = 0 trigger_guard = TRIGGER_GUARD_ALLOW_ALL // Has no trigger at all, uses magic instead + can_holster = FALSE // Nothing here is a gun, and therefore shouldn't really fit into a holster lefthand_file = 'icons/mob/inhands/items_lefthand.dmi' //not really a gun and some toys use these inhands righthand_file = 'icons/mob/inhands/items_righthand.dmi' diff --git a/code/modules/projectiles/guns/projectile/automatic.dm b/code/modules/projectiles/guns/projectile/automatic.dm index 7e4c0ac8cdd..ec24553f68d 100644 --- a/code/modules/projectiles/guns/projectile/automatic.dm +++ b/code/modules/projectiles/guns/projectile/automatic.dm @@ -4,7 +4,6 @@ var/select = 1 can_tactical = TRUE can_suppress = 1 - can_holster = FALSE burst_size = 3 fire_delay = 2 actions_types = list(/datum/action/item_action/toggle_firemode) @@ -143,6 +142,7 @@ mag_type = /obj/item/ammo_box/magazine/uzim9mm fire_sound = 'sound/weapons/gunshots/gunshot_pistol.ogg' burst_size = 2 + can_holster = TRUE // it's a mini-uzi after all //M-90gl Carbine// /obj/item/gun/projectile/automatic/m90 diff --git a/code/modules/projectiles/guns/projectile/launchers.dm b/code/modules/projectiles/guns/projectile/launchers.dm index 8256c8c7a50..37ba272a67e 100644 --- a/code/modules/projectiles/guns/projectile/launchers.dm +++ b/code/modules/projectiles/guns/projectile/launchers.dm @@ -9,6 +9,7 @@ mag_type = /obj/item/ammo_box/magazine/internal/grenadelauncher fire_sound = 'sound/weapons/grenadelaunch.ogg' w_class = WEIGHT_CLASS_NORMAL + can_holster = FALSE // Not your normal revolver /obj/item/gun/projectile/revolver/grenadelauncher/attackby(obj/item/A, mob/user, params) ..() diff --git a/code/modules/projectiles/guns/projectile/revolver.dm b/code/modules/projectiles/guns/projectile/revolver.dm index aa365767223..1b9dcc15079 100644 --- a/code/modules/projectiles/guns/projectile/revolver.dm +++ b/code/modules/projectiles/guns/projectile/revolver.dm @@ -5,6 +5,7 @@ mag_type = /obj/item/ammo_box/magazine/internal/cylinder origin_tech = "combat=3;materials=2" fire_sound = 'sound/weapons/gunshots/gunshot_strong.ogg' + can_holster = TRUE /obj/item/gun/projectile/revolver/New() ..() @@ -158,6 +159,7 @@ fire_sound_text = null lefthand_file = null righthand_file = null + can_holster = FALSE // Get your fingers out of there! trigger_guard = TRIGGER_GUARD_ALLOW_ALL clumsy_check = 0 //Stole your uplink! Honk! needs_permit = 0 //go away beepsky diff --git a/code/modules/projectiles/guns/projectile/toy.dm b/code/modules/projectiles/guns/projectile/toy.dm index 55a9aa79c6b..5250ae70c81 100644 --- a/code/modules/projectiles/guns/projectile/toy.dm +++ b/code/modules/projectiles/guns/projectile/toy.dm @@ -26,6 +26,7 @@ can_suppress = 0 burst_size = 1 fire_delay = 0 + can_holster = TRUE actions_types = list() /obj/item/gun/projectile/automatic/toy/pistol/update_icon() @@ -42,8 +43,8 @@ ..() /obj/item/gun/projectile/automatic/toy/pistol/enforcer - name = "Foam Enforcer" - desc = "A foam shooting version of the Enforcer meant to be used for training new caddets who can't be trusted with rubber bullets." + name = "foam Enforcer" + desc = "A foam-shooting version of the Enforcer meant to be used for training new cadets who can't be trusted with rubber bullets." icon_state = "enforcer" mag_type = /obj/item/ammo_box/magazine/toy/enforcer can_flashlight = TRUE diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm index 4ee5d7aa28e..97e85cb7857 100644 --- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm +++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm @@ -16,7 +16,6 @@ var/recharge_counter = 0 var/hackedcheck = FALSE var/obj/item/reagent_containers/beaker = null - var/image/icon_beaker = null //cached overlay var/list/dispensable_reagents = list("hydrogen", "lithium", "carbon", "nitrogen", "oxygen", "fluorine", "sodium", "aluminum", "silicon", "phosphorus", "sulfur", "chlorine", "potassium", "iron", "copper", "mercury", "plasma", "radium", "water", "ethanol", "sugar", "iodine", "bromine", "silver", "chromium") @@ -130,6 +129,15 @@ else stat |= NOPOWER +/obj/machinery/chem_dispenser/update_icon() + if(panel_open) + icon_state = "[initial(icon_state)]-o" + return + if(!powered() && !is_drink) + icon_state = "dispenser_nopower" + return + icon_state = "[initial(icon_state)][beaker ? "_working" : ""]" + /obj/machinery/chem_dispenser/ex_act(severity) if(severity < 3) if(beaker) @@ -140,7 +148,6 @@ ..() if(A == beaker) beaker = null - overlays.Cut() /obj/machinery/chem_dispenser/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) // update the ui if it exists, returns null if no ui is passed/found @@ -204,11 +211,6 @@ atom_say("Not enough energy to complete operation!") return R.add_reagent(params["reagent"], actual) - overlays.Cut() - if(!icon_beaker) - icon_beaker = mutable_appearance('icons/obj/chemical.dmi', "disp_beaker") //randomize beaker overlay position. - icon_beaker.pixel_x = rand(-10, 5) - overlays += icon_beaker if("remove") var/amount = text2num(params["amount"]) if(!beaker || !amount) @@ -226,7 +228,7 @@ if(Adjacent(usr) && !issilicon(usr)) usr.put_in_hands(beaker) beaker = null - overlays.Cut() + update_icon() else return FALSE @@ -255,10 +257,7 @@ I.forceMove(src) to_chat(user, "You set [I] on the machine.") SStgui.update_uis(src) // update all UIs attached to src - if(!icon_beaker) - icon_beaker = mutable_appearance('icons/obj/chemical.dmi', "disp_beaker") //randomize beaker overlay position. - icon_beaker.pixel_x = rand(-10, 5) - overlays += icon_beaker + update_icon() return return ..() diff --git a/code/modules/reagents/reagent_containers/bottle.dm b/code/modules/reagents/reagent_containers/bottle.dm index 4274c3114db..effeb05d1a4 100644 --- a/code/modules/reagents/reagent_containers/bottle.dm +++ b/code/modules/reagents/reagent_containers/bottle.dm @@ -39,7 +39,7 @@ underlays += filling if(!is_open_container()) - var/image/lid = image(icon, src, "lid_bottle") + var/image/lid = image(icon, src, "lid_[icon_state]") overlays += lid /obj/item/reagent_containers/glass/bottle/decompile_act(obj/item/matter_decompiler/C, mob/user) diff --git a/code/modules/world_topic/queue_status.dm b/code/modules/world_topic/queue_status.dm new file mode 100644 index 00000000000..02649e61fa8 --- /dev/null +++ b/code/modules/world_topic/queue_status.dm @@ -0,0 +1,36 @@ +/datum/world_topic_handler/queue_status + topic_key = "queue_status" + requires_commskey = TRUE + +// This topic is sent every 10 seconds from the bouncer +/datum/world_topic_handler/queue_status/execute(list/input, key_valid) + var/ckey_check = input["ckey_check"] + + if(!ckey_check) + return json_encode(list("error" = "No ckey supplied")) + + var/list/output_data = list() + output_data["queue_enabled"] = SSqueue.queue_enabled + + // Decide whether we should hold the player in queue + // NOTE: We only queue never seen before players + if(SSqueue.queue_enabled) + // If they are in the bypass list, let em in + if(ckey_check in SSqueue.queue_bypass_list) + output_data["allow_player"] = TRUE + else // Otherwise + // If we have more than the threshold, queue + if(length(GLOB.clients) > SSqueue.queue_threshold) + output_data["allow_player"] = FALSE + else // We have less than the threshold, allow if were in the timeframe + if(world.time > (SSqueue.last_letin_time + 3 SECONDS)) + output_data["allow_player"] = TRUE + SSqueue.last_letin_time = world.time + else + output_data["allow_player"] = FALSE + + else + // We arent enabled. Just let them in anyway. + output_data["allow_player"] = TRUE + + return json_encode(output_data) diff --git a/config/example/config.toml b/config/example/config.toml index ddece3c2ded..834a4915941 100644 --- a/config/example/config.toml +++ b/config/example/config.toml @@ -302,8 +302,6 @@ allow_character_metadata = true lobby_time = 240 # Forbid people without a BYOND account joining the server guest_ban = true -# Player threshold before the automatic panic bunker engages -panic_bunker_threshold = 150 # Allow players to use antagHUD? allow_antag_hud = true # Forbid players from rejoining if they use antag hud diff --git a/icons/obj/aicards.dmi b/icons/obj/aicards.dmi index 3a9e773a00c..177e72ad4bc 100644 Binary files a/icons/obj/aicards.dmi and b/icons/obj/aicards.dmi differ diff --git a/icons/obj/airlock_machines.dmi b/icons/obj/airlock_machines.dmi index 80821813cbc..4bb40dde0ad 100644 Binary files a/icons/obj/airlock_machines.dmi and b/icons/obj/airlock_machines.dmi differ diff --git a/icons/obj/apc_repair.dmi b/icons/obj/apc_repair.dmi index 4aadcd2ebdc..9e494902ba4 100644 Binary files a/icons/obj/apc_repair.dmi and b/icons/obj/apc_repair.dmi differ diff --git a/icons/obj/bodybag.dmi b/icons/obj/bodybag.dmi index 945ded53552..3cdeff4d342 100644 Binary files a/icons/obj/bodybag.dmi and b/icons/obj/bodybag.dmi differ diff --git a/icons/obj/bureaucracy.dmi b/icons/obj/bureaucracy.dmi index cb29615d4c9..c708ef12d0a 100644 Binary files a/icons/obj/bureaucracy.dmi and b/icons/obj/bureaucracy.dmi differ diff --git a/icons/obj/chairs.dmi b/icons/obj/chairs.dmi index dba239a064f..7486f0e9859 100644 Binary files a/icons/obj/chairs.dmi and b/icons/obj/chairs.dmi differ diff --git a/icons/obj/chemical.dmi b/icons/obj/chemical.dmi index 17101426105..2b898e3462f 100644 Binary files a/icons/obj/chemical.dmi and b/icons/obj/chemical.dmi differ diff --git a/icons/obj/food/custom.dmi b/icons/obj/food/custom.dmi index 42d28790790..fba3b4e6e68 100644 Binary files a/icons/obj/food/custom.dmi and b/icons/obj/food/custom.dmi differ diff --git a/icons/obj/food/food.dmi b/icons/obj/food/food.dmi index c2552d5a4a5..6159735faf8 100644 Binary files a/icons/obj/food/food.dmi and b/icons/obj/food/food.dmi differ diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi index 23c3dcd676c..d00d1d4fb94 100644 Binary files a/icons/obj/items.dmi and b/icons/obj/items.dmi differ diff --git a/icons/obj/janitor.dmi b/icons/obj/janitor.dmi index ebc1cca56da..e2a1f7cfae2 100644 Binary files a/icons/obj/janitor.dmi and b/icons/obj/janitor.dmi differ diff --git a/icons/obj/kitchen.dmi b/icons/obj/kitchen.dmi index 9f83289c81b..0d13c90cd15 100644 Binary files a/icons/obj/kitchen.dmi and b/icons/obj/kitchen.dmi differ diff --git a/icons/obj/library.dmi b/icons/obj/library.dmi index dc12bb7dd67..e0db0804fa6 100644 Binary files a/icons/obj/library.dmi and b/icons/obj/library.dmi differ diff --git a/icons/obj/lighting.dmi b/icons/obj/lighting.dmi index 4886978ff48..7487c376774 100644 Binary files a/icons/obj/lighting.dmi and b/icons/obj/lighting.dmi differ diff --git a/icons/obj/mainframe.dmi b/icons/obj/mainframe.dmi deleted file mode 100644 index e534206fa00..00000000000 Binary files a/icons/obj/mainframe.dmi and /dev/null differ diff --git a/icons/obj/objects.dmi b/icons/obj/objects.dmi index f9cb6e9ae6c..dbd0abdac97 100644 Binary files a/icons/obj/objects.dmi and b/icons/obj/objects.dmi differ diff --git a/icons/obj/pda.dmi b/icons/obj/pda.dmi index 5cf13a408d5..6d9d83e4fca 100644 Binary files a/icons/obj/pda.dmi and b/icons/obj/pda.dmi differ diff --git a/icons/obj/power.dmi b/icons/obj/power.dmi index d4e21d7e6c8..0a77587a252 100644 Binary files a/icons/obj/power.dmi and b/icons/obj/power.dmi differ diff --git a/icons/obj/reagentfillings.dmi b/icons/obj/reagentfillings.dmi index c36fbf01876..9cf1c37fb50 100644 Binary files a/icons/obj/reagentfillings.dmi and b/icons/obj/reagentfillings.dmi differ diff --git a/icons/obj/stationobjs.dmi b/icons/obj/stationobjs.dmi index 34288086aa4..5652b1f6e9b 100755 Binary files a/icons/obj/stationobjs.dmi and b/icons/obj/stationobjs.dmi differ diff --git a/icons/obj/stock_parts.dmi b/icons/obj/stock_parts.dmi index 38ddb183e97..3526ebc215c 100644 Binary files a/icons/obj/stock_parts.dmi and b/icons/obj/stock_parts.dmi differ diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi index b75eae77d79..45adf5cc6e9 100644 Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ diff --git a/icons/obj/walllocker.dmi b/icons/obj/walllocker.dmi index 4c9389ec1aa..3eb10b14406 100644 Binary files a/icons/obj/walllocker.dmi and b/icons/obj/walllocker.dmi differ diff --git a/icons/obj/watercloset.dmi b/icons/obj/watercloset.dmi index baa04328498..4f0e1f8156e 100644 Binary files a/icons/obj/watercloset.dmi and b/icons/obj/watercloset.dmi differ diff --git a/paradise.dme b/paradise.dme index 45c4ed0db49..b6861bb6feb 100644 --- a/paradise.dme +++ b/paradise.dme @@ -248,6 +248,7 @@ #include "code\controllers\subsystem\radiation.dm" #include "code\controllers\subsystem\radio.dm" #include "code\controllers\subsystem\runechat.dm" +#include "code\controllers\subsystem\server_queue.dm" #include "code\controllers\subsystem\shuttles.dm" #include "code\controllers\subsystem\sounds.dm" #include "code\controllers\subsystem\spacedrift.dm" @@ -1205,6 +1206,7 @@ #include "code\modules\admin\verbs\gimmick_team.dm" #include "code\modules\admin\verbs\infiltratorteam_syndicate.dm" #include "code\modules\admin\verbs\logging_view.dm" +#include "code\modules\admin\verbs\manage_queue.dm" #include "code\modules\admin\verbs\map_template_loadverb.dm" #include "code\modules\admin\verbs\mapping.dm" #include "code\modules\admin\verbs\massmodvar.dm" @@ -2510,6 +2512,7 @@ #include "code\modules\world_topic\manifest.dm" #include "code\modules\world_topic\ping.dm" #include "code\modules\world_topic\players.dm" +#include "code\modules\world_topic\queue_status.dm" #include "code\modules\world_topic\status.dm" #include "goon\code\datums\browserOutput.dm" #include "interface\interface.dm"