@@ -9,6 +9,9 @@ on:
|
|||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
working-directory: Hytale
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
|||||||
+7
-5
@@ -1,13 +1,15 @@
|
|||||||
### Build ###
|
### Build ###
|
||||||
build/
|
Hytale/build/
|
||||||
|
Hytale/.gradle/
|
||||||
|
Hytale/.kotlin/
|
||||||
|
Hytale/devserver/
|
||||||
.gradle/
|
.gradle/
|
||||||
.kotlin/
|
|
||||||
devserver/
|
|
||||||
|
|
||||||
### Hytale local config (chemin d'installation personnel) ###
|
### Hytale local config (chemin d'installation personnel) ###
|
||||||
hytale.properties
|
Hytale/hytale.properties
|
||||||
|
Hytale/gradle.properties
|
||||||
|
|
||||||
### Database ###
|
### Database (racine du monorepo + emplacements locaux) ###
|
||||||
*.db
|
*.db
|
||||||
*.db-journal
|
*.db-journal
|
||||||
|
|
||||||
|
|||||||
+3
-3
@@ -1,10 +1,10 @@
|
|||||||
# Contribution
|
# Contribution
|
||||||
|
|
||||||
Merci de contribuer au serveur MMORPG Hytale.
|
Merci de contribuer au serveur MMORPG Hytale Disklexar.
|
||||||
|
|
||||||
## Avant de commencer
|
## 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
|
2. Vérifier qu'aucune issue existante ne couvre déjà votre sujet
|
||||||
|
|
||||||
## Branches
|
## Branches
|
||||||
@@ -16,7 +16,7 @@ Merci de contribuer au serveur MMORPG Hytale.
|
|||||||
## Pull requests
|
## Pull requests
|
||||||
|
|
||||||
- Une PR = un sujet cohérent
|
- Une PR = un sujet cohérent
|
||||||
- `./gradlew build` doit passer
|
- `cd Hytale && ./gradlew build` doit passer
|
||||||
- Description en français ou anglais : **quoi** + **pourquoi**
|
- Description en français ou anglais : **quoi** + **pourquoi**
|
||||||
- Référencer la phase roadmap (M0, M1, …) si applicable
|
- Référencer la phase roadmap (M0, M1, …) si applicable
|
||||||
|
|
||||||
|
|||||||
@@ -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 {
|
repositories {
|
||||||
mavenCentral()
|
mavenCentral()
|
||||||
}
|
}
|
||||||
@@ -17,6 +24,7 @@ repositories {
|
|||||||
dependencies {
|
dependencies {
|
||||||
implementation("org.xerial:sqlite-jdbc:3.47.2.0")
|
implementation("org.xerial:sqlite-jdbc:3.47.2.0")
|
||||||
implementation("com.google.code.gson:gson:2.11.0")
|
implementation("com.google.code.gson:gson:2.11.0")
|
||||||
|
implementation("at.favre.lib:bcrypt:0.10.2")
|
||||||
}
|
}
|
||||||
|
|
||||||
tasks.shadowJar {
|
tasks.shadowJar {
|
||||||
@@ -53,8 +53,8 @@ Le singleton `MmorpgPlugin.get()` est rafraîchi à chaque chargement pour reste
|
|||||||
|
|
||||||
## Persistance
|
## Persistance
|
||||||
|
|
||||||
- Fichier : `{dataDirectory}/mmorpg.db`
|
- Fichier : `{monorepoRoot}/mmorpg.db` en dev (monorepo) ou `{dataDirectory}/mmorpg.db` en production
|
||||||
- Migrations : `src/main/resources/db/migrations/*.sql`
|
- Migrations : `plugins/mmorpg/src/main/resources/db/migrations/*.sql`
|
||||||
- Table initiale : `player_profiles` (uuid, display_name, level, experience, timestamps)
|
- 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.
|
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
|
## Environnement
|
||||||
|
|
||||||
1. Installer **JDK 25** (`java-25-openjdk`). Le script `start-server.sh` force `/usr/lib/jvm/java-25-openjdk`.
|
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`).
|
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 dans IntelliJ IDEA : `./gradlew openIdea` (ScaffoldIt).
|
3. Cloner le dépôt et ouvrir le projet Gradle dans `Hytale/` (IntelliJ : `./gradlew openIdea` via ScaffoldIt).
|
||||||
|
|
||||||
## Commandes Gradle
|
## Commandes Gradle
|
||||||
|
|
||||||
|
Exécuter depuis le dossier `Hytale/` :
|
||||||
|
|
||||||
| Tâche | Description |
|
| Tâche | Description |
|
||||||
|-------|-------------|
|
|-------|-------------|
|
||||||
| `./gradlew build` | Compile et produit le JAR (Shadow) |
|
| `./gradlew build` | Compile et produit le JAR (Shadow) |
|
||||||
@@ -25,7 +27,8 @@
|
|||||||
|
|
||||||
## Base de données locale
|
## 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`
|
- Inspecter avec `sqlite3 mmorpg.db`
|
||||||
- Requête utile : `SELECT * FROM player_profiles;`
|
- 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.
|
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
|
## 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
|
## 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
|
2. Étendre `SchemaInitializer` pour exécuter les nouveaux fichiers dans l'ordre
|
||||||
3. Documenter le changement dans le changelog / PR
|
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).
|
> 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
|
> **`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.
|
> 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.
|
> Glisser-déposer synchronisé ; panneau détails au clic.
|
||||||
|
|
||||||
| Zone | ID | Section vanilla |
|
| Zone | ID | Section vanilla |
|
||||||
Vendored
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user