Files
Aurora.3/code/datums/components/eye/_eye.dm
Wildkins e4192f9b8f Lag War Day 5.5: are you serious dude (#21889)
we have a gorillion hard deletions and it turns out half of them are
because we set the "ALWAYS HARD DELETE THIS" flag rather than just like.
fixing the hard delete.

cool
2026-02-21 01:41:50 +00:00

85 lines
2.8 KiB
Plaintext

/datum/component/eye
///The actual eye mob linked to the component
var/mob/abstract/eye/component_eye
///What type of /mob/abstract/eye is used
var/eye_type = /mob/abstract/eye
///The mob currently looking through the eye
var/mob/current_looker
///Actions used to pass commands from the eye to the holder. Must be subtypes of /datum/action/eye
///Base type of the action, all subtypes of this are added to actions.
var/action_type
///The actions available to the eye
var/list/actions = list()
/datum/component/eye/Destroy()
unlook()
QDEL_LIST(actions)
. = ..()
/datum/component/eye/proc/look(mob/new_looker, list/eye_args)
if(new_looker.eyeobj || current_looker)
return FALSE
LAZYINSERT(eye_args, get_turf(current_looker), 1) //Make sure that a loc is provided to the eye
if(!component_eye)
component_eye = new eye_type(arglist(eye_args))
current_looker = new_looker
component_eye.possess(current_looker)
if(action_type)
for(var/atype in subtypesof(action_type))
var/datum/action/eye/action = new atype(src)
actions += action
action.Grant(current_looker)
//Manual unlooking for the looker
var/datum/action/eye/unlook/unlook_action = new(src)
actions += unlook_action
unlook_action.Grant(current_looker)
//Checks for removing the user from the eye outside of unlook actions.
RegisterSignal(parent, COMSIG_MOVABLE_MOVED, PROC_REF(unlook))
RegisterSignal(current_looker, COMSIG_MOVABLE_MOVED, PROC_REF(unlook))
RegisterSignal(parent, COMSIG_QDELETING, PROC_REF(unlook))
RegisterSignal(current_looker, COMSIG_QDELETING, PROC_REF(unlook))
RegisterSignal(component_eye, COMSIG_QDELETING, PROC_REF(unlook))
RegisterSignal(current_looker, COMSIG_MOB_LOGOUT, PROC_REF(unlook))
RegisterSignal(SSdcs, COMSIG_GLOB_MOB_DEATH, PROC_REF(unlook))
return TRUE
/datum/component/eye/proc/unlook()
if(!isnull(parent))
UnregisterSignal(parent, COMSIG_QDELETING)
UnregisterSignal(parent, COMSIG_MOVABLE_MOVED)
if(!isnull(component_eye))
UnregisterSignal(component_eye, COMSIG_QDELETING)
component_eye.release(current_looker)
if(!isnull(current_looker))
UnregisterSignal(current_looker, COMSIG_MOVABLE_MOVED)
UnregisterSignal(current_looker, COMSIG_QDELETING)
UnregisterSignal(current_looker, COMSIG_MOB_LOGOUT)
UnregisterSignal(SSdcs, COMSIG_GLOB_MOB_DEATH)
if(current_looker.client)
current_looker.client.eye = current_looker
current_looker.eyeobj = null
QDEL_NULL(component_eye)
if(current_looker)
for(var/datum/action/A in actions)
A.Remove(current_looker)
current_looker = null
/datum/component/eye/proc/get_eye_turf()
return get_turf(component_eye)
//Every eye created using a subtype of this extension will have this action added for manual unlooking.
/datum/action/eye/unlook
name = "Stop looking"
procname = "unlook"
button_icon_state = "cancel"
target_type = COMPONENT_TARGET