first
This commit is contained in:
@@ -0,0 +1,393 @@
|
||||
# SpaceShipProject
|
||||
|
||||
Plugin Paper / Spigot **1.21+** qui permet à chaque joueur d'avoir un (ou plusieurs) spaceship personnel.
|
||||
Le vaisseau est chargé directement dans le ciel de la map actuelle ; il sert d'île volante privée que le
|
||||
joueur peut décorer, fortifier puis ranger dans une "télécommande" en forme de **Recovery Compass**.
|
||||
|
||||
> Inspiré du fonctionnement des îles de Skyllia, mais sans monde dédié : tout reste sur la map du joueur,
|
||||
> en plein ciel.
|
||||
|
||||
---
|
||||
|
||||
## Sommaire
|
||||
|
||||
- [Fonctionnalités](#fonctionnalités)
|
||||
- [Pré-requis](#pré-requis)
|
||||
- [Installation](#installation)
|
||||
- [Compilation](#compilation)
|
||||
- [Configuration](#configuration)
|
||||
- [Utilisation](#utilisation)
|
||||
- [Télécommande (Recovery Compass)](#télécommande-recovery-compass)
|
||||
- [GUI principal](#gui-principal)
|
||||
- [Saut Spatial](#saut-spatial)
|
||||
- [Commandes joueur (`/spaceship`, `/ss`, `/ship`)](#commandes-joueur-spaceship-ss-ship)
|
||||
- [Commandes admin (`/spaceshipadmin`, `/ssa`)](#commandes-admin-spaceshipadmin-ssa)
|
||||
- [Économie (Vault / EssentialsEconomy)](#économie-vault--essentialseconomy)
|
||||
- [Système de niveaux et de tailles](#système-de-niveaux-et-de-tailles)
|
||||
- [Stockage et base de données](#stockage-et-base-de-données)
|
||||
- [Modèles de spaceship](#modèles-de-spaceship)
|
||||
- [Permissions](#permissions)
|
||||
- [FAQ](#faq)
|
||||
|
||||
---
|
||||
|
||||
## Fonctionnalités
|
||||
|
||||
- Spaceships personnels matérialisés en plein ciel **sur la même map** que le joueur.
|
||||
- Télécommande **Recovery Compass** par spaceship (clic gauche / droit / shift+droit).
|
||||
- **Système de niveaux** : chaque level-up agrandit physiquement le vaisseau (x/z en alternance,
|
||||
+1 y tous les 4 niveaux). Les nouvelles limites sont indiquées par des **Verdant Froglight**
|
||||
aux 8 coins au premier chargement après l'upgrade.
|
||||
- **Saut spatial** : déplacement instantané du spaceship le long d'un axe, avec un coût en money
|
||||
proportionnel à la distance.
|
||||
- **Sauvegarde complète** : chaque dépose stocke les blocs **et le contenu des coffres / barils /
|
||||
fournaises / shulker boxes / etc.** dans la base de données.
|
||||
- **Protection** : seul le propriétaire (ou un admin) peut casser/poser des blocs dans un
|
||||
spaceship chargé. Les autres joueurs sont les bienvenus comme passagers.
|
||||
- **Vault / EssentialsEconomy** : tous les coûts (invocation, upgrade, saut spatial) sont payés
|
||||
via Vault. Aucun système monétaire interne — le solde du joueur est la source unique.
|
||||
- **Auto-déchargement à la déconnexion** : tous les spaceships du joueur sont sauvegardés et
|
||||
retirés du monde quand il se déconnecte.
|
||||
- **Respawn sur le vaisseau** : si le joueur meurt sur un de ses spaceships chargés, il y respawn.
|
||||
- **Modèles éditables** : un admin peut définir un plan par défaut (chargé en jeu, édité comme
|
||||
des blocs normaux puis sauvegardé) qui sert de base à chaque nouveau spaceship.
|
||||
- **GUI** complet pour gérer le ship : charger/décharger, téléport, set spawn, renommer, upgrade,
|
||||
supprimer, saut spatial.
|
||||
|
||||
---
|
||||
|
||||
## Pré-requis
|
||||
|
||||
- **Java 21+**
|
||||
- **Paper / Purpur / Folia (compat partielle) 1.21.x**
|
||||
- **Vault** (obligatoire pour l'économie)
|
||||
- Un fournisseur d'économie compatible Vault (recommandé : **EssentialsEconomy** via EssentialsX)
|
||||
|
||||
> Sans Vault, le plugin charge mais désactive toutes les actions payantes.
|
||||
|
||||
---
|
||||
|
||||
## Installation
|
||||
|
||||
1. Copier `SpaceShipProject-1.0-SNAPSHOT.jar` dans le dossier `plugins/` du serveur.
|
||||
2. S'assurer que `Vault` (+ un provider, ex. EssentialsX/EssentialsEconomy) est présent.
|
||||
3. Démarrer le serveur. Le dossier `plugins/SpaceShipProject/` sera créé avec `config.yml`,
|
||||
`models/` et `spaceships.db`.
|
||||
|
||||
---
|
||||
|
||||
## Compilation
|
||||
|
||||
Depuis la racine du dépôt `mcplugin/` :
|
||||
|
||||
```bash
|
||||
./build.sh SpaceShipProject
|
||||
```
|
||||
|
||||
Le JAR final est dans `SpaceShipProject/target/SpaceShipProject-1.0-SNAPSHOT.jar`.
|
||||
|
||||
Pré-requis : Maven 3.6+, JDK 21. Le script gère automatiquement `JAVA_HOME` sur Arch Linux.
|
||||
|
||||
---
|
||||
|
||||
## Configuration
|
||||
|
||||
Fichier `plugins/SpaceShipProject/config.yml` :
|
||||
|
||||
```yaml
|
||||
max-ships-per-player: 5
|
||||
|
||||
default-size: # taille initiale (level 1)
|
||||
x: 4
|
||||
y: 4
|
||||
z: 6
|
||||
|
||||
max-size: # plafond atteignable
|
||||
x: 16
|
||||
y: 8
|
||||
z: 16
|
||||
|
||||
costs:
|
||||
summon: 100 # cout pour charger un spaceship
|
||||
unload: 0 # cout pour decharger
|
||||
upgrade-base: 1000 # cout d'amelioration = upgrade-base * niveau actuel
|
||||
space-jump-per-block: 1
|
||||
|
||||
space-jump:
|
||||
blocks-per-level: 100 # distance max = blocks-per-level * niveau
|
||||
min-blocks: 1
|
||||
max-blocks-hard-cap: 5000
|
||||
|
||||
summon-offset-y: 30 # hauteur du ship au-dessus du joueur a l'invocation
|
||||
|
||||
default-platform-material: SMOOTH_QUARTZ
|
||||
default-edge-material: QUARTZ_PILLAR
|
||||
default-glass-material: WHITE_STAINED_GLASS
|
||||
|
||||
default-ship-name: "Spaceship #%n%"
|
||||
|
||||
safety:
|
||||
check-collision: true
|
||||
min-y-above-player: 10
|
||||
|
||||
messages:
|
||||
prefix: "&8[&bSpaceShip&8] &7"
|
||||
# ... (voir le fichier complet)
|
||||
```
|
||||
|
||||
Toutes les clés peuvent être modifiées à chaud via :
|
||||
|
||||
```
|
||||
/ssa setconfig <chemin> <valeur>
|
||||
/ssa getconfig <chemin>
|
||||
/ssa reload
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Utilisation
|
||||
|
||||
### Télécommande (Recovery Compass)
|
||||
|
||||
Chaque spaceship a sa propre télécommande. L'item est un **Recovery Compass** marqué par PDC.
|
||||
La lore montre l'ID, le nom, le niveau et la taille du ship.
|
||||
|
||||
| Action sur la télécommande | Effet |
|
||||
|---|---|
|
||||
| **Clic gauche** (au sol, ship non chargé) | Invoque le spaceship au-dessus du joueur (coût : `costs.summon`) |
|
||||
| **Clic gauche** (au sol, ship chargé) | Décharge le ship et sauvegarde toutes les modifications |
|
||||
| **Clic gauche** (sur le ship) | Refuse (utiliser clic droit pour redescendre d'abord) |
|
||||
| **Clic droit** (au sol, ship non chargé) | Invoque puis téléporte directement sur le ship |
|
||||
| **Clic droit** (au sol, ship chargé) | Téléporte sur le spawn du ship |
|
||||
| **Clic droit** (sur le ship) | Redescend au sol, à la position initiale |
|
||||
| **Shift + clic droit** | Ouvre le GUI de paramètres |
|
||||
|
||||
### GUI principal
|
||||
|
||||
Ouvert via **shift + clic droit** sur la télécommande. 36 slots :
|
||||
|
||||
```
|
||||
. . . . I . . . . I = info (niveau, taille, statut, solde Vault)
|
||||
. . . . . . . . .
|
||||
. T E . S . . . . T = toggle charge/decharge
|
||||
E = teleport up/down
|
||||
S = set spawn (sur le ship)
|
||||
J = Saut Spatial (sur le ship)
|
||||
U = Ameliorer (level-up)
|
||||
. . . . R . . . D R = renommer (par chat)
|
||||
D = supprimer (shift-clic pour confirmer)
|
||||
```
|
||||
|
||||
### Saut Spatial
|
||||
|
||||
Disponible **uniquement quand le joueur est sur son spaceship**.
|
||||
|
||||
1. Ouvrir le GUI principal, cliquer sur **Saut Spatial**.
|
||||
2. Choisir un axe : `X-`, `X+`, `Y-`, `Y+`, `Z-`, `Z+`.
|
||||
3. Ajuster la distance avec les boutons (`-50 -10 -1 / +1 +10 +50`, shift = ×10).
|
||||
4. Confirmer.
|
||||
|
||||
- Distance max = `space-jump.blocks-per-level × niveau` (par défaut 100 / niveau).
|
||||
- Coût = `costs.space-jump-per-block × distance` (par défaut 1 money / bloc).
|
||||
- Le ship est capturé, déchargé à l'ancienne position, rechargé à la nouvelle, et le joueur est
|
||||
téléporté sur son spawn.
|
||||
|
||||
---
|
||||
|
||||
## Commandes joueur (`/spaceship`, `/ss`, `/ship`)
|
||||
|
||||
| Commande | Description | Permission |
|
||||
|---|---|---|
|
||||
| `/ss help` | Aide | `spaceship.use` |
|
||||
| `/ss create` | Crée un nouveau spaceship + donne sa télécommande | `spaceship.create` |
|
||||
| `/ss give <joueur> <id>` | Redonne la télécommande perdue à un joueur (no-op si déjà présente, dédoublonne) | `spaceship.give` |
|
||||
| `/ss remote <id>` | Redonne sa propre télécommande | `spaceship.give` |
|
||||
| `/ss list [joueur]` | Liste compacte des ships | `spaceship.use` |
|
||||
| `/ss info [joueur]` | Infos détaillées (niveau, taille actuelle/suivante, saut max, etc.) | `spaceship.use` / `spaceship.info.other` |
|
||||
| `/ss delete <id>` | Supprime un ship et retire sa télécommande de l'inventaire | `spaceship.delete` |
|
||||
| `/ss reload` | Recharge la config | `spaceship.reload` |
|
||||
|
||||
---
|
||||
|
||||
## Commandes admin (`/spaceshipadmin`, `/ssa`)
|
||||
|
||||
| Commande | Description |
|
||||
|---|---|
|
||||
| `/ssa reload` | Recharge config + modèles |
|
||||
| `/ssa list [joueur]` | Liste tous les ships, ou ceux d'un joueur, ou les ships actuellement chargés |
|
||||
| `/ssa delete <id>` | Supprime n'importe quel ship |
|
||||
| `/ssa addmoney <joueur> <montant>` | Dépose de la money via Vault sur le solde du joueur |
|
||||
| `/ssa setlevel <joueur> <id> <level>` | Force le niveau d'un ship (la taille s'ajuste au prochain chargement) |
|
||||
| `/ssa setname <joueur> <id> <nom...>` | Renomme un ship |
|
||||
| `/ssa setconfig <chemin> <valeur>` | Modifie une clé du `config.yml` (auto-reload) |
|
||||
| `/ssa getconfig <chemin>` | Lit une clé |
|
||||
| `/ssa loadmodel [nom]` | Matérialise un modèle dans le ciel pour l'éditer (par défaut `default`) |
|
||||
| `/ssa savemodel` | Capture la session en cours et l'écrit dans `models/<nom>.json` |
|
||||
| `/ssa cancelmodel` | Annule la session et nettoie la zone |
|
||||
|
||||
Toutes ces commandes requièrent `spaceship.admin`.
|
||||
|
||||
---
|
||||
|
||||
## Économie (Vault / EssentialsEconomy)
|
||||
|
||||
Le plugin n'a **aucune** monnaie interne. Tout passe par **Vault** :
|
||||
|
||||
- Charger un spaceship → débite `costs.summon` au propriétaire.
|
||||
- Améliorer un spaceship → débite `costs.upgrade-base × niveau actuel`.
|
||||
- Saut spatial → débite `distance × costs.space-jump-per-block`.
|
||||
|
||||
La permission `spaceship.bypass.cost` permet de tester sans payer (par défaut OP).
|
||||
|
||||
Si Vault est absent / sans provider, le plugin log un warning et toutes les actions payantes
|
||||
sont bloquées (`Vault indisponible`).
|
||||
|
||||
---
|
||||
|
||||
## Système de niveaux et de tailles
|
||||
|
||||
Au niveau 1, la taille est celle de `default-size` (par défaut **4 × 4 × 6**, x/y/z).
|
||||
Chaque niveau gagné applique :
|
||||
|
||||
- **+1 sur X** (level-ups impairs : L1→L2, L3→L4, ...)
|
||||
- **+1 sur Z** (level-ups pairs : L2→L3, L4→L5, ...)
|
||||
- **+1 sur Y** tous les **4 level-ups** (L4→L5, L8→L9, ...)
|
||||
|
||||
…jusqu'au plafond `max-size` (par défaut **16 × 8 × 16**, atteint vers le niveau 27).
|
||||
|
||||
| Level | Taille (x,y,z) |
|
||||
|------|----------------|
|
||||
| 1 | 4 × 4 × 6 |
|
||||
| 2 | 5 × 4 × 6 |
|
||||
| 3 | 5 × 4 × 7 |
|
||||
| 4 | 6 × 4 × 7 |
|
||||
| 5 | 6 × 5 × 8 |
|
||||
| ... | ... |
|
||||
| 27+ | 16 × 8 × 16 |
|
||||
|
||||
Quand un ship est chargé pour la première fois après un upgrade, les nouvelles limites sont
|
||||
matérialisées par des blocs **Verdant Froglight** aux 8 coins. Le joueur peut ensuite les
|
||||
casser et décorer ses nouveaux murs librement — au prochain chargement, ces froglights ne
|
||||
réapparaissent pas (sauf nouvel upgrade).
|
||||
|
||||
---
|
||||
|
||||
## Stockage et base de données
|
||||
|
||||
SQLite local : `plugins/SpaceShipProject/spaceships.db`.
|
||||
|
||||
Trois tables :
|
||||
|
||||
```sql
|
||||
players(
|
||||
uuid TEXT PRIMARY KEY, name TEXT, settings TEXT,
|
||||
created_at TIMESTAMP, updated_at TIMESTAMP
|
||||
)
|
||||
|
||||
spaceships(
|
||||
id INTEGER PK,
|
||||
owner_uuid TEXT,
|
||||
name TEXT,
|
||||
size_x, size_y, size_z INTEGER,
|
||||
spawn_x, spawn_y, spawn_z INTEGER,
|
||||
schematic TEXT, -- JSON (palette + RLE + containers)
|
||||
settings TEXT, -- JSON libre
|
||||
level INTEGER DEFAULT 1,
|
||||
money INTEGER DEFAULT 0, -- obsolète (Vault), conservé pour migration
|
||||
last_loaded_level INTEGER, -- pour le marquage Verdant Froglight
|
||||
created_at TIMESTAMP, updated_at TIMESTAMP
|
||||
)
|
||||
|
||||
spaceships_loaded(
|
||||
spaceship_id INTEGER PK,
|
||||
world TEXT,
|
||||
origin_x, origin_y, origin_z INTEGER,
|
||||
loaded_at TIMESTAMP
|
||||
)
|
||||
```
|
||||
|
||||
Le champ `schematic` est un JSON :
|
||||
|
||||
```json
|
||||
{
|
||||
"size": [sx, sy, sz],
|
||||
"spawn": [ox, oy, oz],
|
||||
"palette": ["minecraft:air", "minecraft:smooth_quartz", ...],
|
||||
"blocks": [[paletteIdx, runLength], ...],
|
||||
"containers": [
|
||||
{"x":1,"y":2,"z":3,"items":[{"slot":0,"data":"base64..."}, ...]}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
Les `items` sont sérialisés via `ItemStack#serializeAsBytes()` : enchantements, NBT, custom
|
||||
data, etc. sont entièrement préservés.
|
||||
|
||||
---
|
||||
|
||||
## Modèles de spaceship
|
||||
|
||||
Stockés dans `plugins/SpaceShipProject/models/<name>.json` (format identique au champ
|
||||
`schematic`).
|
||||
|
||||
Workflow admin :
|
||||
|
||||
```text
|
||||
/ssa loadmodel # place le modele actuel devant l'admin (sinon genere une plateforme)
|
||||
# ... edite librement les blocs (admin = bypass de protection) ...
|
||||
/ssa savemodel # capture la zone -> models/default.json, nettoie le ciel
|
||||
```
|
||||
|
||||
Le prochain `/ss create` utilisera ce nouveau plan comme base. On peut créer plusieurs modèles
|
||||
nommés (`/ssa loadmodel arena`, etc.).
|
||||
|
||||
Si `models/default.json` n'existe pas, le plugin génère une plateforme procédurale (sol +
|
||||
piliers aux coins, vitres latérales).
|
||||
|
||||
---
|
||||
|
||||
## Permissions
|
||||
|
||||
```yaml
|
||||
spaceship.use: true # base : utiliser sa propre boussole
|
||||
spaceship.create: true # /ss create
|
||||
spaceship.give: true # /ss give (sa propre télécommande)
|
||||
spaceship.info.other: op # /ss info <autre joueur>
|
||||
spaceship.delete: true # supprimer un de ses ships
|
||||
spaceship.reload: op
|
||||
spaceship.admin: op # bypass de propriété + accès à /ssa
|
||||
spaceship.bypass.cost: op # ne paie pas summon / upgrade / saut
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## FAQ
|
||||
|
||||
**Que se passe-t-il si je me déconnecte alors que mon ship est chargé ?**
|
||||
Le plugin capture l'état complet (y compris coffres) et décharge le ship. Vous êtes téléporté
|
||||
au sol au préalable pour ne pas réapparaître en plein vol à la reconnexion.
|
||||
|
||||
**Et si je meurs sur mon ship ?**
|
||||
Vous respawnez directement sur le spawn du ship si celui-ci est encore chargé. Sinon, respawn
|
||||
normal.
|
||||
|
||||
**Le ship peut-il chevaucher des constructions du joueur ?**
|
||||
Non : le plugin vérifie qu'aucun bloc solide n'occupe la zone avant l'invocation
|
||||
(`safety.check-collision`). Si oui, l'invocation échoue avec un message d'erreur.
|
||||
|
||||
**Puis-je inviter d'autres joueurs sur mon ship ?**
|
||||
Oui — ils peuvent y monter (téléport-relay si tu leur indiques la position). Cependant, ils ne
|
||||
peuvent **pas modifier les blocs** : seuls le propriétaire et les admins peuvent casser/poser.
|
||||
|
||||
**Comment réinitialiser un ship à zéro ?**
|
||||
Le supprimer (`/ss delete <id>`) puis en recréer un (`/ss create`). La télécommande de l'ancien
|
||||
est retirée automatiquement.
|
||||
|
||||
**Que se passe-t-il quand le ship atteint la taille maximale ?**
|
||||
Le bouton "Améliorer" devient inactif. Vous gardez votre ship à taille max.
|
||||
|
||||
---
|
||||
|
||||
## License
|
||||
|
||||
Plugin développé pour un usage privé. Pas de licence formelle, à utiliser librement.
|
||||
Reference in New Issue
Block a user