Listings
Model MarketListing, wystawianie z głównej ręki i ID z next-id w listings.yml.
Na podstawie kodu GrzybcioRynek 1.0.3 i web 0.1.0.
Oferta to com.example.marketplace.model.MarketListing. Zapis: plugins/GrzybcioRynek/listings.yml. Tworzenie: StorageManager.createListing z MarketManager.sellItem.
Model
| Pole | Typ | Opis |
|---|---|---|
id | int | Unikalne, z next-id (autoinkrement) |
seller | UUID | Sprzedawca |
sellerName | String | Nick w momencie wystawienia |
item | ItemStack | Klon stacka z ręki (Bukkit serialize) |
price | double | Cena stała |
timestamp | long | System.currentTimeMillis() — baza wygaśnięcia |
nexoId | String / null | ID Nexo, jeśli hook wykrył item |
oraxenId | String / null | ID Oraxen, analogicznie |
listings:
- id: 1
seller: 069a79f4-44e9-4726-a5be-fca90e38aaf5
sellerName: Gracz
item: {==: org.bukkit.inventory.ItemStack, v: 1, type: DIAMOND_SWORD, amount: 1}
price: 1500.0
timestamp: 1730000000000
nexoId: my_sword # opcjonalne
oraxenId: steel_blade
next-id: 2next-id przy starcie = max(zapisane next-id, największe id + 1).
Jak wystawić
- Przedmiot w głównej ręce (nie off-hand).
/market sell <cena>albo/wystaw <cena>(market.use+market.sell).- Walidacja: cena skończona i w
settings.min-price…settings.max-price. - Cooldown
anti-abuse.listing-cooldown-seconds(gdy antynadużycia włączone). - Limit
settings.max-listings-per-player(aktywne oferty tego UUID). - Prowizja wystawienia (
listing-fee-percent) — pobranie Vault przed zapisem; przy błędzie item wraca, fee jest zwracane. - Ręka czyszczona (
setItemInMainHand(null)), zapis oferty,ListingCreatedEvent,AlertService.checkListing.
Cały stack z ręki idzie na rynek (amount zachowany).
Limit i cena
settings:
max-listings-per-player: 10
min-price: 1.0
max-price: 1000000.0Przekroczenie limitu: sell.limit-reached. Zła cena: sell.invalid-price.
Usuwanie
| Akcja | Powód skrzynki | Kto dostaje item |
|---|---|---|
/market remove właściciel | removed | Właściciel (ekwipunek albo skrzynka) |
/market admin remove | admin-removed | Sprzedawca |
Wygaśnięcie / forceexpire | expired | Sprzedawca |
| Zakup | — | Kupujący (nadmiar → purchase-overflow) |
Przy usunięciu: removeFavoriteEverywhere(id). Oferta zarezerwowana (trwa buyItem) nie da się usunąć (buy.listing-locked).
Rezerwacja
MarketManager.reservedListings trzyma ID w trakcie zakupu. Reload przy niepustym zbiorze jest zablokowany. Timer wygaśnięć pomija zarezerwowane oferty.
Custom itemy
Przy wystawieniu zapisywane są nexoId / oraxenId (jeśli hook działa). Odtwarzanie: CustomItemsHook.recreateItem — najpierw klon zapisanego stacka; przebudowa z ID packa tylko gdy zapisany typ to AIR. Szczegóły: Nexo, serializacja.
Czego nie ma
- Wystawiania z off-hand albo z GUI „wrzuć item”.
- Edycji ceny istniejącej oferty (jest relist ze skrzynki: nowa oferta, nowe ID).
- SQL — tylko YAML.