webapp
Build / build (push) Has been cancelled

This commit is contained in:
gpatruno
2026-06-06 21:59:51 +02:00
parent 02d2af0993
commit 48a1b900c7
279 changed files with 7488 additions and 238 deletions
+3
View File
@@ -9,6 +9,9 @@ on:
jobs:
build:
runs-on: ubuntu-latest
defaults:
run:
working-directory: Hytale
steps:
- uses: actions/checkout@v4
+7 -5
View File
@@ -1,13 +1,15 @@
### Build ###
build/
Hytale/build/
Hytale/.gradle/
Hytale/.kotlin/
Hytale/devserver/
.gradle/
.kotlin/
devserver/
### Hytale local config (chemin d'installation personnel) ###
hytale.properties
Hytale/hytale.properties
Hytale/gradle.properties
### Database ###
### Database (racine du monorepo + emplacements locaux) ###
*.db
*.db-journal
+3 -3
View File
@@ -1,10 +1,10 @@
# Contribution
Merci de contribuer au serveur MMORPG Hytale.
Merci de contribuer au serveur MMORPG Hytale Disklexar.
## Avant de commencer
1. Lire [ARCHITECTURE.md](docs/ARCHITECTURE.md) et [ROADMAP.md](docs/ROADMAP.md)
1. Lire [ARCHITECTURE.md](Hytale/docs/ARCHITECTURE.md) et [ROADMAP.md](Hytale/docs/ROADMAP.md)
2. Vérifier qu'aucune issue existante ne couvre déjà votre sujet
## Branches
@@ -16,7 +16,7 @@ Merci de contribuer au serveur MMORPG Hytale.
## Pull requests
- Une PR = un sujet cohérent
- `./gradlew build` doit passer
- `cd Hytale && ./gradlew build` doit passer
- Description en français ou anglais : **quoi** + **pourquoi**
- Référencer la phase roadmap (M0, M1, …) si applicable
+178
View File
@@ -0,0 +1,178 @@
# Hytale — Serveur & plugin MMORPG
Serveur Hytale de développement et plugin **com.disklexar:MMORPG** : profils joueurs persistants, progression, classes, métiers, groupes et fondations pour l'économie, les quêtes et les guildes.
## Prérequis
- **JDK 25+** (Java 26 recommandé si JDK 25 indisponible)
- **Gradle** via le wrapper inclus (`./gradlew`)
- Serveur Hytale (binaire ou `./gradlew runServer` via [ScaffoldIt](https://scaffoldit.dev))
- Installation **Hytale** (launcher officiel) pour les assets du jeu
## Démarrage rapide
```bash
# Depuis ce dossier (Hytale/)
cp hytale.properties.example hytale.properties
# Éditer hytale.home_path (voir exemples dans le fichier)
./start-server.sh
```
Réinitialiser le monde de dev si le serveur a planté sans assets :
```bash
HYTALE_RESET_DEVSERVER=1 ./start-server.sh
```
Ou manuellement :
```bash
JAVA_HOME=/usr/lib/jvm/java-25-openjdk ./gradlew build
JAVA_HOME=/usr/lib/jvm/java-25-openjdk ./gradlew runServer
```
Le JAR produit se trouve dans `build/libs/hytale-mmorpg-0.1.0.jar` (nom selon version Gradle).
### Déploiement manuel
1. Copier le JAR dans le dossier `mods/` du serveur Hytale
2. Redémarrer le serveur
3. La configuration est générée dans le répertoire de données du plugin : `mods/com.disklexar_MMORPG/config.json`
## Systèmes MMORPG
| Système | Contenu | Effet |
|---------|---------|-------|
| **Classes** | Chevalier (`knight`) | Armes : Épée longue, Hache de bataille. 3 capacités (Charge/dash+étourdissement 3s, Toupie 3s, Cri de guerre : repousse + 20% résistance 20s, bonus si étourdi). |
| **Pouvoirs** (passifs, aucun par défaut) | Sprinteur (`sprinter`), Résilient (`resilient`) | +10% vitesse hors combat / +10% dégâts 5s après avoir été touché. |
| **Métiers** | Tueur de monstre (`monster_slayer`), Mineur (`miner`) | +1 money par monstre tué / +1 money par bloc cassé. |
| **Groupes** | Partage d'XP | Les membres reçoivent 40% de l'XP gagnée sur un kill. |
| **Races** | Humain (`human`, par défaut) | XP ×2. |
> **Effets de combat** : dash, étourdissement, toupie, knockback et le buff de vitesse sont
> implémentés via les APIs serveur (`Velocity`, `TransformComponent`, `MovementManager`,
> `TargetUtil`, `DamageSystems`). Les valeurs (distances, forces, dégâts) sont des constantes à
> ajuster en jeu.
## Commandes
| Commande | Description |
|----------|-------------|
| `/mmorpg help` | Affiche l'aide |
| `/mmorpg profile` | Résumé court (niveau, XP) |
| `/mmorpg info` | Toutes vos informations (chat) |
| `/mmorpg menu` | Menu joueur MMORPG — onglets Personnage, Inventaire, Compétences |
| `/mmorpg inventory` | Même menu, ouvert directement sur l'onglet Inventaire |
| `/mmorpg class <choisir\|quitter\|info> [classe]` | Gérer votre classe |
| `/mmorpg power <recevoir\|retirer\|info> [pouvoir]` | Gérer vos pouvoirs |
| `/mmorpg job <rejoindre\|quitter\|info> [metier]` | Gérer vos métiers |
| `/mmorpg group <inviter\|accepter\|quitter\|kick\|info> [joueur]` | Gérer votre groupe |
| `/mmorpg ability <1\|2\|3>` | Utiliser une capacité de classe |
| `/mmorpg password <mot_de_passe>` | Définir ou modifier le mot de passe web |
| Touches **Use Ability 1/2/3** | Même effet que la commande ci-dessus (si vous avez une classe) |
### Capacités de classe (touches Ability 1/2/3)
Les armes vanilla possèdent leurs propres compétences sur les slots Ability. Le plugin les **remplace**
dès qu'un joueur a choisi une classe MMORPG :
1. **Filtre de paquets** (`SyncInteractionChains`) — intercepte Ability 1/2/3 avant le moteur vanilla,
envoie `CancelInteractionChain` au client et lance la capacité de classe.
2. **Interaction native** (`mmorpg_cast_ability`) — enregistrée côté serveur ; les patches d'items dans
`plugins/mmorpg/src/main/resources/Server/Item/Items/` remplacent Ability1/2/3 sur les armes de test (sync client/serveur).
Prérequis en jeu : `/mmorpg class choisir <classe>` puis équiper une arme autorisée pour cette classe.
Sans classe, les compétences vanilla de l'arme s'appliquent normalement.
Pour ajouter d'autres armes, copiez un patch JSON existant (ex. `Weapon_Longsword_Mithril.json`) en
ne gardant que `"Id"` et `"Interactions"`.
`/mmorpg menu` ouvre une `CustomUIPage` listant toutes les infos du joueur (classe, race, pouvoirs,
métiers, groupe, money, temps de jeu, dates…). Un plugin **serveur seul** ne peut pas ajouter un
bouton dans l'écran d'inventaire natif ; les équivalents fournis sont la commande `/mmorpg menu` et
l'interaction `mmorpg_player_info` (voir `plugins/mmorpg/assetpack/README.md` pour brancher un asset `.ui`).
## Configuration
Fichier `config.json` (valeurs par défaut dans `plugins/mmorpg/src/main/resources/config.json`) :
| Clé | Description |
|-----|-------------|
| `Debug` | Logs détaillés |
| `DefaultLevel` | Niveau initial des nouveaux joueurs |
| `MaxPlayers` | Limite prévue (référence future) |
| `BaseXpPerLevel` | XP de base requise par niveau |
| `KillExperience` | XP de base accordée par monstre tué |
| `Database.FileName` | Nom du fichier SQLite (`mmorpg.db`) |
| `Database.UseMonorepoRoot` | Si `true`, place la base à la racine du dépôt (dossiers `Hytale/` + `Webapp/`) |
| `Database.Path` | Chemin absolu ou relatif au dossier de données du plugin (prioritaire) |
| `Features.Economy` | Active le module économie |
| `Features.Quests` | Active le module quêtes (M3) |
| `Features.Guilds` | Active le module guildes (M4) |
## Base de données
Le plugin persiste les données joueurs dans **SQLite**.
### Emplacement
| Contexte | Fichier |
|----------|---------|
| **Monorepo (dev)** | `../mmorpg.db` à la racine du dépôt (détection auto si `UseMonorepoRoot: true`) |
| **Production** | `{dataDirectory}/mmorpg.db` ou chemin explicite via `Database.Path` |
Inspecter en local :
```bash
sqlite3 ../mmorpg.db
SELECT uuid, display_name, level, experience FROM player_profiles;
```
Les fichiers `*.db` sont ignorés par Git.
### Schéma
`player_profiles` : `class_id`, `powers` (JSON), `jobs` (JSON), `guild_id`, `group_id`,
`is_connected`, `total_time_play`, `last_date_connected`, `date_creation`, `money`, `race_id`.
Tables de référence : `classes`, `powers`, `jobs`, `races`, `groups`, `group_members`.
Migrations versionnées via `schema_migrations` — voir `plugins/mmorpg/src/main/resources/db/migrations/`.
## Structure du plugin
```
plugins/mmorpg/src/main/java/com/disklexar/mmorpg/
├── MmorpgPlugin.java # Point d'entrée (commandes + systèmes ECS)
├── bootstrap/ # Initialisation et registre de services
├── core/ # Config et contrats
├── player/ # Sessions, profils, registre des joueurs en ligne
├── persistence/ # SQLite (migrations versionnées, repositories)
├── command/ # Commandes /mmorpg
├── events/ # Connexion / déconnexion, filtre paquets Ability
├── interaction/ # mmorpg_cast_ability (interaction native asset pack)
├── progression/ # XP et niveaux (multiplicateurs de race)
├── economy/ # Monnaie (money)
├── rpg/ # clazz · power · job · race · group
├── combat/ # Capacités, état de combat, effets passifs
│ └── system/ # Systèmes ECS : dégâts, morts/kills, casse de bloc
├── ui/ # AbilityBarHud, PlayerMenuPage, PlayerInfoPage
├── quest/ # Stub (M3)
└── social/ # Stub (M4)
```
## Documentation
- [Interface utilisateur MMORPG (UI/UX)](docs/README-UI.md)
- [Architecture](docs/ARCHITECTURE.md)
- [Feuille de route](docs/ROADMAP.md)
- [Guide de développement](docs/DEVELOPMENT.md)
- [Contribution](../CONTRIBUTING.md)
### Custom UI (Hytale)
- [Custom UI — vue d'ensemble](https://hytalemodding.dev/en/docs/official-documentation/custom-ui)
- [Layout](https://hytalemodding.dev/en/docs/official-documentation/custom-ui/layout)
- [Common Styling](https://hytalemodding.dev/en/docs/official-documentation/custom-ui/common-styling)
- [Guide plugin UI](https://hytalemodding.dev/en/docs/guides/plugin/ui)
@@ -10,6 +10,13 @@ java {
}
}
sourceSets {
main {
java.setSrcDirs(listOf("plugins/mmorpg/src/main/java"))
resources.setSrcDirs(listOf("plugins/mmorpg/src/main/resources"))
}
}
repositories {
mavenCentral()
}
@@ -17,6 +24,7 @@ repositories {
dependencies {
implementation("org.xerial:sqlite-jdbc:3.47.2.0")
implementation("com.google.code.gson:gson:2.11.0")
implementation("at.favre.lib:bcrypt:0.10.2")
}
tasks.shadowJar {
@@ -53,8 +53,8 @@ Le singleton `MmorpgPlugin.get()` est rafraîchi à chaque chargement pour reste
## Persistance
- Fichier : `{dataDirectory}/mmorpg.db`
- Migrations : `src/main/resources/db/migrations/*.sql`
- Fichier : `{monorepoRoot}/mmorpg.db` en dev (monorepo) ou `{dataDirectory}/mmorpg.db` en production
- Migrations : `plugins/mmorpg/src/main/resources/db/migrations/*.sql`
- Table initiale : `player_profiles` (uuid, display_name, level, experience, timestamps)
Les dépendances JDBC (SQLite) et JSON (Gson) sont **embarquées dans le JAR** via Shadow, car absentes du classpath serveur.
@@ -3,11 +3,13 @@
## Environnement
1. Installer **JDK 25** (`java-25-openjdk`). Le script `start-server.sh` force `/usr/lib/jvm/java-25-openjdk`.
2. Installer **Hytale** via le launcher et configurer `hytale.home_path` (copier `hytale.properties.example``hytale.properties`).
3. Cloner le dépôt et ouvrir le projet dans IntelliJ IDEA : `./gradlew openIdea` (ScaffoldIt).
2. Installer **Hytale** via le launcher et configurer `hytale.home_path` (copier `hytale.properties.example``hytale.properties` dans `Hytale/`).
3. Cloner le dépôt et ouvrir le projet Gradle dans `Hytale/` (IntelliJ : `./gradlew openIdea` via ScaffoldIt).
## Commandes Gradle
Exécuter depuis le dossier `Hytale/` :
| Tâche | Description |
|-------|-------------|
| `./gradlew build` | Compile et produit le JAR (Shadow) |
@@ -25,7 +27,8 @@
## Base de données locale
- Fichier : `devserver/.../com.disklexar_MMORPG/mmorpg.db` (chemin exact selon ScaffoldIt)
- **Monorepo** : `mmorpg.db` à la racine du dépôt (à côté de `Hytale/` et `Webapp/`), si `UseMonorepoRoot: true` dans `config.json`
- **Sinon** : `devserver/.../com.disklexar_MMORPG/mmorpg.db` (chemin exact selon ScaffoldIt)
- Inspecter avec `sqlite3 mmorpg.db`
- Requête utile : `SELECT * FROM player_profiles;`
@@ -35,7 +38,7 @@ Les fichiers `*.db` sont ignorés par Git.
Le plugin utilise `getLogger()` (HytaleLogger). Activer `Debug: true` dans `config.json` pour plus de détails sur les sessions.
Logs serveur de dev : `devserver/logs/`.
Logs serveur de dev : `Hytale/devserver/logs/`.
## Dépannage runServer
@@ -55,7 +58,7 @@ La dépendance `com.hypixel.hytale:Server:+` est en **compileOnly** : ne pas l'i
## Ajouter une migration SQL
1. Créer `src/main/resources/db/migrations/00X_description.sql`
1. Créer `plugins/mmorpg/src/main/resources/db/migrations/00X_description.sql`
2. Étendre `SchemaInitializer` pour exécuter les nouveaux fichiers dans l'ordre
3. Documenter le changement dans le changelog / PR
@@ -260,7 +260,9 @@ pouvoirs / métiers / social.
> Relié à l'inventaire **vanilla** via `ItemGrid.InventorySectionId` (sac, barre rapide, armure, utilitaire).
> **`InventorySectionId` ne fonctionne pas** dans une coquille imbriquée : l'inventaire doit être le document
> racine (`MmorpgInventoryPage.ui`). Changement d'onglet vers/depuis Inventaire → `rebuild()` complet.
> Ne pas appeler `#Grid.Slots` depuis le serveur — le client rejette cette commande et déconnecte.
> Ne pas appeler `#Grid.Slots` depuis le serveur (tableau ou `#Grid.Slots.N`) — le client rejette
> ces commandes et déconnecte. Les grilles utilisent `InventorySectionId` ; l'affichage passe par
> des overlays `ItemSlot` (`ItemId` / `Quantity`).
> Glisser-déposer synchronisé ; panneau détails au clic.
| Zone | ID | Section vanilla |
View File
View File

Some files were not shown because too many files have changed in this diff Show More