From 2ab2be0f375435b58c7e78a0ec5cc3f3e550ab9e Mon Sep 17 00:00:00 2001 From: Bloop <13398309+vinylspiders@users.noreply.github.com> Date: Wed, 10 Dec 2025 05:33:06 -0500 Subject: [PATCH] Guards against qdeletion in afterattack (#94211) --- code/game/objects/items/fireaxe.dm | 2 ++ code/game/objects/items/melee/baton.dm | 2 +- code/game/objects/items/melee/misc.dm | 2 +- code/game/objects/items/weaponry.dm | 2 ++ code/game/objects/items/wizard_weapons.dm | 2 +- .../changeling/powers/mutations.dm | 2 ++ .../heretic/items/heretic_blades.dm | 2 +- .../job_types/chaplain/chaplain_nullrod.dm | 2 +- .../ruins/objects_and_mobs/sin_ruins.dm | 2 +- .../projectiles/guns/ballistic/pistol.dm | 2 ++ .../reagent_containers/cups/drinks.dm | 4 +-- .../reagent_containers/cups/glassbottle.dm | 25 ++++++++++--------- code/modules/zombie/items.dm | 2 ++ 13 files changed, 31 insertions(+), 20 deletions(-) diff --git a/code/game/objects/items/fireaxe.dm b/code/game/objects/items/fireaxe.dm index a6f1469dab2..23cd24c375c 100644 --- a/code/game/objects/items/fireaxe.dm +++ b/code/game/objects/items/fireaxe.dm @@ -69,6 +69,8 @@ GLOBAL_DATUM(bridge_axe, /obj/item/fireaxe) return if(target.resistance_flags & INDESTRUCTIBLE) return + if(QDELETED(target)) + return if(istype(target, /obj/structure/window) || istype(target, /obj/structure/grille)) target.atom_destruction("fireaxe") diff --git a/code/game/objects/items/melee/baton.dm b/code/game/objects/items/melee/baton.dm index 06293e29b5b..ac344e2f073 100644 --- a/code/game/objects/items/melee/baton.dm +++ b/code/game/objects/items/melee/baton.dm @@ -157,7 +157,7 @@ // This is where stun gets applied /obj/item/melee/baton/afterattack(atom/target, mob/user, list/modifiers, list/attack_modifiers) - if(!isliving(target) || !active || !COOLDOWN_FINISHED(src, cooldown_check) || HAS_TRAIT_FROM(target, TRAIT_IWASBATONED, REF(user))) + if(!isliving(target) || !active || !COOLDOWN_FINISHED(src, cooldown_check) || HAS_TRAIT_FROM(target, TRAIT_IWASBATONED, REF(user)) || QDELETED(target)) return // worst check in the chain but - right click = harmbaton if(LAZYACCESS(modifiers, RIGHT_CLICK) && !stun_on_harmbaton) diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm index 5f4b96d3363..2f4defafa2c 100644 --- a/code/game/objects/items/melee/misc.dm +++ b/code/game/objects/items/melee/misc.dm @@ -219,7 +219,7 @@ return ..() /obj/item/melee/beesword/afterattack(atom/target, mob/user, list/modifiers, list/attack_modifiers) - if(iscarbon(target)) + if(iscarbon(target) && !QDELETED(target)) var/mob/living/carbon/carbon_target = target carbon_target.reagents.add_reagent(/datum/reagent/toxin, 4) diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm index 78accb14525..ea974a3993a 100644 --- a/code/game/objects/items/weaponry.dm +++ b/code/game/objects/items/weaponry.dm @@ -1073,6 +1073,8 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 /obj/item/melee/flyswatter/afterattack(atom/target, mob/user, list/modifiers, list/attack_modifiers) if(is_type_in_typecache(target, splattable)) to_chat(user, span_warning("You easily splat [target].")) + if(QDELETED(target)) + return if(isliving(target)) new /obj/effect/decal/cleanable/insectguts(target.drop_location()) var/mob/living/bug = target diff --git a/code/game/objects/items/wizard_weapons.dm b/code/game/objects/items/wizard_weapons.dm index 7179eedb9d5..5c8eaf4a818 100644 --- a/code/game/objects/items/wizard_weapons.dm +++ b/code/game/objects/items/wizard_weapons.dm @@ -64,7 +64,7 @@ return charged = FALSE - if(isliving(target)) + if(isliving(target) && !QDELETED(target)) var/mob/living/smacked = target smacked.take_bodypart_damage(20, 0) playsound(user, 'sound/items/weapons/marauder.ogg', 50, TRUE) diff --git a/code/modules/antagonists/changeling/powers/mutations.dm b/code/modules/antagonists/changeling/powers/mutations.dm index 409c51e6866..762b6b4c90d 100644 --- a/code/modules/antagonists/changeling/powers/mutations.dm +++ b/code/modules/antagonists/changeling/powers/mutations.dm @@ -227,6 +227,8 @@ ) /obj/item/melee/arm_blade/afterattack(atom/target, mob/user, list/modifiers, list/attack_modifiers) + if(QDELETED(target)) + return if(istype(target, /obj/structure/table)) var/obj/smash = target smash.deconstruct(FALSE) diff --git a/code/modules/antagonists/heretic/items/heretic_blades.dm b/code/modules/antagonists/heretic/items/heretic_blades.dm index d5dc25187b5..30433933ec8 100644 --- a/code/modules/antagonists/heretic/items/heretic_blades.dm +++ b/code/modules/antagonists/heretic/items/heretic_blades.dm @@ -166,7 +166,7 @@ /obj/item/melee/sickly_blade/dark/afterattack(atom/target, mob/user, list/modifiers, list/attack_modifiers) . = ..() - if(!infused || target == user || !isliving(target)) + if(!infused || target == user || !isliving(target) || QDELETED(target)) return var/datum/antagonist/heretic/heretic_datum = GET_HERETIC(user) var/mob/living/living_target = target diff --git a/code/modules/jobs/job_types/chaplain/chaplain_nullrod.dm b/code/modules/jobs/job_types/chaplain/chaplain_nullrod.dm index 2e5dc99bb01..679a16caf1c 100644 --- a/code/modules/jobs/job_types/chaplain/chaplain_nullrod.dm +++ b/code/modules/jobs/job_types/chaplain/chaplain_nullrod.dm @@ -859,7 +859,7 @@ GLOBAL_LIST_INIT(nullrod_variants, init_nullrod_variants()) if(user == living_target) return - if(living_target.stat == DEAD) + if(living_target.stat == DEAD || QDELETED(living_target)) return sneak_attack(living_target, user) diff --git a/code/modules/mapfluff/ruins/objects_and_mobs/sin_ruins.dm b/code/modules/mapfluff/ruins/objects_and_mobs/sin_ruins.dm index 706235be089..e4af185ebb5 100644 --- a/code/modules/mapfluff/ruins/objects_and_mobs/sin_ruins.dm +++ b/code/modules/mapfluff/ruins/objects_and_mobs/sin_ruins.dm @@ -38,7 +38,7 @@ hitsound = 'sound/items/weapons/bladeslice.ogg' /obj/item/knife/envy/afterattack(atom/target, mob/living/carbon/human/user, list/modifiers, list/attack_modifiers) - if(!istype(user) || !ishuman(target)) + if(!istype(user) || !ishuman(target) || QDELETED(target)) return var/mob/living/carbon/human/H = target diff --git a/code/modules/projectiles/guns/ballistic/pistol.dm b/code/modules/projectiles/guns/ballistic/pistol.dm index 6d3e407d6e8..620a6668e1f 100644 --- a/code/modules/projectiles/guns/ballistic/pistol.dm +++ b/code/modules/projectiles/guns/ballistic/pistol.dm @@ -100,6 +100,8 @@ return ..() /obj/item/gun/ballistic/automatic/pistol/clandestine/fisher/afterattack(atom/target, mob/user, list/modifiers, list/attack_modifiers) + if(QDELETED(target)) + return var/obj/projectile/energy/fisher/melee/simulated_hit = new simulated_hit.firer = user simulated_hit.on_hit(target) diff --git a/code/modules/reagents/reagent_containers/cups/drinks.dm b/code/modules/reagents/reagent_containers/cups/drinks.dm index 0f3009b048f..fa671c9ca31 100644 --- a/code/modules/reagents/reagent_containers/cups/drinks.dm +++ b/code/modules/reagents/reagent_containers/cups/drinks.dm @@ -29,7 +29,7 @@ return if(bartender_check(target, thrower) && throwingdatum) return - splash_reagents(target, thrower || throwingdatum?.get_thrower(), allow_closed_splash = TRUE) + splash_reagents(QDELETED(target) ? target.drop_location() : target, thrower || throwingdatum?.get_thrower(), allow_closed_splash = TRUE) var/obj/item/broken_bottle/B = new (loc) B.mimic_broken(src, target, break_top) qdel(src) @@ -379,7 +379,7 @@ /obj/item/reagent_containers/cup/glass/bottle/juice/smallcarton/smash(atom/target, mob/thrower, datum/thrownthing/throwingdatum, break_top) if(bartender_check(target, thrower) && throwingdatum) return - splash_reagents(target, thrower || throwingdatum?.get_thrower(), allow_closed_splash = TRUE) + splash_reagents(QDELETED(target) ? target.drop_location() : target, thrower || throwingdatum?.get_thrower(), allow_closed_splash = TRUE) var/obj/item/broken_bottle/bottle_shard = new(drop_location()) bottle_shard.mimic_broken(src, target) qdel(src) diff --git a/code/modules/reagents/reagent_containers/cups/glassbottle.dm b/code/modules/reagents/reagent_containers/cups/glassbottle.dm index f45bab961a0..b1686c774ef 100644 --- a/code/modules/reagents/reagent_containers/cups/glassbottle.dm +++ b/code/modules/reagents/reagent_containers/cups/glassbottle.dm @@ -151,25 +151,25 @@ return var/head_hitter = user.zone_selected == BODY_ZONE_HEAD && isliving(target) - - // An attack that targets the head of a living mob will attempt to knock them down - if(head_hitter) - var/mob/living/living_target = target - var/knockdown_effectiveness = 0 - if(!HAS_TRAIT(target, TRAIT_HEAD_INJURY_BLOCKED)) - knockdown_effectiveness = bottle_knockdown_duration + ((force / 10) * 1 SECONDS) - living_target.getarmor(BODY_ZONE_HEAD, MELEE) - if(prob(knockdown_effectiveness)) - living_target.Knockdown(min(knockdown_effectiveness, 20 SECONDS)) + if(!QDELETED(target)) + // An attack that targets the head of a living mob will attempt to knock them down + if(head_hitter) + var/mob/living/living_target = target + var/knockdown_effectiveness = 0 + if(!HAS_TRAIT(target, TRAIT_HEAD_INJURY_BLOCKED)) + knockdown_effectiveness = bottle_knockdown_duration + ((force / 10) * 1 SECONDS) - living_target.getarmor(BODY_ZONE_HEAD, MELEE) + if(prob(knockdown_effectiveness)) + living_target.Knockdown(min(knockdown_effectiveness, 20 SECONDS)) // Displays a custom message which follows the attack if(target == user) - target.visible_message( + user.visible_message( span_warning("[user] smashes [src] [head_hitter ? "over [user.p_their()] head" : "against [user.p_them()]selves"]!"), span_warning("You smash [src] [head_hitter ? "over your head" : "against yourself"]!"), ) else - target.visible_message( + user.visible_message( span_warning("[user] smashes [src] [head_hitter ? "over [target]'s head" : "against [target]"]!"), span_warning("[user] smashes [src] [head_hitter ? "over your head" : "against you"]!"), ) @@ -916,7 +916,8 @@ break ..() if(firestarter && active) - target.fire_act() + if(!QDELETED(target)) + target.fire_act() new /obj/effect/hotspot(get_turf(target)) /obj/item/reagent_containers/cup/glass/bottle/molotov/item_interaction(mob/living/user, obj/item/item, list/modifiers) diff --git a/code/modules/zombie/items.dm b/code/modules/zombie/items.dm index 7e98f95695f..b47e334a65a 100644 --- a/code/modules/zombie/items.dm +++ b/code/modules/zombie/items.dm @@ -12,6 +12,8 @@ sharpness = SHARP_EDGED /obj/item/mutant_hand/zombie/afterattack(atom/target, mob/user, list/modifiers, list/attack_modifiers) + if(QDELETED(target)) + return if(ishuman(target)) try_to_zombie_infect(target, user, user.zone_selected) else if(isliving(target))