File Details
arcadia-ah-1.3.2
- R
- Jun 9, 2026
- 141.04 KB
- 24
- 1.21.1
- NeoForge
File Name
arcadia-ah-1.3.2.jar
Supported Versions
- 1.21.1
Curse Maven Snippet
## [1.3.2] - 2026-06-08 (latest)
### Fixed
- **Seller silently paid nothing on a completed sale (root cause of "sold for 1000, received 0")** — The currency credit API (`EconomyService.add`) was `void` and the Numismatics backend swallowed any deposit failure, only logging it. Every "pay an online player directly" call site (seller payout, mailbox coin claim, outbid refund) therefore could not detect a failed credit and had no fallback — the sale committed, the buyer was charged, the seller saw a "you sold it for 1000" message, but the coins were destroyed. `add` now returns a success boolean (lib 1.2.13); `payOrMail` and the mailbox coin-claim now fall back to a durable mailbox entry when an online credit fails, and the false "received" confirmation is suppressed on failure.
- **Wrong payment / coin mint above 2.147 billion (int truncation)** — The Numismatics backend cast every transfer to `int` (`(int) Math.min(amount, Integer.MAX_VALUE)`), so any payout or charge above `Integer.MAX_VALUE` was silently clamped — sellers underpaid, and `deduct` checked the full balance but removed only the clamped amount, minting coins. Deposits and deductions now move the full `long` in `Integer.MAX_VALUE`-sized chunks (lib 1.2.13). Bids are now capped at `max_listing_price` at both the command edge and in `BidManager` (previously unbounded), and `max_listing_price`'s allowed range is hard-capped at `Integer.MAX_VALUE` so no single coin movement can exceed the safe transfer range.
- **Critical: instant-buy or cancel of a bid-bearing listing destroyed the bidder's escrow** — A listing's price doubles as its bid floor, so any listing could be bid on *and* instant-bought. Buy-now and cancel both deleted only the listing row and never consulted the bid layer, so an outstanding bidder's escrowed coins were permanently lost and an orphan bid row resurrected on every restart. Buy and cancel now claim the listing and delete the bid row in one transaction (`claimListingWithBid`), refund the displaced bidder via the single online/mailbox channel, and a startup reconciliation pass refunds any orphan bids left by older builds.
- **Expired/unsold items unclaimable forever; item destroyed on degraded buy/cancel** — An item whose stored NBT no longer deserializes on the claiming server (cross-server shulker, mod/registry change) left a mailbox entry that rejected every claim *and* counted against the listing cap, permanently blocking new listings with no in-game remedy. Such rows are now flagged `corrupt` (kept for recovery, excluded from the count), the raw NBT is logged, and a new op command `/arcadia_ah admin mailbox list|purge <player>` surfaces and clears them. On a degraded *buy* or *cancel* the seller's original item blob is now re-mailed instead of silently destroyed.
- **Item dropped on the floor when claiming with a full inventory** — Mailbox item delivery and cancelled-listing returns dropped the item at the player's feet when the inventory was full, where it could despawn or be taken by others. The item is now kept in (or re-added to) the mailbox instead.
### Changed
- **Listing-fail undo logs the lost item NBT** — When listing persistence fails and the fee/item are re-mailed, a failed mailbox insert now logs the raw item NBT (the only unrecoverable payload) so an admin can reconstruct it.
- **Singleplayer durability** — A server-stopping flush now persists any mailbox/expiry change that landed after the last autosave (debug/singleplayer only).
- **Dependency** — Now requires `arcadia_lib >= 1.2.14` (failure-aware, overflow-safe economy API; 1.2.14 late-binds the LuckPerms backend, fixing the staff-cosmetics regression, and ships perf improvements). `libs/` dependency jar refreshed from `1.2.13` to `1.2.14`; full build verified.
### Correctifs
- **Vendeur payé zéro sur une vente aboutie (cause racine de « vendu à 1000, reçu 0 »)** — L'API de crédit (`EconomyService.add`) était `void` et le backend Numismatics avalait silencieusement tout échec de dépôt. Chaque crédit direct à un joueur en ligne (paiement vendeur, réclamation de pièces en boîte, remboursement d'enchère surenchérie) ne pouvait donc pas détecter un crédit échoué ni se rabattre sur autre chose — la vente était validée, l'acheteur débité, le vendeur voyait « vendu pour 1000 », mais les pièces étaient détruites. `add` renvoie désormais un booléen de succès (lib 1.2.13) ; `payOrMail` et la réclamation de pièces se rabattent sur une entrée de boîte aux lettres durable si le crédit en ligne échoue, et la fausse confirmation « reçu » est supprimée en cas d'échec.
- **Paiement erroné / création de pièces au-delà de 2,147 milliards (troncature int)** — Le backend Numismatics convertissait chaque transfert en `int`, donc tout paiement ou débit au-delà d'`Integer.MAX_VALUE` était silencieusement tronqué — vendeurs sous-payés, et `deduct` vérifiait le solde complet mais ne retirait que le montant tronqué, créant des pièces. Les dépôts et débits déplacent désormais le `long` complet par tranches d'`Integer.MAX_VALUE` (lib 1.2.13). Les enchères sont désormais plafonnées à `max_listing_price` au niveau de la commande et dans `BidManager` (auparavant illimitées), et la plage autorisée de `max_listing_price` est bornée à `Integer.MAX_VALUE`.
- **Critique : l'achat direct ou l'annulation d'une annonce avec enchère détruisait l'escrow de l'enchérisseur** — Le prix d'une annonce sert aussi de plancher d'enchère, donc toute annonce pouvait être enchérie *et* achetée directement. L'achat et l'annulation supprimaient seulement la ligne d'annonce sans consulter la couche d'enchères, donc les pièces d'un enchérisseur étaient perdues à jamais et une ligne orpheline ressuscitait à chaque redémarrage. L'achat et l'annulation suppriment désormais l'annonce et la ligne d'enchère dans une seule transaction (`claimListingWithBid`), remboursent l'enchérisseur évincé via le canal unique en ligne/boîte, et une passe de réconciliation au démarrage rembourse les enchères orphelines des anciennes versions.
- **Objets expirés/invendus jamais réclamables ; objet détruit sur achat/annulation dégradé** — Un objet dont le NBT stocké ne se désérialise plus sur le serveur de réclamation (shulker inter-serveur, changement de mod/registre) laissait une entrée de boîte qui refusait toute réclamation *et* comptait dans la limite d'annonces, bloquant définitivement les nouvelles annonces sans recours en jeu. Ces lignes sont désormais marquées `corrupt` (conservées pour récupération, exclues du décompte), le NBT brut est journalisé, et une nouvelle commande op `/arcadia_ah admin mailbox list|purge <joueur>` les expose et les purge. Sur un *achat* ou une *annulation* dégradés, le blob d'origine du vendeur est désormais renvoyé par courrier au lieu d'être détruit.
- **Objet lâché au sol lors d'une réclamation avec inventaire plein** — La livraison d'objets en boîte et les retours d'annonce annulée lâchaient l'objet aux pieds du joueur quand l'inventaire était plein, où il pouvait disparaître ou être pris. L'objet est désormais conservé dans (ou réinséré dans) la boîte aux lettres.
### Modifications
- **L'annulation d'un échec de listing journalise le NBT de l'objet perdu** — Quand la persistance d'une annonce échoue et que les frais/objet sont renvoyés, un échec d'insertion en boîte journalise désormais le NBT brut (seule charge irrécupérable) pour qu'un admin puisse le reconstruire.
- **Durabilité en solo** — Un flush à l'arrêt du serveur persiste désormais tout changement de boîte/expiration survenu après la dernière sauvegarde auto (solo / debug uniquement).
- **Dépendance** — Nécessite désormais `arcadia_lib >= 1.2.14` (API économie sûre face aux échecs et aux dépassements ; 1.2.14 lie tardivement le backend LuckPerms, corrigeant la régression des cosmétiques staff, et apporte des optimisations). Jar de dépendance dans `libs/` mis à jour de `1.2.13` vers `1.2.14` ; build complet vérifié.