mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2025-12-31 20:11:56 +00:00
## About The Pull Request This is a remake of #70242 Replaces all instances of ``do_mob`` and ``do_after_mob`` with ``do_after``. ## Why It's Good For The Game All 3 of these are just copy pastes of eachother but some miss some features (like do_after not checking for target loc change, which helps towards fixing https://github.com/tgstation/tgstation/issues/66874 though it doesn't because mechs are setting ``do_after`` on the mob in the mech) and signals only being used on ``do_after``. ## Changelog 🆑 fix: Mechs should now cancel out of drilling when they move. /🆑
56 lines
1.8 KiB
Plaintext
56 lines
1.8 KiB
Plaintext
/**
|
|
* Attached to an item, when the item is used to attack a human, and the attacker isn't in combat mode, attempts to equip the item to the target after the normal delay.
|
|
*
|
|
* Uses the compare_zone_to_item_slot() proc to see if the attacker is targeting a valid slot.
|
|
*/
|
|
/datum/element/attack_equip
|
|
|
|
/datum/element/attack_equip/Attach(datum/target)
|
|
. = ..()
|
|
if(!isitem(target))
|
|
return ELEMENT_INCOMPATIBLE
|
|
RegisterSignal(target, COMSIG_ITEM_ATTACK, PROC_REF(on_item_attack))
|
|
|
|
/datum/element/attack_equip/Detach(datum/source, ...)
|
|
. = ..()
|
|
|
|
UnregisterSignal(source, COMSIG_ITEM_ATTACK)
|
|
|
|
/datum/element/attack_equip/proc/on_item_attack(obj/item/attire, mob/living/target, mob/living/user)
|
|
SIGNAL_HANDLER
|
|
if(user.combat_mode || !ishuman(target) || target == user)
|
|
return
|
|
|
|
var/mob/living/carbon/human/sharp_dresser = target
|
|
var/targeted_zone = user.zone_selected
|
|
|
|
if(!attire.compare_zone_to_item_slot(targeted_zone))
|
|
return
|
|
|
|
if(attire.mob_can_equip(target, attire.slot_flags, disable_warning = TRUE, bypass_equip_delay_self = TRUE))
|
|
INVOKE_ASYNC(src, PROC_REF(equip), attire, sharp_dresser, user)
|
|
return COMPONENT_CANCEL_ATTACK_CHAIN
|
|
|
|
|
|
/datum/element/attack_equip/proc/equip(obj/item/attire, mob/living/carbon/human/sharp_dresser, mob/living/user)
|
|
|
|
if(HAS_TRAIT(attire, TRAIT_NODROP))
|
|
to_chat(user, span_warning("You can't put [attire] on [sharp_dresser], it's stuck to your hand!"))
|
|
return
|
|
var/equip_time = attire.equip_delay_other
|
|
|
|
attire.item_start_equip(sharp_dresser, attire, user)
|
|
|
|
if(!do_after(user, equip_time, sharp_dresser))
|
|
return
|
|
|
|
if(!user.Adjacent(sharp_dresser)) // Due to teleporting shenanigans
|
|
user.put_in_hands(attire)
|
|
return
|
|
|
|
user.temporarilyRemoveItemFromInventory(attire)
|
|
|
|
sharp_dresser.equip_to_slot_if_possible(attire, attire.slot_flags)
|
|
|
|
return finish_equip_mob(attire, sharp_dresser, user)
|