feat(04-01): register GravityFlipWand interaction + item JSON (WAND-01, WAND-02)

- GravityFlipWandInteraction extends SimpleInstantInteraction; Primary/Secondary
  routed through firstRun(), writes to WandSelectionStore via volatile bindStore()
- Items/gravityflip_wand.json: Utility item (Icon Torch_Fire) whose Primary and
  Secondary Interactions reference Type=GravityFlipWand
- GravityFlipPlugin.setup(): constructs WandSelectionStore, injects it into the
  interaction class, then registers via getCodecRegistry(Interaction.CODEC)
  (pattern from InstancesPlugin:158 / ExitInstanceInteraction)
- Expose wandSelections() getter for Phase 04-02+ commands
This commit is contained in:
2026-04-23 18:51:13 +02:00
parent e0a329480a
commit ae0e2064dc
3 changed files with 159 additions and 0 deletions
@@ -15,6 +15,9 @@ import com.mythlane.gravityflip.region.GravityFlipRegion;
import com.mythlane.gravityflip.region.RegionRegistry;
import com.mythlane.gravityflip.tick.RegionTickLoop;
import com.mythlane.gravityflip.viz.RegionVisualizer;
import com.mythlane.gravityflip.wand.GravityFlipWandInteraction;
import com.mythlane.gravityflip.wand.WandSelectionStore;
import com.hypixel.hytale.server.core.modules.interaction.interaction.config.Interaction;
import java.util.concurrent.ScheduledFuture;
import java.util.logging.Level;
@@ -46,6 +49,7 @@ public class GravityFlipPlugin extends JavaPlugin {
private GravityApplier gravityApplier;
private FallDamageGuard fallDamageGuard;
private RegionVisualizer regionVisualizer;
private WandSelectionStore wandSelectionStore;
public GravityFlipPlugin(JavaPluginInit init) {
super(init);
@@ -69,6 +73,18 @@ public class GravityFlipPlugin extends JavaPlugin {
getEntityStoreRegistry().registerSystem(new FallDamageSuppressorSystem(
fallDamageGuard,
th -> getLogger().at(Level.WARNING).withCause(th).log("fallDamageSuppressor handle failed")));
// Plan 04-01 : Gravity Flip wand.
// Interaction binding pattern per 04-00 SPIKE-RESULT (Finding 3) — same shape as
// InstancesPlugin.java:158 / ExitInstanceInteraction. The JSON Item at
// src/main/resources/Items/gravityflip_wand.json references this Type in
// Interactions.Primary / Interactions.Secondary.
this.wandSelectionStore = new WandSelectionStore();
GravityFlipWandInteraction.bindStore(this.wandSelectionStore);
getCodecRegistry(Interaction.CODEC).register(
"GravityFlipWand",
GravityFlipWandInteraction.class,
GravityFlipWandInteraction.CODEC);
}
@Override
@@ -151,6 +167,14 @@ public class GravityFlipPlugin extends JavaPlugin {
/** Exposed for Phase 3 (gravity physics) and Phase 4 (commands). */
public RegionRegistry regions() { return registry; }
/**
* Per-player wand selection store. Populated by
* {@link GravityFlipWandInteraction}; consumed by
* {@code /gravityflip define} (Phase 04-02+).
* <p>Returns {@code null} until {@link #setup()} has run.
*/
public WandSelectionStore wandSelections() { return wandSelectionStore; }
/**
* Accessor for the region config holder. <strong>SAVE CONTRACT:</strong> any
* caller that mutates {@code configHolder().get().getRegions()} MUST call