From 777951647abc7c8b04f1d02b145601e9f105a152 Mon Sep 17 00:00:00 2001 From: RomainzZ Date: Tue, 19 Mar 2024 02:51:06 +0800 Subject: [PATCH] Multi-tile doors fix (#24113) * Multi-tile doors fix * Linter Fix * Comment cleanup * Removing fillers before updating bounds to prevent issues --- code/game/machinery/doors/airlock.dm | 10 ++ code/game/machinery/doors/airlock_types.dm | 49 ++++++++++ code/game/machinery/doors/door.dm | 96 +++++++++++++++---- code/game/machinery/doors/poddoor.dm | 25 ----- .../objects/structures/door_assembly_types.dm | 2 +- 5 files changed, 138 insertions(+), 44 deletions(-) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index e521e379686..fc017cc9784 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -167,6 +167,7 @@ GLOBAL_LIST_EMPTY(airlock_emissive_underlays) /obj/machinery/door/airlock/Destroy() SStgui.close_uis(wires) + QDEL_LIST_CONTENTS(fillers) QDEL_NULL(electronics) QDEL_NULL(wires) QDEL_NULL(note) @@ -1282,9 +1283,13 @@ GLOBAL_LIST_EMPTY(airlock_emissive_underlays) update_icon(AIRLOCK_OPENING, 1) sleep(1) set_opacity(0) + if(width > 1) + set_fillers_opacity(0) update_freelook_sight() sleep(4) density = FALSE + if(width > 1) + set_fillers_density(FALSE) air_update_turf(1) sleep(1) layer = OPEN_DOOR_LAYER @@ -1325,6 +1330,8 @@ GLOBAL_LIST_EMPTY(airlock_emissive_underlays) if(!override) sleep(1) density = TRUE + if(width > 1) + set_fillers_density(TRUE) air_update_turf(1) if(!override) sleep(4) @@ -1332,6 +1339,8 @@ GLOBAL_LIST_EMPTY(airlock_emissive_underlays) crush() if((visible && !glass) || polarized_on) set_opacity(1) + if(width > 1) + set_fillers_opacity(1) update_freelook_sight() sleep(1) update_icon(AIRLOCK_CLOSED, 1) @@ -1546,6 +1555,7 @@ GLOBAL_LIST_EMPTY(airlock_emissive_underlays) ae = electronics electronics = null ae.forceMove(loc) + QDEL_LIST_CONTENTS(fillers) qdel(src) /obj/machinery/door/airlock/proc/note_type() //Returns a string representing the type of note pinned to this airlock diff --git a/code/game/machinery/doors/airlock_types.dm b/code/game/machinery/doors/airlock_types.dm index c2c47c9c9fe..6edf5605baa 100644 --- a/code/game/machinery/doors/airlock_types.dm +++ b/code/game/machinery/doors/airlock_types.dm @@ -630,3 +630,52 @@ /obj/machinery/door/airlock/multi_tile/glass opacity = FALSE glass = TRUE + +/obj/airlock_filler_object + name = "airlock fluff" + desc = "You shouldn't be able to see this fluff!" + icon = null + icon_state = null + density = TRUE + opacity = TRUE + anchored = TRUE + invisibility = INVISIBILITY_MAXIMUM + //atmos_canpass = CANPASS_DENSITY + /// The door/airlock this fluff panel is attached to + var/obj/machinery/door/filled_airlock + +/obj/airlock_filler_object/Bumped(atom/A) + if(isnull(filled_airlock)) + stack_trace("Someone bumped into an airlock filler with no parent airlock specified!") + return filled_airlock.Bumped(A) + +/obj/airlock_filler_object/Destroy() + filled_airlock = null + return ..() + +/// Multi-tile airlocks pair with a filler panel, if one goes so does the other. +/obj/airlock_filler_object/proc/pair_airlock(obj/machinery/door/parent_airlock) + if(isnull(parent_airlock)) + stack_trace("Attempted to pair an airlock filler with no parent airlock specified!") + + filled_airlock = parent_airlock + RegisterSignal(filled_airlock, PROC_REF(no_airlock)) + +/obj/airlock_filler_object/proc/no_airlock() + UnregisterSignal(filled_airlock) + qdel(src) + +/// Multi-tile airlocks (using a filler panel) have special handling for movables with PASS_FLAG_GLASS +/obj/airlock_filler_object/CanPass(atom/movable/mover, turf/target) + . = ..() + if(.) + return + + if(istype(mover)) + return !opacity + +/obj/airlock_filler_object/singularity_act() + return + +/obj/airlock_filler_object/singularity_pull(S, current_size) + return diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 2ff095788cb..0e8f172e04a 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -37,6 +37,8 @@ var/unres_sides = 0 //Multi-tile doors var/width = 1 + /// List. Player view blocking fillers for multi-tile doors. + var/list/fillers //Whether nonstandard door sounds (cmag laughter) are off cooldown. var/sound_ready = TRUE var/sound_cooldown = 1 SECONDS @@ -49,7 +51,7 @@ /obj/machinery/door/Initialize(mapload) . = ..() set_init_door_layer() - update_dir() + update_bounds() update_freelook_sight() spark_system = new /datum/effect_system/spark_spread spark_system.set_up(2, 1, src) @@ -72,22 +74,13 @@ /obj/machinery/door/setDir(newdir) ..() - update_dir() + update_bounds() /obj/machinery/door/power_change() if(!..()) return update_icon() -/obj/machinery/door/proc/update_dir() - if(width > 1) - if(dir in list(EAST, WEST)) - bound_width = width * world.icon_size - bound_height = world.icon_size - else - bound_width = world.icon_size - bound_height = width * world.icon_size - /obj/machinery/door/Destroy() density = FALSE air_update_turf(1) @@ -131,13 +124,7 @@ . = ..() move_update_air(T) - if(width > 1) - if(dir in list(EAST, WEST)) - bound_width = width * world.icon_size - bound_height = world.icon_size - else - bound_width = world.icon_size - bound_height = width * world.icon_size + update_bounds() /obj/machinery/door/CanPass(atom/movable/mover, turf/target, height=0) if(istype(mover)) @@ -367,12 +354,18 @@ operating = DOOR_OPENING do_animate("opening") set_opacity(0) + if(width > 1) + set_fillers_opacity(0) sleep(5) density = FALSE + if(width > 1) + set_fillers_density(FALSE) sleep(5) layer = initial(layer) update_icon() set_opacity(0) + if(width > 1) + set_fillers_opacity(0) operating = NONE air_update_turf(1) update_freelook_sight() @@ -400,10 +393,14 @@ layer = closingLayer sleep(5) density = TRUE + if(width > 1) + set_fillers_density(TRUE) sleep(5) update_icon() if(!glass || polarized_on) set_opacity(TRUE) + if(width > 1) + set_fillers_opacity(TRUE) operating = NONE air_update_turf(1) update_freelook_sight() @@ -511,3 +508,66 @@ if(caller.checkpass(PASSGLASS)) return !opacity return ..() + +/** + * Checks which way the airlock is facing and adjusts the direction accordingly. + * For use with multi-tile airlocks. + */ +/obj/machinery/door/proc/get_adjusted_dir(dir) + if(dir in list(EAST, WEST)) + return EAST + else + return NORTH + +/** + * Sets the bounds of the airlock. For use with multi-tile airlocks. + * If the airlock is multi-tile, it will set the bounds to be the size of the airlock. + * If the airlock doesn't already have fillers, it will create them. + * If the airlock already has fillers, it will move them to the correct location. + */ +/obj/machinery/door/proc/update_bounds() + if(width <= 1) + return + + QDEL_LIST_CONTENTS(fillers) + + if(dir in list(EAST, WEST)) + bound_width = width * world.icon_size + bound_height = world.icon_size + else + bound_width = world.icon_size + bound_height = width * world.icon_size + + LAZYINITLIST(fillers) + + var/adjusted_dir = get_adjusted_dir(dir) + var/obj/last_filler = src + for(var/i = 1, i < width, i++) + var/obj/airlock_filler_object/filler + + if(length(fillers) < i) + filler = new + filler.pair_airlock(src) + fillers.Add(filler) + else + filler = fillers[i] + + filler.loc = get_step(last_filler, adjusted_dir) + filler.density = density + filler.set_opacity(opacity) + + last_filler = filler + +/obj/machinery/door/proc/set_fillers_density(density) + if(!length(fillers)) + return + + for(var/obj/airlock_filler_object/filler as anything in fillers) + filler.density = density + +/obj/machinery/door/proc/set_fillers_opacity(opacity) + if(!length(fillers)) + return + + for(var/obj/airlock_filler_object/filler as anything in fillers) + filler.set_opacity(opacity) diff --git a/code/game/machinery/doors/poddoor.dm b/code/game/machinery/doors/poddoor.dm index ca4a0812b01..2fd5d6c4e80 100644 --- a/code/game/machinery/doors/poddoor.dm +++ b/code/game/machinery/doors/poddoor.dm @@ -89,31 +89,6 @@ layer = CLOSED_DOOR_LAYER closingLayer = CLOSED_DOOR_LAYER -/obj/machinery/door/poddoor/multi_tile/Initialize(mapload) - . = ..() - apply_opacity_to_my_turfs(opacity) - -/obj/machinery/door/poddoor/multi_tile/open() - if(..()) - apply_opacity_to_my_turfs(opacity) - - -/obj/machinery/door/poddoor/multi_tile/close() - if(..()) - apply_opacity_to_my_turfs(opacity) - -/obj/machinery/door/poddoor/multi_tile/Destroy() - apply_opacity_to_my_turfs(0) - return ..() - -//Multi-tile poddoors don't turn invisible automatically, so we change the opacity of the turfs below instead one by one. -/obj/machinery/door/poddoor/multi_tile/proc/apply_opacity_to_my_turfs(new_opacity) - for(var/turf/T in locs) - T.opacity = new_opacity - T.has_opaque_atom = new_opacity - T.reconsider_lights() - update_freelook_sight() - /obj/machinery/door/poddoor/multi_tile/four_tile_ver icon = 'icons/obj/doors/1x4blast_vert.dmi' width = 4 diff --git a/code/game/objects/structures/door_assembly_types.dm b/code/game/objects/structures/door_assembly_types.dm index fe078699031..a74b9d2cd95 100644 --- a/code/game/objects/structures/door_assembly_types.dm +++ b/code/game/objects/structures/door_assembly_types.dm @@ -137,7 +137,7 @@ base_name = "large airlock" overlays_file = 'icons/obj/doors/airlocks/glass_large/overlays.dmi' dir = EAST - var/width = 1 + var/width = 2 airlock_type = /obj/machinery/door/airlock/multi_tile glass_type = /obj/machinery/door/airlock/multi_tile/glass material_amt = 8