Problemy z transakcjami
Stany TX, kody błędów, logi [TX id] oraz item w mailbox / pending-returns.
Na podstawie kodu GrzybcioRynek 1.0.3 i web 0.1.0.
Zakup jest maszyną stanów w MarketManager.buyItem. Przy transactions.logging: true każdy etap idzie do konsoli.
Log
[TX <uuid>] <STAGE> listing=#<id> buyer=<uuid> seller=<uuid> price=... fee=... item=TYPExN state=... error=...Szukaj [TX i ID. Wyłączenie logów: transactions.logging: false — stany i tak są w market-data.yml.
Stany
CREATED → LISTING_RESERVED → MONEY_WITHDRAWN → SELLER_PAID → ITEM_DELIVERED → COMPLETED
Końcowe: ROLLED_BACK, FAILED.
Kody error
| Kod | Znaczenie |
|---|---|
LISTING_REMOVE_FAILED | removeListing nie zdjął oferty |
WITHDRAW_FAILED | Vault nie ściągnął kasy kupującego; oferta przywrócona |
SELLER_DEPOSIT_FAILED | depozyt UUID sprzedawcy padł; kasa wróciła do kupującego |
ROLLBACK_SELLER_WITHDRAW_FAILED | nie udało się odjąć kasy sprzedawcy — kupujący nie dostaje zwrotu (unik mintu) |
ROLLBACK_FAILED:<msg> | wyjątek w rollbackBuy |
EXCEPTION_AFTER_<STATE> | wyjątek w nieobsłużonym stanie |
REFUND:<timestamp> | admin /market admin refund |
W logu rollbacku po dostarczeniu itemu: FINALIZED_AFTER_EXCEPTION (stan zostaje COMPLETED).
Dlaczego nie da się kupić
Komunikaty gracza (nie kody TX):
| Klucz | Tekst |
|---|---|
buy.not-enough-money | brak kasy |
buy.own-listing | własna oferta |
buy.listing-locked | ID w reservedListings |
buy.inventory-full | brak miejsca (InventoryUtil.canFit) |
buy.not-available | brak oferty / AIR / zła cena |
anti-abuse.* | cooldown / limit / max wartość |
buy.transaction-failed | ogólny fail / rollback |
Item nie wrócił do rąk
- Mailbox (
market-data.yml→mailbox.<uuid>) — powody m.in.expired,removed,admin-removed,purchase-overflow,admin-refund. Komenda/market mailbox. pending-returns.<uuid>wlistings.yml— gdymailbox.enabled: falsei gracz był offline. Dostawa:PlayerJoinListener→deliverPendingReturns.- Zarezerwowana oferta — timer wygaśnięć pomija ID w
reservedListings. Crash w trakcie zakupu: sprawdź log[TXi czy oferta wróciła (restoreListing).
Gdy mailbox włączony, overflow zakupu idzie do skrzynki, nie na ziemię. Gdy wyłączony i gracz online: reszta drop na ziemię.
TX „utknięty”
- Włącz
transactions.logging: true, powtórz zakup, skopiuj[TX <id>]. /market admin inspect <listingId>— liniaZablokowana: true/false.- Reload przy rezerwacji:
Trwają aktywne transakcje — spróbuj ponownie za chwilę. - Refund tylko dla
COMPLETED:Można zwrócić tylko zakończone transakcje (stan: ...). Ponowny refund:Ta transakcja została już zwrócona.
Przy ROLLBACK_SELLER_WITHDRAW_FAILED kasa może zostać u sprzedawcy, a oferta wrócić albo nie — czytaj log Rollback SELLER_PAID: nie udało się odjąć kasy sprzedawcy.