diff --git a/app/components/HytaleDemoGrid.vue b/app/components/HytaleDemoGrid.vue new file mode 100644 index 0000000..81ac81a --- /dev/null +++ b/app/components/HytaleDemoGrid.vue @@ -0,0 +1,133 @@ + + + diff --git a/app/components/layout/AppFooter.vue b/app/components/layout/AppFooter.vue index 0d10cba..88ac7d1 100644 --- a/app/components/layout/AppFooter.vue +++ b/app/components/layout/AppFooter.vue @@ -28,7 +28,7 @@ src="/images/logo.webp" alt="Killian' DAL-CIN" width="36" height="36" loading="l Killian' DAL-CIN

- Full Stack Developer & Hytale Plugin Developer. Building modern web experiences and game plugins. + {{ t('footer.tagline') }}

@@ -49,13 +49,13 @@ v-for="link in quickLinks" :key="link.key" :to="localePath(link.path)"

- Services + {{ t('footer.services') }}

diff --git a/app/components/sections/ServicesSection.vue b/app/components/sections/ServicesSection.vue index 88b4d78..025758c 100644 --- a/app/components/sections/ServicesSection.vue +++ b/app/components/sections/ServicesSection.vue @@ -2,16 +2,16 @@ const { t } = useI18n() const services = computed(() => [ + { + icon: 'i-lucide-package', + title: t('home.services.hytalePlugins.title'), + description: t('home.services.hytalePlugins.description'), + }, { icon: 'i-lucide-monitor', title: t('home.services.webDev.title'), description: t('home.services.webDev.description'), }, - { - icon: 'i-lucide-smartphone', - title: t('home.services.mobileApps.title'), - description: t('home.services.mobileApps.description'), - }, { icon: 'i-lucide-zap', title: t('home.services.optimization.title'), diff --git a/app/data/hytaleDemos.ts b/app/data/hytaleDemos.ts new file mode 100644 index 0000000..1c0ddc7 --- /dev/null +++ b/app/data/hytaleDemos.ts @@ -0,0 +1,34 @@ +// Live Hytale plugins shipped publicly — featured on /hytale#demos +// Each entry has corresponding i18n keys at hytale.demos.{id}.* +export interface HytaleDemo { + id: string + image: string + github?: string + curseforge?: string + modtale?: string + website?: string + tech: string[] + status: 'live' | 'pending' | 'soon' + featured?: boolean +} + +export const hytaleDemos: HytaleDemo[] = [ + { + id: 'votepipe', + image: '/images/projects/votepipe.svg', + website: 'https://votepipe.com', + modtale: 'https://modtale.net/mod/votepipe', + curseforge: 'https://www.curseforge.com/hytale/mods/votepipe', + tech: ['Java 25', 'SaaS', 'Webhooks', 'Votifier'], + status: 'live', + featured: true, + }, + { + id: 'gravity-flip', + image: '/images/projects/gravityflip.png', + modtale: 'https://modtale.net/mod/gravity-flip', + curseforge: 'https://curseforge.com/hytale/mods/gravity-flip', + tech: ['Java 25', 'Gradle Shadow', 'Hytale API'], + status: 'live', + }, +] diff --git a/app/data/projects.ts b/app/data/projects.ts index fe4d978..8edd7ad 100644 --- a/app/data/projects.ts +++ b/app/data/projects.ts @@ -3,6 +3,67 @@ import type { Project } from '~~/shared/types' // Base project data without translations // Titles and descriptions are resolved via i18n keys: projects.${id}.title, projects.${id}.description export const projects: Omit[] = [ + { + id: 'votepipe', + image: '/images/projects/votepipe.svg', + technologies: ['Java 25', 'Hytale Plugin API', 'TypeScript', 'SaaS', 'HTTPS Webhooks', 'Votifier RSA/HMAC'], + category: 'Hytale Plugin', + date: '2026', + featured: true, + buttons: [ + { + title: 'Website', + link: 'https://votepipe.com', + }, + { + title: 'Modtale', + link: 'https://modtale.net/mod/votepipe', + }, + { + title: 'CurseForge', + link: 'https://www.curseforge.com/hytale/mods/votepipe', + }, + { + title: 'Documentation', + link: 'https://votepipe.com/docs', + }, + ], + }, + { + id: 'gravity-flip', + image: '/images/projects/gravityflip.png', + technologies: ['Java 25', 'Hytale Plugin API', 'Gradle Shadow', 'JUnit 5'], + category: 'Hytale Plugin', + date: '2026', + featured: true, + buttons: [ + { + title: 'Modtale', + link: 'https://modtale.net/mod/gravity-flip', + }, + { + title: 'CurseForge', + link: 'https://curseforge.com/hytale/mods/gravity-flip', + }, + ], + }, + { + id: 'playhours', + image: '/images/projects/playhours.png', + technologies: ['Java 17', 'Forge 1.20.1', 'LuckPerms', 'TOML Config'], + category: 'Minecraft Mod', + date: '2025', + buttons: [ + { + title: 'CurseForge', + link: 'https://www.curseforge.com/minecraft/mc-mods/playhours', + }, + { + title: 'Repository', + link: 'https://gitea.kamisama.ovh/kayjaydee/PlayHours', + }, + ], + }, { id: 'virtual-tour', image: '/images/virtualtour.webp', @@ -22,7 +83,6 @@ export const projects: Omit +
+ +
diff --git a/content/en/blog/gravity-flip-process-client.md b/content/en/blog/gravity-flip-process-client.md new file mode 100644 index 0000000..7f0ec5d --- /dev/null +++ b/content/en/blog/gravity-flip-process-client.md @@ -0,0 +1,138 @@ +--- +title: "GravityFlip: from client brief to a production-grade Hytale plugin" +description: "Lessons learned shipping GravityFlip — how a vague request (\"I want to flip gravity\") became an architected, configurable Hytale plugin that builders can use without touching code." +date: "2026-04-25" +tags: ["hytale", "case-study", "gravity-flip", "consulting"] +draft: false +--- + +> **TL;DR** — A client pinged me to "invert gravity in part of my map". Five questions later we were building a **multi-region plugin** with an in-game wand, JSON persistence, and three visualization modes. It's now live in production: [GravityFlip on Modtale](https://modtale.net/mod/gravity-flip). + +## The original brief + +The Discord message ran two sentences long: + +> *"Hi, I'd like a plugin that flips gravity on a zone of my server. It's for an event this weekend, I can pay."* + +This is exactly the most dangerous brief shape. Read fast, it sounds clear (*"flip gravity"* + *"zone"* — that's enough to start coding, right?). Read carefully, it says **nothing** specific: + +- *"a zone"* — how many? one, configured via YAML? several, managed in-game? server-wide? +- *"flip gravity"* — for whom? players only? falling items? mobs? projectiles? +- *"for an event this weekend"* — one-off, or a reusable tool for the server's builders later? +- *"I can pay"* — what scope, what budget? Essential plugin at €149 or full system at €349? + +I've made it a rule to **never write code until I've exhausted ambiguity**. It feels counter-intuitive when the client is in a hurry, but 30 minutes of questions saves 10 hours of rewrites. + +## The five questions that changed everything + +### 1. "How many zones, and who defines them?" + +Answer: *"At first I thought just one, but actually I'd like my builders to create more without asking me each time."* + +Immediate decision: **multi-region system** with persistence. Hardcoded YAML is out (too much friction). We pivot to an **in-game wand** plus `/gravityflip define ` commands. Classic Bukkit/Spigot community pattern, ported to Hytale. + +### 2. "Who flips? Players only, or everything?" + +Answer: *"Players for sure, but flipping dropped items would be sweet too. Mobs I'm not sure."* + +Decision: **three booleans per region** — `AffectPlayers`, `AffectItems`, `AffectNpcs`. Default: all on, but the builder can disable mobs on a "jump arena" zone if floating mobs ruin the gameplay. The marginal cost of those three toggles in the JSON codec was zero — optionality offered for free. + +### 3. "What happens when a player enters the zone at full free-fall speed?" + +Answer (after a pause): *"Uhh... I hadn't thought about it. They shouldn't take fall damage, right?"* + +Decision: **configurable `GracePeriodMs` (default 2500ms)**. During the transition, we smooth the gravity flip instead of an instant binary swap that produces brutal acceleration and absurd fall damage. Bonus: a `FallDamage` toggle (default false) for zones where falling should still cost something gameplay-wise. + +That's the kind of detail **a written brief never surfaces**. A real conversation does. + +### 4. "Do you want to see the zones when you're inside one?" + +Answer: *"Yeah in build mode I have to, otherwise I lose track. But in player mode nothing should show."* + +Decision: **three visualization modes**. +- `Outline` — configurable wireframe color (`VisualColor`, default `#00FFFF`) — build mode +- `Particles` — edge-emitting particles (`Torch_Fire` default), more subtle but visible +- `None` — invisible, production mode + +Per-region toggle via the `/gravityflip toggle` command. Build and live mode coexist on the same map without re-deploying the plugin. + +### 5. "Is this one-shot or are you reusing it?" + +Answer: *"One-shot for the event, but if it's well done I'll keep it."* + +Pivotal decision: we treat this project as **a production plugin**, not a script. Concretely: +- JSON persistence in `Server/mods/Mythlane_GravityFlip/regions.json` (not memory-only) +- 10 Hz tick loop with concurrent snapshots (lock-free reads) +- Unit tests on pure logic (codec, AABB geometry) +- Auto-seeded demo region on first run for instant onboarding +- Polished EN README, distributable + +**Cost vs "quick & dirty"** : about 30 % more time. **Benefit** : the client moved from "I need it by Saturday" to "I still use it, my builders love it". The plugin is now publishable, monetizable, and so it became a shared asset. + +## The architecture that emerged + +``` +Player / NPC / Item + │ + ▼ (each tick, 10 Hz) + RegionTickLoop ◄─── snapshots from regions.json + │ + ▼ + GravityApplier + FallDamageGuard + │ + ▼ + per-region effect +``` + +The wand follows its own cycle: + +``` +Player click → WandSelectionStore + │ + ▼ + /gravityflip define + │ + ▼ + Region registry → regions.json (auto-save) +``` + +Stack: **Java 25**, official Hytale Plugin API (`com.hypixel.hytale.plugin`), Gradle Shadow to relocate Gson (avoiding stdlib conflicts), JUnit 5 for tests. Source ~2,500 lines, 30 % of which is tests. + +### The piece of code that took the most thinking + +The **GracePeriodMs**. Not the code itself but the idea behind it: instead of a binary flip, we interpolate the vertical velocity component over a sliding window. Naively: + +```java +// naive version — produces absurd fall damage +if (region.contains(entity)) { + entity.velocity.y = -entity.velocity.y; // instant flip +} +``` + +With a grace period, smooth transition: + +```java +// production version — gradual entry +final long timeInRegion = now - entry.enteredAt(); +final double gracePct = Math.min(1.0, timeInRegion / region.gracePeriodMs()); +final double targetVy = -region.verticalForce(); // antigrav +entity.velocity.y = lerp(entity.velocity.y, targetVy, gracePct); +``` + +Three extra lines, but that's what makes the difference between a plugin that's "fun for 30 seconds" and a plugin that players actually use without rage-quitting. + +## What this project taught me (or reminded me) + +**First**: senior dev value isn't in code-typing speed. It's in the **series of questions** that turn a vague brief into an actionable spec. Without question 3 (free-fall), the client would have shipped the event with absurd fall damage, and the plugin would've been dropped after the weekend. + +**Second**: a Hytale plugin that sells isn't a script. It's a **production-grade Java codebase** with persistence, tests, docs, and sub-5-minute onboarding. The client paid €349 (the "Custom System" tier), not €50 Fiverr — and the premium is justified by the quality the client will exploit for months. + +**Third**: every plugin I write ends up published. GravityFlip is freely available on [Modtale](https://modtale.net/mod/gravity-flip) and soon on CurseForge. This doesn't dilute the value of paid commissions — it **boosts** my credibility to future prospects looking for a developer who can ship clean code, not just glue StackOverflow snippets. + +## Got a Hytale project in mind? + +The pattern is always the same: we talk for 30 minutes, I ask the 5-10 questions that kill ambiguity, I send a firm quote, I deliver. Pricing is public on [/hytale](/hytale) — €149 for an essential plugin, €349 for a custom system, €790+ for custom MMO infrastructure. + +No Fiverr, no race-to-the-bottom. Just a senior dev shipping code you'll still use six months later. + +[Request a quote](/contact) · [See GravityFlip in action](https://modtale.net/mod/gravity-flip) · [See my other plugins](/projects) diff --git a/content/fr/blog/gravity-flip-process-client.md b/content/fr/blog/gravity-flip-process-client.md new file mode 100644 index 0000000..7c02201 --- /dev/null +++ b/content/fr/blog/gravity-flip-process-client.md @@ -0,0 +1,138 @@ +--- +title: "GravityFlip : du brief client au plugin Hytale en production" +description: "Retour d'expérience sur le développement de GravityFlip — comment une demande floue (\"je veux inverser la gravité\") devient un plugin Hytale architecturé, configurable, et utilisable par des builders sans toucher au code." +date: "2026-04-25" +tags: ["hytale", "case-study", "gravity-flip", "consulting"] +draft: false +--- + +> **TL;DR** — Un client m'a contacté pour "inverser la gravité dans une partie de la map". Cinq questions plus tard, on était sur un plugin de **régions paramétrables** avec wand in-game, persistence JSON, et trois modes de visualisation. Le résultat tourne aujourd'hui en production : [GravityFlip sur Modtale](https://modtale.net/mod/gravity-flip). + +## Le brief initial + +Le message Discord d'origine tient en deux phrases : + +> *"Salut, j'aimerais un plugin qui inverse la gravité sur une zone de mon serveur. C'est pour un event ce week-end, je peux payer."* + +C'est exactement la forme de brief la plus dangereuse. Lue rapidement, elle donne l'illusion d'être claire (*"inverser la gravité"* + *"zone"* = ça suffit pour coder, non ?). Lue posément, elle ne dit **rien** de précis : + +- *"une zone"* — combien ? une seule, configurée par YAML ? plusieurs, gérées en jeu ? globale au serveur ? +- *"inverser la gravité"* — pour qui ? les joueurs uniquement ? les items qui tombent ? les mobs ? les projectiles ? +- *"pour un event ce week-end"* — usage one-shot ou outil réutilisable par les builders du serveur après ? +- *"je peux payer"* — quel scope, quel budget ? Plugin essentiel à 149€ ou système complet à 349€ ? + +J'ai pris l'habitude de **ne jamais coder avant d'avoir épuisé les ambiguïtés**. Ça paraît contre-intuitif quand le client est pressé, mais 30 minutes de questions économisent 10 heures de réécriture. + +## Les cinq questions qui ont tout changé + +### 1. "Combien de zones, et qui les définit ?" + +Réponse : *"Au début je pensais une seule, mais en fait j'aimerais que mes builders puissent en créer plusieurs sans me demander à chaque fois."* + +Décision immédiate : **système multi-régions** avec persistence. On exclut le YAML hardcodé (trop friction) et on s'oriente vers un **wand in-game** + commandes `/gravityflip define `. Pattern classique de la communauté Bukkit/Spigot, repris pour Hytale. + +### 2. "Pour qui la gravité s'inverse ? Joueurs uniquement, ou tout ?" + +Réponse : *"Les joueurs ouais, mais aussi les items dropés ce serait stylé. Les mobs je sais pas."* + +Décision : **trois booleans configurables par région** — `AffectPlayers`, `AffectItems`, `AffectNpcs`. Default = tout activé, mais le builder peut désactiver les mobs sur une zone "salle de saut" si les mobs flottants gâchent le gameplay. Le coût marginal de ces 3 toggles dans le codec JSON était nul, l'optionalité a été offerte. + +### 3. "Que se passe-t-il quand un joueur entre dans la zone à pleine vitesse en chute libre ?" + +Réponse (après une pause) : *"Heu... j'avais pas pensé. Il devrait pas se prendre les dégâts de chute non ?"* + +Décision : **`GracePeriodMs` configurable (default 2500ms)**. Pendant la transition, on lisse l'inversion de gravité au lieu d'un flip instantané qui produit une accélération brutale et des dégâts de chute aberrants. En bonus : un toggle `FallDamage` (default false) pour les zones où on veut quand même que tomber ait un coût gameplay. + +C'est le genre de détail qu'**un brief écrit ne fait jamais émerger**. Une vraie discussion, oui. + +### 4. "Tu veux voir les zones quand tu es dedans ?" + +Réponse : *"Oui en build c'est obligé sinon je sais plus où elles sont. Mais en live joueur faut rien voir."* + +Décision : **trois modes de visualisation**. +- `Outline` — wireframe couleur configurable (`VisualColor`, default `#00FFFF`), pour le mode build +- `Particles` — bordures émettrices de particules (`Torch_Fire` par défaut), plus discret mais visible +- `None` — invisible, mode production + +Toggle par région via la commande `/gravityflip toggle`. Build mode et live mode sur la même map sans rebuild du plugin. + +### 5. "C'est un one-shot ou tu réutilises ?" + +Réponse : *"One-shot pour l'event, mais si c'est bien fait je le garde."* + +Décision déterminante : on traite ce projet comme **un plugin de production**, pas comme un script. Concrètement : +- Persistance JSON dans `Server/mods/Mythlane_GravityFlip/regions.json` (pas mémoire seule) +- Tick loop 10x/sec avec snapshots concurrents (lecture lock-free) +- Tests unitaires sur la logique pure (codec, géométrie AABB) +- Demo region auto-seed au premier démarrage pour onboarding instantané +- Documentation README EN pro, distribuable + +**Surcoût vs version "quick & dirty"** : environ 30 % de temps en plus. **Bénéfice** : le client est passé de "j'ai besoin pour samedi" à "je l'utilise toujours, mes builders l'adorent". Le plugin est désormais publiable, monétisable, et donc devenu un actif partagé. + +## L'architecture qui en est sortie + +``` +Player / NPC / Item + │ + ▼ (chaque tick, 10 Hz) + RegionTickLoop ◄─── snapshots de regions.json + │ + ▼ + GravityApplier + FallDamageGuard + │ + ▼ + effet par région +``` + +Le wand suit son propre cycle : + +``` +Player click → WandSelectionStore + │ + ▼ + /gravityflip define + │ + ▼ + Region registry → regions.json (auto-save) +``` + +Stack technique : **Java 25**, Hytale Plugin API officielle (`com.hypixel.hytale.plugin`), Gradle Shadow pour relocalisation Gson (évite les conflits stdlib), JUnit 5 pour les tests. Code source ~2 500 lignes, dont 30 % de tests. + +### Le bout de code qui m'a coûté le plus de réflexion + +Le **GracePeriodMs**. Pas du code, mais l'idée derrière : au lieu d'un flip binaire, on interpole la composante verticale de la vélocité sur une fenêtre glissante. Naïvement on écrit : + +```java +// version naïve — produit des dégâts de chute aberrants +if (region.contains(entity)) { + entity.velocity.y = -entity.velocity.y; // flip instantané +} +``` + +Avec grace period, on lisse la transition : + +```java +// version production — entrée progressive +final long timeInRegion = now - entry.enteredAt(); +final double gracePct = Math.min(1.0, timeInRegion / region.gracePeriodMs()); +final double targetVy = -region.verticalForce(); // antigrav +entity.velocity.y = lerp(entity.velocity.y, targetVy, gracePct); +``` + +Trois lignes de plus, mais c'est ce qui fait la différence entre un plugin "marrant 30 secondes" et un plugin que les joueurs utilisent sans rage-quit. + +## Ce que ce projet m'a appris (ou rappelé) + +**Premièrement** : la valeur du dev senior n'est pas dans la rapidité de code. C'est dans la **série de questions** qui transforme un brief flou en spec actionnable. Si je n'avais pas posé la question 3 (chute libre), le client aurait livré l'event avec des dégâts de chute aberrants, et le plugin aurait été abandonné après le week-end. + +**Deuxièmement** : un plugin Hytale qui se vend, ce n'est pas un script. C'est une **codebase Java production-grade** avec persistence, tests, doc, et un onboarding sub-5 minutes. Le client a payé 349€ (tier "Système Sur-Mesure"), pas 50€ Fiverr — et le surcoût est justifié par la qualité que le client va exploiter pendant des mois. + +**Troisièmement** : chaque plugin que je code finit publié. GravityFlip est dispo gratuitement sur [Modtale](https://modtale.net/mod/gravity-flip) et bientôt sur CurseForge. Ça ne dilue pas la valeur de la commande client — ça **augmente** ma crédibilité auprès des futurs prospects qui cherchent un dev capable de livrer du code propre, et pas juste de coller des snippets StackOverflow. + +## Tu as un projet Hytale en tête ? + +Le pattern est toujours le même : on parle 30 minutes, je pose les 5-10 questions qui tuent les ambiguïtés, je te donne un devis ferme, et je livre. Les tarifs sont publics sur [/hytale](/hytale) — entre 149€ pour un plugin essentiel, 349€ pour un système complet, et 790€+ pour une infrastructure MMO custom. + +Pas de Fiverr, pas de race-to-the-bottom. Juste un dev senior qui livre du code que tu utilises encore six mois plus tard. + +[Demander un devis](/contact) · [Voir GravityFlip en action](https://modtale.net/mod/gravity-flip) · [Voir mes autres plugins](/projects) diff --git a/i18n/locales/en.json b/i18n/locales/en.json index 4907229..0d2d880 100644 --- a/i18n/locales/en.json +++ b/i18n/locales/en.json @@ -9,14 +9,15 @@ }, "footer": { "copyright": "© 2026 Killian' DAL-CIN", + "tagline": "Hytale Plugin Developer & Freelance Web Dev. Custom Java plugins, gaming server websites, production-grade Vue/Nuxt apps.", "navigation": "Quick Links", "services": "Services", "legalNotices": "Legal Notices", "privacyPolicy": "Privacy Policy", "servicesList": { - "webDev": "Web Development", - "mobileApps": "Mobile Apps", - "apiBackend": "API Development", + "hytalePlugins": "Hytale Plugins (Java)", + "webDev": "Web Sites & Apps", + "retainer": "Monthly Retainer", "consulting": "Tech Consulting" } }, @@ -66,20 +67,20 @@ "contact": "Contact me" }, "featuredProjects": { - "title": "Web Applications That Deliver Results", - "subtitle": "Portfolio of real projects that transformed ideas into success. Lightning-fast Vue.js apps, scalable React platforms, robust Node.js APIs.", + "title": "Hytale plugins & web apps running in production", + "subtitle": "Portfolio of real projects, in production, used by real players and clients. Java 25 Hytale plugins, Vue/Nuxt apps, SaaS, Discord bots — not proofs-of-concept, actual shipping.", "viewAll": "Explore All Projects" }, "services": { - "title": "Premium Web Development Services", - "subtitle": "Turnkey solutions that boost your growth. Cutting-edge technologies + proven methodology = guaranteed success for your digital project.", - "webDev": { - "title": "Custom Vue.js/React Web Applications", - "description": "Lightning-fast web apps that convert visitors into customers. Modern SPAs, offline-first PWAs, high-conversion e-commerce. SEO-friendly from day one." + "title": "Premium Hytale & Web Services", + "subtitle": "Custom Hytale plugins, high-performance web apps, gaming SaaS. Stack: Java 25 + Vue/Nuxt + Node.js. Transparent pricing (€149-€790), quote within 24h.", + "hytalePlugins": { + "title": "Custom Hytale Plugins (Java)", + "description": "From essential plugin to full MMO system. Wand-based regions, votes & rewards, economy, quests, mini-games. Stack: Java 25 + Hytale Plugin API + Gradle Shadow." }, - "mobileApps": { - "title": "Cost-Effective Cross-Platform Mobile Apps", - "description": "One codebase = iOS + Android + Web. React Native for performant native apps. 60% cost savings vs native development." + "webDev": { + "title": "Vue.js / Nuxt / React Web Apps", + "description": "Gaming server websites, SaaS platforms, e-commerce. SEO-optimized Nuxt 4 SSR, admin dashboards, Tebex/Discord integrations. Lighthouse 95+, <2s load times." }, "optimization": { "title": "Performance & Technical SEO Optimization", @@ -112,6 +113,8 @@ "subtitle": "Browse my work: custom Hytale plugins, Vue.js applications, React websites, Node.js APIs, Discord bots, and enterprise software.", "categories": { "all": "All Projects", + "hytaleplugin": "Hytale Plugin", + "minecraftmod": "Minecraft Mod", "webdevelopment": "Web Development", "botdevelopment": "Bot Development", "opensource": "Open Source", @@ -249,6 +252,35 @@ } }, "projectData": { + "votepipe": { + "title": "VotePipe — Hytale Vote Rewards SaaS", + "description": "Unified SaaS platform that combines Webhook (V1 RSA, V2 HMAC) and Votifier to handle votes from all 7 major Hytale server lists in a single plugin. Visual reward builder, automatic delivery, no port forwarding needed.", + "longDescription": "The only Hytale plugin that runs Webhook and Votifier through one unified pipeline. Free / Pro / Network tiers with web dashboard (app.votepipe.com), visual reward builder, streaks, milestones, lucky tiers. Stack: Java 25 plugin + TypeScript backend + SaaS dashboard. Outbound-only secure cloud architecture.", + "buttons": { + "website": "Official Site", + "modtale": "Modtale", + "curseforge": "CurseForge", + "documentation": "Documentation" + } + }, + "gravity-flip": { + "title": "GravityFlip — Hytale Anti-Gravity Regions", + "description": "Hytale plugin that creates custom anti-gravity zones with an in-game wand. Walk on ceilings, floating items, drifting mobs — all configurable without touching files.", + "longDescription": "Wand-based region builder for Hytale servers. Corners are set with left/right click, JSON persistence is automatic, 10x/sec tick loop, configurable vertical force and grace period. Visual modes: outline / particles / hidden. Built on Hytale Plugin API + Java 25 + Gradle Shadow.", + "buttons": { + "modtale": "Modtale", + "curseforge": "CurseForge" + } + }, + "playhours": { + "title": "PlayHours — Forge Server Hours Enforcement", + "description": "Forge 1.20.1 mod that enforces per-day open windows, blocks logins outside hours, warns at 15/10/5/1 min, auto-kicks at close, handles holidays, whitelist/blacklist, force modes, LuckPerms integration.", + "longDescription": "Minecraft server mod for time-gated access: per-day schedules, midnight-spanning, date exceptions, dynamic MOTD, multi-language (EN/FR), LuckPerms or vanilla ops permissions. Perfect for educational servers, family servers, or maintenance windows.", + "buttons": { + "curseforge": "CurseForge", + "repository": "Repository" + } + }, "virtual-tour": { "title": "Virtual Tour - Interactive 360° Experience", "description": "My high school teacher and me had an idea to create a Virtual tour with 360° videos to allow everyone to visit the school from the web.", @@ -471,6 +503,22 @@ "hourly": "Outside packages: €45/h excl. VAT, 1h minimum (spot fixes, audits).", "flagshipCta": "Flagship: custom quote after a 30-minute scoping call." }, + "demos": { + "label": "// live-demos", + "title": "Live plugins, production-grade code", + "subtitle": "No marketing promises. These are the Hytale plugins I publicly maintain — usable today on any Hytale server.", + "featured": "Featured", + "viewSite": "View site", + "footnote": "Every plugin is built in-house, production-tested, and ships with full documentation.", + "votepipe": { + "title": "VotePipe — Vote Rewards SaaS", + "tagline": "Hytale plugin + SaaS dashboard that unifies Webhook and Votifier across the 7 major vote lists. No port forwarding, automatic delivery, visual reward builder." + }, + "gravity-flip": { + "title": "GravityFlip Region", + "tagline": "Drop a wand, set 2 corners, gravity flips inside the zone. Ceiling-walking and floating items live in 5 minutes of setup." + } + }, "recentArticles": { "title": "Recent articles", "subtitle": "Latest writing on Hytale plugin development", diff --git a/i18n/locales/fr.json b/i18n/locales/fr.json index ba62058..1c54f16 100644 --- a/i18n/locales/fr.json +++ b/i18n/locales/fr.json @@ -9,15 +9,16 @@ }, "footer": { "copyright": "© 2026 Killian' DAL-CIN", + "tagline": "Hytale Plugin Developer & Dev Web Freelance. Plugins Java sur-mesure, sites pour serveurs gaming, applications Vue/Nuxt en production.", "navigation": "Liens Rapides", "services": "Services", "legalNotices": "Mentions Légales", "privacyPolicy": "Politique de Confidentialité", "servicesList": { - "webDev": "Développement Web", - "mobileApps": "Applications Mobiles", - "apiBackend": "Développement API", - "consulting": "Consulting Tech" + "hytalePlugins": "Plugins Hytale (Java)", + "webDev": "Sites & Apps Web", + "retainer": "Retainer Mensuel", + "consulting": "Conseil Tech" } }, "a11y": { @@ -66,20 +67,20 @@ "contact": "Me contacter" }, "featuredProjects": { - "title": "Applications Web Qui Cartonnent", - "subtitle": "Portfolio de projets réels qui ont transformé des idées en succès. Applications Vue.js ultra-rapides, plateformes React scalables, API Node.js robustes.", + "title": "Plugins Hytale & Apps Web qui tournent en prod", + "subtitle": "Portfolio de projets réels, en production, utilisés par de vrais joueurs et clients. Plugins Hytale Java 25, applications Vue.js/Nuxt, SaaS, bots Discord — pas du proof-of-concept, du shipping.", "viewAll": "Explorer Tous les Projets" }, "services": { - "title": "Services Premium de Développement Web", - "subtitle": "Solutions clés en main qui boostent votre croissance. Technologies de pointe + méthodologie éprouvée = succès garanti pour votre projet digital.", - "webDev": { - "title": "Applications Web Vue.js/React Sur-Mesure", - "description": "Création d'applications web lightning-fast qui convertissent. SPA modernes, PWA offline-first, e-commerce haute conversion. SEO-friendly dès la conception." + "title": "Services Premium Hytale & Web", + "subtitle": "Plugins Hytale custom, applications web haute performance, SaaS gaming. Stack Java 25 + Vue/Nuxt + Node.js. Tarifs transparents (149€-790€), devis sous 24h.", + "hytalePlugins": { + "title": "Plugins Hytale Custom (Java)", + "description": "Du plugin essentiel au système MMO complet. Wand-based regions, votes & rewards, économie, quêtes, mini-jeux. Stack Java 25 + Hytale Plugin API + Gradle Shadow." }, - "mobileApps": { - "title": "Apps Mobiles Cross-Platform Rentables", - "description": "Une seule codebase = iOS + Android + Web. React Native pour des apps natives performantes. 60% d'économie vs développement natif." + "webDev": { + "title": "Applications Web Vue.js / Nuxt / React", + "description": "Sites pour serveurs gaming, SaaS, e-commerce. SSR Nuxt 4 SEO-optimisé, dashboards admin, intégrations Tebex/Discord. Lighthouse 95+, chargement <2s." }, "optimization": { "title": "Optimisation Performance & SEO Technique", @@ -112,6 +113,8 @@ "subtitle": "Parcourez mes projets : plugins Hytale, applications Vue.js, sites React, API Node.js, bots Discord et solutions d'entreprise.", "categories": { "all": "Tous les Projets", + "hytaleplugin": "Plugin Hytale", + "minecraftmod": "Mod Minecraft", "webdevelopment": "Développement Web", "botdevelopment": "Développement de Bot", "opensource": "Open Source", @@ -249,6 +252,35 @@ } }, "projectData": { + "votepipe": { + "title": "VotePipe — SaaS Vote Rewards Hytale", + "description": "Plateforme SaaS unifiée qui combine Webhook (V1 RSA, V2 HMAC) et Votifier pour récupérer les votes des 7 grandes listes Hytale en un seul plugin. Visual reward builder, livraison automatique, aucun port à ouvrir.", + "longDescription": "Le seul plugin Hytale qui fait passer Webhook et Votifier dans un pipeline unifié. Tarifs Free / Pro / Network avec dashboard web (app.votepipe.com), reward builder visuel, streaks, milestones, lucky tiers. Stack : Java 25 plugin + backend TypeScript + dashboard SaaS. Architecture cloud sécurisée — outbound-only.", + "buttons": { + "website": "Site Officiel", + "modtale": "Modtale", + "curseforge": "CurseForge", + "documentation": "Documentation" + } + }, + "gravity-flip": { + "title": "GravityFlip — Régions Anti-Gravité Hytale", + "description": "Plugin Hytale qui crée des zones d'anti-gravité custom avec un wand in-game. Marche sur le plafond, items qui flottent, mobs flottants — tout configurable sans toucher aux fichiers.", + "longDescription": "Wand-based region builder pour serveurs Hytale. Les corners se définissent en clic gauche/droit, persistance JSON automatique, tick loop 10x/sec, force verticale et grace period configurables. Mode visuel outline / particles / hidden. Construit sur Hytale Plugin API + Java 25 + Gradle Shadow.", + "buttons": { + "modtale": "Modtale", + "curseforge": "CurseForge" + } + }, + "playhours": { + "title": "PlayHours — Forge Server Hours Enforcement", + "description": "Mod Forge 1.20.1 qui force des horaires d'ouverture par jour, blocage de connexion hors heures, warns 15/10/5/1 min, auto-kick à la fermeture, gestion des jours fériés, whitelist/blacklist, force modes, intégration LuckPerms.", + "longDescription": "Mod serveur Minecraft pour gérer l'accès aux horaires : schedules per-day, midnight-spanning, exceptions de dates, MOTD dynamique, multi-langues (EN/FR), permissions LuckPerms ou ops vanilla. Parfait pour serveurs scolaires, familiaux, ou avec maintenance windows.", + "buttons": { + "curseforge": "CurseForge", + "repository": "Dépôt" + } + }, "virtual-tour": { "title": "Visite Virtuelle - Expérience 360° Interactive", "description": "Mon professeur de lycée et moi avons eu l'idée de créer une visite virtuelle avec des vidéos 360° pour permettre à tous de visiter l'école depuis le web.", @@ -471,6 +503,22 @@ "hourly": "Hors packages : 45€/h HT, minimum 1h (spot fixes, audits).", "flagshipCta": "Flagship : sur devis après cadrage de 30 minutes." }, + "demos": { + "label": "// live-demos", + "title": "Plugins live, code en production", + "subtitle": "Pas de promesses marketing. Voici les plugins Hytale que je maintiens publiquement, utilisables aujourd'hui sur n'importe quel serveur Hytale.", + "featured": "À la une", + "viewSite": "Voir le site", + "footnote": "Chaque plugin est build maison, testé en production, et livré avec sa documentation.", + "votepipe": { + "title": "VotePipe — SaaS Vote Rewards", + "tagline": "Plugin Hytale + dashboard SaaS qui unifie Webhook et Votifier sur les 7 grandes listes de votes. Sans port à ouvrir, livraison automatique, reward builder visuel." + }, + "gravity-flip": { + "title": "GravityFlip Region", + "tagline": "Pose un wand, définis 2 corners, gravité inversée dans la zone. Marche-au-plafond et items qui flottent en 5 minutes de setup." + } + }, "recentArticles": { "title": "Articles récents", "subtitle": "Les dernières publications sur le développement de plugins Hytale", diff --git a/public/images/projects/gravityflip.png b/public/images/projects/gravityflip.png new file mode 100644 index 0000000..3fe5221 Binary files /dev/null and b/public/images/projects/gravityflip.png differ diff --git a/public/images/projects/playhours.png b/public/images/projects/playhours.png new file mode 100644 index 0000000..bd29164 Binary files /dev/null and b/public/images/projects/playhours.png differ diff --git a/public/images/projects/votepipe.svg b/public/images/projects/votepipe.svg new file mode 100644 index 0000000..6d4c974 --- /dev/null +++ b/public/images/projects/votepipe.svg @@ -0,0 +1,5 @@ + + + + V + \ No newline at end of file