From af02e1968513cb0449a9ab37c6903355878b200b Mon Sep 17 00:00:00 2001 From: kayjaydee Date: Thu, 23 Apr 2026 11:48:29 +0200 Subject: [PATCH] fix(gravity): wrap forEachEntityParallel dans world.execute (WorldThread assert) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 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 --- .../com/mythlane/gravityflip/physics/GravityApplier.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/main/java/com/mythlane/gravityflip/physics/GravityApplier.java b/src/main/java/com/mythlane/gravityflip/physics/GravityApplier.java index 8539594..eb7a375 100644 --- a/src/main/java/com/mythlane/gravityflip/physics/GravityApplier.java +++ b/src/main/java/com/mythlane/gravityflip/physics/GravityApplier.java @@ -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 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