Soleil, ciel et brouillard

La bibliothèque env change l'ambiance de la map en cours : position, couleur et force du soleil, couleurs du ciel ou ciel panoramique, heure de la journée (avec un cycle jour / nuit), lumière ambiante et brouillard.

Serveur ou client ?

Rien n'est enregistré dans la map : à l'arrêt des scripts (fin de partie, changement de map, rechargement), la map retrouve ses propres réglages. Chaque fonction Set… lance le hook EnvChanged dans le realm qui l'appelle (et, pour un appel serveur, aussi côté client chez chaque joueur).

Éclairage précalculéSur une map .pcmap dont l'éclairage précalculé inclut le soleil et le ciel, les blocs gardent la lumière calculée : seuls le ciel, le décor, les props et les joueurs suivent le nouveau soleil.

Le soleil

env.SetSunAngle(hauteur, direction)

hauteur : degrés au-dessus de l'horizon (0 = à l'horizon, 90 = tout en haut, négatif = sous l'horizon : le soleil s'éteint en dessous de −5). direction (facultatif) : cap en degrés, de 0 à 360, d'où vient le soleil (le même que Direction du soleil de l'éditeur de map). Sans direction, le cap actuel est gardé.

env.SetSunColor(couleur) et env.SetSunBrightness(force)

Couleur (Color(r, g, b), de 0 à 255) et force de la lumière du soleil (1 = normal, 0 = éteint, jusqu'à 64).

-- Soleil rasant et orangé, venant de l'ouest
env.SetSunAngle(10, 270)
env.SetSunColor(Color(255, 150, 80))
env.SetSunBrightness(1.4)

Le ciel et l'heure

env.SetSkyColor(haut, horizon)

Couleur du haut du ciel et, facultatif, de l'horizon (aussi utilisée sous l'horizon). Les nuages restent.

env.SetSkyTime(heure)

Heure de la journée, de 0 à 24 (décimales permises : 18.5 = 18 h 30). Comme le réglage Heure de l'éditeur de map : le soleil se lève à 6 h, monte jusqu'à 70° à midi, se couche à 18 h ; il devient orangé près de l'horizon, s'éteint la nuit et le ciel s'assombrit. Un SetSunAngle appelé ensuite garde l'heure (luminosité, couleurs) mais impose sa hauteur ; un nouveau SetSkyTime reprend la hauteur de l'heure.

env.SetSkyTexture(chemin, rotation)

Remplace le ciel calculé et ses nuages par une image panoramique (équirectangulaire, proportions 2:1 ; .png, .jpg, .webp ou .hdr, 16384 px de côté au plus). chemin s'écrit comme pour Material : relatif aux dossiers materials/ du gamemode et des addons activés ("skybox/coucher.jpg"), ou en entier : "addon:<clé de l'addon>/materials/skybox/<fichier>" (la forme qu'enregistre l'éditeur de map, ex. "addon:ws_3456789012/materials/skybox/coucher.jpg"). rotation (facultatif) : degrés autour de l'axe vertical ; sans elle, la rotation déjà en place est gardée (0 la première fois). nil ou "" remet le ciel calculé. Le panorama suit la luminosité du cycle jour / nuit.

Comme pour un modèle, chaque joueur doit avoir l'addon qui contient l'image (dépendance Workshop) : côté client, une image introuvable écrit une erreur dans la console et le ciel calculé reste.

-- Serveur : materials/skybox/coucher.jpg d'un addon activé, tourné de 90°
env.SetSkyTexture("skybox/coucher.jpg", 90)

-- Plus tard : retour au ciel de la map
env.SetSkyTexture(nil)

env.SetTimeScale(vitesse)

Fait avancer l'heure toute seule. 1 = temps réel, 60 = une heure de jeu par minute (journée de 24 minutes), 0 = arrêt. Une valeur négative remonte le temps. Sans SetSkyTime avant, l'horloge part de l'heure de la map. Côté serveur, les joueurs sont resynchronisés toutes les 10 secondes.

-- Cycle jour / nuit : une journée complète toutes les 20 minutes, en partant de 7 h
env.SetSkyTime(7)
env.SetTimeScale(72)

Lumière ambiante et brouillard

env.SetAmbient(couleur, force, partCiel)

Lumière qui éclaire tout, même à l'ombre. force (facultatif) : 1 = normal. partCiel (facultatif, de 0 à 1) : part de la lumière qui vient encore du ciel ; avec une couleur et sans partCiel, elle vaut 0 (toute la lumière ambiante a ta couleur).

env.SetFog(actif, couleur, densité)

Brouillard en profondeur. couleur et densité sont facultatifs (les valeurs de la map sont gardées). Densité de 0 à 1 : 0.01 = brume légère, 0.05 = brouillard épais, 0.2 = on ne voit presque plus rien. Le brouillard volumétrique des réglages graphiques n'est pas touché.

-- Nuit de brouillard pour une manche d'horreur
env.SetSkyTime(23)
env.SetAmbient(Color(40, 50, 80), 0.6)
env.SetFog(true, Color(20, 25, 35), 0.06)

Lire les valeurs

Valeurs en effet : celles de la map, puis celles du serveur, puis (côté client) celles du client.

FonctionRenvoie
env.GetSunAngle()hauteur, direction (avec SetSkyTime, la hauteur de l'heure, au moins 2°)
env.GetSunColor()Color
env.GetSunBrightness()nombre (sans la baisse de la nuit)
env.GetSkyColor()haut, horizon
env.GetSkyTexture()chemin, rotation du panorama ("" pour le ciel calculé)
env.GetSkyTime()heure de 0 à 24 (si aucun script ne l'a fixée : celle de la map, ou estimée d'après son soleil)
env.GetTimeScale()vitesse de l'horloge (0 = arrêtée)
env.GetAmbient()couleur, force, partCiel
env.GetFog()actif, couleur, densité

Exemple : nuit pendant les manches

-- lua/autorun/server/nuit.lua
hook.Add("Initialize", "nuit_manche", function()
	timer.Create("nuit_manche", 300, 0, function()
		local nuit = env.GetSkyTime() < 20 and env.GetSkyTime() > 5
		env.SetSkyTime(nuit and 22 or 9)
		PrintMessage(nuit and "La nuit tombe…" or "Le jour se lève.")
	end)
end)

-- lua/autorun/client/nuit.lua
hook.Add("EnvChanged", "nuit_manche", function(quoi)
	if quoi == "sky_time" then sound.Play("physicore/bip.wav", LocalPlayer():GetPos()) end
end)

Valeurs de quoi pour EnvChanged : "sun_angle", "sun_color", "sun_brightness", "sky_color", "sky_texture", "sky_time", "time_scale", "ambient", "fog". L'horloge qui avance toute seule ne le lance pas.