Files
Bubberstation/code/datums/elements/damage_threshold.dm
SkyratBot b237afa316 [MIRROR] Mob attackedby / check_block refactor, plus some minor cleanup of attack_x procs [MDB IGNORE] (#25079)
* Mob `attackedby` / `check_block` refactor, plus some minor cleanup of `attack_x` procs

* Fix the race condition

* Modular

* Ooops

---------

Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
Co-authored-by: Giz <13398309+vinylspiders@users.noreply.github.com>
2023-11-18 02:19:31 -05:00

52 lines
1.5 KiB
Plaintext

/// Applied to living mobs.
/// Adds a force threshold for which attacks will be blocked entirely.
/// IE, if they are hit with an attack that deals less than X damage, the attack does nothing.
/datum/element/damage_threshold
element_flags = ELEMENT_BESPOKE
argument_hash_start_idx = 2
/// Incoming attacks beneath this threshold, inclusive, will be blocked entirely
var/force_threshold = -1
/datum/element/damage_threshold/Attach(datum/target, threshold)
. = ..()
if(!isliving(target))
return ELEMENT_INCOMPATIBLE
if(!isnum(threshold) || threshold <= 0)
return ELEMENT_INCOMPATIBLE
RegisterSignal(target, COMSIG_LIVING_CHECK_BLOCK, PROC_REF(check_block))
force_threshold = threshold
/datum/element/damage_threshold/Detach(datum/source, ...)
. = ..()
UnregisterSignal(source, COMSIG_LIVING_CHECK_BLOCK)
/datum/element/damage_threshold/proc/check_block(
mob/living/source,
atom/hitby,
damage,
attack_text,
attack_type,
armour_penetration,
damage_type,
attack_flag,
)
SIGNAL_HANDLER
if(damage <= 0) // Already handled
return NONE
if(damage <= force_threshold)
var/obj/item/item_hitting = hitby
var/tap_vol = istype(item_hitting) ? item_hitting.get_clamped_volume() : 50
source.visible_message(
span_warning("[src] looks unharmed!"),
span_warning("[attack_text] deals no damage to you!"),
span_hear("You hear a thud."),
COMBAT_MESSAGE_RANGE,
)
playsound(source, 'sound/weapons/tap.ogg', tap_vol, TRUE, -1)
return SUCCESSFUL_BLOCK
return NONE