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.