# 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 /ssa getconfig /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 ` | Redonne la télécommande perdue à un joueur (no-op si déjà présente, dédoublonne) | `spaceship.give` | | `/ss remote ` | 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 ` | 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 ` | Supprime n'importe quel ship | | `/ssa addmoney ` | Dépose de la money via Vault sur le solde du joueur | | `/ssa setlevel ` | Force le niveau d'un ship (la taille s'ajuste au prochain chargement) | | `/ssa setname ` | Renomme un ship | | `/ssa setconfig ` | Modifie une clé du `config.yml` (auto-reload) | | `/ssa getconfig ` | 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/.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/.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 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 `) 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.