Files
Cameron Lennox 636dd0a3a6 Motion tracker subsystem (#17215)
* Motion tracker basics

* force unsubscribe on destroy

* remove tracking on destroy too

* missing include

* use new art

* logging

* per client echos

* toggle verb

* vis things not needed, and reset vis option if resubbed

* blind and deaf should affect this

* feedback on toggle

* teshari gain vibration sense, lose listen in

* xenochi too

xenochi also get vibration sense

---------

Co-authored-by: Willburd <7099514+Willburd@users.noreply.github.com>
2025-02-26 18:37:18 -05:00

50 lines
1.5 KiB
Plaintext

/obj/item/motiontracker
name = "Motion Tracker"
desc = "The \"Vibromaster V1.7\", a handheld motion tracker. Often picks up nearby vibrations as motion however."
icon = 'icons/obj/device_alt.dmi'
icon_state = "pinoff"
item_state = "analyzer"
w_class = ITEMSIZE_SMALL
slot_flags = SLOT_BELT
throwforce = 5
throw_speed = 4
throw_range = 20
matter = list(MAT_STEEL = 30,MAT_GLASS = 20)
origin_tech = list(TECH_MAGNET = 1, TECH_DATA = 1)
pickup_sound = 'sound/items/pickup/device.ogg'
drop_sound = 'sound/items/drop/device.ogg'
/obj/item/motiontracker/Initialize(mapload)
RegisterSignal(SSmotiontracker, COMSIG_MOVABLE_MOTIONTRACKER, PROC_REF(handle_motion_tracking))
. = ..()
/obj/item/motiontracker/Destroy(force, ...)
if(ismob(loc))
var/mob/M = loc
M.motiontracker_subscribe()
UnregisterSignal(SSmotiontracker, COMSIG_MOVABLE_MOTIONTRACKER)
. = ..()
/obj/item/motiontracker/proc/handle_motion_tracking(mob/source, var/datum/weakref/RW, var/turf/T)
SIGNAL_HANDLER
SHOULD_NOT_OVERRIDE(TRUE)
PRIVATE_PROC(TRUE)
var/atom/echo_source = RW?.resolve()
var/atom/scan_pos = src
if(!isturf(loc))
scan_pos = loc
if(!echo_source || get_dist(scan_pos,echo_source) > SSmotiontracker.max_range || scan_pos.z != echo_source.z)
return
flick("pinondirect",src)
/obj/item/motiontracker/Moved(atom/old_loc, direction, forced, movetime)
. = ..()
if(ismob(old_loc))
var/mob/M = old_loc
M.motiontracker_unsubscribe()
if(ismob(loc))
var/mob/M = loc
M.motiontracker_subscribe()