From ad898efb9e6eba53e4bc41e18b58688f3380219c Mon Sep 17 00:00:00 2001 From: QuoteFox <49098813+quotefox@users.noreply.github.com> Date: Thu, 2 Jul 2020 09:58:24 +0100 Subject: [PATCH] Grab and Drag Animations Grab and Drag Animations, allowing players to see whos dragging who, via a pixel shift. --- code/__DEFINES/mobs.dm | 8 +++- code/datums/components/riding.dm | 6 +++ code/game/atoms_movable.dm | 22 ++++----- code/game/objects/buckling.dm | 11 ++++- .../atmospherics/machinery/pipes/manifold.dm | 46 +++++++++--------- .../machinery/pipes/manifold4w.dm | 47 +++++++++--------- code/modules/mob/living/living.dm | 48 ++++++++++++++++++- code/modules/mob/living/living_defense.dm | 1 + code/modules/mob/living/living_movement.dm | 8 ++++ code/modules/mob/mob_movement.dm | 7 +-- 10 files changed, 137 insertions(+), 67 deletions(-) diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index be0ac101..9910ad77 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -269,4 +269,10 @@ #define HUMAN_FIRE_STACK_ICON_NUM 3 #define PULL_PRONE_SLOWDOWN 0.6 -#define HUMAN_CARRY_SLOWDOWN 0 \ No newline at end of file +#define HUMAN_CARRY_SLOWDOWN 0 + +//GRAB_PIXEL_SHIFT +#define GRAB_PIXEL_SHIFT_PASSIVE 6 +#define GRAB_PIXEL_SHIFT_AGGRESSIVE 12 +#define GRAB_PIXEL_SHIFT_NECK 16 + diff --git a/code/datums/components/riding.dm b/code/datums/components/riding.dm index 4fc6bce0..980a4dbe 100644 --- a/code/datums/components/riding.dm +++ b/code/datums/components/riding.dm @@ -19,6 +19,7 @@ var/ride_check_rider_restrained = FALSE var/ride_check_ridden_incapacitated = FALSE var/list/offhands = list() // keyed list containing all the current riding offsets associated by mob + var/del_on_unbuckle_all = FALSE /datum/component/riding/Initialize() if(!ismovableatom(parent)) @@ -28,8 +29,11 @@ RegisterSignal(parent, COMSIG_MOVABLE_MOVED, .proc/vehicle_moved) /datum/component/riding/proc/vehicle_mob_unbuckle(datum/source, mob/living/M, force = FALSE) + var/atom/movable/AM = parent restore_position(M) unequip_buckle_inhands(M) + if(del_on_unbuckle_all && !AM.has_buckled_mobs()) + qdel(src) /datum/component/riding/proc/vehicle_mob_buckle(datum/source, mob/living/M, force = FALSE) handle_vehicle_offsets() @@ -191,6 +195,7 @@ ///////Yes, I said humans. No, this won't end well...////////// /datum/component/riding/human + del_on_unbuckle_all = TRUE /datum/component/riding/human/Initialize() . = ..() @@ -244,6 +249,7 @@ user.visible_message("[AM] pushes [user] off of [AM.p_them()]!") /datum/component/riding/cyborg + del_on_unbuckle_all = TRUE /datum/component/riding/cyborg/ride_check(mob/user) var/atom/movable/AM = parent diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 7baf36f3..d2e162e4 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -23,6 +23,7 @@ var/inertia_move_delay = 10 var/pass_flags = 0 var/moving_diagonally = 0 //0: not doing a diagonal move. 1 and 2: doing the first/second step of the diagonal move + var/atom/movable/moving_from_pull var/list/client_mobs_in_contents // This contains all the client mobs within this container var/list/acted_explosions //for explosion dodging glide_size = 7 @@ -159,6 +160,7 @@ if(!Process_Spacemove(get_dir(pulling.loc, A))) return step(pulling, get_dir(pulling.loc, A)) + return TRUE @@ -180,6 +182,9 @@ stop_pulling() return + if(pulledby && moving_diagonally != FIRST_DIAG_STEP && get_dist(src, pulledby) > 1) //separated from our puller and not in the middle of a diagonal move. + pulledby.stop_pulling() + @@ -235,13 +240,8 @@ /atom/movable/Move(atom/newloc, direct) var/atom/movable/pullee = pulling var/turf/T = loc - if(pulling) - if(pullee && get_dist(src, pullee) > 1) - stop_pulling() - - if(pullee && pullee.loc != loc && !isturf(pullee.loc) ) //to be removed once all code that changes an object's loc uses forceMove(). - log_game("DEBUG:[src]'s pull on [pullee] wasn't broken despite [pullee] being in [pullee.loc]. Pull stopped manually.") - stop_pulling() + if(!moving_from_pull) + check_pulling() if(!loc || !newloc) return FALSE var/atom/oldloc = loc @@ -310,7 +310,7 @@ if(.) Moved(oldloc, direct) - if(. && pulling && pulling == pullee) //we were pulling a thing and didn't lose it during our move. + if(. && pulling && pulling == pullee && pulling != moving_from_pull)//we were pulling a thing and didn't lose it during our move. if(pulling.anchored) stop_pulling() @@ -318,12 +318,10 @@ var/pull_dir = get_dir(src, pulling) //puller and pullee more than one tile away or in diagonal position if(get_dist(src, pulling) > 1 || (moving_diagonally != SECOND_DIAG_STEP && ((pull_dir - 1) & pull_dir))) + pulling.moving_from_pull = src pulling.Move(T, get_dir(pulling, T)) //the pullee tries to reach our previous position - if(pulling && get_dist(src, pulling) > 1) //the pullee couldn't keep up - stop_pulling() - if(pulledby && moving_diagonally != FIRST_DIAG_STEP && get_dist(src, pulledby) > 1)//separated from our puller and not in the middle of a diagonal move. - pulledby.stop_pulling() + pulling.moving_from_pull = null last_move = direct diff --git a/code/game/objects/buckling.dm b/code/game/objects/buckling.dm index 9c3df539..0093c072 100644 --- a/code/game/objects/buckling.dm +++ b/code/game/objects/buckling.dm @@ -56,8 +56,12 @@ M.buckling = null return FALSE - if(M.pulledby && buckle_prevents_pull) - M.pulledby.stop_pulling() + if(M.pulledby) + if(buckle_prevents_pull) + M.pulledby.stop_pulling() + else if(isliving(M.pulledby)) + var/mob/living/L = M.pulledby + L.reset_pull_offsets(M, TRUE) if(!check_loc && M.loc != loc) M.forceMove(loc) @@ -138,4 +142,7 @@ "You unbuckle yourself from [src].",\ "You hear metal clanking.") add_fingerprint(user) + if(isliving(M.pulledby)) + var/mob/living/L = M.pulledby + L.set_pull_offsets(M, L.grab_state) return M diff --git a/code/modules/atmospherics/machinery/pipes/manifold.dm b/code/modules/atmospherics/machinery/pipes/manifold.dm index b089ebfa..f7b6abbf 100644 --- a/code/modules/atmospherics/machinery/pipes/manifold.dm +++ b/code/modules/atmospherics/machinery/pipes/manifold.dm @@ -45,7 +45,7 @@ /obj/machinery/atmospherics/pipe/manifold/general/visible level = PIPE_VISIBLE_LEVEL layer = GAS_PIPE_VISIBLE_LAYER - + /obj/machinery/atmospherics/pipe/manifold/general/visible/layer1 piping_layer = PIPING_LAYER_MIN pixel_x = -PIPING_LAYER_P_X @@ -58,7 +58,7 @@ /obj/machinery/atmospherics/pipe/manifold/general/hidden level = PIPE_HIDDEN_LEVEL - + /obj/machinery/atmospherics/pipe/manifold/general/hidden/layer1 piping_layer = PIPING_LAYER_MIN pixel_x = -PIPING_LAYER_P_X @@ -90,7 +90,7 @@ /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden level = PIPE_HIDDEN_LEVEL - + /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer1 piping_layer = PIPING_LAYER_MIN pixel_x = -PIPING_LAYER_P_X @@ -109,7 +109,7 @@ /obj/machinery/atmospherics/pipe/manifold/supply/visible level = PIPE_VISIBLE_LEVEL layer = GAS_PIPE_VISIBLE_LAYER - + /obj/machinery/atmospherics/pipe/manifold/supply/visible/layer1 piping_layer = PIPING_LAYER_MIN pixel_x = -PIPING_LAYER_P_X @@ -132,7 +132,7 @@ piping_layer = PIPING_LAYER_MAX pixel_x = PIPING_LAYER_P_X pixel_y = PIPING_LAYER_P_Y - + /obj/machinery/atmospherics/pipe/manifold/supplymain name="main air supply pipe" pipe_color=rgb(130,43,255) @@ -141,7 +141,7 @@ /obj/machinery/atmospherics/pipe/manifold/supplymain/visible level = PIPE_VISIBLE_LEVEL layer = GAS_PIPE_VISIBLE_LAYER - + /obj/machinery/atmospherics/pipe/manifold/supplymain/visible/layer1 piping_layer = PIPING_LAYER_MIN pixel_x = -PIPING_LAYER_P_X @@ -154,7 +154,7 @@ /obj/machinery/atmospherics/pipe/manifold/supplymain/hidden level = PIPE_HIDDEN_LEVEL - + /obj/machinery/atmospherics/pipe/manifold/supplymain/hidden/layer1 piping_layer = PIPING_LAYER_MIN pixel_x = -PIPING_LAYER_P_X @@ -172,7 +172,7 @@ /obj/machinery/atmospherics/pipe/manifold/yellow/visible level = PIPE_VISIBLE_LEVEL layer = GAS_PIPE_VISIBLE_LAYER - + /obj/machinery/atmospherics/pipe/manifold/yellow/visible/layer1 piping_layer = PIPING_LAYER_MIN pixel_x = -PIPING_LAYER_P_X @@ -185,7 +185,7 @@ /obj/machinery/atmospherics/pipe/manifold/yellow/hidden level = PIPE_HIDDEN_LEVEL - + /obj/machinery/atmospherics/pipe/manifold/yellow/hidden/layer1 piping_layer = PIPING_LAYER_MIN pixel_x = -PIPING_LAYER_P_X @@ -203,7 +203,7 @@ /obj/machinery/atmospherics/pipe/manifold/cyan/visible level = PIPE_VISIBLE_LEVEL layer = GAS_PIPE_VISIBLE_LAYER - + /obj/machinery/atmospherics/pipe/manifold/cyan/visible/layer1 piping_layer = PIPING_LAYER_MIN pixel_x = -PIPING_LAYER_P_X @@ -216,7 +216,7 @@ /obj/machinery/atmospherics/pipe/manifold/cyan/hidden level = PIPE_HIDDEN_LEVEL - + /obj/machinery/atmospherics/pipe/manifold/cyan/hidden/layer1 piping_layer = PIPING_LAYER_MIN pixel_x = -PIPING_LAYER_P_X @@ -234,7 +234,7 @@ /obj/machinery/atmospherics/pipe/manifold/green/visible level = PIPE_VISIBLE_LEVEL layer = GAS_PIPE_VISIBLE_LAYER - + /obj/machinery/atmospherics/pipe/manifold/green/visible/layer1 piping_layer = PIPING_LAYER_MIN pixel_x = -PIPING_LAYER_P_X @@ -247,7 +247,7 @@ /obj/machinery/atmospherics/pipe/manifold/green/hidden level = PIPE_HIDDEN_LEVEL - + /obj/machinery/atmospherics/pipe/manifold/green/hidden/layer1 piping_layer = PIPING_LAYER_MIN pixel_x = -PIPING_LAYER_P_X @@ -265,7 +265,7 @@ /obj/machinery/atmospherics/pipe/manifold/orange/visible level = PIPE_VISIBLE_LEVEL layer = GAS_PIPE_VISIBLE_LAYER - + /obj/machinery/atmospherics/pipe/manifold/orange/visible/layer1 piping_layer = PIPING_LAYER_MIN pixel_x = -PIPING_LAYER_P_X @@ -278,7 +278,7 @@ /obj/machinery/atmospherics/pipe/manifold/orange/hidden level = PIPE_HIDDEN_LEVEL - + /obj/machinery/atmospherics/pipe/manifold/orange/hidden/layer1 piping_layer = PIPING_LAYER_MIN pixel_x = -PIPING_LAYER_P_X @@ -296,7 +296,7 @@ /obj/machinery/atmospherics/pipe/manifold/purple/visible level = PIPE_VISIBLE_LEVEL layer = GAS_PIPE_VISIBLE_LAYER - + /obj/machinery/atmospherics/pipe/manifold/purple/visible/layer1 piping_layer = PIPING_LAYER_MIN pixel_x = -PIPING_LAYER_P_X @@ -309,7 +309,7 @@ /obj/machinery/atmospherics/pipe/manifold/purple/hidden level = PIPE_HIDDEN_LEVEL - + /obj/machinery/atmospherics/pipe/manifold/purple/hidden/layer1 piping_layer = PIPING_LAYER_MIN pixel_x = -PIPING_LAYER_P_X @@ -327,7 +327,7 @@ /obj/machinery/atmospherics/pipe/manifold/dark/visible level = PIPE_VISIBLE_LEVEL layer = GAS_PIPE_VISIBLE_LAYER - + /obj/machinery/atmospherics/pipe/manifold/dark/visible/layer1 piping_layer = PIPING_LAYER_MIN pixel_x = -PIPING_LAYER_P_X @@ -340,7 +340,7 @@ /obj/machinery/atmospherics/pipe/manifold/dark/hidden level = PIPE_HIDDEN_LEVEL - + /obj/machinery/atmospherics/pipe/manifold/dark/hidden/layer1 piping_layer = PIPING_LAYER_MIN pixel_x = -PIPING_LAYER_P_X @@ -358,7 +358,7 @@ /obj/machinery/atmospherics/pipe/manifold/violet/visible level = PIPE_VISIBLE_LEVEL layer = GAS_PIPE_VISIBLE_LAYER - + /obj/machinery/atmospherics/pipe/manifold/violet/visible/layer1 piping_layer = PIPING_LAYER_MIN pixel_x = -PIPING_LAYER_P_X @@ -371,7 +371,7 @@ /obj/machinery/atmospherics/pipe/manifold/violet/hidden level = PIPE_HIDDEN_LEVEL - + /obj/machinery/atmospherics/pipe/manifold/violet/hidden/layer1 piping_layer = PIPING_LAYER_MIN pixel_x = -PIPING_LAYER_P_X @@ -389,7 +389,7 @@ /obj/machinery/atmospherics/pipe/manifold/brown/visible level = PIPE_VISIBLE_LEVEL layer = GAS_PIPE_VISIBLE_LAYER - + /obj/machinery/atmospherics/pipe/manifold/brown/visible/layer1 piping_layer = PIPING_LAYER_MIN pixel_x = -PIPING_LAYER_P_X @@ -402,7 +402,7 @@ /obj/machinery/atmospherics/pipe/manifold/brown/hidden level = PIPE_HIDDEN_LEVEL - + /obj/machinery/atmospherics/pipe/manifold/brown/hidden/layer1 piping_layer = PIPING_LAYER_MIN pixel_x = -PIPING_LAYER_P_X diff --git a/code/modules/atmospherics/machinery/pipes/manifold4w.dm b/code/modules/atmospherics/machinery/pipes/manifold4w.dm index 5dc68f16..e955b595 100644 --- a/code/modules/atmospherics/machinery/pipes/manifold4w.dm +++ b/code/modules/atmospherics/machinery/pipes/manifold4w.dm @@ -24,7 +24,6 @@ icon_state = "manifold4w_center[invis]" cut_overlays() - //Add non-broken pieces for(var/i in 1 to device_type) if(nodes[i]) @@ -36,7 +35,7 @@ /obj/machinery/atmospherics/pipe/manifold4w/general/visible level = PIPE_VISIBLE_LEVEL layer = GAS_PIPE_VISIBLE_LAYER - + /obj/machinery/atmospherics/pipe/manifold4w/general/visible/layer1 piping_layer = PIPING_LAYER_MIN pixel_x = -PIPING_LAYER_P_X @@ -49,7 +48,7 @@ /obj/machinery/atmospherics/pipe/manifold4w/general/hidden level = PIPE_HIDDEN_LEVEL - + /obj/machinery/atmospherics/pipe/manifold4w/general/hidden/layer1 piping_layer = PIPING_LAYER_MIN pixel_x = -PIPING_LAYER_P_X @@ -81,7 +80,7 @@ /obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden level = PIPE_HIDDEN_LEVEL - + /obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden/layer1 piping_layer = PIPING_LAYER_MIN pixel_x = -PIPING_LAYER_P_X @@ -100,7 +99,7 @@ /obj/machinery/atmospherics/pipe/manifold4w/supply/visible level = PIPE_VISIBLE_LEVEL layer = GAS_PIPE_VISIBLE_LAYER - + /obj/machinery/atmospherics/pipe/manifold4w/supply/visible/layer1 piping_layer = PIPING_LAYER_MIN pixel_x = -PIPING_LAYER_P_X @@ -123,7 +122,7 @@ piping_layer = PIPING_LAYER_MAX pixel_x = PIPING_LAYER_P_X pixel_y = PIPING_LAYER_P_Y - + /obj/machinery/atmospherics/pipe/manifold4w/supplymain name="main air supply pipe" pipe_color=rgb(130,43,255) @@ -132,7 +131,7 @@ /obj/machinery/atmospherics/pipe/manifold4w/supplymain/visible level = PIPE_VISIBLE_LEVEL layer = GAS_PIPE_VISIBLE_LAYER - + /obj/machinery/atmospherics/pipe/manifold4w/supplymain/visible/layer1 piping_layer = PIPING_LAYER_MIN pixel_x = -PIPING_LAYER_P_X @@ -145,7 +144,7 @@ /obj/machinery/atmospherics/pipe/manifold4w/supplymain/hidden level = PIPE_HIDDEN_LEVEL - + /obj/machinery/atmospherics/pipe/manifold4w/supplymain/hidden/layer1 piping_layer = PIPING_LAYER_MIN pixel_x = -PIPING_LAYER_P_X @@ -163,7 +162,7 @@ /obj/machinery/atmospherics/pipe/manifold4w/yellow/visible level = PIPE_VISIBLE_LEVEL layer = GAS_PIPE_VISIBLE_LAYER - + /obj/machinery/atmospherics/pipe/manifold4w/yellow/visible/layer1 piping_layer = PIPING_LAYER_MIN pixel_x = -PIPING_LAYER_P_X @@ -176,7 +175,7 @@ /obj/machinery/atmospherics/pipe/manifold4w/yellow/hidden level = PIPE_HIDDEN_LEVEL - + /obj/machinery/atmospherics/pipe/manifold4w/yellow/hidden/layer1 piping_layer = PIPING_LAYER_MIN pixel_x = -PIPING_LAYER_P_X @@ -194,7 +193,7 @@ /obj/machinery/atmospherics/pipe/manifold4w/cyan/visible level = PIPE_VISIBLE_LEVEL layer = GAS_PIPE_VISIBLE_LAYER - + /obj/machinery/atmospherics/pipe/manifold4w/cyan/visible/layer1 piping_layer = PIPING_LAYER_MIN pixel_x = -PIPING_LAYER_P_X @@ -207,7 +206,7 @@ /obj/machinery/atmospherics/pipe/manifold4w/cyan/hidden level = PIPE_HIDDEN_LEVEL - + /obj/machinery/atmospherics/pipe/manifold4w/cyan/hidden/layer1 piping_layer = PIPING_LAYER_MIN pixel_x = -PIPING_LAYER_P_X @@ -225,7 +224,7 @@ /obj/machinery/atmospherics/pipe/manifold4w/green/visible level = PIPE_VISIBLE_LEVEL layer = GAS_PIPE_VISIBLE_LAYER - + /obj/machinery/atmospherics/pipe/manifold4w/green/visible/layer1 piping_layer = PIPING_LAYER_MIN pixel_x = -PIPING_LAYER_P_X @@ -238,7 +237,7 @@ /obj/machinery/atmospherics/pipe/manifold4w/green/hidden level = PIPE_HIDDEN_LEVEL - + /obj/machinery/atmospherics/pipe/manifold4w/green/hidden/layer1 piping_layer = PIPING_LAYER_MIN pixel_x = -PIPING_LAYER_P_X @@ -256,7 +255,7 @@ /obj/machinery/atmospherics/pipe/manifold4w/orange/visible level = PIPE_VISIBLE_LEVEL layer = GAS_PIPE_VISIBLE_LAYER - + /obj/machinery/atmospherics/pipe/manifold4w/orange/visible/layer1 piping_layer = PIPING_LAYER_MIN pixel_x = -PIPING_LAYER_P_X @@ -269,7 +268,7 @@ /obj/machinery/atmospherics/pipe/manifold4w/orange/hidden level = PIPE_HIDDEN_LEVEL - + /obj/machinery/atmospherics/pipe/manifold4w/orange/hidden/layer1 piping_layer = PIPING_LAYER_MIN pixel_x = -PIPING_LAYER_P_X @@ -287,7 +286,7 @@ /obj/machinery/atmospherics/pipe/manifold4w/purple/visible level = PIPE_VISIBLE_LEVEL layer = GAS_PIPE_VISIBLE_LAYER - + /obj/machinery/atmospherics/pipe/manifold4w/purple/visible/layer1 piping_layer = PIPING_LAYER_MIN pixel_x = -PIPING_LAYER_P_X @@ -300,7 +299,7 @@ /obj/machinery/atmospherics/pipe/manifold4w/purple/hidden level = PIPE_HIDDEN_LEVEL - + /obj/machinery/atmospherics/pipe/manifold4w/purple/hidden/layer1 piping_layer = PIPING_LAYER_MIN pixel_x = -PIPING_LAYER_P_X @@ -318,7 +317,7 @@ /obj/machinery/atmospherics/pipe/manifold4w/dark/visible level = PIPE_VISIBLE_LEVEL layer = GAS_PIPE_VISIBLE_LAYER - + /obj/machinery/atmospherics/pipe/manifold4w/dark/visible/layer1 piping_layer = PIPING_LAYER_MIN pixel_x = -PIPING_LAYER_P_X @@ -331,7 +330,7 @@ /obj/machinery/atmospherics/pipe/manifold4w/dark/hidden level = PIPE_HIDDEN_LEVEL - + /obj/machinery/atmospherics/pipe/manifold4w/dark/hidden/layer1 piping_layer = PIPING_LAYER_MIN pixel_x = -PIPING_LAYER_P_X @@ -349,7 +348,7 @@ /obj/machinery/atmospherics/pipe/manifold4w/violet/visible level = PIPE_VISIBLE_LEVEL layer = GAS_PIPE_VISIBLE_LAYER - + /obj/machinery/atmospherics/pipe/manifold4w/violet/visible/layer1 piping_layer = PIPING_LAYER_MIN pixel_x = -PIPING_LAYER_P_X @@ -362,7 +361,7 @@ /obj/machinery/atmospherics/pipe/manifold4w/violet/hidden level = PIPE_HIDDEN_LEVEL - + /obj/machinery/atmospherics/pipe/manifold4w/violet/hidden/layer1 piping_layer = PIPING_LAYER_MIN pixel_x = -PIPING_LAYER_P_X @@ -380,7 +379,7 @@ /obj/machinery/atmospherics/pipe/manifold4w/brown/visible level = PIPE_VISIBLE_LEVEL layer = GAS_PIPE_VISIBLE_LAYER - + /obj/machinery/atmospherics/pipe/manifold4w/brown/visible/layer1 piping_layer = PIPING_LAYER_MIN pixel_x = -PIPING_LAYER_P_X @@ -393,7 +392,7 @@ /obj/machinery/atmospherics/pipe/manifold4w/brown/hidden level = PIPE_HIDDEN_LEVEL - + /obj/machinery/atmospherics/pipe/manifold4w/brown/hidden/layer1 piping_layer = PIPING_LAYER_MIN pixel_x = -PIPING_LAYER_P_X diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index d1c3492a..3ce62fd1 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -247,7 +247,7 @@ AM.setDir(current_dir) now_pushing = 0 -/mob/living/start_pulling(atom/movable/AM, supress_message = 0) +/mob/living/start_pulling(atom/movable/AM, state, supress_message = FALSE) if(!AM || !src) return FALSE if(!(AM.can_be_pulled(src))) @@ -305,6 +305,44 @@ var/mob/living/carbon/C = L if(HAS_TRAIT(src, TRAIT_STRONG_GRABBER)) C.grippedby(src) + set_pull_offsets(M, state) + +/mob/living/proc/set_pull_offsets(mob/living/M, grab_state = GRAB_PASSIVE) + if(M.buckled) + return //don't make them change direction or offset them if they're buckled into something or in combat mode. + var/offset = 0 + switch(grab_state) + if(GRAB_PASSIVE) + offset = GRAB_PIXEL_SHIFT_PASSIVE + if(GRAB_AGGRESSIVE) + offset = GRAB_PIXEL_SHIFT_AGGRESSIVE + if(GRAB_NECK) + offset = GRAB_PIXEL_SHIFT_NECK + if(GRAB_KILL) + offset = GRAB_PIXEL_SHIFT_NECK + M.setDir(get_dir(M, src)) + switch(M.dir) + if(NORTH) + animate(M, pixel_x = 0, pixel_y = offset, 3) + if(SOUTH) + animate(M, pixel_x = 0, pixel_y = -offset, 3) + if(EAST) + if(M.lying == 270) //update the dragged dude's direction if we've turned + M.lying = 90 + M.update_transform() //force a transformation update, otherwise it'll take a few ticks for update_mobility() to do so + M.lying_prev = M.lying + animate(M, pixel_x = offset, pixel_y = 0, 3) + if(WEST) + if(M.lying == 90) + M.lying = 270 + M.update_transform() + M.lying_prev = M.lying + animate(M, pixel_x = -offset, pixel_y = 0, 3) + +/mob/living/proc/reset_pull_offsets(mob/living/M, override) + if(!override && M.buckled) + return + animate(M, pixel_x = 0, pixel_y = 0, 1) //mob verbs are a lot faster than object verbs //for more info on why this is not atom/pull, see examinate() in mob.dm @@ -318,6 +356,8 @@ stop_pulling() /mob/living/stop_pulling() + if(ismob(pulling)) + reset_pull_offsets(pulling) ..() update_pull_hud_icon() @@ -547,8 +587,12 @@ var/turf/T = loc . = ..() - if(pulledby && moving_diagonally != FIRST_DIAG_STEP && get_dist(src, pulledby) > 1)//separated from our puller and not in the middle of a diagonal move. + if(pulledby && moving_diagonally != FIRST_DIAG_STEP && get_dist(src, pulledby) > 1 && (pulledby != moving_from_pull))//separated from our puller and not in the middle of a diagonal move. pulledby.stop_pulling() + else + if(isliving(pulledby)) + var/mob/living/L = pulledby + L.set_pull_offsets(src, pulledby.grab_state) if(active_storage && !(CanReach(active_storage.parent,view_only = TRUE))) active_storage.close(src) diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index f80a9a64..f957df41 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -203,6 +203,7 @@ update_canmove() //we fall down if(!buckled && !density) Move(user.loc) + user.set_pull_offsets(src, grab_state) return 1 diff --git a/code/modules/mob/living/living_movement.dm b/code/modules/mob/living/living_movement.dm index 1716d313..fa33b330 100644 --- a/code/modules/mob/living/living_movement.dm +++ b/code/modules/mob/living/living_movement.dm @@ -26,3 +26,11 @@ add_movespeed_modifier(MOVESPEED_ID_LIVING_TURF_SPEEDMOD, TRUE, 100, override = TRUE, multiplicative_slowdown = T.slowdown) else remove_movespeed_modifier(MOVESPEED_ID_LIVING_TURF_SPEEDMOD) + +/mob/living/Move_Pulled(atom/A) + . = ..() + if(!. || !isliving(A)) + return + var/mob/living/L = A + set_pull_offsets(L, grab_state) + diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index 27278901..233ed47e 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -117,15 +117,16 @@ for(var/obj/O in mob.user_movement_hooks) O.intercept_user_move(direct, mob, n, oldloc) - var/atom/movable/P = mob.pulling - if(P && !ismob(P) && P.density) - mob.setDir(turn(mob.dir, 180)) + if(L.pulling) + L.setDir(turn(L.dir, 180)) ///Process_Grab() ///Called by client/Move() ///Checks to see if you are being grabbed and if so attemps to break it /client/proc/Process_Grab() if(mob.pulledby) + if((mob.pulledby == mob.pulling) && (mob.pulledby.grab_state == GRAB_PASSIVE)) //Don't autoresist passive grabs if we're grabbing them too. + return if(mob.incapacitated(ignore_restraints = 1)) move_delay = world.time + 10 return TRUE