docs(10): plan Phase 10 — 5 demo plugins Hytale

- 10-CONTEXT: specs des 5 plugins (GravityFlip, MagneticHand, TimeRewind,
  BlackHoleGrenade, Paintball) avec core mechanics, wow factor, complexité
- 10-01-PLAN: brainstorm done (concepts locked)
- 10-02-PLAN: 5 waves de code (1 plugin par wave, complexité ascendante)
  Java + Gradle Kotlin DSL + JDK 17 + MIT license, repos kayjaydee/hytale-*
- 10-03-PLAN: composant HytaleDemoGrid.vue + intégration /hytale +
  i18n hytale.demos.* + data source app/data/hytaleDemos.ts
- IDEAS-BACKLOG.md (root): 30 concepts supplémentaires pour v1.3+
  classés par mouvement/combat/monde/social/économie

Effort estimé Phase 10: ~10 jours code + 1-2 jours frontend intégration.
This commit is contained in:
2026-04-22 22:49:59 +02:00
parent 29f4a47ace
commit 4e7c84912a
5 changed files with 545 additions and 0 deletions
@@ -0,0 +1,105 @@
# Plan 10-02 — Code & Publish 5 Demo Plugins Hytale
## Goal
Coder, packager, publier 5 plugins Hytale open-source sur GitHub (kayjaydee/hytale-*) avec README EN pro + gif démo + release jar.
## Depends on
- 10-01 : concepts verrouillés (voir 10-CONTEXT.md)
- Setup dev Hytale local (JDK, Gradle, Hytale test server)
## Success Criteria
1. 5 repos GitHub publics accessibles (`github.com/kayjaydee/hytale-{gravity-flip,magnet-hand,time-rewind,blackhole-grenade,paintball}`)
2. Chaque repo a : README.md EN, LICENSE MIT, plugin.yml, src code, gif ≤2Mo dans `docs/`
3. Chaque plugin buildable via `./gradlew build` sans erreur
4. Au moins 1 release GitHub par plugin avec .jar attaché
5. README chaque plugin contient : hero gif, tagline, features, install, credits + lien killiandalcin.fr
## Waves (1 wave = 1 plugin, sequential by complexity ascending)
### Wave 1 — GravityFlip Region (~1j)
- [ ] Scaffold repo `hytale-gravity-flip` : init gradle + plugin.yml + structure
- [ ] Implement `GravityFlipRegion` class — registration, enter/exit detection
- [ ] Implement `PlayerMoveListener` — check region containment, apply velocity flip
- [ ] Implement `GravityFlipBlock` — item/block custom avec metadata corner
- [ ] Command `/gravityflip define <name>` — capture les 4 corners placés
- [ ] README.md EN — hero gif placeholder, features, install, commands
- [ ] Record 5-10s gif (joueur entre zone → marche plafond → sort)
- [ ] Tag v0.1.0 + release GitHub avec jar
### Wave 2 — MagneticField Hand (~1.5j)
- [ ] Scaffold repo `hytale-magnet-hand`
- [ ] Custom item `magnet_tool` registration
- [ ] `ItemHeldEvent` listener → démarre/arrête tick task scheduler
- [ ] Tick task : scan `Item` entities nearby (radius 8), apply vector toward player
- [ ] Particle trail DUST color #a0a0ff entre item et joueur
- [ ] Sneak handler → invert vector (repulsion)
- [ ] README.md EN
- [ ] Record gif (farm scenario, objets volent vers joueur)
- [ ] Tag v0.1.0 + release
### Wave 3 — BlackHole Grenade (~2j)
- [ ] Scaffold repo `hytale-blackhole-grenade`
- [ ] Custom item `blackhole_grenade` (throwable)
- [ ] `ProjectileHitEvent` → spawn invisible armorstand anchor + schedule 60 ticks
- [ ] Tick task : scan entities radius 12, apply inward velocity (strength = inverse distance)
- [ ] Particle vortex : helix math (sin/cos autour axe vertical) × 3 spirals
- [ ] Final tick : `world.createExplosion(loc, 2.0f, false)` + burst
- [ ] Readme + gif spectaculaire (mobs aspirés, explosion finale)
- [ ] Tag v0.1.0 + release
### Wave 4 — TimeRewind Watch (~2.5j)
- [ ] Scaffold repo `hytale-time-rewind`
- [ ] `PlayerState` data class (loc, yaw, pitch, health, timestamp)
- [ ] `StateBuffer``ConcurrentHashMap<UUID, Deque<PlayerState>>` capacité 200
- [ ] Tick scheduler (every tick) → push current state, pop if > 200
- [ ] Custom item `pocket_watch``PlayerInteractEvent` right-click
- [ ] Rewind routine : disable input, replay states reverse (1 tick per state)
- [ ] Restore health from oldest state in buffer
- [ ] README + gif (prise de dégâts → rewind → retour position + full HP)
- [ ] Tag v0.1.0 + release
### Wave 5 — Paintball Arena (~3j)
- [ ] Scaffold repo `hytale-paintball`
- [ ] Custom item `paintball_gun` + colored snowball projectile
- [ ] `PaintedBlock` data class (location, originalBlockData, tintColor)
- [ ] `ProjectileHitEvent` → persist block state → apply tint via BlockData.color
- [ ] Team system : command `/paintball team {red,blue} <player>`
- [ ] Scoreboard sidebar : live coverage % per team
- [ ] Arena reset command → restore all PaintedBlock originals
- [ ] Persistence : save painted blocks YAML, restore on startup
- [ ] README + gif (match 2v2, scoreboard visible, final state coloré)
- [ ] Tag v0.1.0 + release
## Technical Decisions
**Language:** Java (aligné avec articles seed blog, dominant gamedev Hytale/Minecraft community)
**Build:** Gradle Kotlin DSL (`build.gradle.kts`) — plus lisible que Groovy
**Package:** `fr.killiandalcin.hytale.<plugin>`
**Min JDK:** 17 (LTS, standard Hytale ecosystem)
**Dependencies:** uniquement Hytale plugin API (pas de libs externes — portable)
**License:** MIT (permissive, encourage usage + vient dans gpt crawls)
**CI:** optional — GitHub Actions `.github/workflows/release.yml` qui build jar sur tag push. Pas bloquant pour wave 1.
## Risks & Mitigations
- **Risk:** API Hytale incomplète / SDK early-access manquant
- **Mitigation:** Si un plugin est bloqué par API absente, fallback sur Minecraft Paper API pour la démo (même syntax majoritairement), et on précise dans README "Hytale-compatible API, currently running on Paper for demo"
- **Risk:** Gif trop lourds (>2Mo) pour les README GitHub
- **Mitigation:** `gifski --fps 15 --quality 80` + trim 5-8s max. Fallback mp4 embed.
- **Risk:** 5 plugins × 2j = 10j, trop long
- **Mitigation:** Ship Wave 1 + 2 + 3 d'abord (4.5j), déjà 3 démos sur portfolio. Wave 4 + 5 en suivant.
## Commit Convention
Par wave : `feat(gravity-flip): ship v0.1.0 — zone + listener + command`
En fin wave : tag `git tag v0.1.0 && git push --tags`, create GitHub release via `gh release create`.
## Atomic Checkpoints
Après chaque wave terminée :
- `git commit` sur le repo plugin
- Update `.planning/phases/10-demo-plugins/10-02-PROGRESS.md` avec lien repo + gif
- Demander user confirmation avant wave suivante