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. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,32 @@
|
||||
# Plan 10-01 — Brainstorm & Select Plugin Concepts
|
||||
|
||||
## Goal
|
||||
|
||||
Sélectionner 2-5 concepts de plugins Hytale pour Phase 10, documenter les specs rapides de chaque.
|
||||
|
||||
## Outcome (shipped 2026-04-22)
|
||||
|
||||
**Décision user : ship les 5 concepts proposés** (pas de coupe, ambition full batch).
|
||||
|
||||
Specs complètes dans `10-CONTEXT.md` :
|
||||
1. **GravityFlip Region** — ~1j — gravité inversée dans zone définie
|
||||
2. **MagneticField Hand** — ~1.5j — item magnet qui attire drops
|
||||
3. **TimeRewind Watch** — ~2.5j — rewind 10s de gameplay
|
||||
4. **BlackHole Grenade** — ~2j — trou noir + explosion
|
||||
5. **Paintball Arena** — ~3j — mini-jeu PvP avec scoring team
|
||||
|
||||
Total effort estimé : ~10j répartis sur plusieurs semaines.
|
||||
|
||||
## Backlog (future milestones)
|
||||
|
||||
30 concepts supplémentaires documentés dans `IDEAS-BACKLOG.md` (root du repo) pour alimenter v1.3+.
|
||||
|
||||
## Success Criteria
|
||||
|
||||
- [x] 5 concepts verrouillés avec repo names, core mechanics, wow factor assessment
|
||||
- [x] Backlog 30 idées pour pipeline long terme
|
||||
- [x] Technical decisions captées (Java, Gradle Kotlin DSL, JDK 17, MIT license)
|
||||
|
||||
## Next
|
||||
|
||||
Lancer Plan 10-02 (code & publish les 5 plugins par waves).
|
||||
@@ -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
|
||||
@@ -0,0 +1,112 @@
|
||||
# Plan 10-03 — HytaleDemoGrid Component + /hytale Integration
|
||||
|
||||
## Goal
|
||||
|
||||
Afficher sur `/hytale` une section "Live Demos" présentant les 5 plugins de Phase 10 (ou ceux déjà shippés), avec screenshot/gif + description + lien GitHub + tag techno.
|
||||
|
||||
## Depends on
|
||||
|
||||
- Plan 10-02 Wave 1 minimum (au moins 1 plugin publié) pour avoir du contenu réel
|
||||
- Peut être développé en parallèle avec placeholder data au début
|
||||
|
||||
## Success Criteria
|
||||
|
||||
1. Composant `HytaleDemoGrid.vue` créé dans `app/components/`, auto-importé
|
||||
2. Section "Live Demos" visible sur `/hytale` (FR + EN), SSR rendu
|
||||
3. Chaque card affiche : image/gif, titre, description 1 phrase, tag techno, lien GitHub (externe `rel="noopener"`), wow factor indicator optionnel
|
||||
4. Data source centralisée : `app/data/hytaleDemos.ts` typé avec `HytaleDemo` interface
|
||||
5. i18n `hytale.demos.*` ajouté dans `fr.json` + `en.json` (title, subtitle, empty state)
|
||||
6. Responsive : grille 1 col mobile, 2 cols tablet, 3 cols desktop
|
||||
7. Typecheck vert : `pnpm typecheck` exit 0
|
||||
|
||||
## Tasks
|
||||
|
||||
### Wave 1 — Data Layer
|
||||
- [ ] Créer `shared/types/hytaleDemo.ts` :
|
||||
```ts
|
||||
export interface HytaleDemo {
|
||||
id: string
|
||||
titleKey: string // i18n key
|
||||
descKey: string // i18n key
|
||||
image: string // /public/demos/<id>.gif ou .webp
|
||||
github: string // URL repo
|
||||
tech: 'Java' | 'Kotlin'
|
||||
wowFactor?: 1 | 2 | 3 | 4 | 5
|
||||
}
|
||||
```
|
||||
- [ ] Créer `app/data/hytaleDemos.ts` avec les 5 entries (ou les shippés au moment du code)
|
||||
- [ ] Placer placeholders dans `public/demos/` : `.webp` 400×225 avec texte "Demo coming soon" si gif pas prêt
|
||||
|
||||
### Wave 2 — Component
|
||||
- [ ] Créer `app/components/HytaleDemoGrid.vue` :
|
||||
- Props : `demos: HytaleDemo[]` (default = import depuis data)
|
||||
- Template : `<UCard>` Nuxt UI v3 par démo
|
||||
- Image `<NuxtImg>` avec `loading="lazy"`, fallback si manquante
|
||||
- Description via `<I18nT :keypath>` pour interpolations
|
||||
- Badge `<UBadge>` pour `tech` (couleur selon Java/Kotlin)
|
||||
- Lien `<NuxtLink external target="_blank" rel="noopener noreferrer">` vers GitHub
|
||||
- [ ] Variant `featured` avec card plus grande pour 1 démo vedette (optionnel)
|
||||
- [ ] Empty state : si `demos` vide → message "Demos coming soon" traduit
|
||||
|
||||
### Wave 3 — Integration
|
||||
- [ ] Ajouter section sur `app/pages/hytale.vue` après pricing/témoignages :
|
||||
```vue
|
||||
<section class="py-16">
|
||||
<h2>{{ t('hytale.demos.title') }}</h2>
|
||||
<p>{{ t('hytale.demos.subtitle') }}</p>
|
||||
<HytaleDemoGrid />
|
||||
</section>
|
||||
```
|
||||
- [ ] Ajouter ancre `#demos` pour deep-linking
|
||||
- [ ] Vérifier responsive sur mobile/tablet/desktop (Chrome DevTools)
|
||||
|
||||
### Wave 4 — i18n
|
||||
- [ ] Ajouter dans `i18n/locales/fr.json` :
|
||||
```json
|
||||
"hytale": {
|
||||
"demos": {
|
||||
"title": "Live Demos",
|
||||
"subtitle": "Plugins open-source que j'ai développés pour Hytale. Code et documentation complète sur GitHub.",
|
||||
"viewCode": "Voir le code",
|
||||
"emptyState": "Démos à venir"
|
||||
}
|
||||
}
|
||||
```
|
||||
- [ ] Équivalent EN dans `en.json`
|
||||
- [ ] Clés i18n par démo : `hytale.demos.gravityFlip.title`, `.description` etc. (5 démos × 2 clés × 2 langues = 20 clés)
|
||||
|
||||
### Wave 5 — Polish
|
||||
- [ ] SEO : ajouter démos au JSON-LD de `/hytale` (liste `CreativeWork` ou `SoftwareSourceCode`) pour Google
|
||||
- [ ] Animation hover card : scale 1.02 + shadow (Tailwind transition)
|
||||
- [ ] Preload première image (`<link rel="preload">` pour la démo featured)
|
||||
- [ ] Test dark/light : vérifier contraste images et text overlay
|
||||
|
||||
## Technical Decisions
|
||||
|
||||
- **Data source** : TypeScript fichier statique (pas JSON) pour avoir typing + auto-import
|
||||
- **Images** : WebP prioritaire, fallback .gif si animation critique (GravityFlip, BlackHole = gif ; Paintball screenshot screenshot)
|
||||
- **Pas de CMS/frontmatter** : les démos sont stables et peu nombreuses, data-as-code suffit
|
||||
- **Couleurs tech badge** : Java = orange, Kotlin = purple (conventions ecosystem)
|
||||
- **Fallback gracieux** : si image manque, show text card "Demo image coming soon"
|
||||
|
||||
## Deferred / Out of Scope
|
||||
|
||||
- Satori og:image dynamique par démo (hors Phase 10)
|
||||
- Player vidéo embedded YouTube (MP4 trop lourd, gif suffit pour MVP)
|
||||
- Stats téléchargement GitHub en live (overkill, scrap manuel)
|
||||
- Internationalisation des repos GitHub README (EN only, aligné target server owners)
|
||||
|
||||
## Commit Atomic Points
|
||||
|
||||
- Wave 1 : `feat(hytale): add HytaleDemo type + data source`
|
||||
- Wave 2 : `feat(components): add HytaleDemoGrid component`
|
||||
- Wave 3 : `feat(hytale): integrate demos section on /hytale`
|
||||
- Wave 4 : `feat(i18n): add hytale.demos.* keys FR+EN`
|
||||
- Wave 5 : `polish(hytale): demos section hover + JSON-LD + dark mode check`
|
||||
|
||||
## Success Validation
|
||||
|
||||
- [ ] Curl `https://killiandalcin.fr/hytale` → HTML contient markup `HytaleDemoGrid`
|
||||
- [ ] Curl `https://killiandalcin.fr/en/hytale` → HTML contient traductions EN
|
||||
- [ ] Check lighthouse sur `/hytale` : score perf pas dégradé (images optimisées)
|
||||
- [ ] DMs Discord : copier l'URL `https://killiandalcin.fr/hytale#demos` et confirmer que le rendu est pro
|
||||
@@ -0,0 +1,105 @@
|
||||
# Phase 10 — Demo Plugins Hytale — Context
|
||||
|
||||
## Goal
|
||||
|
||||
Produire 5 mini-plugins Hytale open-source publiés sur GitHub avec README EN pro, pour donner des preuves concrètes à montrer en DM Discord / Fiverr. Chaque plugin = 1 repo, 1 gif/screenshot, 1 paragraphe de description.
|
||||
|
||||
## Business Rationale
|
||||
|
||||
- **Blocker prospection #1** : zéro démo crédible à montrer actuellement
|
||||
- **Objectif** : pivot de "0 démo" → "5 démos variées" en 7-14 jours de travail réparti
|
||||
- **Target audience** : Hytale server owners (Discord), Fiverr buyers, recruiters gaming
|
||||
|
||||
## Les 5 Concepts Retenus
|
||||
|
||||
### 1. GravityFlip Region
|
||||
**Pitch** : Block spécial qui définit une zone → entités dedans ont gravité inversée.
|
||||
**Wow factor** : ⭐⭐⭐⭐⭐ (viral-friendly, gif 5s)
|
||||
**Complexité** : ⭐ (~150 lignes)
|
||||
**API showcase** : physics override, region system
|
||||
**Core mechanics** :
|
||||
- `PlayerMoveEvent` listener → check if in registered region
|
||||
- Flip `velocity.y` (ou apply upward force chaque tick)
|
||||
- Blocks `gravityflip_block` placés en 4 corners définissent la zone
|
||||
**Repo name** : `hytale-gravity-flip`
|
||||
|
||||
### 2. MagneticField Hand
|
||||
**Pitch** : Item `magnet_tool` → drops dans 8 blocs gravitent vers le joueur, trail de particules. Shift = répulsion.
|
||||
**Wow factor** : ⭐⭐⭐⭐ (satisfying visual, utile)
|
||||
**Complexité** : ⭐⭐ (~200 lignes)
|
||||
**API showcase** : particles, entity velocity, item events
|
||||
**Core mechanics** :
|
||||
- `ItemHeldEvent` → start tick task si magnet_tool
|
||||
- Chaque tick : scan entities.items nearby, apply Vector.subtract(player.loc, item.loc).normalize().multiply(0.3)
|
||||
- `spawnParticle(DUST, item.loc, color=#a0a0ff)`
|
||||
- Detect `player.isSneaking()` → invert direction
|
||||
**Repo name** : `hytale-magnet-hand`
|
||||
|
||||
### 3. TimeRewind Watch
|
||||
**Pitch** : `pocket_watch` clic droit → rewind 10 dernières secondes (position, rotation, dégâts annulés).
|
||||
**Wow factor** : ⭐⭐⭐⭐⭐ (Prince of Persia, gameplay unique)
|
||||
**Complexité** : ⭐⭐⭐ (~300 lignes)
|
||||
**API showcase** : state serialization, scheduler, entity manipulation, damage events
|
||||
**Core mechanics** :
|
||||
- `Deque<PlayerState>` par joueur (capacité 200 ticks = 10s@20tps)
|
||||
- Chaque tick : `states.offer({loc, yaw, pitch, health, timestamp})`; pop old
|
||||
- On `rightClick(pocket_watch)` : lock input, replay states reverse chaque tick (or teleport instant)
|
||||
- Restore health si tracked damage during rewind window
|
||||
**Repo name** : `hytale-time-rewind`
|
||||
|
||||
### 4. BlackHole Grenade
|
||||
**Pitch** : Item lancé → trou noir 3s. Aspire mobs + items + joueurs dans 12 blocs. Implosion finale avec explosion particules.
|
||||
**Wow factor** : ⭐⭐⭐⭐⭐ (spectaculaire, clip-ready)
|
||||
**Complexité** : ⭐⭐ (~250 lignes)
|
||||
**API showcase** : projectiles, entity pull, particle math (vortex)
|
||||
**Core mechanics** :
|
||||
- `ProjectileHitEvent` sur custom item → spawn armorstand invisible au point d'impact
|
||||
- 60 ticks scheduler : chaque tick, scan entities in radius 12, apply Vector toward center * strength
|
||||
- Spawn particles en spiral (helix math) autour du center point
|
||||
- Final tick : `world.createExplosion(loc, 2.0f, false)` + burst particles
|
||||
**Repo name** : `hytale-blackhole-grenade`
|
||||
|
||||
### 5. Paintball Arena
|
||||
**Pitch** : Arme `paintball_gun` tire snowballs colorés. Impact = block change de tint. Arena auto-scorée par équipe.
|
||||
**Wow factor** : ⭐⭐⭐⭐ (mini-jeu complet)
|
||||
**Complexité** : ⭐⭐⭐⭐ (~400 lignes)
|
||||
**API showcase** : projectiles, block manipulation, scoreboard, teams, persistence
|
||||
**Core mechanics** :
|
||||
- `PlayerInteractEvent` (right-click paintball_gun) → `launchProjectile(Snowball)` avec metadata color
|
||||
- `ProjectileHitEvent` sur target block : wrap block in `PaintedBlock` (stocke couleur originale + tint appliqué)
|
||||
- `HashMap<Team, Set<Block>>` pour compter % territoire peint
|
||||
- Scoreboard sidebar live : team A: 42%, team B: 38%
|
||||
- Arena reset command : restore original blocks from persistence
|
||||
**Repo name** : `hytale-paintball`
|
||||
|
||||
## Shared Infrastructure (par repo)
|
||||
|
||||
Chaque repo aura :
|
||||
- `build.gradle.kts` (Kotlin DSL) ou `build.gradle` (Java) — à décider
|
||||
- `src/main/kotlin/fr/killiandalcin/<plugin>/` — source
|
||||
- `plugin.yml` — manifest Hytale
|
||||
- `README.md` — EN pro :
|
||||
- Hero gif/screenshot
|
||||
- Tagline 1 phrase
|
||||
- Features bullet points
|
||||
- Installation (drop jar in /plugins, reload)
|
||||
- Commands/permissions
|
||||
- Credits + lien portfolio killiandalcin.fr
|
||||
- `LICENSE` (MIT)
|
||||
- `.github/workflows/release.yml` — auto-build jar on tag push
|
||||
- `docs/demo.gif` ou screenshot (1-5 Mo max)
|
||||
|
||||
## Open Questions
|
||||
|
||||
1. **Kotlin ou Java ?** — Stack blog article seed utilise Java (com.hypixel.hytale.plugin). Kotlin modernise mais Minecraft/Hytale dev majoritaire Java.
|
||||
2. **GitHub org ou perso ?** — `kayjaydee/hytale-*` (perso visible) ou créer org `killiandalcin-hytale` ?
|
||||
3. **Gif creation tool ?** — ffmpeg + recorder in-game, ou OBS + gifski ? Target ~2 Mo max par gif.
|
||||
4. **Order de ship** — Tous en parallèle, ou 1 par semaine pour générer du contenu Twitter/X/Discord étalé ?
|
||||
|
||||
## Success Criteria (Phase 10)
|
||||
|
||||
- 5 repos GitHub publics avec README EN complet
|
||||
- 5 .jar téléchargeables (release ou build artifact)
|
||||
- 5 gifs/screenshots dans `/public/demos/` du portfolio
|
||||
- Composant `HytaleDemoGrid.vue` intégré sur `/hytale` affichant les 5 démos
|
||||
- i18n FR+EN des cards démos
|
||||
Reference in New Issue
Block a user