From cbeb9c5be40da789a2af85d392fb4ccfee151ac6 Mon Sep 17 00:00:00 2001 From: spessbro <51048066+spessbro@users.noreply.github.com> Date: Mon, 8 Mar 2021 19:50:53 -0500 Subject: [PATCH] Refactors the paper bin behavior for dragging to pick up into an element (#57501) * Drag pickup element for the paper bin behavior * invokes async on put_in_hands to comply with the linter * documented and like better names * blackspace --- code/datums/elements/drag_pickup.dm | 29 +++++++++++++++++++++++++++++ code/modules/paperwork/paperbin.dm | 17 ++--------------- tgstation.dme | 1 + 3 files changed, 32 insertions(+), 15 deletions(-) create mode 100644 code/datums/elements/drag_pickup.dm diff --git a/code/datums/elements/drag_pickup.dm b/code/datums/elements/drag_pickup.dm new file mode 100644 index 00000000000..ea4fd387db5 --- /dev/null +++ b/code/datums/elements/drag_pickup.dm @@ -0,0 +1,29 @@ +/** + * drag_pickup element; for allowing things to be picked up by dragging. + * + * Used for paper bins. + */ +/datum/element/drag_pickup + element_flags = ELEMENT_DETACH + +/datum/element/drag_pickup/Attach(datum/target) + if(!ismovable(target)) + return ELEMENT_INCOMPATIBLE + RegisterSignal(target, COMSIG_MOUSEDROP_ONTO, .proc/pick_up) + return ..() + +/datum/element/drag_pickup/Detach(datum/source, force) + UnregisterSignal(source, COMSIG_MOUSEDROP_ONTO) + return ..() + +/datum/element/drag_pickup/proc/pick_up(atom/source, atom/over, mob/user) + SIGNAL_HANDLER + var/mob/living/picker = user + if(!istype(picker) || picker.incapacitated() || !source.Adjacent(picker)) + return + + if(over == picker) + INVOKE_ASYNC(picker, /mob/.proc/put_in_hands, source) + else if(istype(over, /atom/movable/screen/inventory/hand)) + var/atom/movable/screen/inventory/hand/Selected_hand = over + picker.putItemFromInventoryInHandIfPossible(source, Selected_hand.held_index) diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm index 7504bac7e33..a119d37260e 100644 --- a/code/modules/paperwork/paperbin.dm +++ b/code/modules/paperwork/paperbin.dm @@ -19,6 +19,7 @@ /obj/item/paper_bin/Initialize(mapload) . = ..() interaction_flags_item &= ~INTERACT_ITEM_ATTACK_HAND_PICKUP + AddElement(/datum/element/drag_pickup) if(!mapload) return var/obj/item/pen/P = locate(/obj/item/pen) in src.loc @@ -26,6 +27,7 @@ P.forceMove(src) bin_pen = P update_appearance() + /obj/item/paper_bin/Destroy() if(papers) @@ -40,21 +42,6 @@ update_appearance() ..() -/obj/item/paper_bin/MouseDrop(atom/over_object) - . = ..() - var/mob/living/M = usr - if(!istype(M) || M.incapacitated() || !Adjacent(M)) - return - - if(over_object == M) - M.put_in_hands(src) - - else if(istype(over_object, /atom/movable/screen/inventory/hand)) - var/atom/movable/screen/inventory/hand/H = over_object - M.putItemFromInventoryInHandIfPossible(src, H.held_index) - - add_fingerprint(M) - /obj/item/paper_bin/attack_paw(mob/user, list/modifiers) return attack_hand(user, modifiers) diff --git a/tgstation.dme b/tgstation.dme index 62e8fccbe85..eb1c42a27ab 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -636,6 +636,7 @@ #include "code\datums\elements\decal.dm" #include "code\datums\elements\deferred_aquarium_content.dm" #include "code\datums\elements\digitalcamo.dm" +#include "code\datums\elements\drag_pickup.dm" #include "code\datums\elements\dryable.dm" #include "code\datums\elements\earhealing.dm" #include "code\datums\elements\embed.dm"