Hôtel des ventes (/hdv) : ventes directes et enchères, invendus, historique et annulation par le staff.
Hôtel des ventes (/hdv) : ventes directes et enchères, invendus, historique et annulation par le staff.
- Saisie par dialogue natif : sur un client 1.21.6 ou plus, miser sur une enchère (clic gauche dans la page Enchères) ou donner la raison d'une annulation staff (clic droit) ouvre un dialogue avec un champ de saisie et deux boutons, Miser / Valider et Annuler, à la place de « saisissez dans le chat, tapez annuler ». Échap annule proprement. Le dialogue rappelle l'objet, la meilleure offre, la mise minimum et le temps restant.
- Mêmes règles que le chat : le montant est lu comme au chat (virgule décimale, espaces ignorés, strictement positif) puis transmis à la même méthode de mise, qui revérifie tout côté serveur : enchère encore ouverte, vendeur, meilleur enchérisseur, minimum, incrément, solde, concurrence. Les messages d'erreur sont ceux du chat. Aucun plafond n'est imposé aux gros montants (champ texte, pas de curseur).
- Saisie à usage unique : chaque dialogue porte un jeton aléatoire ; un clic n'est pris en compte que si le jeton, le type de saisie et le joueur correspondent, avant expiration (
dialogues.expiration-secondes). La saisie est annulée si le joueur se déconnecte ou si l'enchère disparaît (annulée, expirée, remportée). - Titre en première ligne, joueur aveuglé : le titre d'un dialogue (mise, raison d'annulation, nouvelle recherche) est la première ligne du corps, l'icône d'avertissement du client reste seule sur la barre de titre. Le joueur est aveuglé tant que le dialogue est affiché, pour lire le texte sur fond noir ; l'effet est retiré dès qu'il clique un bouton du dialogue, sinon dès qu'il tourne la caméra, se déplace ou ouvre un inventaire, et un joueur déjà aveugle n'est pas touché. Se coupe avec
dialogues.aveugler-pendant-dialogues: false. - Repli sur le chat : les clients plus anciens (ViaVersion donne leur version),
dialogues.actif: falseou une API de dialogues absente gardent exactement la saisie par chat d'avant. - Saisie au chat fiabilisée : une mise refusée (trop basse, solde insuffisant, course perdue) ne ferme plus l'attente : le message d'erreur habituel s'affiche, puis le plugin redemande un montant (
bid_retry_prompt), au lieu de laisser le montant retapé partir dans le chat public. L'attente ne se termine que sur une mise acceptée,annuler, l'expiration (60 s depuis la dernière tentative) ou une enchère devenue indisponible.NaN,Infinity,0et les négatifs sont refusés comme un montant invalide.
Les mises en vente, achats, mises, enchères remportées, retraits et annulations du staff sont écrits dans les fichiers mises-en-vente, achats, encheres, retraits et staff de SHLogs (plugins/SHLogs/SHAuctions/) ; les enchères et ventes du serveur dans encheres-serveur et ventes-serveur.
Utilisé sur : Opale.
Chaque jour, le serveur met lui-même des lots aux enchères (page Enchères, section encheres-serveur) et en vente à prix fixe (page Ventes, section ventes-serveur) ; actif: true active chaque type. But : donner aux SHC une dépense désirable qui les retire de l'économie. Aucune limite par joueur : seul l'étalement aléatoire des heures laisse sa chance à tout le monde.
- Annonces comme celles d'un joueur : vendeur affiché
vendeur(SkyHand). Enchères : mises au dialogue ou au chat, remboursement du surenchéri, anti-snipe, écart minimal entre deux mises propre à chaque lot (increment-min). Ventes : un seul exemplaire au prix fixeprix, achat par la page Ventes comme toute vente directe ; la vente disparaît une fois achetée ou à la fin de sa durée. - Argent retiré du jeu : l'offre gagnante ou le prix payé n'est versé à personne.
- Lot remis par commandes : les
commandesdu lot sont lancées par la console pour le joueur (%player%). Joueur connecté avec une place libre : tout de suite. Hors ligne (enchère) ou inventaire plein : le lot part dans ses invendus (signalés à la connexion,/hdv expired) et les commandes sont lancées quand il le récupère. L'objet affiché dans l'HDV n'est jamais donné. L'objet porte son lot (id, type, commandes, incrément) : un reload qui change les lots ne touche pas une annonce en cours, et en mode réseau n'importe quel serveur sait la régler. - Sans offre / sans acheteur : l'annonce disparaît, rien ne bouge.
- Planning : chaque lundi 00:00 (heure du serveur), chaque jour de la semaine reçoit entre
par-jour.minetpar-jour.maxenchères et autant de ventes, à des heures tirées dans laplage-horaire(une par tranche égale de la plage), avececart-minimal-minutesentre deux débuts ; les ventes gardent aussi leur écart avec les enchères. Durées tirées dansduree-minutes. Le jour de la mise en route reçoit sa part au prorata. Le planning est gardé dansplugins/SHAuctions/encheres-serveur.yml: les redémarrages ne le changent pas ; une annonce dont l'heure passe serveur éteint est lancée au démarrage si sa plage n'est pas finie, sinon notée manquée. Changer les réglages refait la suite de la semaine. Si l'écart minimal ne laisse pas la place d'en mettre autant dans un jour, ce jour en reçoit moins. - Tirage des lots : au prorata de
poids(0 = jamais tiré, lançable à la main). Un lot lancé (enchère ou vente) depuis moins derepetition-minimale-heures(24 par défaut) n'est pas retiré, sauf s'il ne reste aucun autre lot tirable. La config fournie ne porte que quelques lots d'exemple. - Annonces : chaque nouvelle enchère (
server_auction_start, cliquable : ouvre/hdv encheres) et chaque nouvelle vente (server_sale_start, cliquable : ouvre/hdv) sont annoncées à tout le serveur, objet survolable, sonson-annoncesi réglé ; le gagnant d'une enchère aussi (server_auction_result). En mode réseau, sur les autres serveurs aussi. - Mode réseau : seul le serveur où
actifvauttruetient le planning et lance les annonces de ce type ; tous les affichent, prennent mises et achats, le serveur meneur règle les échéances.
Avec SHNetwork chargé et reseau.actif: true (par défaut), un seul hôtel des ventes sert tous les serveurs du réseau. Sans SHNetwork, rien ne change : base SQLite locale, mêmes commandes, mêmes messages.
- Stockage : MariaDB (
reseau.base-de-donnees), tablesshauctions_auctions,shauctions_sold_items,shauctions_expired_items,shauctions_wanted,shauctions_bids(journal des mises) etshauctions_state. Le premier serveur démarré en mode réseau y reprend une fois sa base SQLite, ids compris ; chaque serveur renomme ensuite la sienne enshauctions.db.avant-reseau, pour qu'un retour sans SHNetwork ne fasse jamais réapparaître des annonces déjà vendues. Base injoignable : l'HDV se désactive sur ce serveur au lieu de retomber sur SQLite. - Achat : l'annonce est réservée en base avant tout mouvement d'argent (
UPDATE ... WHERE claim_token IS NULL) ; un seul serveur l'obtient. Puis l'acheteur paie, le vendeur est payé, et l'annonce est supprimée avec l'écriture de la vente dans une seule transaction. Un échec en route rend l'argent et libère la réservation. - Mise : l'argent est mis de côté, puis une transaction verrouille l'enchère (
SELECT ... FOR UPDATE), revérifie toutes les règles (échéance, vendeur, meilleur enchérisseur, minimum, anti-snipe) et rend l'enchérisseur qu'elle remplace : c'est lui qui est remboursé, une fois. Chaque mise prise laisse une ligne dansshauctions_bids. - Annulation et échéance : transaction qui verrouille, supprime et range l'objet ; le remboursement et le paiement du vendeur se calculent sur la ligne verrouillée. Les échéances et le nettoyage des invendus ne tournent que sur le serveur meneur (
leaderSHNetwork, tâcheshauctions-echeances). - Mise en vente : l'annonce est écrite réservée (invisible) et ne devient visible qu'une fois l'objet retiré de l'inventaire.
- Joueur sur un autre serveur : surenchère, vente, enchère remportée, remboursement et annulation staff lui sont annoncés par le bus (
reseau.canal). Les annonces d'enchères et le rafraîchissement des menus ouverts passent par le même canal. Un objet gagné par un joueur connecté sur un autre serveur que le meneur va dans ses invendus (/hdv expired). - Opération interrompue (serveur arrêté brutalement au milieu) : une mise en vente jamais publiée est supprimée après 10 minutes (l'inventaire du vendeur est revenu à sa dernière sauvegarde, l'objet y est) ; un achat interrompu est signalé une fois dans la console du meneur pour une vérification à la main.
- Optionnelles :
Vault,ViaVersion(version du client pour choisir dialogue ou chat ; sans lui tous les clients sont considérés compatibles),SHLogs(journal des actions, sinon écrit dans la console),SHNetwork(mode réseau) - Bibliothèques chargées par Paper (
libraries:) : HikariCP et le pilote MariaDB, utilisés seulement en mode réseau
| Commande | Alias | Description | Permission |
|---|---|---|---|
/hdv |
/ah, /auctionhouse |
Ouvre l'hôtel des ventes. Sous-commandes joueur : sell, bid, encheres (page Enchères), history, expired, ownsales, recherche. |
shauctions.use |
/shauctions reload |
— | Recharge config.yml, messages.yml et les menus. Un fichier illisible ne change rien : le message donne le fichier et l'erreur. Replanifie la tâche des échéances. Les sections reseau, database et economy.use_vault demandent un redémarrage ; les données ne sont jamais touchées. |
shauctions.admin.reload |
/shauctions info <joueur> |
— | Ventes, enchères, invendus et ventes terminées d'un joueur, avec ses limites s'il est connecté. | shauctions.admin.info |
/shauctions plan |
— | Planning de la semaine des enchères et ventes du serveur : date, type, durée, état (prévue, lancée et lot, retirée, manquée). | shauctions.admin.plan |
/shauctions launch [vente] <lot|random> [durée] |
— | Lance tout de suite une enchère du serveur (une vente avec vente) sur ce lot, hors planning (durée : 2m, 1h30m, 3 = 3 h ; sans durée, tirée dans duree-minutes de la section). |
shauctions.admin.launch |
/shauctions skip [enchere|vente] |
— | Retire du planning la prochaine enchère ou vente du serveur prévue (la prochaine des deux sans précision). | shauctions.admin.skip |
/shauctions marche aussi depuis la console. /hdv reload reste accepté et fait la même chose que /shauctions reload. Sans argument, /shauctions rappelle les sous-commandes que l'on a le droit d'utiliser.
| Permission | Description | Par défaut |
|---|---|---|
shauctions.use |
Permet d'utiliser les fonctionnalités de base de l'HDV (ouvrir, voir). | true |
shauctions.sell |
Permet de mettre des items en vente. | true |
shauctions.buy |
Permet d'acheter des items. | true |
shauctions.bid |
Permet de mettre des items aux enchères et de miser. | true |
shauctions.menu.bids |
Permet d'ouvrir la page des Enchères. | true |
shauctions.menu.ownsales |
Affiche le bouton "Vos objets en vente" dans les menus. | true |
shauctions.menu.expired |
Affiche le bouton "Vos invendus" dans les menus. | true |
shauctions.menu.history |
Affiche le bouton "Historique des ventes" dans les menus. | true |
shauctions.history.self |
Permet de voir son propre historique de ventes. | true |
shauctions.history.global |
Permet de voir l'historique global des ventes. | op |
shauctions.expired.claim |
Permet de réclamer ses items expirés. | true |
shauctions.cancel.self |
Permet d'annuler ses propres ventes. | true |
shauctions.cancel.others |
Permet d'annuler les ventes des autres joueurs (admin). | op |
shauctions.ownsales.view |
Permet d'utiliser la commande /hdv ownsales (le bouton des menus passe par shauctions.menu.ownsales). |
op |
shauctions.recherches.use |
Onglet Recherches de l'HDV. | true |
shauctions.recherches.admin |
Supprimer n'importe quelle recherche, sans délai entre deux publications. | op |
shauctions.admin |
Toute l'administration (parent des permissions suivantes). | op |
shauctions.admin.reload |
/shauctions reload et /hdv reload. |
op |
shauctions.admin.info |
/shauctions info. |
op |
shauctions.admin.plan |
/shauctions plan. |
op |
shauctions.admin.launch |
/shauctions launch. |
op |
shauctions.admin.skip |
/shauctions skip. |
op |
Paliers (nœuds construits à partir d'un nombre, non déclarés) :
| Permission | Effet |
|---|---|
shauctions.limit.<n> (ou unlimited, *) |
Ventes simultanées, exemple shauctions.limit.4. La plus grande valeur l'emporte. |
shauctions.bidlimit.<n> (ou unlimited, *) |
Enchères simultanées, exemple shauctions.bidlimit.1. |
shauctions.recherches.max.<n> |
Recherches en cours, exemple shauctions.recherches.max.6. |
Fichiers par défaut, avec des valeurs d'exemple. Cliquez sur un fichier pour l'ouvrir :
plugins/SHAuctions/ ├── config.yml sections encheres-serveur et ventes-serveur (planning, lots), dialogues.actif, dialogues.min-protocol (771 = 1.21.6), dialogues.expiration-secondes, dialogues.aveugler-pendant-dialogues, section logs (fichier et format de chaque ligne SHLogs), section reseau (mode réseau avec SHNetwork) ├── encheres-serveur.yml planning de la semaine des enchères et ventes du serveur (écrit par le plugin) ├── messages.yml messages server_* (enchères et ventes du serveur), section dialogues (titres, champs, boutons, erreurs), messages dialog_* et bid_retry_prompt ; les clés manquantes (dont generic_error_occurred) sont ajoutées au fichier du serveur au premier démarrage └── menus/ ├── auction_bids.yml ├── confirm_purchase.yml ├── expired_items.yml ├── main_auction_house.yml ├── own_sales.yml ├── own_wanted_requests.yml ├── sales_history.yml └── wanted_requests.yml
Java 25 et Maven :
mvn clean packageLe jar est généré dans target/. Les tests du planning du serveur (1 à 3 enchères et ventes par jour, plage horaire, écarts, ventes tenues à l'écart des enchères, planning relu après redémarrage) tournent sans serveur. Les tests du mode réseau (une seule réservation, chaque mise remplacée remboursée une fois, échéance réglée une fois, importation) tournent sur une vraie base MariaDB jetable : SHAU_TEST_URL, SHAU_TEST_USER, SHAU_TEST_PASSWORD ; sans elles ils sont ignorés.
Développé par Cry_Legende pour le serveur SkyHand · Tous droits réservés