/
githubmirror
/
vgstation13
Обзор
Документация
Войти
/
githubmirror
/
vgstation13
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
Bleeding-Edge
code/modules/lighting/lighting_atom.dm
104 строки
4 KB
CrazyAmphibian
WELCOME TO THE JUNGLE (#37475)
13 июн 2025, 00:19
Не верифицирован
13 июн 2025, 00:19
7e55ece
Код
Авторство
О чём код?
#define MINIMUM_USEFUL_LIGHT_RANGE 1.4 /atom var/light_power = 1 // Intensity of the light. var/light_range = 0 // Range in tiles of the light. var/light_color // Hexadecimal RGB string representing the colour of the light. var/tmp/datum/light_source/light // Our light source. Don't fuck with this directly unless you have a good reason! var/tmp/list/light_sources // Any light sources that are "inside" of us, for example, if src here was a mob that's carrying a flashlight, that flashlight's light source would be part of this list. // The proc you should always use to set the light of this atom. // Nonesensical value for l_color default, so we can detect if it gets set to null. #define NONSENSICAL_VALUE -99999 /** * Changes the lighting of the atom, then calls update_light. Arguments left null will not be changed. * Arguments: * * l_range - Range of the light in tiles. 0 is off, and anything higher than 0 that's below 1.4 is floored to 1.4 * * l_power - Intensity of the light * * l_color - Color of the light in hex */ /atom/proc/set_light(var/l_range, var/l_power, var/l_color = NONSENSICAL_VALUE,var/lowpriority=FALSE) if(l_range > 0 && l_range < MINIMUM_USEFUL_LIGHT_RANGE) l_range = MINIMUM_USEFUL_LIGHT_RANGE //Brings the range up to 1.4, which is just barely brighter than the soft lighting that surrounds players. if (l_power != null) light_power = l_power if (l_range != null) light_range = l_range if (l_color != NONSENSICAL_VALUE) light_color = l_color update_light(lowpriority) #undef NONSENSICAL_VALUE // Will update the light (duh). // Creates or destroys it if needed, makes it update values, makes sure it's got the correct source turf... /atom/proc/update_light(var/lowpriority=FALSE) set waitfor = FALSE if (gcDestroyed) return if (!light_power || !light_range) // We won't emit light anyways, destroy the light source. if(light) light.destroy() light = null else if (!istype(loc, /atom/movable)) // We choose what atom should be the top atom of the light here. . = src else . = loc if (light) // Update the light or create it if it does not exist. light.lowpriority=lowpriority light.update(.) else light = new/datum/light_source(src, .,lowpriority) // Destroy our light source so we GC correctly. /atom/Destroy() if (light) light.destroy() light = null QDEL_NULL(firelightdummy) . = ..() // Should always be used to change the opacity of an atom. // It notifies (potentially) affected light sources so they can update (if needed). /atom/proc/set_opacity(var/new_opacity) if (new_opacity == opacity) return opacity = new_opacity var/turf/T = loc if (!isturf(T)) return if (new_opacity == TRUE) T.has_opaque_atom = TRUE T.reconsider_lights() else var/old_has_opaque_atom = T.has_opaque_atom T.recalc_atom_opacity() if (old_has_opaque_atom != T.has_opaque_atom) T.reconsider_lights() // This code makes the light be queued for update when it is moved. // Entered() should handle it, however Exited() can do it if it is being moved to nullspace (as there would be no Entered() call in that situation). /atom/Entered(var/atom/movable/Obj, var/atom/OldLoc) //Implemented here because forceMove() doesn't call Move() . = ..() if (Obj && OldLoc != src) for (var/datum/light_source/L in Obj.light_sources) // Cycle through the light sources on this atom and tell them to update. L.source_atom.update_light() /atom/Exited(var/atom/movable/Obj, var/atom/newloc) . = ..() if (!newloc && Obj && newloc != src) // Incase the atom is being moved to nullspace, we handle queuing for a lighting update here. for (var/datum/light_source/L in Obj.light_sources) // Cycle through the light sources on this atom and tell them to update. L.source_atom.update_light()