From 41870bbf24229a4e4a7654674d21445a1605c6db Mon Sep 17 00:00:00 2001
From: ForrestWick <54997375+ForrestWick@users.noreply.github.com>
Date: Thu, 13 Feb 2020 18:26:40 -0600
Subject: [PATCH] Fireman Carry
---
code/__DEFINES/mobs.dm | 3 +
code/__DEFINES/movespeed_modification.dm | 5 +-
code/datums/components/footstep.dm | 14 +-
code/datums/components/riding.dm | 51 +++++--
.../objects/items/stacks/tiles/tile_types.dm | 56 -------
code/game/objects/structures/tables_racks.dm | 142 +++---------------
code/modules/mob/living/carbon/human/human.dm | 108 ++++++++-----
code/modules/mob/living/living.dm | 6 +-
.../logs/2020/02/13/round-18.21.40/cargo.html | 1 +
9 files changed, 149 insertions(+), 237 deletions(-)
create mode 100644 data/logs/2020/02/13/round-18.21.40/cargo.html
diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm
index 1a7340d0..01ac96a2 100644
--- a/code/__DEFINES/mobs.dm
+++ b/code/__DEFINES/mobs.dm
@@ -264,3 +264,6 @@
#define BODYPART_LIFE_UPDATE_HEALTH (1<<0)
#define HUMAN_FIRE_STACK_ICON_NUM 3
+
+#define PULL_PRONE_SLOWDOWN 0.6
+#define HUMAN_CARRY_SLOWDOWN 0
\ No newline at end of file
diff --git a/code/__DEFINES/movespeed_modification.dm b/code/__DEFINES/movespeed_modification.dm
index 5d63de6d..9faa37ac 100644
--- a/code/__DEFINES/movespeed_modification.dm
+++ b/code/__DEFINES/movespeed_modification.dm
@@ -32,4 +32,7 @@
#define MOVESPEED_ID_SANITY "MOOD_SANITY"
-#define MOVESPEED_ID_TASED_STATUS "TASED"
\ No newline at end of file
+#define MOVESPEED_ID_TASED_STATUS "TASED"
+
+#define MOVESPEED_ID_PRONE_DRAGGING "PRONE_DRAG"
+#define MOVESPEED_ID_HUMAN_CARRYING "HUMAN_CARRY"
\ No newline at end of file
diff --git a/code/datums/components/footstep.dm b/code/datums/components/footstep.dm
index c4bf893c..9410804d 100644
--- a/code/datums/components/footstep.dm
+++ b/code/datums/components/footstep.dm
@@ -3,7 +3,7 @@
var/volume
var/e_range
-/datum/component/footstep/Initialize(volume_ = 0.4, e_range_ = -1)
+/datum/component/footstep/Initialize(volume_ = 0.5, e_range_ = -1)
if(!isliving(parent))
return COMPONENT_INCOMPATIBLE
volume = volume_
@@ -32,7 +32,7 @@
return
if(ishuman(C) && C.m_intent == MOVE_INTENT_WALK)
v /= 2
- e -= 4
+ e -= 5
steps++
if(steps >= 3)
@@ -58,7 +58,7 @@
if(isclawfoot(LM))
if(isalienadult(LM)) //xenos are stealthy and get quieter footsteps
v /= 3
- e -= 4
+ e -= 5
playsound(T, pick(GLOB.clawfootstep[T.clawfootstep][1]),
GLOB.clawfootstep[T.clawfootstep][2] * v,
@@ -89,20 +89,20 @@
return
if(ishuman(LM)) //for proper humans, they're special
var/mob/living/carbon/human/H = LM
- var/feetCover = (H.wear_suit && (H.wear_suit.body_parts_covered & FEET)) || (H.w_uniform && (H.w_uniform.body_parts_covered & FEET) || (H.shoes && (H.shoes.body_parts_covered & FEET)))
+ var/feetCover = (H.wear_suit && (H.wear_suit.body_parts_covered & FEET)) || (H.w_uniform && (H.w_uniform.body_parts_covered & FEET))
if (H.dna.features["taur"] == "Naga" || H.dna.features["taur"] == "Tentacle") //are we a naga or tentacle taur creature
playsound(T, 'sound/effects/footstep/crawl1.ogg', 15 * v)
return
- if(feetCover) //are we wearing shoes
+ if(H.shoes || feetCover) //are we wearing shoes
playsound(T, pick(GLOB.footstep[T.footstep][1]),
GLOB.footstep[T.footstep][2] * v,
TRUE,
GLOB.footstep[T.footstep][3] + e)
- if(!feetCover) //are we NOT wearing shoes
+ if((!H.shoes && !feetCover)) //are we NOT wearing shoes
playsound(T, pick(GLOB.barefootstep[T.barefootstep][1]),
GLOB.barefootstep[T.barefootstep][2] * v,
TRUE,
- GLOB.barefootstep[T.barefootstep][3] + e)
\ No newline at end of file
+ GLOB.barefootstep[T.barefootstep][3] + e)
diff --git a/code/datums/components/riding.dm b/code/datums/components/riding.dm
index 83e46cd8..266e8dfc 100644
--- a/code/datums/components/riding.dm
+++ b/code/datums/components/riding.dm
@@ -162,12 +162,12 @@
if(!Process_Spacemove(direction) || !isturf(AM.loc))
return
step(AM, direction)
-
+
if((direction & (direction - 1)) && (AM.loc == next)) //moved diagonally
last_move_diagonal = TRUE
else
last_move_diagonal = FALSE
-
+
handle_vehicle_layer()
handle_vehicle_offsets()
else
@@ -195,21 +195,47 @@
. = ..()
RegisterSignal(parent, COMSIG_HUMAN_MELEE_UNARMED_ATTACK, .proc/on_host_unarmed_melee)
+/datum/component/riding/human/vehicle_mob_unbuckle(datum/source, mob/living/M, force = FALSE)
+ var/mob/living/carbon/human/H = parent
+ H.remove_movespeed_modifier(MOVESPEED_ID_HUMAN_CARRYING)
+ . = ..()
+
+/datum/component/riding/human/vehicle_mob_buckle(datum/source, mob/living/M, force = FALSE)
+ . = ..()
+ var/mob/living/carbon/human/H = parent
+ H.add_movespeed_modifier(MOVESPEED_ID_HUMAN_CARRYING, multiplicative_slowdown = HUMAN_CARRY_SLOWDOWN)
+
/datum/component/riding/human/proc/on_host_unarmed_melee(atom/target)
- var/mob/living/carbon/human/AM = parent
- if(AM.a_intent == INTENT_DISARM && (target in AM.buckled_mobs))
+ var/mob/living/carbon/human/H = parent
+ if(H.a_intent == INTENT_DISARM && (target in H.buckled_mobs))
force_dismount(target)
/datum/component/riding/human/handle_vehicle_layer()
var/atom/movable/AM = parent
if(AM.buckled_mobs && AM.buckled_mobs.len)
- if(AM.dir == SOUTH)
- AM.layer = ABOVE_MOB_LAYER
+ for(var/mob/M in AM.buckled_mobs) //ensure proper layering of piggyback and carry, sometimes weird offsets get applied
+ M.layer = MOB_LAYER
+ if(!AM.buckle_lying)
+ if(AM.dir == SOUTH)
+ AM.layer = ABOVE_MOB_LAYER
+ else
+ AM.layer = OBJ_LAYER
else
- AM.layer = OBJ_LAYER
+ if(AM.dir == NORTH)
+ AM.layer = OBJ_LAYER
+ else
+ AM.layer = ABOVE_MOB_LAYER
else
AM.layer = MOB_LAYER
+/datum/component/riding/human/get_offsets(pass_index)
+ var/mob/living/carbon/human/H = parent
+ if(H.buckle_lying)
+ return list(TEXT_NORTH = list(0, 6), TEXT_SOUTH = list(0, 6), TEXT_EAST = list(0, 6), TEXT_WEST = list(0, 6))
+ else
+ return list(TEXT_NORTH = list(0, 6), TEXT_SOUTH = list(0, 6), TEXT_EAST = list(-6, 4), TEXT_WEST = list( 6, 4))
+
+
/datum/component/riding/human/force_dismount(mob/living/user)
var/atom/movable/AM = parent
AM.unbuckle_mob(user)
@@ -273,12 +299,15 @@
M.throw_at(target, 14, 5, AM)
M.Knockdown(60)
-/datum/component/riding/proc/equip_buckle_inhands(mob/living/carbon/human/user, amount_required = 1)
+/datum/component/riding/proc/equip_buckle_inhands(mob/living/carbon/human/user, amount_required = 1, riding_target_override = null)
var/atom/movable/AM = parent
var/amount_equipped = 0
for(var/amount_needed = amount_required, amount_needed > 0, amount_needed--)
var/obj/item/riding_offhand/inhand = new /obj/item/riding_offhand(user)
- inhand.rider = user
+ if(!riding_target_override)
+ inhand.rider = user
+ else
+ inhand.rider = riding_target_override
inhand.parent = AM
if(user.put_in_hands(inhand, TRUE))
amount_equipped++
@@ -318,7 +347,7 @@
. = ..()
/obj/item/riding_offhand/equipped()
- if(loc != rider)
+ if(loc != rider && loc != parent)
selfdeleting = TRUE
qdel(src)
. = ..()
@@ -328,4 +357,4 @@
if(selfdeleting)
if(rider in AM.buckled_mobs)
AM.unbuckle_mob(rider)
- . = ..()
+ . = ..()
\ No newline at end of file
diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm
index 6d010369..e1d06aa2 100644
--- a/code/game/objects/items/stacks/tiles/tile_types.dm
+++ b/code/game/objects/items/stacks/tiles/tile_types.dm
@@ -128,62 +128,6 @@
turf_type = /turf/open/floor/carpet/monochrome
tableVariant = /obj/structure/table/wood/fancy/monochrome
-/obj/item/stack/tile/carpet/blue
- name = "blue carpet"
- icon_state = "tile-carpet-blue"
- item_state = "tile-carpet-blue"
- turf_type = /turf/open/floor/carpet/blue
- tableVariant = /obj/structure/table/wood/fancy/blue
-
-/obj/item/stack/tile/carpet/cyan
- name = "cyan carpet"
- icon_state = "tile-carpet-cyan"
- item_state = "tile-carpet-cyan"
- turf_type = /turf/open/floor/carpet/cyan
- tableVariant = /obj/structure/table/wood/fancy/cyan
-
-/obj/item/stack/tile/carpet/green
- name = "green carpet"
- icon_state = "tile-carpet-green"
- item_state = "tile-carpet-green"
- turf_type = /turf/open/floor/carpet/green
- tableVariant = /obj/structure/table/wood/fancy/green
-
-/obj/item/stack/tile/carpet/orange
- name = "orange carpet"
- icon_state = "tile-carpet-orange"
- item_state = "tile-carpet-orange"
- turf_type = /turf/open/floor/carpet/orange
- tableVariant = /obj/structure/table/wood/fancy/orange
-
-/obj/item/stack/tile/carpet/purple
- name = "purple carpet"
- icon_state = "tile-carpet-purple"
- item_state = "tile-carpet-purple"
- turf_type = /turf/open/floor/carpet/purple
- tableVariant = /obj/structure/table/wood/fancy/purple
-
-/obj/item/stack/tile/carpet/red
- name = "red carpet"
- icon_state = "tile-carpet-red"
- item_state = "tile-carpet-red"
- turf_type = /turf/open/floor/carpet/red
- tableVariant = /obj/structure/table/wood/fancy/red
-
-/obj/item/stack/tile/carpet/royalblack
- name = "royal black carpet"
- icon_state = "tile-carpet-royalblack"
- item_state = "tile-carpet-royalblack"
- turf_type = /turf/open/floor/carpet/royalblack
- tableVariant = /obj/structure/table/wood/fancy/royalblack
-
-/obj/item/stack/tile/carpet/royalblue
- name = "royal blue carpet"
- icon_state = "tile-carpet-royalblue"
- item_state = "tile-carpet-royalblue"
- turf_type = /turf/open/floor/carpet/royalblue
- tableVariant = /obj/structure/table/wood/fancy/royalblue
-
/obj/item/stack/tile/carpet/fifty
amount = 50
diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm
index bec51dce..31b229a9 100644
--- a/code/game/objects/structures/tables_racks.dm
+++ b/code/game/objects/structures/tables_racks.dm
@@ -136,17 +136,6 @@
var/mob/living/carbon/human/H = pushed_mob
SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "table", /datum/mood_event/table)
-/* You don't shove people onto a table frame.
-/obj/structure/table/shove_act(mob/living/target, mob/living/user)
- if(!target.resting)
- target.Knockdown(SHOVE_KNOCKDOWN_TABLE)
- user.visible_message("[user.name] shoves [target.name] onto \the [src]!",
- "You shove [target.name] onto \the [src]!", null, COMBAT_MESSAGE_RANGE)
- target.forceMove(src.loc)
- log_combat(user, target, "shoved", "onto [src] (table)")
- return TRUE
-*/
-
/obj/structure/table/attackby(obj/item/I, mob/user, params)
if(!(flags_1 & NODECONSTRUCT_1))
if(istype(I, /obj/item/screwdriver) && deconstruction_ready)
@@ -272,52 +261,6 @@
for(var/obj/item/shard/S in debris)
S.color = NARSIE_WINDOW_COLOUR
-/*
- * Plasmaglass tables
- */
-/obj/structure/table/plasmaglass
- name = "plasmaglass table"
- desc = "A glasstable, but it's pink and more sturdy. What will Nanotrasen design next with plasma?"
- icon = 'icons/obj/smooth_structures/plasmaglass_table.dmi'
- icon_state = "plasmaglass_table"
- climbable = TRUE
- buildstack = /obj/item/stack/sheet/plasmaglass
- canSmoothWith = null
- max_integrity = 270
- resistance_flags = ACID_PROOF
- armor = list("melee" = 10, "bullet" = 5, "laser" = 0, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 100)
- var/list/debris = list()
-
-/obj/structure/table/plasmaglass/New()
- . = ..()
- debris += new frame
-
-/obj/structure/table/plasmaglass/Destroy()
- QDEL_LIST(debris)
- . = ..()
-
-/obj/structure/table/plasmaglass/proc/check_break(mob/living/M)
- return
-
-/obj/structure/table/plasmaglass/deconstruct(disassembled = TRUE, wrench_disassembly = 0)
- if(!(flags_1 & NODECONSTRUCT_1))
- if(disassembled)
- ..()
- return
- else
- var/turf/T = get_turf(src)
- playsound(T, "shatter", 50, 1)
- for(var/X in debris)
- var/atom/movable/AM = X
- AM.forceMove(T)
- debris -= AM
- qdel(src)
-
-/obj/structure/table/plasmaglass/narsie_act()
- color = NARSIE_WINDOW_COLOUR
- for(var/obj/item/shard/S in debris)
- S.color = NARSIE_WINDOW_COLOUR
-
/*
* Wooden tables
*/
@@ -358,83 +301,44 @@
frame = /obj/structure/table_frame
framestack = /obj/item/stack/rods
buildstack = /obj/item/stack/tile/carpet
- canSmoothWith = list(/obj/structure/table/wood/fancy,
- /obj/structure/table/wood/fancy/black,
- /obj/structure/table/wood/fancy/blackred,
- /obj/structure/table/wood/fancy/monochrome,
- /obj/structure/table/wood/fancy/blue,
- /obj/structure/table/wood/fancy/cyan,
- /obj/structure/table/wood/fancy/green,
- /obj/structure/table/wood/fancy/orange,
- /obj/structure/table/wood/fancy/purple,
- /obj/structure/table/wood/fancy/red,
- /obj/structure/table/wood/fancy/royalblack,
- /obj/structure/table/wood/fancy/royalblue)
- var/smooth_icon = 'icons/obj/smooth_structures/fancy_table.dmi' // see Initialize()
+ canSmoothWith = list(/obj/structure/table/wood/fancy, /obj/structure/table/wood/fancy/black, /obj/structure/table/wood/fancy/blackred, /obj/structure/table/wood/fancy/monochrome)
-/obj/structure/table/wood/fancy/Initialize()
+/obj/structure/table/wood/fancy/New()
+ // New() is used so that the /black subtype can override `icon` easily and
+ // the correct value will be used by the smoothing subsystem.
. = ..()
// Needs to be set dynamically because table smooth sprites are 32x34,
// which the editor treats as a two-tile-tall object. The sprites are that
// size so that the north/south corners look nice - examine the detail on
// the sprites in the editor to see why.
- icon = smooth_icon
+ icon = 'icons/obj/smooth_structures/fancy_table.dmi'
/obj/structure/table/wood/fancy/black
icon_state = "fancy_table_black"
buildstack = /obj/item/stack/tile/carpet/black
- smooth_icon = 'icons/obj/smooth_structures/fancy_table_black.dmi'
/obj/structure/table/wood/fancy/blackred
- icon_state = "fancy_table_blackred"
- buildstack = /obj/item/stack/tile/carpet/blackred
- smooth_icon = 'icons/obj/smooth_structures/fancy_table_blackred.dmi'
+ icon = 'icons/obj/structures.dmi'
+ icon_state = "fancy_table_blackred"
+ buildstack = /obj/item/stack/tile/carpet/blackred
+
+/obj/structure/table/wood/fancy/blackred/New()
+ . = ..()
+ icon = 'icons/obj/smooth_structures/fancy_table_blackred.dmi'
/obj/structure/table/wood/fancy/monochrome
- icon_state = "fancy_table_monochrome"
- buildstack = /obj/item/stack/tile/carpet/monochrome
- smooth_icon = 'icons/obj/smooth_structures/fancy_table_monochrome.dmi'
+ icon = 'icons/obj/structures.dmi'
+ icon_state = "fancy_table_monochrome"
+ buildstack = /obj/item/stack/tile/carpet/monochrome
-/obj/structure/table/wood/fancy/blue
- icon_state = "fancy_table_blue"
- buildstack = /obj/item/stack/tile/carpet/blue
- smooth_icon = 'icons/obj/smooth_structures/fancy_table_blue.dmi'
-
-/obj/structure/table/wood/fancy/cyan
- icon_state = "fancy_table_cyan"
- buildstack = /obj/item/stack/tile/carpet/cyan
- smooth_icon = 'icons/obj/smooth_structures/fancy_table_cyan.dmi'
-
-/obj/structure/table/wood/fancy/green
- icon_state = "fancy_table_green"
- buildstack = /obj/item/stack/tile/carpet/green
- smooth_icon = 'icons/obj/smooth_structures/fancy_table_green.dmi'
-
-/obj/structure/table/wood/fancy/orange
- icon_state = "fancy_table_orange"
- buildstack = /obj/item/stack/tile/carpet/orange
- smooth_icon = 'icons/obj/smooth_structures/fancy_table_orange.dmi'
-
-/obj/structure/table/wood/fancy/purple
- icon_state = "fancy_table_purple"
- buildstack = /obj/item/stack/tile/carpet/purple
- smooth_icon = 'icons/obj/smooth_structures/fancy_table_purple.dmi'
-
-/obj/structure/table/wood/fancy/red
- icon_state = "fancy_table_red"
- buildstack = /obj/item/stack/tile/carpet/red
- smooth_icon = 'icons/obj/smooth_structures/fancy_table_red.dmi'
-
-/obj/structure/table/wood/fancy/royalblack
- icon_state = "fancy_table_royalblack"
- buildstack = /obj/item/stack/tile/carpet/royalblack
- smooth_icon = 'icons/obj/smooth_structures/fancy_table_royalblack.dmi'
-
-/obj/structure/table/wood/fancy/royalblue
- icon_state = "fancy_table_royalblue"
- buildstack = /obj/item/stack/tile/carpet/royalblue
- smooth_icon = 'icons/obj/smooth_structures/fancy_table_royalblue.dmi'
+/obj/structure/table/wood/fancy/monochrome/New()
+ . = ..()
+ icon = 'icons/obj/smooth_structures/fancy_table_monochrome.dmi'
+/obj/structure/table/wood/fancy/black/New()
+ . = ..()
+ // Ditto above.
+ icon = 'icons/obj/smooth_structures/fancy_table_black.dmi'
/*
* Reinforced tables
*/
@@ -687,4 +591,4 @@
", "You assemble \a [R].")
R.add_fingerprint(user)
qdel(src)
- building = FALSE
+ building = FALSE
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index dcb1980c..b4a8839e 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -854,52 +854,84 @@
.["Copy outfit"] = "?_src_=vars;[HrefToken()];copyoutfit=[REF(src)]"
/mob/living/carbon/human/MouseDrop_T(mob/living/target, mob/living/user)
- //If they dragged themselves and we're currently aggressively grabbing them try to piggyback
- if(user == target && can_piggyback(target) && pulling == target && (HAS_TRAIT(src, TRAIT_PACIFISM) || grab_state >= GRAB_AGGRESSIVE) && stat == CONSCIOUS)
- buckle_mob(target,TRUE,TRUE)
+ if(pulling == target && grab_state >= GRAB_AGGRESSIVE && stat == CONSCIOUS)
+ //If they dragged themselves and we're currently aggressively grabbing them try to piggyback
+ if(user == target && can_piggyback(target))
+ piggyback(target)
+ return
+ //If you dragged them to you and you're aggressively grabbing try to fireman carry them
+ else if(user != target && can_be_firemanned(target))
+ fireman_carry(target)
+ return
. = ..()
-/mob/living/carbon/human/proc/piggyback_instant(mob/living/M)
- return buckle_mob(M, TRUE, TRUE, FALSE, TRUE)
+//src is the user that will be carrying, target is the mob to be carried
+/mob/living/carbon/human/proc/can_piggyback(mob/living/carbon/target)
+ return (istype(target) && target.stat == CONSCIOUS)
-//Can C try to piggyback at all.
-/mob/living/carbon/human/proc/can_piggyback(mob/living/carbon/C)
- if(istype(C) && C.stat == CONSCIOUS)
- return TRUE
- return FALSE
+/mob/living/carbon/human/proc/can_be_firemanned(mob/living/carbon/target)
+ return (ishuman(target) && target.lying)
-/mob/living/carbon/human/buckle_mob(mob/living/M, force = FALSE, check_loc = TRUE, bypass_piggybacking = FALSE, no_delay = FALSE)
+/mob/living/carbon/human/proc/fireman_carry(mob/living/carbon/target)
+ if(can_be_firemanned(target))
+ visible_message("[src] starts lifting [target] onto their back...",
+ "You start lifting [target] onto your back...")
+ if(do_after(src, 30, TRUE, target))
+ //Second check to make sure they're still valid to be carried
+ if(can_be_firemanned(target) && !incapacitated(FALSE, TRUE))
+ target.resting = FALSE
+ buckle_mob(target, TRUE, TRUE, 90, 1, 0)
+ return
+ visible_message("[src] fails to fireman carry [target]!")
+ else
+ to_chat(src, "You can't fireman carry [target] while they're standing!")
+
+/mob/living/carbon/human/proc/piggyback(mob/living/carbon/target)
+ if(can_piggyback(target))
+ visible_message("[target] starts to climb onto [src]...")
+ if(do_after(target, 15, target = src))
+ if(can_piggyback(target))
+ if(target.incapacitated(FALSE, TRUE) || incapacitated(FALSE, TRUE))
+ target.visible_message("[target] can't hang onto [src]!")
+ return
+ buckle_mob(target, TRUE, TRUE, FALSE, 0, 2)
+ else
+ visible_message("[target] fails to climb onto [src]!")
+ else
+ to_chat(target, "You can't piggyback ride [src] right now!")
+
+/mob/living/carbon/human/buckle_mob(mob/living/target, force = FALSE, check_loc = TRUE, lying_buckle = FALSE, hands_needed = 0, target_hands_needed = 0)
if(!force)//humans are only meant to be ridden through piggybacking and special cases
return
- if(bypass_piggybacking)
- return ..()
- if(!is_type_in_typecache(M, can_ride_typecache))
- M.visible_message("[M] really can't seem to mount [src]...")
+ if(!is_type_in_typecache(target, can_ride_typecache))
+ target.visible_message("[target] really can't seem to mount [src]...")
return
+ buckle_lying = lying_buckle
var/datum/component/riding/human/riding_datum = LoadComponent(/datum/component/riding/human)
- riding_datum.ride_check_rider_incapacitated = TRUE
- riding_datum.ride_check_rider_restrained = TRUE
- riding_datum.set_riding_offsets(RIDING_OFFSET_ALL, list(TEXT_NORTH = list(0, 6), TEXT_SOUTH = list(0, 6), TEXT_EAST = list(-6, 4), TEXT_WEST = list( 6, 4)))
- if(buckled_mobs && ((M in buckled_mobs) || (buckled_mobs.len >= max_buckled_mobs)) || buckled || (M.stat != CONSCIOUS))
+ if(target_hands_needed)
+ riding_datum.ride_check_rider_restrained = TRUE
+ if(buckled_mobs && ((target in buckled_mobs) || (buckled_mobs.len >= max_buckled_mobs)) || buckled)
return
- if(can_piggyback(M))
- riding_datum.ride_check_ridden_incapacitated = TRUE
- visible_message("[M] starts to climb onto [src]...")
- if(no_delay || do_after(M, 15, target = src))
- if(can_piggyback(M))
- if(M.incapacitated(FALSE, TRUE) || incapacitated(FALSE, TRUE))
- M.visible_message("[M] can't hang onto [src]!")
- return
- if(!riding_datum.equip_buckle_inhands(M, 2)) //MAKE SURE THIS IS LAST!!
- M.visible_message("[M] can't climb onto [src]!")
- return
- . = ..(M, force, check_loc)
- stop_pulling()
- else
- visible_message("[M] fails to climb onto [src]!")
- else
- . = ..(M,force,check_loc)
- stop_pulling()
+ var/equipped_hands_self
+ var/equipped_hands_target
+ if(hands_needed)
+ equipped_hands_self = riding_datum.equip_buckle_inhands(src, hands_needed, target)
+ if(target_hands_needed)
+ equipped_hands_target = riding_datum.equip_buckle_inhands(target, target_hands_needed)
+
+ if(hands_needed || target_hands_needed)
+ if(hands_needed && !equipped_hands_self)
+ src.visible_message("[src] can't get a grip on [target] because their hands are full!",
+ "You can't get a grip on [target] because your hands are full!")
+ return
+ else if(target_hands_needed && !equipped_hands_target)
+ target.visible_message("[target] can't get a grip on [src] because their hands are full!",
+ "You can't get a grip on [src] because your hands are full!")
+ return
+
+ stop_pulling()
+ riding_datum.handle_vehicle_layer()
+ . = ..(target, force, check_loc)
/mob/living/carbon/human/proc/is_shove_knockdown_blocked() //If you want to add more things that block shove knockdown, extend this
for(var/obj/item/clothing/C in get_equipped_items()) //doesn't include pockets
@@ -1066,4 +1098,4 @@
race = /datum/species/zombie/infectious
/mob/living/carbon/human/species/zombie/krokodil_addict
- race = /datum/species/krokodil_addict
+ race = /datum/species/krokodil_addict
\ No newline at end of file
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 5be545a0..f311649d 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -281,11 +281,7 @@
var/datum/disease/D = thing
if(D.spread_flags & DISEASE_SPREAD_CONTACT_SKIN)
ContactContractDisease(D)
-
- if(iscarbon(L))
- var/mob/living/carbon/C = L
- if(HAS_TRAIT(src, TRAIT_STRONG_GRABBER))
- C.grippedby(src)
+p
//mob verbs are a lot faster than object verbs
//for more info on why this is not atom/pull, see examinate() in mob.dm
diff --git a/data/logs/2020/02/13/round-18.21.40/cargo.html b/data/logs/2020/02/13/round-18.21.40/cargo.html
new file mode 100644
index 00000000..289c5be1
--- /dev/null
+++ b/data/logs/2020/02/13/round-18.21.40/cargo.html
@@ -0,0 +1 @@
+18:22:32 [0x2026c96] (152,108,1) || the supply shuttle Shuttle contents sold for 0 credits. Contents: /list Message: none.