feat(03-01): wire GravityApplier into RegionTickLoop + plugin (Task 2)

- RegionTickLoop gagne un constructeur 3-args (registry, gravityApplier, errorHandler)
- Ancien constructeur 2-args conservé pour rétrocompat des tests Phase 02
- Tick body appelle gravityApplier.apply(w, registry.currentSnapshot(w)) après refreshFor
- GravityFlipPlugin.start() construit l'applier et l'injecte dans le tickLoop
- Log de démarrage mis à jour: 'gravity inversion active'
This commit is contained in:
2026-04-23 10:32:28 +02:00
parent ef3f398c55
commit f7dcc7d59a
2 changed files with 16 additions and 2 deletions
@@ -6,6 +6,7 @@ import com.hypixel.hytale.server.core.universe.Universe;
import com.hypixel.hytale.server.core.universe.world.World; import com.hypixel.hytale.server.core.universe.world.World;
import com.hypixel.hytale.server.core.util.Config; import com.hypixel.hytale.server.core.util.Config;
import com.mythlane.gravityflip.config.GravityFlipConfig; import com.mythlane.gravityflip.config.GravityFlipConfig;
import com.mythlane.gravityflip.physics.GravityApplier;
import com.mythlane.gravityflip.region.RegionRegistry; import com.mythlane.gravityflip.region.RegionRegistry;
import com.mythlane.gravityflip.tick.RegionTickLoop; import com.mythlane.gravityflip.tick.RegionTickLoop;
@@ -36,6 +37,7 @@ public class GravityFlipPlugin extends JavaPlugin {
private RegionRegistry registry; private RegionRegistry registry;
private RegionTickLoop tickLoop; private RegionTickLoop tickLoop;
private GravityApplier gravityApplier;
public GravityFlipPlugin(JavaPluginInit init) { public GravityFlipPlugin(JavaPluginInit init) {
super(init); super(init);
@@ -61,7 +63,9 @@ public class GravityFlipPlugin extends JavaPlugin {
super.start(); super.start();
GravityFlipConfig cfg = configHolder.get(); GravityFlipConfig cfg = configHolder.get();
this.registry = new RegionRegistry(cfg, configHolder); this.registry = new RegionRegistry(cfg, configHolder);
this.tickLoop = new RegionTickLoop(registry, th -> this.gravityApplier = new GravityApplier(th ->
getLogger().at(Level.WARNING).withCause(th).log("gravityApply failed"));
this.tickLoop = new RegionTickLoop(registry, gravityApplier, th ->
getLogger().at(Level.WARNING).withCause(th).log("detectTick failed")); getLogger().at(Level.WARNING).withCause(th).log("detectTick failed"));
// Lazy world resolution — see setup() comment. // Lazy world resolution — see setup() comment.
@@ -81,7 +85,7 @@ public class GravityFlipPlugin extends JavaPlugin {
} catch (Throwable ignored) { /* manual shutdown() fallback */ } } catch (Throwable ignored) { /* manual shutdown() fallback */ }
getLogger().at(Level.INFO).log( getLogger().at(Level.INFO).log(
"Gravity Flip enabled — %d region(s) loaded, detector @100ms", "Gravity Flip enabled — %d region(s) loaded, detector @100ms, gravity inversion active",
cfg.getRegions().size()); cfg.getRegions().size());
} }
@@ -1,6 +1,7 @@
package com.mythlane.gravityflip.tick; package com.mythlane.gravityflip.tick;
import com.hypixel.hytale.server.core.universe.world.World; import com.hypixel.hytale.server.core.universe.world.World;
import com.mythlane.gravityflip.physics.GravityApplier;
import com.mythlane.gravityflip.region.RegionRegistry; import com.mythlane.gravityflip.region.RegionRegistry;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
@@ -32,9 +33,15 @@ public final class RegionTickLoop {
private volatile ScheduledFuture<?> future; private volatile ScheduledFuture<?> future;
private final Consumer<Throwable> errorHandler; private final Consumer<Throwable> errorHandler;
private final RegionRegistry registry; private final RegionRegistry registry;
private final GravityApplier gravityApplier;
public RegionTickLoop(RegionRegistry registry, Consumer<Throwable> errorHandler) { public RegionTickLoop(RegionRegistry registry, Consumer<Throwable> errorHandler) {
this(registry, null, errorHandler);
}
public RegionTickLoop(RegionRegistry registry, GravityApplier gravityApplier, Consumer<Throwable> errorHandler) {
this.registry = registry; this.registry = registry;
this.gravityApplier = gravityApplier;
this.errorHandler = errorHandler == null ? t -> {} : errorHandler; this.errorHandler = errorHandler == null ? t -> {} : errorHandler;
this.scheduler = Executors.newSingleThreadScheduledExecutor(r -> { this.scheduler = Executors.newSingleThreadScheduledExecutor(r -> {
Thread t = new Thread(r, "GravityFlip-Detect"); Thread t = new Thread(r, "GravityFlip-Detect");
@@ -65,6 +72,9 @@ public final class RegionTickLoop {
World w = worldSupplier.get(); World w = worldSupplier.get();
if (w == null) return; if (w == null) return;
registry.refreshFor(w); registry.refreshFor(w);
if (gravityApplier != null) {
gravityApplier.apply(w, registry.currentSnapshot(w));
}
}; };
scheduleGuarded(initialDelayMs, tick); scheduleGuarded(initialDelayMs, tick);
} }