diff --git a/code/modules/multiz/movement.dm b/code/modules/multiz/movement.dm index f5201f60eca..fa276adbfbe 100644 --- a/code/modules/multiz/movement.dm +++ b/code/modules/multiz/movement.dm @@ -37,6 +37,11 @@ forceMove(destination) return 1 + var/obj/structure/ladder/ladder = locate() in start.contents + if((direction == UP ? ladder?.target_up : ladder?.target_down) && (ladder?.allowed_directions & direction)) + if(src.may_climb_ladders(ladder)) + return ladder.climbLadder(src, (direction == UP ? ladder.target_up : ladder.target_down)) + if(!start.CanZPass(src, direction)) to_chat(src, "\The [start] is in the way.") return 0 @@ -46,54 +51,59 @@ return 0 var/area/area = get_area(src) - if(direction == UP && area.has_gravity() && !can_overcome_gravity()) - var/obj/structure/lattice/lattice = locate() in destination.contents - var/obj/structure/catwalk/catwalk = locate() in destination.contents - if(lattice) - var/pull_up_time = max(5 SECONDS + (src.movement_delay() * 10), 1) - to_chat(src, "You grab \the [lattice] and start pulling yourself upward...") - destination.audible_message("You hear something climbing up \the [lattice].") - if(do_after(src, pull_up_time)) - to_chat(src, "You pull yourself up.") - else - to_chat(src, "You gave up on pulling yourself up.") - return 0 - else if(catwalk?.hatch_open) - var/pull_up_time = max(5 SECONDS + (src.movement_delay() * 10), 1) - to_chat(src, "You grab the edge of \the [catwalk] and start pulling yourself upward...") - var/old_dest = destination - destination = get_step(destination, dir) // mob's dir - if(!destination?.Enter(src, old_dest)) - to_chat(src, "There's something in the way up above in that direction, try another.") - return 0 - destination.audible_message("You hear something climbing up \the [catwalk].") - if(do_after(src, pull_up_time)) - to_chat(src, "You pull yourself up.") - else - to_chat(src, "You gave up on pulling yourself up.") - return 0 - else if(ismob(src)) //VOREStation Edit Start. Are they a mob, and are they currently flying?? - var/mob/H = src - if(H.flying) - if(H.incapacitated(INCAPACITATION_ALL)) - to_chat(src, "You can't fly in your current state.") - H.stop_flying() //Should already be done, but just in case. - return 0 - var/fly_time = max(7 SECONDS + (H.movement_delay() * 10), 1) //So it's not too useful for combat. Could make this variable somehow, but that's down the road. - to_chat(src, "You begin to fly upwards...") - destination.audible_message("You hear the flapping of wings.") - H.audible_message("[H] begins to flap \his wings, preparing to move upwards!") - if(do_after(H, fly_time) && H.flying) - to_chat(src, "You fly upwards.") + if(area.has_gravity() && !can_overcome_gravity()) + if(direction == UP) + var/obj/structure/lattice/lattice = locate() in destination.contents + var/obj/structure/catwalk/catwalk = locate() in destination.contents + + if(lattice) + var/pull_up_time = max(5 SECONDS + (src.movement_delay() * 10), 1) + to_chat(src, "You grab \the [lattice] and start pulling yourself upward...") + destination.audible_message("You hear something climbing up \the [lattice].") + if(do_after(src, pull_up_time)) + to_chat(src, "You pull yourself up.") else - to_chat(src, "You stopped flying upwards.") + to_chat(src, "You gave up on pulling yourself up.") return 0 + + else if(catwalk?.hatch_open) + var/pull_up_time = max(5 SECONDS + (src.movement_delay() * 10), 1) + to_chat(src, "You grab the edge of \the [catwalk] and start pulling yourself upward...") + var/old_dest = destination + destination = get_step(destination, dir) // mob's dir + if(!destination?.Enter(src, old_dest)) + to_chat(src, "There's something in the way up above in that direction, try another.") + return 0 + destination.audible_message("You hear something climbing up \the [catwalk].") + if(do_after(src, pull_up_time)) + to_chat(src, "You pull yourself up.") + else + to_chat(src, "You gave up on pulling yourself up.") + return 0 + + else if(ismob(src)) //VOREStation Edit Start. Are they a mob, and are they currently flying?? + var/mob/H = src + if(H.flying) + if(H.incapacitated(INCAPACITATION_ALL)) + to_chat(src, "You can't fly in your current state.") + H.stop_flying() //Should already be done, but just in case. + return 0 + var/fly_time = max(7 SECONDS + (H.movement_delay() * 10), 1) //So it's not too useful for combat. Could make this variable somehow, but that's down the road. + to_chat(src, "You begin to fly upwards...") + destination.audible_message("You hear the flapping of wings.") + H.audible_message("[H] begins to flap \his wings, preparing to move upwards!") + if(do_after(H, fly_time) && H.flying) + to_chat(src, "You fly upwards.") + else + to_chat(src, "You stopped flying upwards.") + return 0 + else + to_chat(src, "Gravity stops you from moving upward.") + return 0 //VOREStation Edit End. + else to_chat(src, "Gravity stops you from moving upward.") - return 0 //VOREStation Edit End. - else - to_chat(src, "Gravity stops you from moving upward.") - return 0 + return 0 for(var/atom/A in destination) if(!A.CanPass(src, start, 1.5, 0)) diff --git a/code/modules/multiz/structures.dm b/code/modules/multiz/structures.dm index 07084265115..bf7f3c0865b 100644 --- a/code/modules/multiz/structures.dm +++ b/code/modules/multiz/structures.dm @@ -52,16 +52,7 @@ to_chat(M, "You fail to reach \the [src].") return - var/direction = target_ladder == target_up ? "up" : "down" - - M.visible_message("\The [M] begins climbing [direction] \the [src]!", - "You begin climbing [direction] \the [src]!", - "You hear the grunting and clanging of a metal ladder being used.") - - target_ladder.audible_message("You hear something coming [direction] \the [src]") - - if(do_after(M, climb_time, src)) - climbLadder(M, target_ladder) + climbLadder(M, target_ladder) /obj/structure/ladder/attack_ghost(var/mob/M) var/target_ladder = getTargetLadder(M) @@ -105,13 +96,21 @@ /mob/observer/ghost/may_climb_ladders(var/ladder) return TRUE -/obj/structure/ladder/proc/climbLadder(var/mob/M, var/target_ladder) - var/turf/T = get_turf(target_ladder) - for(var/atom/A in T) - if(!A.CanPass(M, M.loc, 1.5, 0)) - to_chat(M, "\The [A] is blocking \the [src].") - return FALSE - return M.forceMove(T) //VOREStation Edit - Fixes adminspawned ladders +/obj/structure/ladder/proc/climbLadder(var/mob/M, var/obj/target_ladder) + var/direction = (target_ladder == target_up ? "up" : "down") + M.visible_message("\The [M] begins climbing [direction] \the [src]!", + "You begin climbing [direction] \the [src]!", + "You hear the grunting and clanging of a metal ladder being used.") + + target_ladder.audible_message("You hear something coming [direction] \the [src]") + + if(do_after(M, climb_time, src)) + var/turf/T = get_turf(target_ladder) + for(var/atom/A in T) + if(!A.CanPass(M, M.loc, 1.5, 0)) + to_chat(M, "\The [A] is blocking \the [src].") + return FALSE + return M.forceMove(T) //VOREStation Edit - Fixes adminspawned ladders /obj/structure/ladder/CanPass(obj/mover, turf/source, height, airflow) return airflow || !density diff --git a/html/changelogs/atermonera - move updown.yml b/html/changelogs/atermonera - move updown.yml new file mode 100644 index 00000000000..ceae85d35e6 --- /dev/null +++ b/html/changelogs/atermonera - move updown.yml @@ -0,0 +1,4 @@ +author: Atermonera +delete-after: True +changes: + - tweak: "You can use Move Up/Down to traverse ladders No popup "Which way do you want to go?" windows required for bidirectional ladders!."