mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-01-03 05:21:27 +00:00
Necessary for #72292 to work effectively, and probably not very useful out of that context. Split out of its own PR because this is long and boring. I want to make sure that we're catching actual mistakes there, and not just experiencing side effects of how shitty the attack chain is.
39 lines
1.8 KiB
Plaintext
39 lines
1.8 KiB
Plaintext
// If an item has the dunkable element, it's able to be dunked into reagent containers like beakers and glasses.
|
|
// Dunking the item into a container will transfer reagents from the container to the item.
|
|
/datum/element/dunkable
|
|
element_flags = ELEMENT_BESPOKE
|
|
argument_hash_start_idx = 2
|
|
var/dunk_amount // the amount of reagents that will be transfered from the container to the item on each click
|
|
|
|
/datum/element/dunkable/Attach(datum/target, amount_per_dunk)
|
|
. = ..()
|
|
if(!isitem(target))
|
|
return ELEMENT_INCOMPATIBLE
|
|
dunk_amount = amount_per_dunk
|
|
RegisterSignal(target, COMSIG_ITEM_AFTERATTACK, PROC_REF(get_dunked))
|
|
|
|
/datum/element/dunkable/Detach(datum/target)
|
|
. = ..()
|
|
UnregisterSignal(target, COMSIG_ITEM_AFTERATTACK)
|
|
|
|
/datum/element/dunkable/proc/get_dunked(datum/source, atom/target, mob/user, proximity_flag)
|
|
SIGNAL_HANDLER
|
|
|
|
if(!proximity_flag) // if the user is not adjacent to the container
|
|
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 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 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
|