Files
Bubberstation/code/datums/elements/drag_pickup.dm
MrMelbert da10322dc1 Fix modsuits and defibs (#93373)
## About The Pull Request

Fixes #93359

Caused by #93165

Inventory screen elements were no longer considered reachable, which
broke mousedrop handing on objects that check "is dragging into
inventory slot"

I don't know the best way to fix this yet but I figured the next best
thing would be to make all of these use the `drag_pickup` element, which
skips this reach-ability check

Thus I refactored it slightly to accommodate for items which should
contextually not be drag-pick-up-abble and bam, works like a charm

## Changelog

🆑 Melbert
fix: Dragging defibs and modsuits off your back works again
/🆑

---------

Co-authored-by: ArcaneMusic <41715314+ArcaneMusic@users.noreply.github.com>
Co-authored-by: Xander3359 <66163761+Xander3359@users.noreply.github.com>
2025-10-11 18:17:23 -04:00

38 lines
1.2 KiB
Plaintext

/**
* drag_pickup element
*
* Allowing things to be picked up or unequipped by mouse-dragging.
* Useful for objects which have an interaction on click
*/
/datum/element/drag_pickup
/datum/element/drag_pickup/Attach(datum/target)
if(!ismovable(target))
return ELEMENT_INCOMPATIBLE
RegisterSignal(target, COMSIG_MOUSEDROP_ONTO, PROC_REF(pick_up))
return ..()
/datum/element/drag_pickup/Detach(datum/source)
UnregisterSignal(source, COMSIG_MOUSEDROP_ONTO)
return ..()
/datum/element/drag_pickup/proc/pick_up(atom/movable/source, atom/over, mob/user)
SIGNAL_HANDLER
if(!user.can_perform_action(source, FORBID_TELEKINESIS_REACH))
return NONE
if(source.anchored)
return NONE
if(source.loc == user && isitem(source))
var/obj/item/item_source = source
if(!item_source.can_mob_unequip(user))
return COMPONENT_CANCEL_MOUSEDROP_ONTO
if(over == user)
INVOKE_ASYNC(user, TYPE_PROC_REF(/mob, put_in_hands), source)
else if(istype(over, /atom/movable/screen/inventory/hand))
var/atom/movable/screen/inventory/hand/selected_hand = over
user.putItemFromInventoryInHandIfPossible(source, selected_hand.held_index)
source.add_fingerprint(user)
return COMPONENT_CANCEL_MOUSEDROP_ONTO