108 lines
6.2 KiB
Markdown
108 lines
6.2 KiB
Markdown
# LIGHT-01 — éclairage dynamique, beta.030
|
||
|
||
## Contrat
|
||
|
||
Les objets lumineux tenus en main principale ou secondaire, les cosmétiques de
|
||
tête et les objets jetés éclairent le décor et les entités. Les autres joueurs
|
||
sont des sources au même titre que soi. Un gâteau coiffé d'une bougie n'éclaire
|
||
que si sa bougie est allumée ; les états des blocs font autorité.
|
||
|
||
L'effet est visuel côté client, sans bloc artificiel, modification de sauvegarde
|
||
ou changement des règles de spawn. La lumière utilise la teinte native de la
|
||
lightmap ; ce ticket ne crée pas de lumière colorée ni d'ombres dynamiques.
|
||
|
||
Les objets jetés dans une cellule de 4 × 4 × 4 blocs partagent une source :
|
||
l'objet le plus lumineux la représente, à une position arrondie au demi-bloc.
|
||
Les quantités des piles ne multiplient pas la lumière. Les sources immobiles
|
||
ne provoquent pas de reconstructions répétées du terrain. Les calculs utilisent
|
||
un instantané immuable indexé par section et une file de sections dédupliquée,
|
||
traitée avec un budget par tick, sans chargement de chunks.
|
||
|
||
## Utilisation et réglages
|
||
|
||
L'effet est activé de base, sans aptitude. Il suit aussi les objets lumineux
|
||
tenus par les créatures, leurs équipements de tête et les entités en feu.
|
||
Les inventaires fermés, coffres et rangées non sélectionnées ne sont pas des
|
||
sources. Les spectateurs n'éclairent pas les autres joueurs.
|
||
|
||
`config/sanctuary-dynamic-lights.json` est créé localement au premier lancement.
|
||
Le redémarrage du client applique les changements :
|
||
|
||
| Réglage | Valeur initiale | Rôle |
|
||
| --- | ---: | --- |
|
||
| `enabled` | `true` | Active l'éclairage visuel |
|
||
| `updateIntervalTicks` | 4 | Collecte des objets cinq fois par seconde à 20 TPS client |
|
||
| `dropClusterSize` | 4 | Taille des cellules de regroupement des objets jetés |
|
||
| `maxSources` | 32 | Sources les plus proches ; celle du joueur local est prioritaire |
|
||
| `range` | 48 | Distance maximale de collecte autour de la caméra, en blocs |
|
||
| `sectionUpdatesPerTick` | 12 | Maximum de sections marquées à mettre à jour par tick |
|
||
| `itemOverrides` | `{}` | Intensité 0–15 par identifiant d'objet, par exemple `"mod:lampe": 12` |
|
||
|
||
Les réglages numériques sont bornés pour éviter un coût accidentel démesuré.
|
||
Contrôles → Sanctuary propose également « Activer / désactiver les lumières
|
||
dynamiques », sans touche attribuée par défaut. Ce raccourci agit pour la session.
|
||
Une désactivation éteint aussi les sections précédemment éclairées.
|
||
|
||
Les objets-blocs utilisent leur émission native et leur composant `BLOCK_STATE`.
|
||
Les bougies colorées et les gâteaux composites utilisent exactement l'état
|
||
synchronisé du cosmétique. Hors blocs, le seau de lave émet 15, bâton/poudre de
|
||
Blaze 10, poudre lumineuse/baies lumineuses 8, poche d'encre luisante/cadre
|
||
luminescent 6. Une surcharge d'objet remplace explicitement ce comportement,
|
||
y compris son état allumé/éteint ; 0 permet d'exclure un objet.
|
||
|
||
## Portée technique
|
||
|
||
Le rendu natif de Minecraft **26.3-pre-2** reçoit des coordonnées de lightmap
|
||
enrichies : terrain et occlusion ambiante, eau, particules, blocs-entités et
|
||
entités. La lumière du ciel et les surfaces déjà lumineuses sont préservées.
|
||
Les tâches de reconstruction reçoivent chacune un instantané immuable.
|
||
Les changements de monde et déconnexions abandonnent les sources précédentes.
|
||
|
||
La décroissance est radiale, avec la lightmap habituelle de Minecraft : elle
|
||
ne calcule pas d'occultation par les murs ni de couleur propre à chaque lampe.
|
||
Les sources distantes au-delà du rayon ou du budget sont ignorées ; beaucoup
|
||
de sources mobiles peuvent rendre leur suivi plus progressif. Un mouvement
|
||
de caméra seul ne change pas la position d'une lampe portée.
|
||
|
||
## Vérifications
|
||
|
||
- Contrôles CPU : 10 000 objets dans une même cellule donnent une seule source,
|
||
plafonnement des sources, priorité locale, coordonnées négatives, sections
|
||
dédupliquées, budget strict, aucune invalidation après 500 mises à jour
|
||
immobiles, déplacement, suppression et conservation des instantanés des workers.
|
||
- 100 000 requêtes d'éclairage comparées à une référence brute sans index :
|
||
mêmes résultats. Sur ce Mac M1, un million de requêtes sur l'index de stress
|
||
prennent 20–26 ms sur les exécutions de vérification ; c'est une mesure CPU
|
||
isolée, pas un résultat FPS.
|
||
- Client natif réussi (`build/dynamic030-client-final.log`) : pièce fermée
|
||
sombre, torche principale, lanterne des âmes secondaire, bloc lumineux sur
|
||
la tête, gâteau allumé puis éteint, autre joueur avec lanterne, déplacement
|
||
du porteur et suppression des objets. Les coordonnées de lumière du moteur
|
||
de monde restent à zéro alors que le maillage et les entités s'éclairent.
|
||
- 200 torches jetées fusionnent naturellement en quatre piles, toutes servies
|
||
par une seule source. Le courant déplace les objets ; l'éclairage les suit.
|
||
Après leur retrait, l'image redevient sombre. Neuf captures sont conservées
|
||
dans `build/dynamic030-evidence/`.
|
||
|
||
- `./gradlew check build assemblePack -PsanctuaryFocusedTests=lights,cosmetics,familiarhit -PsanctuaryExpansionReload=true`
|
||
réussit : **21 tests serveur**, dont le registre complet des objets-blocs,
|
||
les états de bougies, le gâteau manipulé par un habitant et sa synchronisation.
|
||
Les régressions des cosmétiques et réactions des familiers passent également.
|
||
Log : `build/dynamic030-check.log`.
|
||
- Le client natif est lancé avec `./gradlew :sanctuary:runClientGameTest
|
||
-PsanctuaryClientTests=true -PsanctuaryLightsClientTests=true
|
||
-PsanctuaryFocusedTests=lights`. Le dernier parcours complet réussit.
|
||
|
||
## Livraison locale
|
||
|
||
[Sanctuary-beta.030.mrpack](../build/Sanctuary-beta.030.mrpack), 4 792 058 octets.
|
||
Version interne `beta.030`. Les 1 269 classes compilées correspondent au JAR
|
||
embarqué ; aucune classe de test n'est distribuée. Le JAR JEI et les classes
|
||
Demeure sont identiques à beta.029. Les classes existantes de Sanctuary restent
|
||
identiques, hors l'initialiseur qui enregistre l'éclairage. L'archive beta.029
|
||
est préservée.
|
||
|
||
SHA-256 : `7942c661cbb01b5d0e4b6a59d9839e450223ab57aa3d45297c6816e884d70e80`.
|
||
Reçu : `build/dynamic030-artifact.json`. Export local vérifié, sans publication
|
||
du canal ni installation dans Prism.
|