MarketListing
Model oferty rynku — pola, serializacja YAML i odtwarzanie ItemStack.
Na podstawie kodu GrzybcioRynek 1.0.3 i web 0.1.0.
MarketListing (model/MarketListing.java) to aktywna oferta. Implementuje ConfigurationSerializable i jest rejestrowana w MarketPlace.onEnable przez ConfigurationSerialization.registerClass(MarketListing.class).
Pola
| Pole | Typ | Znaczenie |
|---|---|---|
id | int | ID oferty (StorageManager.nextId) |
seller | UUID | sprzedawca |
sellerName | String | nick w momencie wystawienia; brak → "Nieznany" |
item | ItemStack | zapisany przedmiot |
price | double | cena stała |
timestamp | long | System.currentTimeMillis() przy utworzeniu |
oraxenId | String | ID Oraxen albo null |
nexoId | String | ID Nexo albo null |
Konstruktor: new MarketListing(id, seller, sellerName, item, price, timestamp, oraxenId, nexoId).
Nie ma pola „aktywna / zarezerwowana”. Rezerwacja podczas zakupu jest w pamięci: MarketManager.reservedListings.
Serializacja do listings.yml
serialize() zapisuje: id, seller (UUID jako string), sellerName, item, price, timestamp. oraxenId / nexoId tylko gdy nie-null.
deserialize(Map) wymaga item przez ItemStackSerializer.parse. Brak itemu:
IllegalArgumentException: Brak przedmiotu w ofercie #<id>Brak liczby dla id / price / timestamp:
IllegalArgumentException: Brak lub nieprawidłowa wartość dla: <klucz>StorageManager.parseListing akceptuje też starszy format Map i woła MarketListing.deserialize. Uszkodzony item: log Pominięto oferte #<id> - brak przedmiotu.
Tworzenie
StorageManager.createListing(seller, sellerName, item, price, oraxenId, nexoId):
id = nextId++timestamp = System.currentTimeMillis()- dodanie do listy w pamięci
- synchroniczny
save()dolistings.yml
ID Nexo/Oraxen ustawia MarketManager.sellItem przez CustomItemsHook.getNexoId / getOraxenId przed zdjęciem itemu z ręki.
Odtwarzanie itemu
Przy zakupie, usunięciu i wygaśnięciu item idzie przez CustomItemsHook.recreateItem(listing):
- klon zapisanego
ItemStack(enchanty, PDC, nazwa); - przebudowa z ID packa tylko gdy zapisany typ to AIR.
Wygasanie
Oferta wygasa, gdy now - timestamp > listing-expiry-days (domyślnie 7 dni). Timer w MarketPlace: co 30 minut. Zarezerwowana oferta (isListingReserved) jest pomijana.
Powiązane modele
| Klasa | Rola |
|---|---|
MarketTransaction | przebieg zakupu (ID UUID-string, stany, fee) |
BrowseContext | filtr GUI: kategoria, sort, strona, fraza, sprzedawca, ulubione |
SortMode | CHEAPEST, EXPENSIVE, NEWEST, OLDEST, MOST_AMOUNT, LEAST_AMOUNT |
MailboxEntry | zwrot itemu (powód, poprzednia cena) |
PriceAlert | alert cenowy |
SellerRating | ocena 1–5 powiązana z transactionId |