Expiration
Oferty wygasają po listing-expiry-days od timestamp; timer co 30 minut plus start pluginu.
Na podstawie kodu GrzybcioRynek 1.0.3 i web 0.1.0.
Czas życia oferty = settings.listing-expiry-days dni od MarketListing.timestamp. Domyślnie 7. Sprawdzenie: przy onEnable oraz co 30 minut (20L * 60 * 30 ticków) w MarketPlace. Także po /market reload.
Warunek
teraz - timestamp > listing-expiry-days w milisekundach
Zarezerwowana oferta (trwa zakup) nie jest wygaszana w tym przebiegu.
Przebieg (StorageManager.removeExpiredListings)
- Zbierz wygasłe, pomijając
reservedListings. - Najpierw zapisz dziennik
expiry-outbox.<id>(seller, item, price, reasonexpired) i wyczyść ulubione. - Usuń oferty z listy,
save(). processExpiryOutbox()— dostarczenie itemu.
Kolejność journal → usunięcie jest po to, żeby crash nie zgubił itemu i nie zduplikował oferty.
Outbox
expiry-outbox:
"42":
seller: "069a79f4-44e9-4726-a5be-fca90e38aaf5"
item: {==: org.bukkit.inventory.ItemStack, type: DIAMOND, amount: 16}
price: 100.0
reason: expiredPrzy przetwarzaniu wpis jest kasowany przed dostawą; przy błędzie dostawy item wraca do outbox / skrzynki.
Gdzie ląduje item
| Sytuacja | Wynik |
|---|---|
| Sprzedawca online, jest miejsce | Ekwipunek + messages.expiry.returned |
| Online, brak miejsca / resztka | Skrzynka (mailbox.enabled) albo drop / pending-returns |
| Offline, skrzynka włączona | market-data.yml mailbox, powód expired |
| Offline, skrzynka wyłączona | listings.yml → pending-returns.<uuid> |
/market admin forceexpire <id> używa tej samej ścieżki zwrotu z powodem expired (bez czekania na timer).
Konfiguracja
settings:
listing-expiry-days: 70 oznacza natychmiastowe wygaśnięcie przy następnym ticku timera (różnica czasu > 0). Nie ustawiaj ujemnych wartości — kod nie sanityzuje ich osobno.
Pełny opis kluczy: configuration/expiration.