mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2025-12-19 14:51:27 +00:00
109 lines
3.9 KiB
Plaintext
109 lines
3.9 KiB
Plaintext
///Makes large icons partially see through if high priority atoms are behind them.
|
|
/datum/component/largetransparency
|
|
//Can be positive or negative. Determines how far away from parent the first registered turf is.
|
|
var/x_offset
|
|
var/y_offset
|
|
//Has to be positive or 0.
|
|
var/x_size
|
|
var/y_size
|
|
//The alpha values this switches in between.
|
|
var/initial_alpha
|
|
var/target_alpha
|
|
//if this is supposed to prevent clicks if it's transparent.
|
|
var/toggle_click
|
|
//The atom's mouse opacity, so it's restored to its default
|
|
var/initial_mouse_opacity
|
|
var/list/registered_turfs
|
|
var/amounthidden = 0
|
|
|
|
/datum/component/largetransparency/Initialize(_x_offset = 0, _y_offset = 1, _x_size = 0, _y_size = 1, _initial_alpha = null, _target_alpha = 140, _toggle_click = TRUE)
|
|
if(!isatom(parent))
|
|
return COMPONENT_INCOMPATIBLE
|
|
x_offset = _x_offset
|
|
y_offset = _y_offset
|
|
x_size = _x_size
|
|
y_size = _y_size
|
|
var/atom/at = parent
|
|
if(isnull(_initial_alpha))
|
|
initial_alpha = at.alpha
|
|
else
|
|
initial_alpha = _initial_alpha
|
|
target_alpha = _target_alpha
|
|
toggle_click = _toggle_click
|
|
initial_mouse_opacity = at.mouse_opacity
|
|
registered_turfs = list()
|
|
|
|
|
|
/datum/component/largetransparency/Destroy()
|
|
registered_turfs.Cut()
|
|
return ..()
|
|
|
|
/datum/component/largetransparency/RegisterWithParent()
|
|
RegisterSignal(parent, COMSIG_MOVABLE_MOVED, PROC_REF(OnMove))
|
|
RegisterWithTurfs()
|
|
|
|
/datum/component/largetransparency/UnregisterFromParent()
|
|
UnregisterSignal(parent, COMSIG_MOVABLE_MOVED)
|
|
UnregisterFromTurfs()
|
|
|
|
/datum/component/largetransparency/proc/RegisterWithTurfs()
|
|
var/turf/current_turf = get_turf(parent)
|
|
if(!current_turf)
|
|
return
|
|
var/turf/lowleft_turf = locate(clamp(current_turf.x + x_offset, 0, world.maxx), clamp(current_turf.y + y_offset, 0, world.maxy), current_turf.z)
|
|
var/turf/upright_turf = locate(min(lowleft_turf.x + x_size, world.maxx), min(lowleft_turf.y + y_size, world.maxy), current_turf.z)
|
|
registered_turfs = block(lowleft_turf, upright_turf) //small problems with z level edges due to object size offsets, but nothing truly problematic.
|
|
//register the signals
|
|
for(var/registered_turf in registered_turfs)
|
|
RegisterSignal(registered_turf, list(COMSIG_ATOM_ENTERED, COMSIG_ATOM_INITIALIZED_ON), PROC_REF(objectEnter))
|
|
RegisterSignal(registered_turf, COMSIG_ATOM_EXITED, PROC_REF(objectLeave))
|
|
RegisterSignal(registered_turf, COMSIG_TURF_CHANGE, PROC_REF(OnTurfChange))
|
|
for(var/thing in registered_turf)
|
|
var/atom/check_atom = thing
|
|
if(!(check_atom.flags_2 & CRITICAL_ATOM_2))
|
|
continue
|
|
amounthidden++
|
|
if(amounthidden)
|
|
reduceAlpha()
|
|
|
|
/datum/component/largetransparency/proc/UnregisterFromTurfs()
|
|
var/list/signal_list = list(COMSIG_ATOM_ENTERED, COMSIG_ATOM_EXITED, COMSIG_TURF_CHANGE, COMSIG_ATOM_INITIALIZED_ON)
|
|
for(var/registered_turf in registered_turfs)
|
|
UnregisterSignal(registered_turf, signal_list)
|
|
registered_turfs.Cut()
|
|
|
|
/datum/component/largetransparency/proc/OnMove()
|
|
amounthidden = 0
|
|
restoreAlpha()
|
|
UnregisterFromTurfs()
|
|
RegisterWithTurfs()
|
|
|
|
/datum/component/largetransparency/proc/OnTurfChange()
|
|
addtimer(CALLBACK(src, PROC_REF(OnMove)), 0, TIMER_UNIQUE|TIMER_OVERRIDE) //*pain
|
|
|
|
/datum/component/largetransparency/proc/objectEnter(datum/source, atom/enterer)
|
|
if(!(enterer.flags_2 & CRITICAL_ATOM_2))
|
|
return
|
|
if(!amounthidden)
|
|
reduceAlpha()
|
|
amounthidden++
|
|
|
|
/datum/component/largetransparency/proc/objectLeave(datum/source, atom/leaver)
|
|
if(!(leaver.flags_2 & CRITICAL_ATOM_2))
|
|
return
|
|
amounthidden = max(0, amounthidden - 1)
|
|
if(!amounthidden)
|
|
restoreAlpha()
|
|
|
|
/datum/component/largetransparency/proc/reduceAlpha()
|
|
var/atom/parent_atom = parent
|
|
animate(parent_atom, alpha = target_alpha, 0.5 SECONDS)
|
|
if(toggle_click)
|
|
parent_atom.mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
|
|
|
/datum/component/largetransparency/proc/restoreAlpha()
|
|
var/atom/parent_atom = parent
|
|
animate(parent_atom, alpha = initial_alpha, 0.5 SECONDS)
|
|
if(toggle_click)
|
|
parent_atom.mouse_opacity = initial_mouse_opacity
|