mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-01-01 12:31:32 +00:00
* bane component to element. nullrod now uses it for revenants. (#60640) * bane component to element. nullrod uses it for revenants. * TRUE to FALSE * bane component to element. nullrod now uses it for revenants. Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
56 lines
1.9 KiB
Plaintext
56 lines
1.9 KiB
Plaintext
/// Deals extra damage to mobs of a certain type or species.
|
|
/datum/element/bane
|
|
element_flags = ELEMENT_DETACH|ELEMENT_BESPOKE
|
|
id_arg_index = 2
|
|
/// can be a mob or a species.
|
|
var/target_type
|
|
/// multiplier of the extra damage based on the force of the item.
|
|
var/damage_multiplier
|
|
/// Added after the above.
|
|
var/added_damage
|
|
/// If it requires combat mode on to deal the extra damage or not.
|
|
var/requires_combat_mode
|
|
|
|
/datum/element/bane/Attach(datum/target, target_type, damage_multiplier=1, added_damage = 0, requires_combat_mode = TRUE)
|
|
. = ..()
|
|
if(!isitem(target))
|
|
return ELEMENT_INCOMPATIBLE
|
|
|
|
if(ispath(target_type, /mob/living))
|
|
RegisterSignal(target, COMSIG_ITEM_AFTERATTACK, .proc/mob_check)
|
|
else if(ispath(target_type, /datum/species))
|
|
RegisterSignal(target, COMSIG_ITEM_AFTERATTACK, .proc/species_check)
|
|
else
|
|
return ELEMENT_INCOMPATIBLE
|
|
|
|
src.target_type = target_type
|
|
src.damage_multiplier = damage_multiplier
|
|
src.added_damage = added_damage
|
|
src.requires_combat_mode = requires_combat_mode
|
|
|
|
/datum/element/bane/Detach(datum/source)
|
|
UnregisterSignal(source, COMSIG_ITEM_AFTERATTACK)
|
|
return ..()
|
|
|
|
/datum/element/bane/proc/species_check(obj/item/source, atom/target, mob/user, proximity_flag, click_parameters)
|
|
SIGNAL_HANDLER
|
|
|
|
if(!proximity_flag || !is_species(target, target_type))
|
|
return
|
|
activate(source, target, user)
|
|
|
|
/datum/element/bane/proc/mob_check(obj/item/source, atom/target, mob/user, proximity_flag, click_parameters)
|
|
SIGNAL_HANDLER
|
|
|
|
if(!proximity_flag || !istype(target, target_type))
|
|
return
|
|
activate(source, target, user)
|
|
|
|
/datum/element/bane/proc/activate(obj/item/source, mob/living/target, mob/living/attacker)
|
|
if(requires_combat_mode && !attacker.combat_mode)
|
|
return
|
|
|
|
var/extra_damage = max(0, (source.force * damage_multiplier) + added_damage)
|
|
target.apply_damage(extra_damage, source.damtype, attacker.zone_selected)
|
|
SEND_SIGNAL(target, COMSIG_LIVING_BANED, source, attacker) // for extra effects when baned.
|