promotional bannermobile promotional banner

Arcadia Auction House

Arcadia Auction House adds a cross-player marketplace with item listings, a mailbox for delivered purchases, and Numismatics currency support. Requires Arcadia Lib.

File Details

arcadia-ah-1.2.3

  • R
  • Apr 23, 2026
  • 102.73 KB
  • 27.2K
  • 1.21.1
  • NeoForge

File Name

arcadia-ah-1.2.3.jar

Supported Versions

  • 1.21.1

Curse Maven Snippet

NeoForge

implementation "curse.maven:arcadia-ah-1493501:7971269"
Curse Maven does not yet support mods that have disabled 3rd party sharing

Learn more about Curse Maven

## [1.2.3] - 2026-04-23 (latest)

### Added

- **Live coin-breakdown preview in the sell screen** — `AhSellScreen` previously asked the seller for a raw spur amount with zero indication of what that number represents in real Numismatics coins — sellers had to do the math in their head. A translucent preview line under the price field now renders a live `Component`-based breakdown of the typed amount (`"1 Sun, 3 Crown, 2 Cog, 1 Florin"` or whatever the player's locale shows on their coin tooltips) while they type. Panel height expanded 130 → 150 px to fit the new line above the Sell/Cancel buttons. Hint text `arcadia_ah.gui.sell.preview_hint` shown when the field is empty or invalid. Requires arcadia-lib ≥ 1.2.5 for `NumismaticsBackend.formatPriceBreakdown`.

### Ajouts

- **Aperçu live de la répartition en pièces dans l'écran de vente** — `AhSellScreen` demandait auparavant au vendeur un montant brut en spurs sans aucune indication de ce que ce nombre représente en vraies pièces Numismatics — les vendeurs devaient faire le calcul de tête. Une ligne d'aperçu translucide sous le champ de prix affiche maintenant une décomposition live (`Component`) du montant saisi (`"1 Sun, 3 Crown, 2 Cog, 1 Florin"` ou tout ce que la locale du joueur affiche sur ses tooltips de pièces) pendant qu'il tape. Hauteur du panneau passée de 130 à 150 px pour loger la nouvelle ligne au-dessus des boutons Vendre/Annuler. Texte d'indication `arcadia_ah.gui.sell.preview_hint` affiché quand le champ est vide ou invalide. Nécessite arcadia-lib ≥ 1.2.5 pour `NumismaticsBackend.formatPriceBreakdown`.

---

## [1.2.2] - 2026-04-23

### Fixed

- **Clicking an AH listing could buy the wrong item** — `AhDashboardTab.handleClick` recomputed `index = page * 36 + (slot - 9)` against a fresh `getFiltered()` call. Between the moment `buildTab` rendered the page and the moment the player clicked, `AuctionManager.refreshCache()` could replace the cache (expired listings pruned, new listings inserted, etc.), shifting what index N pointed to — the click then bought or cancelled a different listing than the one visually under the cursor. Now `buildTab` records a `Map<slotId, listingUuid>` snapshot of exactly what was rendered and `handleClick` resolves the UUID from it; the server-side `buyListing`/`cancelListing` already accept UUIDs, so the right listing is always resolved (or cleanly errors with `listing_gone` if it vanished).
- **AH sale notification + payout doubled on seller's next login** — When the seller was online on the same server at purchase time, `buyListing` inserted a mailbox entry asynchronously and then asynchronously deleted it on a separate `executeAsync` task. The 4-threaded DB executor could re-order the pair; a "delete-then-insert" reorder left a ghost mailbox row in MySQL that was re-delivered (re-paid!) the next time the seller logged in. Now if the seller is online on THIS server we pay them directly and skip the mailbox insert entirely — no row, no race, no double payment.
- **Refuse listing a currently-summoned pet** — Listing a pet in the AH while its entity was still following the seller let the seller keep the pet and sell a copy at the same time. `AuctionManager.listItem` now calls `ArcadiaModRegistry.isPetActive(petId)` (soft-dep via arcadia-lib ≥ 1.2.2) and rejects the listing with `arcadia_pets.msg.pet_active_cannot_list`. Seller must recall the pet first.

### Correctifs

- **Cliquer sur une annonce HDV pouvait acheter le mauvais item** — `AhDashboardTab.handleClick` recalculait `index = page * 36 + (slot - 9)` dans un `getFiltered()` rafraîchi. Entre le moment où `buildTab` affichait la page et le clic du joueur, `AuctionManager.refreshCache()` pouvait remplacer le cache (annonces expirées purgées, nouvelles insérées, etc.), décalant à quoi l'index N pointait — le clic achetait ou annulait une annonce différente de celle visuellement sous le curseur. Désormais `buildTab` enregistre un snapshot `Map<slotId, listingUuid>` de exactement ce qui a été affiché et `handleClick` en extrait l'UUID ; le `buyListing`/`cancelListing` côté serveur accepte déjà des UUIDs, donc la bonne annonce est toujours résolue (ou erreur propre `listing_gone` si elle a disparu).
- **Notification + paiement de vente HDV doublés à la prochaine reconnexion** — Quand le vendeur était en ligne sur le même serveur au moment de l'achat, `buyListing` insérait une entrée mailbox en asynchrone puis la supprimait en asynchrone dans une tâche `executeAsync` séparée. L'exécuteur DB multi-thread (4) pouvait réordonner la paire ; un "delete puis insert" laissait une ligne mailbox fantôme en MySQL qui était re-livrée (re-payée !) à la reconnexion. Maintenant si le vendeur est en ligne sur CE serveur on le paye directement et on skip complètement l'insert mailbox — plus de ligne, plus de race, plus de double paiement.
- **Refus de mise en vente d'un pet actuellement invoqué** — Mettre en vente un pet à l'HDV pendant que son entité suivait toujours le vendeur permettait au vendeur de garder le pet et d'en vendre une copie en même temps. `AuctionManager.listItem` appelle maintenant `ArcadiaModRegistry.isPetActive(petId)` (soft-dep via arcadia-lib ≥ 1.2.2) et refuse avec `arcadia_pets.msg.pet_active_cannot_list`. Le vendeur doit d'abord rappeler son pet.

---

## [1.2.1] - 2026-04-23

### Fixed

- **logSale column count mismatch** — `AuctionDatabase.logSale` was emitting `INSERT INTO arcadia_prestige_auction_sales_log VALUES (?,?,?,?,?,?)` (6 values) while the table schema has 7 columns (the indexed `item_type` column was added for leaderboard/analytics). Every sale raised `SQLException: Column count doesn't match value count at row 1`, skipping the sales-log write and corrupting leaderboard/revenue aggregates. INSERT now names all 7 columns explicitly and populates `item_type` from the sold listing — prevents recurrence after any future schema additions.

### Ajouts

*(aucun)*

### Correctifs

- **Incohérence du nombre de colonnes dans logSale** — `AuctionDatabase.logSale` envoyait `INSERT INTO arcadia_prestige_auction_sales_log VALUES (?,?,?,?,?,?)` (6 valeurs) alors que la table en a 7 (la colonne indexée `item_type` avait été ajoutée pour le classement et les analytiques). Chaque vente levait `SQLException: Column count doesn't match value count at row 1`, bloquant l'écriture du journal des ventes et faussant les agrégats classement/revenus. L'INSERT nomme désormais les 7 colonnes explicitement et renseigne `item_type` depuis l'annonce vendue — évite la récurrence si d'autres colonnes sont ajoutées.