diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm index d9ebe2d2e2a..525f0e32212 100644 --- a/code/__DEFINES/combat.dm +++ b/code/__DEFINES/combat.dm @@ -286,6 +286,13 @@ GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list( /// Proceed with the attack chain, but don't call the normal methods. #define SECONDARY_ATTACK_CONTINUE_CHAIN 3 +/// Flag for when /afterattack potentially acts on an item. +/// Used for the swap hands/drop tutorials to know when you might just be trying to do something normally. +/// Does not necessarily imply success, or even that it did hit an item, just intent. +// This is intentionally not (1 << 0) because some stuff currently erroneously returns TRUE/FALSE for afterattack. +// Doesn't need to be set if proximity flag is FALSE. +#define AFTERATTACK_PROCESSED_ITEM (1 << 1) + //Autofire component /// Compatible firemode is in the gun. Wait until it's held in the user hands. #define AUTOFIRE_STAT_IDLE (1<<0) diff --git a/code/__DEFINES/dcs/signals/signals_object.dm b/code/__DEFINES/dcs/signals/signals_object.dm index 9efbd34cdd8..908722e4912 100644 --- a/code/__DEFINES/dcs/signals/signals_object.dm +++ b/code/__DEFINES/dcs/signals/signals_object.dm @@ -390,6 +390,10 @@ #define COMSIG_ITEM_ATTACK_SECONDARY "item_pre_attack_secondary" ///from base of obj/item/afterattack(): (atom/target, mob/user, proximity_flag, click_parameters) #define COMSIG_ITEM_AFTERATTACK "item_afterattack" + /// Flag for when /afterattack potentially acts on an item. + /// Used for the swap hands/drop tutorials to know when you might just be trying to do something normally. + /// Does not necessarily imply success, or even that it did hit an item, just intent. + #define COMPONENT_AFTERATTACK_PROCESSED_ITEM (1<<0) ///from base of obj/item/afterattack_secondary(): (atom/target, mob/user, proximity_flag, click_parameters) #define COMSIG_ITEM_AFTERATTACK_SECONDARY "item_afterattack_secondary" ///from base of obj/item/attack_qdeleted(): (atom/target, mob/user, params) diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index 9af671fc9b5..aa223e6d4c5 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -59,7 +59,7 @@ if (after_attack_secondary_result == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN || after_attack_secondary_result == SECONDARY_ATTACK_CONTINUE_CHAIN) return TRUE - return afterattack(target, user, TRUE, params) + return afterattack(target, user, TRUE, params) == TRUE /// Called when the item is in the active hand, and clicked; alternately, there is an 'activate held object' verb or you can hit pagedown. /obj/item/proc/attack_self(mob/user, modifiers) @@ -271,7 +271,9 @@ return ..() /** - * Last proc in the [/obj/item/proc/melee_attack_chain] + * Last proc in the [/obj/item/proc/melee_attack_chain]. + * Returns a bitfield containing AFTERATTACK_PROCESSED_ITEM if the user is likely intending to use this item on another item. + * Some consumers currently return TRUE to mean "processed". These are not consistent and should be taken with a grain of salt. * * Arguments: * * atom/target - The thing that was hit @@ -280,8 +282,10 @@ * * click_parameters - is the params string from byond [/atom/proc/Click] code, see that documentation. */ /obj/item/proc/afterattack(atom/target, mob/user, proximity_flag, click_parameters) - SEND_SIGNAL(src, COMSIG_ITEM_AFTERATTACK, target, user, proximity_flag, click_parameters) + . = NONE + . |= SEND_SIGNAL(src, COMSIG_ITEM_AFTERATTACK, target, user, proximity_flag, click_parameters) SEND_SIGNAL(user, COMSIG_MOB_ITEM_AFTERATTACK, target, src, proximity_flag, click_parameters) + return . /** * Called at the end of the attack chain if the user right-clicked. diff --git a/code/_onclick/telekinesis.dm b/code/_onclick/telekinesis.dm index ea6108a1f1c..624cf560f64 100644 --- a/code/_onclick/telekinesis.dm +++ b/code/_onclick/telekinesis.dm @@ -179,9 +179,11 @@ focus.do_attack_animation(target, null, focus) else if(isgun(I)) //I've only tested this with guns, and it took some doing to make it work . = I.afterattack(target, tk_user, 0, params) + . |= AFTERATTACK_PROCESSED_ITEM user.changeNext_move(CLICK_CD_MELEE) update_appearance() + return . /obj/item/tk_grab/afterattack_secondary(atom/target, mob/user, proximity_flag, click_parameters) . = ..() diff --git a/code/datums/components/cleaner.dm b/code/datums/components/cleaner.dm index 50eb48ff985..87c61c061fe 100644 --- a/code/datums/components/cleaner.dm +++ b/code/datums/components/cleaner.dm @@ -69,12 +69,14 @@ SIGNAL_HANDLER if(!proximity_flag) return + . |= COMPONENT_AFTERATTACK_PROCESSED_ITEM var/clean_target if(pre_clean_callback) clean_target = pre_clean_callback?.Invoke(source, target, user) if(clean_target == DO_NOT_CLEAN) - return + return . INVOKE_ASYNC(src, PROC_REF(clean), source, target, user, clean_target) //signal handlers can't have do_afters inside of them + return . /** * Cleans something using this cleaner. diff --git a/code/datums/components/igniter.dm b/code/datums/components/igniter.dm index 4b90742deb2..d94c4be101a 100644 --- a/code/datums/components/igniter.dm +++ b/code/datums/components/igniter.dm @@ -26,6 +26,7 @@ if(!proximity_flag) return do_igniter(target) + return COMPONENT_AFTERATTACK_PROCESSED_ITEM /datum/component/igniter/proc/hostile_attackingtarget(mob/living/simple_animal/hostile/attacker, atom/target, success) SIGNAL_HANDLER diff --git a/code/datums/components/reagent_refiller.dm b/code/datums/components/reagent_refiller.dm index 017ec3c3c37..ae223488bc0 100644 --- a/code/datums/components/reagent_refiller.dm +++ b/code/datums/components/reagent_refiller.dm @@ -44,6 +44,8 @@ /datum/component/reagent_refiller/proc/refill() SIGNAL_HANDLER + . |= COMPONENT_AFTERATTACK_PROCESSED_ITEM + var/obj/item/reagent_containers/container = parent var/refill = container.reagents.get_master_reagent_id() var/amount = min((container.amount_per_transfer_from_this + container.reagents.total_volume), container.reagents.total_volume) diff --git a/code/datums/components/summoning.dm b/code/datums/components/summoning.dm index 11dd3d68882..54eea882e8a 100644 --- a/code/datums/components/summoning.dm +++ b/code/datums/components/summoning.dm @@ -39,6 +39,7 @@ if(!proximity_flag) return do_spawn_mob(get_turf(target), user) + return COMPONENT_AFTERATTACK_PROCESSED_ITEM /datum/component/summoning/proc/hostile_attackingtarget(mob/living/simple_animal/hostile/attacker, atom/target, success) SIGNAL_HANDLER diff --git a/code/datums/elements/easily_fragmented.dm b/code/datums/elements/easily_fragmented.dm index 905bb6a516b..eb7f499c0f2 100644 --- a/code/datums/elements/easily_fragmented.dm +++ b/code/datums/elements/easily_fragmented.dm @@ -30,3 +30,5 @@ if(prob(break_chance)) user.visible_message(span_danger("[user]'s [item.name] snap[item.p_s()] into tiny pieces in [user.p_their()] hand.")) item.deconstruct(disassembled = FALSE) + + return COMPONENT_AFTERATTACK_PROCESSED_ITEM diff --git a/code/datums/elements/food/dunkable.dm b/code/datums/elements/food/dunkable.dm index 51bf6faefad..a948772ce00 100644 --- a/code/datums/elements/food/dunkable.dm +++ b/code/datums/elements/food/dunkable.dm @@ -23,14 +23,16 @@ return var/obj/item/reagent_containers/container = target // the container we're trying to dunk into if(istype(container) && container.reagent_flags & DUNKABLE) // container should be a valid target for dunking + . = COMPONENT_AFTERATTACK_PROCESSED_ITEM if(!container.is_drainable()) to_chat(user, span_warning("[container] is unable to be dunked in!")) - return + return COMPONENT_AFTERATTACK_PROCESSED_ITEM var/obj/item/I = source // the item that has the dunkable element if(container.reagents.trans_to(I, dunk_amount, transfered_by = user)) //if reagents were transfered, show the message to_chat(user, span_notice("You dunk \the [I] into \the [container].")) - return + return COMPONENT_AFTERATTACK_PROCESSED_ITEM if(!container.reagents.total_volume) to_chat(user, span_warning("[container] is empty!")) else to_chat(user, span_warning("[I] is full!")) + return COMPONENT_AFTERATTACK_PROCESSED_ITEM diff --git a/code/datums/elements/knockback.dm b/code/datums/elements/knockback.dm index e236521b1e8..59dd82b678f 100644 --- a/code/datums/elements/knockback.dm +++ b/code/datums/elements/knockback.dm @@ -36,6 +36,7 @@ if(!proximity_flag) return do_knockback(target, user, get_dir(source, target)) + return COMPONENT_AFTERATTACK_PROCESSED_ITEM /// triggered after a hostile simplemob attacks something /datum/element/knockback/proc/hostile_attackingtarget(mob/living/simple_animal/hostile/attacker, atom/target, success) diff --git a/code/datums/elements/lifesteal.dm b/code/datums/elements/lifesteal.dm index d1406121546..3727c8122cc 100644 --- a/code/datums/elements/lifesteal.dm +++ b/code/datums/elements/lifesteal.dm @@ -32,6 +32,7 @@ if(!proximity_flag) return do_lifesteal(user, target) + return COMPONENT_AFTERATTACK_PROCESSED_ITEM /datum/element/lifesteal/proc/hostile_attackingtarget(mob/living/simple_animal/hostile/attacker, atom/target, success) SIGNAL_HANDLER diff --git a/code/datums/elements/light_eater.dm b/code/datums/elements/light_eater.dm index e461e40579a..6b47e2c6356 100644 --- a/code/datums/elements/light_eater.dm +++ b/code/datums/elements/light_eater.dm @@ -123,7 +123,7 @@ if(!proximity) return NONE eat_lights(target, source) - return NONE + return COMPONENT_AFTERATTACK_PROCESSED_ITEM /** * Called when a source object is used to block a thrown object, projectile, or attack diff --git a/code/datums/elements/openspace_item_click_handler.dm b/code/datums/elements/openspace_item_click_handler.dm index 75f91fc244c..f0449892ceb 100644 --- a/code/datums/elements/openspace_item_click_handler.dm +++ b/code/datums/elements/openspace_item_click_handler.dm @@ -22,3 +22,4 @@ var/turf/turf_above = get_step_multiz(target, UP) if(turf_above?.z == user.z) INVOKE_ASYNC(source, TYPE_PROC_REF(/obj/item, handle_openspace_click), turf_above, user, user.CanReach(turf_above, source), click_parameters) + return COMPONENT_AFTERATTACK_PROCESSED_ITEM diff --git a/code/datums/elements/venomous.dm b/code/datums/elements/venomous.dm index c15ad2f6915..1ff46843e66 100644 --- a/code/datums/elements/venomous.dm +++ b/code/datums/elements/venomous.dm @@ -41,6 +41,7 @@ if(!proximity_flag) return add_reagent(target) + return COMPONENT_AFTERATTACK_PROCESSED_ITEM /datum/element/venomous/proc/hostile_attackingtarget(mob/living/simple_animal/hostile/attacker, atom/target, success) SIGNAL_HANDLER diff --git a/code/game/objects/items/RCD.dm b/code/game/objects/items/RCD.dm index 01d65c24ce8..616ed706fe7 100644 --- a/code/game/objects/items/RCD.dm +++ b/code/game/objects/items/RCD.dm @@ -856,6 +856,7 @@ GLOBAL_VAR_INIT(icon_holographic_window, init_holographic_window()) . = ..() if(range_check(A,user)) pre_attack(A, user) + return . | AFTERATTACK_PROCESSED_ITEM /obj/item/construction/rcd/arcd/afterattack_secondary(atom/target, mob/user, proximity_flag, click_parameters) if(range_check(target,user)) diff --git a/code/game/objects/items/RSF.dm b/code/game/objects/items/RSF.dm index 6e0aedb3bc2..ef2edd9f8d2 100644 --- a/code/game/objects/items/RSF.dm +++ b/code/game/objects/items/RSF.dm @@ -119,13 +119,17 @@ RSF if(cooldown > world.time) return . = ..() - if(!proximity || !is_allowed(A)) - return + if(!proximity) + return . + . |= AFTERATTACK_PROCESSED_ITEM + if (!is_allowed(A)) + return . if(use_matter(dispense_cost, user))//If we can charge that amount of charge, we do so and return true playsound(loc, 'sound/machines/click.ogg', 10, TRUE) var/atom/meme = new to_dispense(get_turf(A)) to_chat(user, span_notice("[action_type] [meme.name]...")) cooldown = world.time + cooldowndelay + return . ///A helper proc. checks to see if we can afford the amount of charge that is passed, and if we can docs the charge from our base, and returns TRUE. If we can't we return FALSE /obj/item/rsf/proc/use_matter(charge, mob/user) diff --git a/code/game/objects/items/broom.dm b/code/game/objects/items/broom.dm index eca274e41d5..355dae56093 100644 --- a/code/game/objects/items/broom.dm +++ b/code/game/objects/items/broom.dm @@ -52,6 +52,7 @@ if(!proximity) return sweep(user, A) + return . | AFTERATTACK_PROCESSED_ITEM /** * Attempts to push up to BROOM_PUSH_LIMIT atoms from a given location the user's faced direction diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm index b30f1420596..2f475be8be8 100644 --- a/code/game/objects/items/cards_ids.dm +++ b/code/game/objects/items/cards_ids.dm @@ -1341,7 +1341,7 @@ if(isidcard(target)) theft_target = WEAKREF(target) ui_interact(user) - return + return AFTERATTACK_PROCESSED_ITEM return ..() diff --git a/code/game/objects/items/cigs_lighters.dm b/code/game/objects/items/cigs_lighters.dm index 50dc1c49831..8b6dd4ea681 100644 --- a/code/game/objects/items/cigs_lighters.dm +++ b/code/game/objects/items/cigs_lighters.dm @@ -237,6 +237,8 @@ CIGARETTE PACKETS ARE IN FANCY.DM else to_chat(user, span_warning("[src] is full!")) + return AFTERATTACK_PROCESSED_ITEM + /obj/item/clothing/mask/cigarette/update_icon_state() . = ..() if(lit) diff --git a/code/game/objects/items/clown_items.dm b/code/game/objects/items/clown_items.dm index 9908aab3f71..7a3e3a71674 100644 --- a/code/game/objects/items/clown_items.dm +++ b/code/game/objects/items/clown_items.dm @@ -144,10 +144,11 @@ to_chat(user, span_warning("The soap has ran out of chemicals")) /obj/item/soap/nanotrasen/cyborg/afterattack(atom/target, mob/user, proximity) + . = isitem(target) ? AFTERATTACK_PROCESSED_ITEM : NONE if(uses <= 0) to_chat(user, span_warning("No good, you need to recharge!")) - return - return ..() + return . + return ..() | . /obj/item/soap/attackby_storage_insert(datum/storage, atom/storage_holder, mob/living/user) return !user?.combat_mode // only cleans a storage item if on combat diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index 6ff44c40846..3243f3b7a73 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -266,11 +266,8 @@ var/static/regex/crayon_regex = new /regex(@"[^\w!?,.=&%#+/\-]", "ig") return lowertext(crayon_regex.Replace(text, "")) -/obj/item/toy/crayon/afterattack(atom/target, mob/user, proximity, params) - . = ..() - if(!proximity || !check_allowed_items(target)) - return - +/// Attempts to color the target. Returns how many charges were used. +/obj/item/toy/crayon/proc/use_on(atom/target, mob/user, params) var/static/list/punctuation = list("!","?",".",",","/","+","-","=","%","#","&") var/istagger = HAS_TRAIT(user, TRAIT_TAGGER) @@ -283,13 +280,13 @@ if (istagger) cost *= 0.5 if(check_empty(user, cost)) - return + return 0 if(istype(target, /obj/effect/decal/cleanable)) target = target.loc if(!isValidSurface(target)) - return + return 0 var/drawing = drawtype switch(drawtype) @@ -361,11 +358,11 @@ if(!instant) if(!do_after(user, 50, target = target)) - return + return 0 var/charges_used = use_charges(user, cost) if(!charges_used) - return + return 0 . = charges_used if(length(text_buffer)) @@ -418,6 +415,22 @@ for(var/t in affected_turfs) reagents.trans_to(t, ., volume_multiplier, transfered_by = user, methods = TOUCH) check_empty(user) + return . + +/obj/item/toy/crayon/afterattack(atom/target, mob/user, proximity, params) + . = ..() + + if(!proximity) + return . + + if (isitem(target)) + . |= AFTERATTACK_PROCESSED_ITEM + + if (!check_allowed_items(target)) + return . + + use_on(target, user, params) + return . /obj/item/toy/crayon/attack(mob/M, mob/user) if(edible && (M == user)) @@ -665,16 +678,13 @@ . += "It is empty." . += span_notice("Alt-click [src] to [ is_capped ? "take the cap off" : "put the cap on"]. Right-click a colored object to match its existing color.") -/obj/item/toy/crayon/spraycan/afterattack(atom/target, mob/user, proximity, params) - if(!proximity) - return - +/obj/item/toy/crayon/spraycan/use_on(atom/target, mob/user, params) if(is_capped) balloon_alert(user, "take the cap off first!") - return + return 0 if(check_empty(user)) - return + return 0 if(iscarbon(target)) if(pre_noise || post_noise) @@ -697,7 +707,7 @@ var/fraction = min(1, . / reagents.maximum_volume) reagents.expose(C, VAPOR, fraction * volume_multiplier) - return + return . if(ismob(target) && (HAS_TRAIT(target, TRAIT_SPRAY_PAINTABLE))) if(actually_paints) @@ -735,9 +745,9 @@ if(pre_noise || post_noise) playsound(user.loc, 'sound/effects/spray.ogg', 5, TRUE, 5) user.visible_message(span_notice("[user] coats [target] with spray paint!"), span_notice("You coat [target] with spray paint.")) - return + return 0 - . = ..() + return ..() /obj/item/toy/crayon/spraycan/afterattack_secondary(atom/target, mob/user, proximity, params) if(!proximity) @@ -793,16 +803,25 @@ charges = -1 /obj/item/toy/crayon/spraycan/borg/afterattack(atom/target,mob/user,proximity, params) - var/diff = ..() + if (!proximity) + return + + if (isitem(target)) + . = AFTERATTACK_PROCESSED_ITEM + + if (!check_allowed_items(target)) + return . + + var/diff = use_on(target, user, params) if(!iscyborg(user)) to_chat(user, span_notice("How did you get this?")) qdel(src) - return FALSE + return . var/mob/living/silicon/robot/borgy = user if(!diff) - return + return . // 25 is our cost per unit of paint, making it cost 25 energy per // normal tag, 50 per window, and 250 per attack var/cost = diff * 25 @@ -811,6 +830,8 @@ if(borgy.cell) borgy.cell.use(cost) + return . + /obj/item/toy/crayon/spraycan/hellcan name = "hellcan" desc = "This spraycan doesn't seem to be filled with paint..." diff --git a/code/game/objects/items/devices/chameleonproj.dm b/code/game/objects/items/devices/chameleonproj.dm index 111f8cffed4..534871bdda6 100644 --- a/code/game/objects/items/devices/chameleonproj.dm +++ b/code/game/objects/items/devices/chameleonproj.dm @@ -40,6 +40,7 @@ . = ..() if(!proximity) return + . |= AFTERATTACK_PROCESSED_ITEM if(!check_sprite(target)) return if(active_dummy)//I now present you the blackli(f)st diff --git a/code/game/objects/items/devices/electroadaptive_pseudocircuit.dm b/code/game/objects/items/devices/electroadaptive_pseudocircuit.dm index 94d1d783c9b..6d6c82cdefd 100644 --- a/code/game/objects/items/devices/electroadaptive_pseudocircuit.dm +++ b/code/game/objects/items/devices/electroadaptive_pseudocircuit.dm @@ -54,6 +54,7 @@ . = ..() if(!proximity) return + . |= AFTERATTACK_PROCESSED_ITEM if(!is_type_in_typecache(target, recycleable_circuits)) return circuits++ diff --git a/code/game/objects/items/devices/forcefieldprojector.dm b/code/game/objects/items/devices/forcefieldprojector.dm index 360ec985598..f6a3a0f4e0d 100644 --- a/code/game/objects/items/devices/forcefieldprojector.dm +++ b/code/game/objects/items/devices/forcefieldprojector.dm @@ -25,6 +25,7 @@ . = ..() if(!check_allowed_items(target, not_inside = TRUE)) return + . |= AFTERATTACK_PROCESSED_ITEM if(istype(target, /obj/structure/projected_forcefield)) var/obj/structure/projected_forcefield/F = target if(F.generator == src) diff --git a/code/game/objects/items/devices/geiger_counter.dm b/code/game/objects/items/devices/geiger_counter.dm index 001e349c281..e75a9f5a6c2 100644 --- a/code/game/objects/items/devices/geiger_counter.dm +++ b/code/game/objects/items/devices/geiger_counter.dm @@ -69,6 +69,7 @@ /obj/item/geiger_counter/afterattack(atom/target, mob/living/user, params) . = ..() + . |= AFTERATTACK_PROCESSED_ITEM if (user.combat_mode) return diff --git a/code/game/objects/items/devices/laserpointer.dm b/code/game/objects/items/devices/laserpointer.dm index 9fc02d912b2..cc8f9ee2b4e 100644 --- a/code/game/objects/items/devices/laserpointer.dm +++ b/code/game/objects/items/devices/laserpointer.dm @@ -71,6 +71,7 @@ /obj/item/laser_pointer/afterattack(atom/target, mob/living/user, flag, params) . = ..() + . |= AFTERATTACK_PROCESSED_ITEM laser_act(target, user, params) /obj/item/laser_pointer/proc/laser_act(atom/target, mob/living/user, params) diff --git a/code/game/objects/items/devices/scanners/gas_analyzer.dm b/code/game/objects/items/devices/scanners/gas_analyzer.dm index 0e55a8f7087..00382aa9089 100644 --- a/code/game/objects/items/devices/scanners/gas_analyzer.dm +++ b/code/game/objects/items/devices/scanners/gas_analyzer.dm @@ -213,4 +213,5 @@ . = ..() if(!can_see(user, target, 15)) return + . |= AFTERATTACK_PROCESSED_ITEM atmos_scan(user, (target.return_analyzable_air() ? target : get_turf(target))) diff --git a/code/game/objects/items/dna_probe.dm b/code/game/objects/items/dna_probe.dm index e150e6128ca..f6239d54701 100644 --- a/code/game/objects/items/dna_probe.dm +++ b/code/game/objects/items/dna_probe.dm @@ -31,18 +31,21 @@ /obj/item/dna_probe/afterattack(atom/target, mob/user, proximity_flag, click_parameters) . = ..() if(!proximity_flag || !target) - return + return . + + if (isitem(target)) + . |= AFTERATTACK_PROCESSED_ITEM if((allowed_scans & DNA_PROBE_SCAN_PLANTS) && istype(target, /obj/machinery/hydroponics)) var/obj/machinery/hydroponics/hydro_tray = target if(!hydro_tray.myseed) - return + return . if(stored_dna_plants[hydro_tray.myseed.type]) to_chat(user, span_notice("Plant data already present in local storage.")) - return + return . if(hydro_tray.plant_status != HYDROTRAY_PLANT_HARVESTABLE) // So it's bit harder. to_chat(user, span_alert("Plant needs to be ready to harvest to perform full data scan.")) //Because space dna is actually magic - return + return . stored_dna_plants[hydro_tray.myseed.type] = TRUE to_chat(user, span_notice("Plant data added to local storage.")) @@ -54,10 +57,10 @@ var/mob/living/living_target = target if(stored_dna_animal[living_target.type]) to_chat(user, span_alert("Animal data already present in local storage.")) - return + return . if(!(living_target.mob_biotypes & MOB_ORGANIC)) to_chat(user, span_alert("No compatible DNA detected.")) - return + return . stored_dna_animal[living_target.type] = TRUE to_chat(user, span_notice("Animal data added to local storage.")) @@ -65,10 +68,10 @@ var/mob/living/carbon/human/human_target = target if(stored_dna_human[human_target.dna.unique_identity]) to_chat(user, span_notice("Humanoid data already present in local storage.")) - return + return . if(!(human_target.mob_biotypes & MOB_ORGANIC)) to_chat(user, span_alert("No compatible DNA detected.")) - return + return . stored_dna_human[human_target.dna.unique_identity] = TRUE to_chat(user, span_notice("Humanoid data added to local storage.")) diff --git a/code/game/objects/items/emags.dm b/code/game/objects/items/emags.dm index 49bbc14f8d6..a3d0176ca68 100644 --- a/code/game/objects/items/emags.dm +++ b/code/game/objects/items/emags.dm @@ -51,8 +51,11 @@ user.visible_message(span_notice("[user] shows you: [icon2html(src, viewers(user))] [name]."), span_notice("You show [src].")) add_fingerprint(user) -/obj/item/card/emagfake/afterattack() +/obj/item/card/emagfake/afterattack(atom/target, mob/user, proximity_flag, click_parameters) . = ..() + if (!proximity_flag) + return + . |= AFTERATTACK_PROCESSED_ITEM playsound(src, 'sound/items/bikehorn.ogg', 50, TRUE) /obj/item/card/emag/Initialize(mapload) @@ -67,6 +70,7 @@ var/atom/A = target if(!proximity && prox_check) return + . |= AFTERATTACK_PROCESSED_ITEM if(!can_emag(target, user)) return log_combat(user, A, "attempted to emag") diff --git a/code/game/objects/items/extinguisher.dm b/code/game/objects/items/extinguisher.dm index 34ae1e0c299..9ace19c8e57 100644 --- a/code/game/objects/items/extinguisher.dm +++ b/code/game/objects/items/extinguisher.dm @@ -178,20 +178,21 @@ // Make it so the extinguisher doesn't spray yourself when you click your inventory items if (target.loc == user) return - //TODO; Add support for reagents in water. + + . |= AFTERATTACK_PROCESSED_ITEM if(refilling) refilling = FALSE - return + return . if (!safety) if (src.reagents.total_volume < 1) balloon_alert(user, "it's empty!") - return + return . if (world.time < src.last_use + 12) - return + return . src.last_use = world.time @@ -232,6 +233,8 @@ //Make em move dat ass, hun move_particles(water_particles) + return . + //Particle movement loop /obj/item/extinguisher/proc/move_particles(list/particles) var/delay = 2 diff --git a/code/game/objects/items/flamethrower.dm b/code/game/objects/items/flamethrower.dm index d8862ef74b7..e87042d3552 100644 --- a/code/game/objects/items/flamethrower.dm +++ b/code/game/objects/items/flamethrower.dm @@ -72,6 +72,7 @@ /obj/item/flamethrower/afterattack(atom/target, mob/user, flag) . = ..() + . |= AFTERATTACK_PROCESSED_ITEM if(flag) return // too close if(ishuman(user)) diff --git a/code/game/objects/items/grenades/_grenade.dm b/code/game/objects/items/grenades/_grenade.dm index 5a2d0676372..522c22439df 100644 --- a/code/game/objects/items/grenades/_grenade.dm +++ b/code/game/objects/items/grenades/_grenade.dm @@ -249,3 +249,4 @@ . = ..() if(active) user.throw_item(target) + return . | AFTERATTACK_PROCESSED_ITEM diff --git a/code/game/objects/items/grenades/plastic.dm b/code/game/objects/items/grenades/plastic.dm index f7509ec6012..98224529a4d 100644 --- a/code/game/objects/items/grenades/plastic.dm +++ b/code/game/objects/items/grenades/plastic.dm @@ -89,15 +89,18 @@ return if(!flag) return + + . |= AFTERATTACK_PROCESSED_ITEM + if(bomb_target != user && HAS_TRAIT(user, TRAIT_PACIFISM) && isliving(bomb_target)) to_chat(user, span_warning("You don't want to harm other living beings!")) - return + return . to_chat(user, span_notice("You start planting [src]. The timer is set to [det_time]...")) if(do_after(user, 30, target = bomb_target)) if(!user.temporarilyRemoveItemFromInventory(src)) - return + return . target = bomb_target active = TRUE @@ -121,6 +124,8 @@ to_chat(user, span_notice("You plant the bomb. Timer counting down from [det_time].")) addtimer(CALLBACK(src, PROC_REF(detonate)), det_time*10) + return . + /obj/item/grenade/c4/proc/shout_syndicate_crap(mob/player) if(!player) CRASH("[src] proc shout_syndicate_crap called without a mob to shout crap from!") diff --git a/code/game/objects/items/hand_items.dm b/code/game/objects/items/hand_items.dm index ef2c256b9f0..c02aaf6ba1b 100644 --- a/code/game/objects/items/hand_items.dm +++ b/code/game/objects/items/hand_items.dm @@ -474,6 +474,7 @@ /obj/item/hand_item/kisser/afterattack(atom/target, mob/user, proximity_flag, click_parameters) . = ..() + . |= AFTERATTACK_PROCESSED_ITEM if(HAS_TRAIT(user, TRAIT_GARLIC_BREATH)) kiss_type = /obj/projectile/kiss/french diff --git a/code/game/objects/items/holosign_creator.dm b/code/game/objects/items/holosign_creator.dm index 243de818ad4..56a3f8bbad3 100644 --- a/code/game/objects/items/holosign_creator.dm +++ b/code/game/objects/items/holosign_creator.dm @@ -36,33 +36,35 @@ . = ..() if(!proximity_flag) return + . |= AFTERATTACK_PROCESSED_ITEM if(!check_allowed_items(target, not_inside = TRUE)) - return + return . var/turf/target_turf = get_turf(target) var/obj/structure/holosign/target_holosign = locate(holosign_type) in target_turf if(target_holosign) qdel(target_holosign) - return + return . if(target_turf.is_blocked_turf(TRUE)) //can't put holograms on a tile that has dense stuff - return + return . if(holocreator_busy) to_chat(user, span_notice("[src] is busy creating a hologram.")) - return + return . if(LAZYLEN(signs) >= max_signs) balloon_alert(user, "max capacity!") - return + return . playsound(loc, 'sound/machines/click.ogg', 20, TRUE) if(creation_time) holocreator_busy = TRUE if(!do_after(user, creation_time, target = target)) holocreator_busy = FALSE - return + return . holocreator_busy = FALSE if(LAZYLEN(signs) >= max_signs) - return + return . if(target_turf.is_blocked_turf(TRUE)) //don't try to sneak dense stuff on our tile during the wait. - return + return . target_holosign = new holosign_type(get_turf(target), src) + return . /obj/item/holosign_creator/attack(mob/living/carbon/human/M, mob/user) return diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm index 867c137c3b2..cb5b3b9d1e4 100644 --- a/code/game/objects/items/melee/misc.dm +++ b/code/game/objects/items/melee/misc.dm @@ -224,6 +224,7 @@ user.dropItemToGround(src) if(proximity_flag) consume_everything(target) + return . | AFTERATTACK_PROCESSED_ITEM /obj/item/melee/supermatter_sword/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) ..() diff --git a/code/game/objects/items/paint.dm b/code/game/objects/items/paint.dm index c8fe4db5bfe..5675bbd3a03 100644 --- a/code/game/objects/items/paint.dm +++ b/code/game/objects/items/paint.dm @@ -129,5 +129,6 @@ return if(!isturf(target) || !isobj(target)) return + . |= AFTERATTACK_PROCESSED_ITEM if(target.color != initial(target.color)) target.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) diff --git a/code/game/objects/items/pneumaticCannon.dm b/code/game/objects/items/pneumaticCannon.dm index 763a3931731..43c1cb6d355 100644 --- a/code/game/objects/items/pneumaticCannon.dm +++ b/code/game/objects/items/pneumaticCannon.dm @@ -161,6 +161,7 @@ if(!istype(user)) return Fire(user, target) + return AFTERATTACK_PROCESSED_ITEM /obj/item/pneumatic_cannon/proc/Fire(mob/living/user, atom/target) if(!istype(user) && !target) diff --git a/code/game/objects/items/religion.dm b/code/game/objects/items/religion.dm index 9b143fa5728..70c8264f778 100644 --- a/code/game/objects/items/religion.dm +++ b/code/game/objects/items/religion.dm @@ -341,6 +341,7 @@ . = ..() if(staffcooldown + staffwait > world.time) return + . |= AFTERATTACK_PROCESSED_ITEM user.visible_message(span_notice("[user] chants deeply and waves [user.p_their()] staff!")) if(do_after(user, 2 SECONDS, src)) target.add_atom_colour(conversion_color, WASHABLE_COLOUR_PRIORITY) //wololo diff --git a/code/game/objects/items/robot/items/food.dm b/code/game/objects/items/robot/items/food.dm index be834fa0f73..6e11b403715 100644 --- a/code/game/objects/items/robot/items/food.dm +++ b/code/game/objects/items/robot/items/food.dm @@ -123,17 +123,17 @@ var/mob/living/silicon/robot/robot_user = user if(!robot_user.cell.use(12)) to_chat(user, span_warning("Not enough power.")) - return FALSE + return AFTERATTACK_PROCESSED_ITEM switch(mode) if(DISPENSE_LOLLIPOP_MODE, DISPENSE_ICECREAM_MODE) if(!proximity) - return FALSE + return AFTERATTACK_PROCESSED_ITEM dispense(target, user) if(THROW_LOLLIPOP_MODE) shootL(target, user, click_params) if(THROW_GUMBALL_MODE) shootG(target, user, click_params) - return ..() + return ..() | AFTERATTACK_PROCESSED_ITEM /obj/item/borg/lollipop/attack_self(mob/living/user) switch(mode) diff --git a/code/game/objects/items/robot/items/generic.dm b/code/game/objects/items/robot/items/generic.dm index 0d102c044c6..a1644958b18 100644 --- a/code/game/objects/items/robot/items/generic.dm +++ b/code/game/objects/items/robot/items/generic.dm @@ -190,6 +190,7 @@ . = ..() if(!proximity_flag || !iscyborg(user)) return + . |= AFTERATTACK_PROCESSED_ITEM if(mode == "draw") if(is_type_in_list(target, charge_machines)) var/obj/machinery/target_machine = target diff --git a/code/game/objects/items/robot/items/hypo.dm b/code/game/objects/items/robot/items/hypo.dm index d8c13ec0677..0e4d008e5b2 100644 --- a/code/game/objects/items/robot/items/hypo.dm +++ b/code/game/objects/items/robot/items/hypo.dm @@ -348,17 +348,18 @@ /obj/item/reagent_containers/borghypo/borgshaker/afterattack(obj/target, mob/user, proximity) . = ..() if(!proximity) - return + return . if(!selected_reagent) balloon_alert(user, "no reagent selected!") - return + return . + . |= AFTERATTACK_PROCESSED_ITEM if(target.is_refillable()) if(!stored_reagents.has_reagent(selected_reagent.type, amount_per_transfer_from_this)) balloon_alert(user, "not enough [selected_reagent.name]!") - return + return . if(target.reagents.total_volume >= target.reagents.maximum_volume) balloon_alert(user, "[target] is full!") - return + return . // This is the in-between where we're storing the reagent we're going to pour into the container // because we cannot specify a singular reagent to transfer in trans_to @@ -368,6 +369,7 @@ shaker.trans_to(target, amount_per_transfer_from_this, transfered_by = user) balloon_alert(user, "[amount_per_transfer_from_this] unit\s poured") + return . /obj/item/reagent_containers/borghypo/borgshaker/hacked name = "cyborg shaker" diff --git a/code/game/objects/items/singularityhammer.dm b/code/game/objects/items/singularityhammer.dm index a4830f6f65c..6d03ad595d6 100644 --- a/code/game/objects/items/singularityhammer.dm +++ b/code/game/objects/items/singularityhammer.dm @@ -62,6 +62,7 @@ . = ..() if(!proximity) return + . |= AFTERATTACK_PROCESSED_ITEM if(HAS_TRAIT(src, TRAIT_WIELDED)) if(charged) charged = FALSE @@ -72,6 +73,7 @@ var/turf/target = get_turf(A) vortex(target,user) addtimer(CALLBACK(src, PROC_REF(recharge)), 100) + return . /obj/item/mjollnir name = "Mjolnir" diff --git a/code/game/objects/items/spear.dm b/code/game/objects/items/spear.dm index 45c827caaab..2ee4a36fe5c 100644 --- a/code/game/objects/items/spear.dm +++ b/code/game/objects/items/spear.dm @@ -155,14 +155,15 @@ . = ..() if(!proximity || !HAS_TRAIT(src, TRAIT_WIELDED) || !istype(AM)) return + . |= AFTERATTACK_PROCESSED_ITEM if(AM.resistance_flags & INDESTRUCTIBLE) //due to the lich incident of 2021, embedding grenades inside of indestructible structures is forbidden - return + return . if(ismob(AM)) var/mob/mob_target = AM if(mob_target.status_flags & GODMODE) //no embedding grenade phylacteries inside of ghost poly either - return + return . if(iseffect(AM)) //and no accidentally wasting your moment of glory on graffiti - return + return . user.say("[war_cry]", forced="spear warcry") if(isliving(user)) var/mob/living/living_user = user @@ -173,6 +174,7 @@ if(!QDELETED(living_user)) living_user.set_resting(new_resting = FALSE, silent = TRUE, instant = TRUE) qdel(src) + return . //GREY TIDE /obj/item/spear/grey_tide diff --git a/code/game/objects/items/stacks/tape.dm b/code/game/objects/items/stacks/tape.dm index f9e5cf8f870..08dbc768070 100644 --- a/code/game/objects/items/stacks/tape.dm +++ b/code/game/objects/items/stacks/tape.dm @@ -46,9 +46,11 @@ if(!istype(target)) return + . |= AFTERATTACK_PROCESSED_ITEM + if(target.embedding && target.embedding == conferred_embed) to_chat(user, span_warning("[target] is already coated in [src]!")) - return + return . user.visible_message(span_notice("[user] begins wrapping [target] with [src]."), span_notice("You begin wrapping [target] with [src].")) playsound(user, 'sound/items/duct_tape_rip.ogg', 50, TRUE) @@ -61,11 +63,11 @@ to_chat(user, span_notice("You turn [target] into [O] with [src].")) QDEL_NULL(target) user.put_in_hands(O) - return + return . if(target.embedding && target.embedding == conferred_embed) to_chat(user, span_warning("[target] is already coated in [src]!")) - return + return . target.embedding = conferred_embed target.updateEmbedding() @@ -76,6 +78,8 @@ var/obj/item/grenade/sticky_bomb = target sticky_bomb.sticky = TRUE + return . + /obj/item/stack/sticky_tape/super name = "super sticky tape" singular_name = "super sticky tape" diff --git a/code/game/objects/items/stacks/wrap.dm b/code/game/objects/items/stacks/wrap.dm index 9a420c46f76..f74e546d7fb 100644 --- a/code/game/objects/items/stacks/wrap.dm +++ b/code/game/objects/items/stacks/wrap.dm @@ -111,6 +111,7 @@ return if(isitem(target)) + . |= AFTERATTACK_PROCESSED_ITEM var/obj/item/item = target if(!item.can_be_package_wrapped()) balloon_alert(user, "can't be wrapped!") diff --git a/code/game/objects/items/storage/book.dm b/code/game/objects/items/storage/book.dm index 172fdc9e85d..a8e19107075 100644 --- a/code/game/objects/items/storage/book.dm +++ b/code/game/objects/items/storage/book.dm @@ -191,7 +191,7 @@ GLOBAL_LIST_INIT(bibleitemstates, list("bible", "koran", "scrapbook", "burning", if(!proximity) return if(SEND_SIGNAL(bible_smacked, COMSIG_BIBLE_SMACKED, user, proximity) & COMSIG_END_BIBLE_CHAIN) - return + return . | AFTERATTACK_PROCESSED_ITEM if(isfloorturf(bible_smacked)) if(user.mind && (user.mind.holy_role)) var/area/current_area = get_area(bible_smacked) @@ -204,16 +204,19 @@ GLOBAL_LIST_INIT(bibleitemstates, list("bible", "koran", "scrapbook", "burning", if(user?.mind?.holy_role) if(bible_smacked.reagents && bible_smacked.reagents.has_reagent(/datum/reagent/water)) // blesses all the water in the holder + . |= AFTERATTACK_PROCESSED_ITEM bible_smacked.balloon_alert(user, "blessed") var/water2holy = bible_smacked.reagents.get_reagent_amount(/datum/reagent/water) bible_smacked.reagents.del_reagent(/datum/reagent/water) bible_smacked.reagents.add_reagent(/datum/reagent/water/holywater,water2holy) if(bible_smacked.reagents && bible_smacked.reagents.has_reagent(/datum/reagent/fuel/unholywater)) // yeah yeah, copy pasted code - sue me + . |= AFTERATTACK_PROCESSED_ITEM bible_smacked.balloon_alert(user, "purified") var/unholy2clean = bible_smacked.reagents.get_reagent_amount(/datum/reagent/fuel/unholywater) bible_smacked.reagents.del_reagent(/datum/reagent/fuel/unholywater) bible_smacked.reagents.add_reagent(/datum/reagent/water/holywater,unholy2clean) if(istype(bible_smacked, /obj/item/storage/book/bible) && !istype(bible_smacked, /obj/item/storage/book/bible/syndicate)) + . |= AFTERATTACK_PROCESSED_ITEM bible_smacked.balloon_alert(user, "converted") var/obj/item/storage/book/bible/B = bible_smacked B.name = name @@ -221,6 +224,7 @@ GLOBAL_LIST_INIT(bibleitemstates, list("bible", "koran", "scrapbook", "burning", B.inhand_icon_state = inhand_icon_state if(istype(bible_smacked, /obj/item/cult_bastard) && !IS_CULTIST(user)) + . |= AFTERATTACK_PROCESSED_ITEM var/obj/item/cult_bastard/sword = bible_smacked bible_smacked.balloon_alert(user, "exorcising...") playsound(src,'sound/hallucinations/veryfar_noise.ogg',40,TRUE) diff --git a/code/game/objects/items/tanks/watertank.dm b/code/game/objects/items/tanks/watertank.dm index 2c3fa8e905c..98c519fe6df 100644 --- a/code/game/objects/items/tanks/watertank.dm +++ b/code/game/objects/items/tanks/watertank.dm @@ -143,7 +143,7 @@ /obj/item/reagent_containers/spray/mister/afterattack(obj/target, mob/user, proximity) if(target.loc == loc) //Safety check so you don't fill your mister with mutagen or something and then blast yourself in the face with it return - ..() + return ..() //Janitor tank /obj/item/watertank/janitor @@ -299,8 +299,7 @@ if(AttemptRefill(target, user)) return if(nozzle_mode == EXTINGUISHER) - ..() - return + return ..() var/Adj = user.Adjacent(target) if(nozzle_mode == RESIN_LAUNCHER) if(Adj) diff --git a/code/game/objects/items/taster.dm b/code/game/objects/items/taster.dm index d1d1a27fa4b..eaa65967f97 100644 --- a/code/game/objects/items/taster.dm +++ b/code/game/objects/items/taster.dm @@ -13,6 +13,8 @@ if(!proximity) return + . |= AFTERATTACK_PROCESSED_ITEM + if(!O.reagents) to_chat(user, span_notice("[src] cannot taste [O], since [O.p_they()] [O.p_have()] have no reagents.")) else if(O.reagents.total_volume == 0) diff --git a/code/game/objects/items/theft_tools.dm b/code/game/objects/items/theft_tools.dm index d6d95263bfc..a6bc209966a 100644 --- a/code/game/objects/items/theft_tools.dm +++ b/code/game/objects/items/theft_tools.dm @@ -300,8 +300,12 @@ . = ..() if(!sliver) return - if(proximity && ismovable(O) && O != sliver) + if (!proximity) + return + . |= AFTERATTACK_PROCESSED_ITEM + if(ismovable(O) && O != sliver) Consume(O, user) + return . /obj/item/hemostat/supermatter/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) // no instakill supermatter javelins if(sliver) diff --git a/code/game/objects/items/tools/weldingtool.dm b/code/game/objects/items/tools/weldingtool.dm index 7a9850b48b4..2e38e348bbc 100644 --- a/code/game/objects/items/tools/weldingtool.dm +++ b/code/game/objects/items/tools/weldingtool.dm @@ -156,18 +156,23 @@ if(!proximity) return - if(isOn() && !QDELETED(attacked_atom) && isliving(attacked_atom)) // can't ignite something that doesn't exist - handle_fuel_and_temps(1, user) - var/mob/living/attacked_mob = attacked_atom - if(attacked_mob.ignite_mob()) - message_admins("[ADMIN_LOOKUPFLW(user)] set [key_name_admin(attacked_mob)] on fire with [src] at [AREACOORD(user)]") - user.log_message("set [key_name(attacked_mob)] on fire with [src].", LOG_ATTACK) + if(isOn()) + . |= AFTERATTACK_PROCESSED_ITEM + if (!QDELETED(attacked_atom) && isliving(attacked_atom)) // can't ignite something that doesn't exist + handle_fuel_and_temps(1, user) + var/mob/living/attacked_mob = attacked_atom + if(attacked_mob.ignite_mob()) + message_admins("[ADMIN_LOOKUPFLW(user)] set [key_name_admin(attacked_mob)] on fire with [src] at [AREACOORD(user)]") + user.log_message("set [key_name(attacked_mob)] on fire with [src].", LOG_ATTACK) if(!status && attacked_atom.is_refillable()) + . |= AFTERATTACK_PROCESSED_ITEM reagents.trans_to(attacked_atom, reagents.total_volume, transfered_by = user) to_chat(user, span_notice("You empty [src]'s fuel tank into [attacked_atom].")) update_appearance() + return . + /obj/item/weldingtool/attack_qdeleted(atom/attacked_atom, mob/user, proximity) . = ..() if(!proximity) diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index b21a0339110..a5bb0dc72fd 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -872,6 +872,7 @@ /obj/item/toy/snowball/afterattack(atom/target as mob|obj|turf|area, mob/user) . = ..() + . |= AFTERATTACK_PROCESSED_ITEM if(user.dropItemToGround(src)) throw_at(target, throw_range, throw_speed) diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm index e7b8868b428..654c1604ef6 100644 --- a/code/game/objects/items/weaponry.dm +++ b/code/game/objects/items/weaponry.dm @@ -1033,6 +1033,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 if(!proximity_flag || !(isclosedturf(target) || isitem(target) || ismachinery(target) || isstructure(target) || isvehicle(target))) return slash(target, user, params) + return AFTERATTACK_PROCESSED_ITEM /// triggered on wield of two handed item /obj/item/highfrequencyblade/proc/on_wield(obj/item/source, mob/user) diff --git a/code/game/objects/structures/deployable_turret.dm b/code/game/objects/structures/deployable_turret.dm index 2a6e57b1da6..28594582f88 100644 --- a/code/game/objects/structures/deployable_turret.dm +++ b/code/game/objects/structures/deployable_turret.dm @@ -270,6 +270,7 @@ /obj/item/gun_control/afterattack(atom/targeted_atom, mob/user, flag, params) . = ..() + . |= AFTERATTACK_PROCESSED_ITEM var/modifiers = params2list(params) var/obj/machinery/deployable_turret/E = user.buckled E.calculated_projectile_vars = calculate_projectile_angle_and_pixel_offsets(user, targeted_atom, modifiers) diff --git a/code/modules/antagonists/abductor/equipment/abduction_gear.dm b/code/modules/antagonists/abductor/equipment/abduction_gear.dm index 6ae261f8d4f..49e3e0fda52 100644 --- a/code/modules/antagonists/abductor/equipment/abduction_gear.dm +++ b/code/modules/antagonists/abductor/equipment/abduction_gear.dm @@ -217,10 +217,10 @@ if(flag) return if(!ScientistCheck(user)) - return + return . if(!console) to_chat(user, span_warning("The device is not linked to console!")) - return + return . switch(mode) if(GIZMO_SCAN) @@ -228,6 +228,8 @@ if(GIZMO_MARK) mark(target, user) + return . + /obj/item/abductor/gizmo/proc/scan(atom/target, mob/living/user) if(ishuman(target)) console.AddSnapshot(target) @@ -275,9 +277,11 @@ . = ..() if(flag) return + . |= AFTERATTACK_PROCESSED_ITEM if(!AbductorCheck(user)) - return + return . radio_off(target, user) + return . /obj/item/abductor/silencer/proc/radio_off(atom/target, mob/living/user) if( !(user in (viewers(7,target))) ) @@ -322,6 +326,7 @@ /obj/item/abductor/mind_device/afterattack(atom/target, mob/living/user, flag, params) . = ..() + . |= AFTERATTACK_PROCESSED_ITEM if(!ScientistCheck(user)) return diff --git a/code/modules/antagonists/cult/blood_magic.dm b/code/modules/antagonists/cult/blood_magic.dm index 5e75b277bbc..45237b46d65 100644 --- a/code/modules/antagonists/cult/blood_magic.dm +++ b/code/modules/antagonists/cult/blood_magic.dm @@ -553,6 +553,7 @@ if(channeling) to_chat(user, span_cultitalic("You are already invoking twisted construction!")) return + . |= AFTERATTACK_PROCESSED_ITEM var/turf/T = get_turf(target) if(istype(target, /obj/item/stack/sheet/iron)) var/obj/item/stack/sheet/candidate = target @@ -631,7 +632,7 @@ else to_chat(user, span_warning("The spell will not work on [target]!")) return - ..() + return . | ..() /obj/item/melee/blood_magic/construction/proc/check_menu(mob/user) if(!istype(user)) diff --git a/code/modules/antagonists/cult/cult_items.dm b/code/modules/antagonists/cult/cult_items.dm index 3d7be538033..1ec684102ed 100644 --- a/code/modules/antagonists/cult/cult_items.dm +++ b/code/modules/antagonists/cult/cult_items.dm @@ -622,6 +622,8 @@ Striking a noncultist, however, will tear their flesh."} to_chat(user, span_warning("\The [src] can only transport items!")) return + . |= AFTERATTACK_PROCESSED_ITEM + var/list/cultists = list() for(var/datum/mind/M as anything in get_antag_minds(/datum/antagonist/cult)) if(M.current && M.current.stat != DEAD) @@ -855,7 +857,7 @@ Striking a noncultist, however, will tear their flesh."} angle = get_angle(user, A) else qdel(src) - return + return . | AFTERATTACK_PROCESSED_ITEM charging = TRUE INVOKE_ASYNC(src, PROC_REF(charge), user) if(do_after(user, 9 SECONDS, target = user)) diff --git a/code/modules/antagonists/traitor/objectives/bug_room.dm b/code/modules/antagonists/traitor/objectives/bug_room.dm index 62aaaac15af..8b301003d6e 100644 --- a/code/modules/antagonists/traitor/objectives/bug_room.dm +++ b/code/modules/antagonists/traitor/objectives/bug_room.dm @@ -154,6 +154,7 @@ return if(!user.Adjacent(target)) return + . |= AFTERATTACK_PROCESSED_ITEM var/result = SEND_SIGNAL(src, COMSIG_TRAITOR_BUG_PRE_PLANTED_OBJECT, target) if(!(result & COMPONENT_FORCE_PLACEMENT)) if(result & COMPONENT_FORCE_FAIL_PLACEMENT || !istype(target, target_object_type)) diff --git a/code/modules/antagonists/traitor/objectives/demoralise_graffiti.dm b/code/modules/antagonists/traitor/objectives/demoralise_graffiti.dm index e4cc3752397..8076cf04cab 100644 --- a/code/modules/antagonists/traitor/objectives/demoralise_graffiti.dm +++ b/code/modules/antagonists/traitor/objectives/demoralise_graffiti.dm @@ -112,6 +112,8 @@ user.balloon_alert(user, "already busy!") return COMPONENT_CANCEL_ATTACK_CHAIN + . |= AFTERATTACK_PROCESSED_ITEM + if (!proximity || !check_allowed_items(target) || !isliving(user)) return diff --git a/code/modules/art/statues.dm b/code/modules/art/statues.dm index a7d79b28712..426978b1422 100644 --- a/code/modules/art/statues.dm +++ b/code/modules/art/statues.dm @@ -330,9 +330,14 @@ Moving interrupts // We aim at something distant. /obj/item/chisel/afterattack(atom/target, mob/user, proximity_flag, click_parameters) . = ..() - if(!proximity_flag && !sculpting && prepared_block && ismovable(target) && prepared_block.completion == 0) + if(!proximity_flag) + return . + + if (!sculpting && prepared_block && ismovable(target) && prepared_block.completion == 0) prepared_block.set_target(target,user) + return . | AFTERATTACK_PROCESSED_ITEM + /obj/item/chisel/proc/start_sculpting(mob/living/user) to_chat(user,span_notice("You start sculpting [prepared_block]."),type=MESSAGE_TYPE_INFO) sculpting = TRUE diff --git a/code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer_items.dm b/code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer_items.dm index 0551551dd03..d1ac81975c5 100644 --- a/code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer_items.dm +++ b/code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer_items.dm @@ -9,6 +9,7 @@ . = ..() if(!proximity) return + . |= AFTERATTACK_PROCESSED_ITEM var/obj/machinery/portable_atmospherics/atmos_device = target_object if(istype(atmos_device)) if(atmos_device.nob_crystal_inserted) diff --git a/code/modules/cargo/universal_scanner.dm b/code/modules/cargo/universal_scanner.dm index 9d948ea6c12..7321c743b93 100644 --- a/code/modules/cargo/universal_scanner.dm +++ b/code/modules/cargo/universal_scanner.dm @@ -61,11 +61,13 @@ . = ..() if(!istype(object) || !proximity) return + . |= AFTERATTACK_PROCESSED_ITEM if(scanning_mode == SCAN_EXPORTS) export_scan(object, user) - return + return . if(scanning_mode == SCAN_PRICE_TAG) price_tag(target = object, user = user) + return . /obj/item/universal_scanner/attackby(obj/item/attacking_item, mob/user, params) . = ..() diff --git a/code/modules/clothing/neck/_neck.dm b/code/modules/clothing/neck/_neck.dm index d65653ad6e8..58991cc8ace 100644 --- a/code/modules/clothing/neck/_neck.dm +++ b/code/modules/clothing/neck/_neck.dm @@ -348,6 +348,7 @@ . = ..() if(!proximity) return + . |= AFTERATTACK_PROCESSED_ITEM var/datum/export_report/ex = export_item_and_contents(I, delete_unsold = selling, dry_run = !selling) var/price = 0 for(var/x in ex.total_amount) @@ -361,6 +362,8 @@ else to_chat(user, span_warning("There is no export value for [I] or any items within it.")) + return . + /obj/item/clothing/neck/beads name = "plastic bead necklace" desc = "A cheap, plastic bead necklace. Show team spirit! Collect them! Throw them away! The posibilites are endless!" diff --git a/code/modules/detectivework/evidence.dm b/code/modules/detectivework/evidence.dm index c5c13a4a332..8c19c306bdb 100644 --- a/code/modules/detectivework/evidence.dm +++ b/code/modules/detectivework/evidence.dm @@ -13,6 +13,7 @@ if(!proximity || loc == I) return evidencebagEquip(I, user) + return . | AFTERATTACK_PROCESSED_ITEM /obj/item/evidencebag/attackby(obj/item/I, mob/user, params) if(evidencebagEquip(I, user)) diff --git a/code/modules/detectivework/scanner.dm b/code/modules/detectivework/scanner.dm index 14107973398..9a873ffeec3 100644 --- a/code/modules/detectivework/scanner.dm +++ b/code/modules/detectivework/scanner.dm @@ -72,7 +72,7 @@ /obj/item/detective_scanner/afterattack(atom/A, mob/user, params) . = ..() scan(A, user) - return FALSE + return . | AFTERATTACK_PROCESSED_ITEM /obj/item/detective_scanner/proc/scan(atom/A, mob/user) set waitfor = FALSE diff --git a/code/modules/events/wizard/rpgloot.dm b/code/modules/events/wizard/rpgloot.dm index 6ac65a944f5..6ceb933fb77 100644 --- a/code/modules/events/wizard/rpgloot.dm +++ b/code/modules/events/wizard/rpgloot.dm @@ -26,6 +26,8 @@ if(!proximity || !istype(target)) return + . |= AFTERATTACK_PROCESSED_ITEM + target.AddComponent(/datum/component/fantasy, upgrade_amount, null, null, can_backfire, TRUE) uses -= 1 @@ -33,6 +35,8 @@ visible_message(span_warning("[src] vanishes, its magic completely consumed from the fortification.")) qdel(src) + return . + /obj/item/upgradescroll/unlimited name = "unlimited foolproof item fortification scroll" desc = "Somehow, this piece of paper can be applied to items to make them \"better\". This scroll is made from the tongues of dead paper wizards, and can be used an unlimited number of times, with no drawbacks." diff --git a/code/modules/experisci/experiment/handlers/experiment_handler.dm b/code/modules/experisci/experiment/handlers/experiment_handler.dm index bd182127e52..95c81fbdcd0 100644 --- a/code/modules/experisci/experiment/handlers/experiment_handler.dm +++ b/code/modules/experisci/experiment/handlers/experiment_handler.dm @@ -98,10 +98,14 @@ */ /datum/component/experiment_handler/proc/ignored_handheld_experiment_attempt(datum/source, atom/target, mob/user, proximity_flag, params) SIGNAL_HANDLER - if (!proximity_flag || (selected_experiment == null && !(config_flags & EXPERIMENT_CONFIG_ALWAYS_ACTIVE))) + if (!proximity_flag) return + . |= COMPONENT_AFTERATTACK_PROCESSED_ITEM + if (selected_experiment == null && !(config_flags & EXPERIMENT_CONFIG_ALWAYS_ACTIVE)) + return . playsound(user, 'sound/machines/buzz-sigh.ogg', 25) to_chat(user, span_notice("[target] is not related to your currently selected experiment.")) + return . /** * Checks that an experiment can be run using the provided target, used for preventing the cancellation of the attack chain inappropriately diff --git a/code/modules/explorer_drone/loot.dm b/code/modules/explorer_drone/loot.dm index 9518337f266..ccb7d433d9a 100644 --- a/code/modules/explorer_drone/loot.dm +++ b/code/modules/explorer_drone/loot.dm @@ -165,6 +165,7 @@ GLOBAL_LIST_INIT(adventure_loot_generator_index,generate_generator_index()) /obj/item/firelance/afterattack(atom/target, mob/user, proximity_flag, click_parameters) . = ..() + . |= AFTERATTACK_PROCESSED_ITEM if(!HAS_TRAIT(src,TRAIT_WIELDED)) to_chat(user,span_notice("You need to wield [src] in two hands before you can fire it.")) return diff --git a/code/modules/fishing/fishing_rod.dm b/code/modules/fishing/fishing_rod.dm index 6efb3bb202b..1368db76772 100644 --- a/code/modules/fishing/fishing_rod.dm +++ b/code/modules/fishing/fishing_rod.dm @@ -194,11 +194,12 @@ /obj/item/fishing_rod/afterattack(atom/target, mob/user, proximity_flag, click_parameters) . = ..() + . |= AFTERATTACK_PROCESSED_ITEM /// Reel in if able if(currently_hooked_item) reel(user) - return + return . /// If the line to whatever that is is clear and we're not already busy, try fishing in it if(!casting && !currently_hooked_item && !proximity_flag && CheckToolReach(user, target, cast_range)) @@ -215,6 +216,8 @@ cast_projectile.preparePixelProjectile(target, user) cast_projectile.fire() + return . + /// Called by hook projectile when hitting things /obj/item/fishing_rod/proc/hook_hit(atom/atom_hit_by_hook_projectile) var/mob/user = loc diff --git a/code/modules/hydroponics/unique_plant_genes.dm b/code/modules/hydroponics/unique_plant_genes.dm index ecab43d3588..5f2a8e0aad4 100644 --- a/code/modules/hydroponics/unique_plant_genes.dm +++ b/code/modules/hydroponics/unique_plant_genes.dm @@ -85,12 +85,15 @@ if(!ismovable(target)) return + . |= COMPONENT_AFTERATTACK_PROCESSED_ITEM + if(isobj(target)) var/obj/object_target = target if(!(object_target.obj_flags & CAN_BE_HIT)) - return + return . INVOKE_ASYNC(src, PROC_REF(after_attack_effect), source, target, user) + return . /* * Effects done when we hit people with our plant, AFTER the attack is done. diff --git a/code/modules/mapfluff/ruins/spaceruin_code/hilbertshotel.dm b/code/modules/mapfluff/ruins/spaceruin_code/hilbertshotel.dm index a24c8cd0228..a6ea1743485 100644 --- a/code/modules/mapfluff/ruins/spaceruin_code/hilbertshotel.dm +++ b/code/modules/mapfluff/ruins/spaceruin_code/hilbertshotel.dm @@ -478,9 +478,10 @@ GLOBAL_VAR_INIT(hhMysteryRoomNumber, rand(1, 999999)) /obj/item/analyzer/hilbertsanalyzer/afterattack(atom/target, mob/user, proximity) . = ..() if(istype(target, /obj/item/hilbertshotel)) + . |= AFTERATTACK_PROCESSED_ITEM if(!proximity) to_chat(user, span_warning("It's to far away to scan!")) - return + return . var/obj/item/hilbertshotel/sphere = target if(sphere.activeRooms.len) to_chat(user, "Currently Occupied Rooms:") @@ -494,6 +495,7 @@ GLOBAL_VAR_INIT(hhMysteryRoomNumber, rand(1, 999999)) to_chat(user, roomnumber) else to_chat(user, "No vacated rooms.") + return . /obj/effect/landmark/lift_id/hilbert specific_lift_id = HILBERT_TRAM diff --git a/code/modules/mining/equipment/monster_organs/monster_organ.dm b/code/modules/mining/equipment/monster_organs/monster_organ.dm index 6fcbe2187ad..7e664f3f789 100644 --- a/code/modules/mining/equipment/monster_organs/monster_organ.dm +++ b/code/modules/mining/equipment/monster_organs/monster_organ.dm @@ -12,17 +12,20 @@ . = ..() if (!proximity) return + . |= AFTERATTACK_PROCESSED_ITEM + var/obj/item/organ/internal/monster_core/target_core = target_organ if (!istype(target_core, /obj/item/organ/internal/monster_core)) balloon_alert(user, "invalid target!") - return + return . if (!target_core.preserve()) balloon_alert(user, "organ decayed!") - return + return . balloon_alert(user, "organ stabilized") qdel(src) + return . /** * Useful organs which drop as loot from a mining creature. @@ -137,6 +140,7 @@ if (!proximity_flag) return try_apply(target, user) + return . | AFTERATTACK_PROCESSED_ITEM /obj/item/organ/internal/monster_core/attack_self(mob/user) if (!user.canUseTopic(src, be_close = TRUE, no_dexterity = FALSE, no_tk = TRUE)) diff --git a/code/modules/mining/fulton.dm b/code/modules/mining/fulton.dm index 4408c196fbe..4f93909881c 100644 --- a/code/modules/mining/fulton.dm +++ b/code/modules/mining/fulton.dm @@ -34,6 +34,7 @@ GLOBAL_LIST_EMPTY(total_extraction_beacons) /obj/item/extraction_pack/afterattack(atom/movable/A, mob/living/carbon/human/user, flag, params) . = ..() + . |= AFTERATTACK_PROCESSED_ITEM if(!beacon) to_chat(user, span_warning("[src] is not linked to a beacon, and cannot be used!")) return diff --git a/code/modules/mining/lavaland/megafauna_loot.dm b/code/modules/mining/lavaland/megafauna_loot.dm index 3d390d3f391..40ebc34960e 100644 --- a/code/modules/mining/lavaland/megafauna_loot.dm +++ b/code/modules/mining/lavaland/megafauna_loot.dm @@ -101,6 +101,7 @@ /obj/item/hierophant_club/afterattack(atom/target, mob/user, proximity_flag, click_parameters) . = ..() + . |= AFTERATTACK_PROCESSED_ITEM // If our target is the beacon and the hierostaff is next to the beacon, we're trying to pick it up. if((target == beacon) && target.Adjacent(src)) return @@ -779,6 +780,7 @@ . = ..() if(timer > world.time) return + . |= AFTERATTACK_PROCESSED_ITEM if(is_type_in_typecache(target, banned_turfs)) return if(target in view(user.client.view, get_turf(user))) @@ -1009,6 +1011,7 @@ /obj/item/storm_staff/afterattack(atom/target, mob/user, proximity_flag, click_parameters) . = ..() + . |= AFTERATTACK_PROCESSED_ITEM if(!thunder_charges) balloon_alert(user, "needs to charge!") return diff --git a/code/modules/mob/living/basic/vermin/mouse.dm b/code/modules/mob/living/basic/vermin/mouse.dm index a5e2f182d6a..a1f4f3a38c5 100644 --- a/code/modules/mob/living/basic/vermin/mouse.dm +++ b/code/modules/mob/living/basic/vermin/mouse.dm @@ -329,6 +329,7 @@ /obj/item/food/deadmouse/afterattack(obj/target, mob/living/user, proximity_flag) . = ..() if(proximity_flag && reagents && target.is_open_container()) + . |= AFTERATTACK_PROCESSED_ITEM // is_open_container will not return truthy if target.reagents doesn't exist var/datum/reagents/target_reagents = target.reagents var/trans_amount = reagents.maximum_volume - reagents.total_volume * (4 / 3) @@ -336,7 +337,7 @@ to_chat(user, span_notice("You dip [src] into [target].")) else to_chat(user, span_warning("That's a terrible idea.")) - return + return . /obj/item/food/deadmouse/moldy name = "moldy dead mouse" diff --git a/code/modules/ninja/ninja_explosive.dm b/code/modules/ninja/ninja_explosive.dm index 79cd4298962..68241ce7769 100644 --- a/code/modules/ninja/ninja_explosive.dm +++ b/code/modules/ninja/ninja_explosive.dm @@ -42,10 +42,11 @@ if(!IS_SPACE_NINJA(ninja)) to_chat(ninja, span_notice("While it appears normal, you can't seem to detonate the charge.")) return + . |= AFTERATTACK_PROCESSED_ITEM if (!check_loc(ninja)) - return + return . detonator = WEAKREF(ninja) - return ..() + return . | ..() /obj/item/grenade/c4/ninja/detonate(mob/living/lanced_by) if(!check_loc(detonator.resolve())) // if its moved, deactivate the c4 diff --git a/code/modules/paperwork/handlabeler.dm b/code/modules/paperwork/handlabeler.dm index d86d8420701..45bd1a26438 100644 --- a/code/modules/paperwork/handlabeler.dm +++ b/code/modules/paperwork/handlabeler.dm @@ -40,6 +40,9 @@ . = ..() if(!proximity) return + + . |= AFTERATTACK_PROCESSED_ITEM + if(!mode) //if it's off, give up. return @@ -98,6 +101,7 @@ . = ..() if(!proximity) return + . |= AFTERATTACK_PROCESSED_ITEM if(!iscyborg(user)) return diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm index e649f2448ba..41829f16335 100644 --- a/code/modules/paperwork/pen.dm +++ b/code/modules/paperwork/pen.dm @@ -160,8 +160,14 @@ /obj/item/pen/afterattack(obj/O, mob/living/user, proximity) . = ..() + + if (!proximity) + return . + + . |= AFTERATTACK_PROCESSED_ITEM + //Changing name/description of items. Only works if they have the UNIQUE_RENAME object flag set - if(isobj(O) && proximity && (O.obj_flags & UNIQUE_RENAME)) + if(isobj(O) && (O.obj_flags & UNIQUE_RENAME)) var/penchoice = tgui_input_list(user, "What would you like to edit?", "Pen Setting", list("Rename", "Description", "Reset")) if(QDELETED(O) || !user.canUseTopic(O, be_close = TRUE)) return diff --git a/code/modules/photography/camera/camera.dm b/code/modules/photography/camera/camera.dm index 7752eda4957..a4fe4e2ef6e 100644 --- a/code/modules/photography/camera/camera.dm +++ b/code/modules/photography/camera/camera.dm @@ -125,6 +125,8 @@ return TRUE /obj/item/camera/afterattack(atom/target, mob/user, flag) + . |= AFTERATTACK_PROCESSED_ITEM + if (disk) if(ismob(target)) if (disk.record) diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index a55bcf79a7d..e910a9e703c 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -491,6 +491,7 @@ /obj/item/turret_control/afterattack(atom/targeted_atom, mob/user, proxflag, clickparams) . = ..() + . |= AFTERATTACK_PROCESSED_ITEM var/obj/machinery/power/emitter/emitter = user.buckled emitter.setDir(get_dir(emitter,targeted_atom)) user.setDir(emitter.dir) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 1e652120ac5..158330e9df6 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -210,8 +210,8 @@ return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN /obj/item/gun/afterattack(atom/target, mob/living/user, flag, params) - . = ..() - return fire_gun(target, user, flag, params) + ..() + return fire_gun(target, user, flag, params) | AFTERATTACK_PROCESSED_ITEM /obj/item/gun/proc/fire_gun(atom/target, mob/living/user, flag, params) if(QDELETED(target)) diff --git a/code/modules/projectiles/guns/ballistic/automatic.dm b/code/modules/projectiles/guns/ballistic/automatic.dm index 88cd82f9330..1e3870b063e 100644 --- a/code/modules/projectiles/guns/ballistic/automatic.dm +++ b/code/modules/projectiles/guns/ballistic/automatic.dm @@ -291,11 +291,13 @@ /obj/item/gun/ballistic/automatic/l6_saw/afterattack(atom/target as mob|obj|turf, mob/living/user as mob|obj, flag, params) + . |= AFTERATTACK_PROCESSED_ITEM + if(cover_open) balloon_alert(user, "close the cover!") return else - . = ..() + . |= ..() update_appearance() //ATTACK HAND IGNORING PARENT RETURN VALUE diff --git a/code/modules/projectiles/guns/ballistic/bow.dm b/code/modules/projectiles/guns/ballistic/bow.dm index dbb45389a3b..930acaa5330 100644 --- a/code/modules/projectiles/guns/ballistic/bow.dm +++ b/code/modules/projectiles/guns/ballistic/bow.dm @@ -44,6 +44,7 @@ update_appearance() /obj/item/gun/ballistic/bow/afterattack(atom/target, mob/living/user, flag, params, passthrough = FALSE) + . |= AFTERATTACK_PROCESSED_ITEM if(!chambered) return if(!drawn) diff --git a/code/modules/projectiles/guns/energy/beam_rifle.dm b/code/modules/projectiles/guns/energy/beam_rifle.dm index 1487e4a8b56..2eb93186dab 100644 --- a/code/modules/projectiles/guns/energy/beam_rifle.dm +++ b/code/modules/projectiles/guns/energy/beam_rifle.dm @@ -302,6 +302,7 @@ return ..() /obj/item/gun/energy/beam_rifle/afterattack(atom/target, mob/living/user, flag, params, passthrough = FALSE) + . |= AFTERATTACK_PROCESSED_ITEM if(flag) //It's adjacent, is the user, or is on the user's person if(target in user.contents) //can't shoot stuff inside us. return diff --git a/code/modules/projectiles/guns/magic/wand.dm b/code/modules/projectiles/guns/magic/wand.dm index 4ff00029409..a078c4ae00b 100644 --- a/code/modules/projectiles/guns/magic/wand.dm +++ b/code/modules/projectiles/guns/magic/wand.dm @@ -34,6 +34,7 @@ ..() /obj/item/gun/magic/wand/afterattack(atom/target, mob/living/user) + . |= AFTERATTACK_PROCESSED_ITEM if(!charges) shoot_with_empty_chamber(user) return @@ -47,7 +48,7 @@ no_den_usage = 0 zap_self(user) else - . = ..() + . |= ..() update_appearance() diff --git a/code/modules/projectiles/guns/special/blastcannon.dm b/code/modules/projectiles/guns/special/blastcannon.dm index 8b75e47b422..a255a2dfabf 100644 --- a/code/modules/projectiles/guns/special/blastcannon.dm +++ b/code/modules/projectiles/guns/special/blastcannon.dm @@ -111,6 +111,8 @@ return TRUE /obj/item/gun/blastcannon/afterattack(atom/target, mob/user, flag, params) + . |= AFTERATTACK_PROCESSED_ITEM + if((!bomb && bombcheck) || !target || (get_dist(get_turf(target), get_turf(user)) <= 2)) return ..() diff --git a/code/modules/projectiles/pins.dm b/code/modules/projectiles/pins.dm index 77813c1e608..74b279a4a3e 100644 --- a/code/modules/projectiles/pins.dm +++ b/code/modules/projectiles/pins.dm @@ -24,6 +24,7 @@ . = ..() if(proximity_flag) if(isgun(target)) + . |= AFTERATTACK_PROCESSED_ITEM var/obj/item/gun/G = target var/obj/item/firing_pin/old_pin = G.pin if(old_pin && (force_replace || old_pin.pin_removeable)) @@ -36,12 +37,14 @@ if(!G.pin) if(!user.temporarilyRemoveItemFromInventory(src)) - return + return . gun_insert(user, G) to_chat(user, span_notice("You insert [src] into [G].")) else to_chat(user, span_notice("This firearm already has a firing pin installed.")) + return . + /obj/item/firing_pin/emag_act(mob/user) if(obj_flags & EMAGGED) return diff --git a/code/modules/reagents/chemistry/items.dm b/code/modules/reagents/chemistry/items.dm index 61128b64d4f..cfa1f4a47e6 100644 --- a/code/modules/reagents/chemistry/items.dm +++ b/code/modules/reagents/chemistry/items.dm @@ -81,6 +81,7 @@ /obj/item/ph_paper/afterattack(atom/target, mob/user, proximity_flag, click_parameters) if(!is_reagent_container(target)) return + . |= AFTERATTACK_PROCESSED_ITEM var/obj/item/reagent_containers/cont = target if(used == TRUE) to_chat(user, span_warning("[src] has already been used!")) @@ -116,6 +117,7 @@ . = ..() if(!is_reagent_container(target)) return + . |= AFTERATTACK_PROCESSED_ITEM var/obj/item/reagent_containers/cont = target if(LAZYLEN(cont.reagents.reagent_list) == null) return @@ -188,18 +190,22 @@ /obj/item/burner/afterattack(atom/target, mob/user, proximity_flag, click_parameters) . = ..() if(lit) + . |= AFTERATTACK_PROCESSED_ITEM if(is_reagent_container(target)) var/obj/item/reagent_containers/container = target container.reagents.expose_temperature(get_temperature()) to_chat(user, span_notice("You heat up the [src].")) playsound(user.loc, 'sound/chemistry/heatdam.ogg', 50, TRUE) - return + return . else if(isitem(target)) var/obj/item/item = target if(item.heat > 1000) + . |= AFTERATTACK_PROCESSED_ITEM set_lit(TRUE) user.visible_message(span_notice("[user] lights up the [src].")) + return . + /obj/item/burner/update_icon_state() . = ..() icon_state = "[initial(icon_state)][lit ? "-on" : ""]" @@ -289,12 +295,14 @@ /obj/item/thermometer/afterattack(atom/target, mob/user, proximity_flag, click_parameters) . = ..() + . |= AFTERATTACK_PROCESSED_ITEM if(target.reagents) if(!user.transferItemToLoc(src, target)) - return + return . attached_to_reagents = target.reagents to_chat(user, span_notice("You add the [src] to the [target].")) ui_interact(usr, null) + return . /obj/item/thermometer/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) diff --git a/code/modules/reagents/reagent_containers/condiment.dm b/code/modules/reagents/reagent_containers/condiment.dm index 92cbac59935..0f9917fed72 100644 --- a/code/modules/reagents/reagent_containers/condiment.dm +++ b/code/modules/reagents/reagent_containers/condiment.dm @@ -70,6 +70,7 @@ . = ..() if(!proximity) return + . |= AFTERATTACK_PROCESSED_ITEM if(istype(target, /obj/structure/reagent_dispensers)) //A dispenser. Transfer FROM it TO us. if(!target.reagents.total_volume) @@ -152,6 +153,7 @@ . = ..() if(!proximity) return + . |= AFTERATTACK_PROCESSED_ITEM if(isturf(target)) if(!reagents.has_reagent(/datum/reagent/consumable/salt, 2)) to_chat(user, span_warning("You don't have enough salt to make a pile!")) @@ -367,7 +369,7 @@ /obj/item/reagent_containers/condiment/pack/afterattack(obj/target, mob/user , proximity) if(!proximity) return - + . |= AFTERATTACK_PROCESSED_ITEM //You can tear the bag open above food to put the condiments on it, obviously. if(IS_EDIBLE(target)) if(!reagents.total_volume) @@ -383,7 +385,7 @@ src.reagents.trans_to(target, amount_per_transfer_from_this, transfered_by = user) qdel(src) return - . = ..() + return . | ..() /// Handles reagents getting added to the condiment pack. /obj/item/reagent_containers/condiment/pack/proc/on_reagent_add(datum/reagents/reagents) diff --git a/code/modules/reagents/reagent_containers/cups/_cup.dm b/code/modules/reagents/reagent_containers/cups/_cup.dm index 328bf34fed6..37e6958f0e8 100644 --- a/code/modules/reagents/reagent_containers/cups/_cup.dm +++ b/code/modules/reagents/reagent_containers/cups/_cup.dm @@ -100,7 +100,12 @@ /obj/item/reagent_containers/cup/afterattack(atom/target, mob/user, proximity_flag, click_parameters) . = ..() - if((!proximity_flag) || !check_allowed_items(target, target_self = TRUE)) + if(!proximity_flag) + return + + . |= AFTERATTACK_PROCESSED_ITEM + + if(!check_allowed_items(target, target_self = TRUE)) return if(!spillable) diff --git a/code/modules/reagents/reagent_containers/cups/drinks.dm b/code/modules/reagents/reagent_containers/cups/drinks.dm index 23917f7af52..e770626aaf9 100644 --- a/code/modules/reagents/reagent_containers/cups/drinks.dm +++ b/code/modules/reagents/reagent_containers/cups/drinks.dm @@ -287,6 +287,8 @@ return ..() /obj/item/reagent_containers/cup/glass/waterbottle/afterattack(obj/target, mob/living/user, proximity) + . |= AFTERATTACK_PROCESSED_ITEM + if(cap_on && (target.is_refillable() || target.is_drainable() || (reagents.total_volume && !user.combat_mode))) to_chat(user, span_warning("You must remove the cap before you can do that!")) return @@ -297,7 +299,7 @@ to_chat(user, span_warning("[other_bottle] has a cap firmly twisted on!")) return - return ..() + return . | ..() // heehoo bottle flipping /obj/item/reagent_containers/cup/glass/waterbottle/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) diff --git a/code/modules/reagents/reagent_containers/dropper.dm b/code/modules/reagents/reagent_containers/dropper.dm index 4be30fc719f..2a005d27826 100644 --- a/code/modules/reagents/reagent_containers/dropper.dm +++ b/code/modules/reagents/reagent_containers/dropper.dm @@ -15,6 +15,7 @@ . = ..() if(!proximity) return + . |= AFTERATTACK_PROCESSED_ITEM if(!target.reagents) return diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index 5a7d2057d8f..8564b7a1024 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -59,6 +59,7 @@ . = ..() if(!proximity) return + . |= AFTERATTACK_PROCESSED_ITEM if(!dissolvable || !target.is_refillable()) return if(target.is_drainable() && !target.reagents.total_volume) diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index f823aa406de..7f332239837 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -30,6 +30,8 @@ if(istype(target, /obj/structure/sink) || istype(target, /obj/structure/mop_bucket/janitorialcart) || istype(target, /obj/machinery/hydroponics)) return + . |= AFTERATTACK_PROCESSED_ITEM + if((target.is_drainable() && !target.is_refillable()) && (get_dist(src, target) <= 1) && can_fill_from_container) if(!target.reagents.total_volume) to_chat(user, span_warning("[target] is empty.")) @@ -220,7 +222,7 @@ /obj/item/reagent_containers/spray/pepper/afterattack(atom/A as mob|obj, mob/user) if (A.loc == user) return - . = ..() + return ..() | AFTERATTACK_PROCESSED_ITEM //water flower /obj/item/reagent_containers/spray/waterflower @@ -309,7 +311,7 @@ // Make it so the bioterror spray doesn't spray yourself when you click your inventory items if (A.loc == user) return - . = ..() + return ..() | AFTERATTACK_PROCESSED_ITEM /obj/item/reagent_containers/spray/chemsprayer/spray(atom/A, mob/user) var/direction = get_dir(src, A) diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index b6c89e066f3..be66097855e 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -42,6 +42,7 @@ /obj/item/reagent_containers/syringe/afterattack(atom/target, mob/user, proximity) . = ..() + . |= AFTERATTACK_PROCESSED_ITEM if (!try_syringe(target, user, proximity)) return diff --git a/code/modules/research/xenobiology/crossbreeding/_misc.dm b/code/modules/research/xenobiology/crossbreeding/_misc.dm index 09a8e0627c3..bd6b8ffcd56 100644 --- a/code/modules/research/xenobiology/crossbreeding/_misc.dm +++ b/code/modules/research/xenobiology/crossbreeding/_misc.dm @@ -53,8 +53,10 @@ Slimecrossing Items return ret /obj/item/camera/rewind/afterattack(atom/target, mob/user, flag) + . |= AFTERATTACK_PROCESSED_ITEM + if(!on || !pictures_left || !isturf(target.loc)) - return + return . if(user == target) to_chat(user, span_notice("You take a selfie!")) @@ -64,7 +66,7 @@ Slimecrossing Items to_chat(target, span_boldnotice("You'll remember this moment forever!")) target.AddComponent(/datum/component/dejavu, 2) - .=..() + return . | ..() @@ -76,10 +78,12 @@ Slimecrossing Items pictures_max = 1 /obj/item/camera/timefreeze/afterattack(atom/target, mob/user, flag) + . |= AFTERATTACK_PROCESSED_ITEM + if(!on || !pictures_left || !isturf(target.loc)) - return + return . new /obj/effect/timestop(get_turf(target), 2, 50, list(user)) - . = ..() + return . | ..() //Hypercharged slime cell - Charged Yellow /obj/item/stock_parts/cell/high/slime_hypercharged diff --git a/code/modules/research/xenobiology/crossbreeding/_potions.dm b/code/modules/research/xenobiology/crossbreeding/_potions.dm index 7dd780cca3b..6dba8b7c491 100644 --- a/code/modules/research/xenobiology/crossbreeding/_potions.dm +++ b/code/modules/research/xenobiology/crossbreeding/_potions.dm @@ -14,6 +14,7 @@ Slimecrossing Potions /obj/item/slimepotion/extract_cloner/afterattack(obj/item/target, mob/user , proximity) if(!proximity) return + . |= AFTERATTACK_PROCESSED_ITEM if(is_reagent_container(target)) return ..(target, user, proximity) if(istype(target, /obj/item/slimecross)) @@ -116,12 +117,13 @@ Slimecrossing Potions if(!istype(C)) to_chat(user, span_warning("The potion can only be used on clothing!")) return + . |= AFTERATTACK_PROCESSED_ITEM if(istype(C, /obj/item/clothing/suit/space)) to_chat(user, span_warning("The [C] is already pressure-resistant!")) - return ..() + return . | ..() if(C.min_cold_protection_temperature == SPACE_SUIT_MIN_TEMP_PROTECT && C.clothing_flags & STOPSPRESSUREDAMAGE) to_chat(user, span_warning("The [C] is already pressure-resistant!")) - return ..() + return . | ..() to_chat(user, span_notice("You slather the blue gunk over the [C], making it airtight.")) C.name = "pressure-resistant [C.name]" C.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) @@ -132,6 +134,7 @@ Slimecrossing Potions uses-- if(!uses) qdel(src) + return . //Enhancer potion - Charged Cerulean /obj/item/slimepotion/enhancer/max @@ -159,6 +162,7 @@ Slimecrossing Potions if(!istype(C)) to_chat(user, span_warning("You can't coat this with lavaproofing fluid!")) return ..() + . |= AFTERATTACK_PROCESSED_ITEM to_chat(user, span_notice("You slather the red gunk over the [C], making it lavaproof.")) C.name = "lavaproof [C.name]" C.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) @@ -170,6 +174,7 @@ Slimecrossing Potions uses-- if(!uses) qdel(src) + return . //Revival potion - Charged Grey /obj/item/slimepotion/slime_reviver diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index b1c3ba068c6..8a5b8fef9e1 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -889,6 +889,7 @@ if(!istype(C)) to_chat(user, span_warning("The potion can only be used on objects!")) return + . |= AFTERATTACK_PROCESSED_ITEM if(SEND_SIGNAL(C, COMSIG_SPEED_POTION_APPLIED, src, user) & SPEED_POTION_STOP) return if(isitem(C)) @@ -927,6 +928,7 @@ if(!uses) qdel(src) return + . |= AFTERATTACK_PROCESSED_ITEM if(!istype(C)) to_chat(user, span_warning("The potion can only be used on clothing!")) return diff --git a/code/modules/wiremod/shell/scanner.dm b/code/modules/wiremod/shell/scanner.dm index 4d3a3d1ef73..faf3c57bb8c 100644 --- a/code/modules/wiremod/shell/scanner.dm +++ b/code/modules/wiremod/shell/scanner.dm @@ -58,4 +58,5 @@ attacker.set_output(user) attacking.set_output(target) signal.set_output(COMPONENT_SIGNAL) + return COMPONENT_AFTERATTACK_PROCESSED_ITEM diff --git a/code/modules/zombie/items.dm b/code/modules/zombie/items.dm index bd59eb3033e..5690b72caf6 100644 --- a/code/modules/zombie/items.dm +++ b/code/modules/zombie/items.dm @@ -38,6 +38,7 @@ if(ishuman(target)) try_to_zombie_infect(target) else + . |= AFTERATTACK_PROCESSED_ITEM check_feast(target, user) /proc/try_to_zombie_infect(mob/living/carbon/human/target)