From b09a7b0e4f9834b7884ef7140142fd5eac70c2a2 Mon Sep 17 00:00:00 2001 From: MrMelbert Date: Thu, 19 Feb 2026 22:31:30 -0600 Subject: [PATCH 1/3] Dropping items on fall is no longer guaranteed --- code/game/turfs/turf.dm | 19 ++++++++++++++++--- code/modules/mob/living/living_defense.dm | 1 + 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index c210cff8278a..eba83d070715 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -622,9 +622,22 @@ GLOBAL_LIST_EMPTY(station_turfs) AddElement(/datum/element/rust) /turf/handle_fall(mob/faller) - if(has_gravity(src)) - playsound(src, SFX_BODYFALL, 50, TRUE) - faller.drop_all_held_items() + if(!has_gravity(src)) + return + playsound(src, SFX_BODYFALL, 50, TRUE) + if(!iscarbon(faller)) + faller.drop_all_held_items() + return + + var/mob/living/carbon/carbon_faller = faller + var/is_staggered = carbon_faller.has_status_effect(/datum/status_effect/staggered) + for(var/obj/item/bodypart/arm/arm in carbon_faller.bodyparts) + var/obj/item/held = faller.get_item_for_held_index(arm.held_index) + if(isnull(held)) + continue + if(!prob((0.3 * ((is_staggered ? 10 : 0) + (5 * held.w_class) + arm.get_modified_pain())) ** 1.5)) + continue + faller.dropItemToGround(held) /turf/proc/photograph(limit=20) var/image/I = new() diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 1c445c3f4ff4..4a64cca6204c 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -717,6 +717,7 @@ addtimer(CALLBACK(target, TYPE_PROC_REF(/mob/living, SetKnockdown), 0), SHOVE_CHAIN_PARALYZE) log_combat(src, target, "kicks", "onto their side (paralyzing)") target.set_headset_block_if_lower(3 SECONDS) + target.drop_all_held_items() return target.get_shoving_message(src, weapon, shove_flags) From 0a1f32808f60b86a545ed8de7ff55b17ab657f8b Mon Sep 17 00:00:00 2001 From: MrMelbert Date: Thu, 19 Feb 2026 22:40:33 -0600 Subject: [PATCH 2/3] Tweak --- code/modules/mob/living/living_defense.dm | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 4a64cca6204c..b5bb25f1d549 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -725,10 +725,9 @@ //Take their lunch money var/target_held_item = target.get_active_held_item() var/append_message = weapon ? " with [weapon]" : "" - if(!is_type_in_typecache(target_held_item, GLOB.shove_disarming_types)) //It's too expensive we'll get caught - target_held_item = null + var/disarmable = is_type_in_typecache(target_held_item, GLOB.shove_disarming_types) || target.body_position == LYING_DOWN - if(target_held_item && target.get_timed_status_effect_duration(/datum/status_effect/staggered)) + if(target_held_item && disarmable && target.has_status_effect(/datum/status_effect/staggered)) target.dropItemToGround(target_held_item) append_message = "causing [target.p_them()] to drop [target_held_item]" target.visible_message(span_danger("[target.name] drops \the [target_held_item]!"), From 2b854d405b6c0460143ed61cfe0531c7e5d0a470 Mon Sep 17 00:00:00 2001 From: MrMelbert Date: Thu, 19 Feb 2026 22:42:33 -0600 Subject: [PATCH 3/3] Redundant --- code/modules/mob/living/living_defense.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index b5bb25f1d549..43937f847fd7 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -717,7 +717,6 @@ addtimer(CALLBACK(target, TYPE_PROC_REF(/mob/living, SetKnockdown), 0), SHOVE_CHAIN_PARALYZE) log_combat(src, target, "kicks", "onto their side (paralyzing)") target.set_headset_block_if_lower(3 SECONDS) - target.drop_all_held_items() return target.get_shoving_message(src, weapon, shove_flags)