From 95efc8fbda7ae52d83b7f5169746d5134a5c0eaf Mon Sep 17 00:00:00 2001 From: GDN <96800819+GDNgit@users.noreply.github.com> Date: Sun, 14 Apr 2024 15:21:44 -0500 Subject: [PATCH] fix for the worlds shittiest exploit (#25130) --- code/game/machinery/doors/airlock.dm | 2 ++ code/game/machinery/doors/airlock_electronics.dm | 3 ++- code/game/objects/structures/displaycase.dm | 9 ++++++--- code/game/objects/structures/door_assembly.dm | 9 ++++++--- code/game/objects/structures/windoor_assembly.dm | 11 +++++++---- 5 files changed, 23 insertions(+), 11 deletions(-) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index a51f7aadade..2f2c4ce3229 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -1552,10 +1552,12 @@ GLOBAL_LIST_EMPTY(airlock_emissive_underlays) ae.selected_accesses = req_one_access ae.one_access = 1 ae.unres_access_from = unres_sides + ae.is_installed = FALSE else ae = electronics electronics = null ae.forceMove(loc) + ae.is_installed = FALSE QDEL_LIST_CONTENTS(fillers) qdel(src) diff --git a/code/game/machinery/doors/airlock_electronics.dm b/code/game/machinery/doors/airlock_electronics.dm index 070c29e377d..3b9da5c1be5 100644 --- a/code/game/machinery/doors/airlock_electronics.dm +++ b/code/game/machinery/doors/airlock_electronics.dm @@ -18,6 +18,8 @@ var/const/max_brain_damage = 60 /// Which direction has unrestricted access to the airlock (e.g. medbay doors from the inside) var/unres_access_from = null + /// Is this electronic installed in a door? + var/is_installed = FALSE /obj/item/airlock_electronics/Initialize(mapload) . = ..() @@ -38,7 +40,6 @@ return ui_interact(user) - // tgui\packages\tgui\interfaces\AirlockElectronics.js /obj/item/airlock_electronics/ui_state(mob/user) return GLOB.inventory_state diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm index bf94750fbae..4a11d6cc15d 100644 --- a/code/game/objects/structures/displaycase.dm +++ b/code/game/objects/structures/displaycase.dm @@ -207,10 +207,12 @@ to_chat(user, "You start installing the electronics into [src]...") playsound(loc, I.usesound, 50, 1) if(do_after(user, 30, target = src)) - if(user.drop_item()) - I.forceMove(src) - electronics = I + var/obj/item/airlock_electronics/new_electronics = I + if(user.drop_item() && !new_electronics.is_installed) + new_electronics.forceMove(src) + electronics = new_electronics to_chat(user, "You install the airlock electronics.") + electronics.is_installed = TRUE else if(istype(I, /obj/item/stack/sheet/glass)) var/obj/item/stack/sheet/glass/G = I @@ -241,6 +243,7 @@ if(I.use_tool(src, user, 0, volume = I.tool_volume)) to_chat(user, "You remove the airlock electronics.") new /obj/item/airlock_electronics(drop_location(), 1) + electronics.is_installed = FALSE electronics = null /obj/structure/displaycase_chassis/wrench_act(mob/user, obj/item/I) diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm index fdfe4194b5a..6e3bcbd9171 100644 --- a/code/game/objects/structures/door_assembly.dm +++ b/code/game/objects/structures/door_assembly.dm @@ -82,14 +82,16 @@ user.visible_message("[user] installs the electronics into the airlock assembly.", "You start to install electronics into the airlock assembly...") if(do_after(user, 40 * W.toolspeed, target = src)) - if(state != AIRLOCK_ASSEMBLY_NEEDS_ELECTRONICS) + var/obj/item/airlock_electronics/new_electronics = W + if(state != AIRLOCK_ASSEMBLY_NEEDS_ELECTRONICS || new_electronics.is_installed) return user.drop_item() - W.forceMove(src) + new_electronics.forceMove(src) to_chat(user, "You install the airlock electronics.") state = AIRLOCK_ASSEMBLY_NEEDS_SCREWDRIVER name = "near finished airlock assembly" - electronics = W + electronics = new_electronics + electronics.is_installed = TRUE else if(istype(W, /obj/item/stack/sheet) && (!glass || !mineral)) var/obj/item/stack/sheet/S = W @@ -137,6 +139,7 @@ ae = electronics electronics = null ae.forceMove(loc) + ae.is_installed = FALSE update_appearance(UPDATE_NAME | UPDATE_OVERLAYS) /obj/structure/door_assembly/screwdriver_act(mob/user, obj/item/I) diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm index 09f57dede18..6c34c677f50 100644 --- a/code/game/objects/structures/windoor_assembly.dm +++ b/code/game/objects/structures/windoor_assembly.dm @@ -155,16 +155,18 @@ user.visible_message("[user] installs the electronics into the windoor assembly.", "You start to install electronics into the windoor assembly...") user.drop_item() W.forceMove(src) + var/obj/item/airlock_electronics/new_electronics = W - if(do_after(user, 40 * W.toolspeed, target = src)) + if(do_after(user, 40 * new_electronics.toolspeed, target = src) && !new_electronics.is_installed) if(!src || electronics) - W.forceMove(loc) + new_electronics.forceMove(loc) return to_chat(user, "You install the windoor electronics.") name = "near finished windoor assembly" - electronics = W + electronics = new_electronics + electronics.is_installed = TRUE else - W.forceMove(loc) + new_electronics.forceMove(loc) else if(is_pen(W)) var/t = rename_interactive(user, W) @@ -247,6 +249,7 @@ ae = electronics electronics = null ae.forceMove(loc) + ae.is_installed = FALSE /obj/structure/windoor_assembly/wirecutter_act(mob/user, obj/item/I) if(state != WIRED_ASSEMBLY)