Files
SpaceShipProject/README.md
T
gpatruno 94404156d9 first
2026-05-19 15:35:55 +02:00

14 KiB
Raw Blame History

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

  • 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/ :

./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 :

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 :

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 :

{
  "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 :

/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

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.