diff --git a/code/datums/elements/drag_activation.dm b/code/datums/elements/drag_activation.dm new file mode 100644 index 00000000000..12f44782f55 --- /dev/null +++ b/code/datums/elements/drag_activation.dm @@ -0,0 +1,29 @@ +/** + * drag_to_activate element + * + * Allowing things to be activated by mouse dragging. + * Useful for objects which have a TGUI window on interaction. + */ +/datum/element/drag_to_activate + +/datum/element/drag_to_activate/Attach(datum/target) + if(!ismovable(target)) + return ELEMENT_INCOMPATIBLE + RegisterSignal(target, COMSIG_MOUSEDROP_ONTO, PROC_REF(activate)) + return ..() + +/datum/element/drag_to_activate/Detach(datum/source) + UnregisterSignal(source, COMSIG_MOUSEDROP_ONTO) + return ..() + +/datum/element/drag_to_activate/proc/activate(atom/movable/source, atom/over, mob/user) + SIGNAL_HANDLER + + if(!user.can_perform_action(source, FORBID_TELEKINESIS_REACH)) + return NONE + + var/obj/item/item_source = source + if(!istype(over, /atom/movable/screen)) + INVOKE_ASYNC(item_source, TYPE_PROC_REF(/obj/item, attack_self), user) + source.add_fingerprint(user) + return COMPONENT_CANCEL_MOUSEDROP_ONTO diff --git a/code/game/objects/items/devices/sensor_device.dm b/code/game/objects/items/devices/sensor_device.dm index 97320669be8..9eb9ee94255 100644 --- a/code/game/objects/items/devices/sensor_device.dm +++ b/code/game/objects/items/devices/sensor_device.dm @@ -17,3 +17,7 @@ /obj/item/sensor_device/attack_self(mob/user) GLOB.crewmonitor.show(user,src) //Proc already exists, just had to call it + +/obj/item/sensor_device/Initialize(mapload) + . = ..() + AddElement(/datum/element/drag_to_activate) diff --git a/code/modules/modular_computers/computers/item/computer.dm b/code/modules/modular_computers/computers/item/computer.dm index 011484b5bb9..8fd0fbcf70e 100644 --- a/code/modules/modular_computers/computers/item/computer.dm +++ b/code/modules/modular_computers/computers/item/computer.dm @@ -149,6 +149,7 @@ if(internal_cell) internal_cell = new internal_cell(src) + AddElement(/datum/element/drag_to_activate) install_default_programs() register_context() update_appearance() @@ -398,10 +399,6 @@ update_appearance() return TRUE -/obj/item/modular_computer/mouse_drop_dragged(atom/over_object, mob/user) - if(!istype(over_object, /atom/movable/screen)) - return attack_self(user) - /obj/item/modular_computer/attack_ai(mob/user) return attack_self(user) diff --git a/tgstation.dme b/tgstation.dme index 36b93c48fe8..d67abf61816 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1551,6 +1551,7 @@ #include "code\datums\elements\digitalcamo.dm" #include "code\datums\elements\disarm_attack.dm" #include "code\datums\elements\door_pryer.dm" +#include "code\datums\elements\drag_activation.dm" #include "code\datums\elements\drag_pickup.dm" #include "code\datums\elements\dryable.dm" #include "code\datums\elements\earhealing.dm"