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"