mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2025-12-15 04:01:41 +00:00
* Makes turfs persist their signals, uses this to optimize connect_loc (#59608) * Makes turfs persist signals * Splits connect_loc up into two elements, one for stuff that wishes to connect on behalf of something, and one for stuff that just wants to connect normally. Connecting on behalf of someone has a significant amount of overhead, so let's do this to keep things clear * Converts all uses of connect_loc over to the new patterns * Adds some comments, actually makes turfs persist signals * There's no need to detach connect loc anymore, since all it does is unregister signals. Unregisters a signal from formorly decal'd turfs, and makes the changeturf signal persistance stuff actually work * bro fuck documentation * Changes from a var to a proc, prevents admemems and idiots * Extra detail on why we do the copy post qdel * Makes turfs persist their signals, uses this to optimize connect_loc Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
84 lines
3.0 KiB
Plaintext
84 lines
3.0 KiB
Plaintext
//This element facilitates reaction to atmos changes when a tile is inactive.
|
|
//It adds the object to a list on SSair to be processed for so long as the object wants to be processed
|
|
//And removes it as soon as the object is no longer interested
|
|
//Don't put it on things that tend to clump into one spot, you will cause lag spikes.
|
|
/datum/element/atmos_sensitive
|
|
element_flags = ELEMENT_DETACH
|
|
var/static/list/pass_on = list(COMSIG_TURF_EXPOSE = /atom/proc/check_atmos_process)
|
|
|
|
/datum/element/atmos_sensitive/Attach(datum/target, mapload)
|
|
if(!isatom(target)) //How
|
|
return ELEMENT_INCOMPATIBLE
|
|
var/atom/to_track = target
|
|
to_track.AddElement(/datum/element/connect_loc, pass_on)
|
|
RegisterSignal(to_track, COMSIG_MOVABLE_MOVED, .proc/react_to_move)
|
|
|
|
if(!mapload && isopenturf(to_track.loc))
|
|
var/turf/open/new_open = to_track.loc
|
|
to_track.check_atmos_process(new_open, new_open.air, new_open.air.temperature) //Make sure you're properly registered
|
|
|
|
return ..()
|
|
|
|
/datum/element/atmos_sensitive/Detach(datum/source)
|
|
var/atom/us = source
|
|
us.RemoveElement(/datum/element/connect_loc, pass_on)
|
|
if(us.flags_1 & ATMOS_IS_PROCESSING_1)
|
|
us.atmos_end()
|
|
SSair.atom_process -= us
|
|
us.flags_1 &= ~ATMOS_IS_PROCESSING_1
|
|
return ..()
|
|
|
|
/datum/element/atmos_sensitive/proc/react_to_move(datum/source, atom/movable/oldloc, direction, forced)
|
|
SIGNAL_HANDLER
|
|
var/atom/atom_source = source
|
|
if(isopenturf(atom_source.loc))
|
|
var/turf/open/new_open = atom_source.loc
|
|
atom_source.check_atmos_process(new_open, new_open.air, new_open.air.temperature) //Make sure you're properly registered
|
|
|
|
/atom/proc/check_atmos_process(datum/source, datum/gas_mixture/air, exposed_temperature)
|
|
SIGNAL_HANDLER
|
|
if(should_atmos_process(air, exposed_temperature))
|
|
if(flags_1 & ATMOS_IS_PROCESSING_1)
|
|
return
|
|
SSair.atom_process += src
|
|
flags_1 |= ATMOS_IS_PROCESSING_1
|
|
else if(flags_1 & ATMOS_IS_PROCESSING_1)
|
|
atmos_end()
|
|
SSair.atom_process -= src
|
|
flags_1 &= ~ATMOS_IS_PROCESSING_1
|
|
|
|
/atom/proc/process_exposure()
|
|
var/turf/open/spot = loc
|
|
if(!istype(loc, /turf/open))
|
|
//If you end up in a locker or a wall reconsider your life decisions
|
|
atmos_end()
|
|
SSair.atom_process -= src
|
|
flags_1 &= ~ATMOS_IS_PROCESSING_1
|
|
return
|
|
if(!should_atmos_process(spot.air, spot.air.temperature)) //Things can change without a tile becoming active
|
|
atmos_end()
|
|
SSair.atom_process -= src
|
|
flags_1 &= ~ATMOS_IS_PROCESSING_1
|
|
return
|
|
atmos_expose(spot.air, spot.air.temperature)
|
|
|
|
/turf/open/process_exposure()
|
|
if(!should_atmos_process(air, air.temperature))
|
|
atmos_end()
|
|
SSair.atom_process -= src
|
|
flags_1 &= ~ATMOS_IS_PROCESSING_1
|
|
return
|
|
atmos_expose(air, air.temperature)
|
|
|
|
///We use this proc to check if we should start processing an item, or continue processing it. Returns true/false as expected
|
|
/atom/proc/should_atmos_process(datum/gas_mixture/air, exposed_temperature)
|
|
return FALSE
|
|
|
|
///This is your process() proc
|
|
/atom/proc/atmos_expose(datum/gas_mixture/air, exposed_temperature)
|
|
return
|
|
|
|
///What to do when our requirements are no longer met
|
|
/atom/proc/atmos_end()
|
|
return
|