fix(gravity): wrap forEachEntityParallel dans world.execute (WorldThread assert)
- GravityApplier.apply dispatche via world.execute(Runnable) pour satisfaire assertThread de Store.forEachEntityParallel - PASS 1, PASS 2 et update tracker exécutés dans le même Runnable (cohérence intra-tick) - Null-guards conservés avant le dispatch - Amendement D-04 du plan 03-01 : world.execute requis côté initiation
This commit is contained in:
@@ -78,6 +78,15 @@ public final class GravityApplier {
|
||||
/** Tick entry point. NO-OP si world ou snapshot est null. */
|
||||
public void apply(World world, RegionSnapshot snapshot) {
|
||||
if (world == null || snapshot == null) return;
|
||||
// THREADING (fix WorldThread assert 2026-04-23) : `Store.forEachEntityParallel` exige
|
||||
// d'être initié depuis la WorldThread (assertThread @Store.java:2362). Le tick loop tourne
|
||||
// sur `GravityFlip-Detect` (ScheduledExecutorService) → on dispatch tout le travail ECS
|
||||
// via `world.execute(Runnable)`. Le CommandBuffer reste utilisé côté mutations, mais
|
||||
// ne résout PAS l'assert côté appelant (amendement D-04 du plan 03-01).
|
||||
world.execute(() -> applyOnWorldThread(world, snapshot));
|
||||
}
|
||||
|
||||
private void applyOnWorldThread(World world, RegionSnapshot snapshot) {
|
||||
Collection<GravityFlipRegion> enabledRegions = snapshot.byRegion().keySet();
|
||||
// Stratégie figée (cf. WARNING 1 résolu) : on accepte la duplication du containsPosition
|
||||
// (cf. must_haves trade-off) plutôt que de coupler à un nouveau contrat RegionSnapshot
|
||||
|
||||
Reference in New Issue
Block a user