diff --git a/src/main/java/com/mythlane/gravityflip/wand/spike/WandAssetSpike.java b/src/main/java/com/mythlane/gravityflip/wand/spike/WandAssetSpike.java new file mode 100644 index 0000000..7720566 --- /dev/null +++ b/src/main/java/com/mythlane/gravityflip/wand/spike/WandAssetSpike.java @@ -0,0 +1,71 @@ +package com.mythlane.gravityflip.wand.spike; + +/** + *

04-00 Spike artifact — NOT WIRED INTO THE PLUGIN.

+ * + *

This class is intentionally not referenced from + * {@code GravityFlipPlugin}. It exists purely as an executable-looking + * documentation of the empirical investigation that produced + * {@code .planning/phases/04-wand-commands/04-00-SPIKE-RESULT.md}. + * + *

Locked decision (see SPIKE-RESULT.md): we will not register + * a brand-new {@code Item} asset store from a plugin — no decompiled builtin + * plugin does that, and it risks duplicating the core's Item store. Instead, + * Plan 04-01 will: + * + *

    + *
  1. Subclass {@link com.hypixel.hytale.server.core.modules.interaction.interaction.config.SimpleInstantInteraction} + * as {@code GravityFlipWandInteraction} with its own {@code BuilderCodec}.
  2. + *
  3. In {@code GravityFlipPlugin.setup()}, call: + *
    {@code
    + *       getCodecRegistry(Interaction.CODEC)
    + *           .register("GravityFlipWand",
    + *                     GravityFlipWandInteraction.class,
    + *                     GravityFlipWandInteraction.CODEC);
    + *       }
    + * This is the pattern used by PortalsPlugin:74, CreativeHubPlugin:149, + * InstancesPlugin:158, CraftingPlugin:130, TeleporterPlugin:73, + * ObjectivePlugin:210-211 — 8+ builtin precedents.
  4. + *
  5. Plan 04-02 will identify the concrete vanilla itemID to hand out in + * {@code /gravityflip wand} by iterating + * {@code Item.getAssetStore().getAssetMap()} at runtime (disposable + * probe), then hardcode the chosen itemID (likely a hatchet/axe variant + * that already exposes Primary + Secondary interactions).
  6. + *
+ * + *

The code below is illustrative only. It compiles against stubs in + * javadoc and is not invoked. Delete this class at the start + * of Plan 04-01. + * + *

Why VANILLA_COPY and not a brand-new Item JSON?

+ * + *

Hypothesised pattern (rejected): + *

{@code
+ * // UNPROVEN: no builtin plugin does this for Item.class.
+ * getAssetRegistry().register(
+ *     HytaleAssetStore.builder(Item.class, Item.ASSET_MAP)
+ *                     .setPath("Items")
+ *                     .build());
+ * }
+ * + *

User-confirmed pattern (adopted): + *

+ * « On peut copier un item vanilla genre la hache et changer des propriétés + * genre couleur etc. » — 2026-04-23 + *
+ * + *

Copy an existing vanilla item (hatchet / pickaxe / sword — anything + * exposing {@code Primary} + {@code Secondary}) and hijack the click + * behaviour via the {@code Interaction.CODEC} registry. Visual polish + * (custom colour / display name) can be layered later without blocking v1. + */ +public final class WandAssetSpike { + + /** Not callable. Not invoked. Documentation-only. */ + private WandAssetSpike() { + throw new UnsupportedOperationException( + "WandAssetSpike is a 04-00 documentation artifact. " + + "See .planning/phases/04-wand-commands/04-00-SPIKE-RESULT.md. " + + "Delete this class at the start of Plan 04-01."); + } +}