diff --git a/code/datums/components/effect_remover.dm b/code/datums/components/effect_remover.dm index c714ebdacaa..210e240abd8 100644 --- a/code/datums/components/effect_remover.dm +++ b/code/datums/components/effect_remover.dm @@ -3,6 +3,7 @@ * certain effects (such as cult runes) in one attack. */ /datum/component/effect_remover + dupe_mode = COMPONENT_DUPE_ALLOWED /// Line sent to the user on successful removal. var/success_feedback /// Line forcesaid by the user on successful removal. @@ -59,8 +60,10 @@ if(success_forcesay) user.say(success_forcesay, forced = item_parent.name) if(success_feedback) - var/real_feedback = replacetext(success_feedback, "%THEEFFECT", "[target]") - real_feedback = replacetext(real_feedback, "%THEWEAPON", "[item_parent]") + var/real_feedback = replacetext(success_feedback, "%THEEFFECT", "\the [target]") + real_feedback = replacetext(real_feedback, "%THEWEAPON", "\the [item_parent]") to_chat(user, span_notice(real_feedback)) on_clear_callback?.Invoke(target, user) - qdel(target) + + if(!QDELETED(target)) + qdel(target) diff --git a/code/game/objects/effects/anomalies.dm b/code/game/objects/effects/anomalies.dm index 76b7350ceeb..a898e90fccc 100644 --- a/code/game/objects/effects/anomalies.dm +++ b/code/game/objects/effects/anomalies.dm @@ -89,9 +89,12 @@ qdel(src) -/obj/effect/anomaly/attackby(obj/item/I, mob/user, params) - if(I.tool_behaviour == TOOL_ANALYZER) +/obj/effect/anomaly/attackby(obj/item/weapon, mob/user, params) + if(weapon.tool_behaviour == TOOL_ANALYZER) to_chat(user, span_notice("Analyzing... [src]'s unstable field is fluctuating along frequency [format_frequency(aSignal.frequency)], code [aSignal.code].")) + return TRUE + + return ..() /////////////////////// diff --git a/code/game/objects/items/devices/anomaly_neutralizer.dm b/code/game/objects/items/devices/anomaly_neutralizer.dm index b918d2bfe7c..39ceac83045 100644 --- a/code/game/objects/items/devices/anomaly_neutralizer.dm +++ b/code/game/objects/items/devices/anomaly_neutralizer.dm @@ -14,35 +14,27 @@ /obj/item/anomaly_neutralizer/Initialize(mapload) . = ..() - // Can be used to delete drained heretic influences + // Primarily used to delete and neutralize anomalies. + AddComponent(/datum/component/effect_remover, \ + success_feedback = "You neutralize %THEEFFECT with %THEWEAPON, frying its circuitry in the process.", \ + on_clear_callback = CALLBACK(src, .proc/on_anomaly_neutralized), \ + effects_we_clear = list(/obj/effect/anomaly)) + + // Can also be used to delete drained heretic influences, to stop fools from losing arms. AddComponent(/datum/component/effect_remover, \ success_feedback = "You close %THEEFFECT with %THEWEAPON, frying its circuitry in the process.", \ on_clear_callback = CALLBACK(src, .proc/on_use), \ effects_we_clear = list(/obj/effect/visible_heretic_influence)) -/obj/item/anomaly_neutralizer/afterattack(atom/target, mob/living/user, proximity) //SKYRAT EDIT - MOB/LIVING - ..() - if(!proximity || !target) - return - if(istype(target, /obj/effect/anomaly)) - var/obj/effect/anomaly/A = target - to_chat(user, span_notice("The circuitry of [src] fries from the strain of neutralizing [A]!")) - A.anomalyNeutralize() - qdel(src) - //SKYRAT EDIT ADDITON START - CME - if(istype(target, /obj/effect/cme)) - var/obj/effect/cme/C = target - if(C.neutralized) - return - to_chat(user, "The circuitry of [src] fries from the strain of neutralizing [C] causing you to absorb the shock!") - do_sparks(5, FALSE, src) - electrocute_mob(user, get_area(src), src, 1, TRUE) - C.anomalyNeutralize() - qdel(src) - //SKYRAT EDIT END +/** + * Callback for the effect remover component to handle neutralizing anomalies. + */ +/obj/item/anomaly_neutralizer/proc/on_anomaly_neutralized(obj/effect/anomaly/target, mob/living/user) + target.anomalyNeutralize() + on_use(target, user) -/* - * Callback for the effect remover component to delete after use. +/** + * Use up the anomaly neutralizer. Cause some sparks and delete it. */ /obj/item/anomaly_neutralizer/proc/on_use(obj/effect/target, mob/living/user) do_sparks(3, FALSE, user) diff --git a/modular_skyrat/master_files/code/game/objects/items/devices/anomaly_neutralizer.dm b/modular_skyrat/master_files/code/game/objects/items/devices/anomaly_neutralizer.dm new file mode 100644 index 00000000000..93a05e8218d --- /dev/null +++ b/modular_skyrat/master_files/code/game/objects/items/devices/anomaly_neutralizer.dm @@ -0,0 +1,17 @@ +/obj/item/anomaly_neutralizer/Initialize(mapload) + . = ..() + AddComponent(/datum/component/effect_remover, \ + success_feedback = "You neutralize %THEEFFECT with %THEWEAPON, frying its circuitry in the process.", \ + on_clear_callback = CALLBACK(src, .proc/on_use_cme), \ + effects_we_clear = list(/obj/effect/cme)) + +/** + * Callback for the effect remover component to handle neutralizing CMEs. + */ +/obj/item/anomaly_neutralizer/proc/on_use_cme(obj/effect/target, mob/living/user) + var/obj/effect/cme/cme_target = target + if(cme_target.neutralized) + return + electrocute_mob(user, get_area(src), src, 1, TRUE) + cme_target.anomalyNeutralize() + on_use(target, user) diff --git a/tgstation.dme b/tgstation.dme index 646b8915674..9b236cbf82f 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -4396,6 +4396,7 @@ #include "modular_skyrat\master_files\code\game\objects\items\oxygen_candle.dm" #include "modular_skyrat\master_files\code\game\objects\items\RCD.dm" #include "modular_skyrat\master_files\code\game\objects\items\religion.dm" +#include "modular_skyrat\master_files\code\game\objects\items\devices\anomaly_neutralizer.dm" #include "modular_skyrat\master_files\code\game\objects\items\devices\radio\encryption_key.dm" #include "modular_skyrat\master_files\code\game\objects\items\devices\radio\headset.dm" #include "modular_skyrat\master_files\code\game\objects\items\storage\boxes.dm"