Architecture
Warstwy pluginu MarketPlace 1.0.3 i oddzielny mock Next.js — bez HTTP API.
Na podstawie kodu GrzybcioRynek 1.0.3 i web 0.1.0.
Administrator serwera: wystarczy wiedzieć, że plugin wymaga Paper 26.2 + Vault + ekonomię, a dane leżą w plugins/GrzybcioRynek/. Pełny graf klas: Developer → Architecture. Start na serwerze: Getting Started.
Plugin startuje w com.example.marketplace.MarketPlace. Najpierw sprawdza wersję serwera, potem Vault, potem resztę menedżerów. Strona WWW nie jest częścią tego łańcucha.
Start pluginu
@Override
public void onEnable() {
if (!isSupportedServerVersion()) {
getLogger().severe("GrzybcioRynek działa TYLKO na Paper 26.2!");
Bukkit.getPluginManager().disablePlugin(this);
return;
}
// ConfigManager, GuiConfigManager, MessageManager
this.vaultHook = new VaultHook(this);
if (!vaultHook.isEnabled()) {
// ponowienie za 20 ticków (1 s) — Essentials / Vault late load
Bukkit.getScheduler().runTaskLater(this, () -> { /* ... */ }, 20L);
return;
}
finishEnable();
}finishEnable() składa hooki custom itemów, magazyn, serwisy, komendy i timer wygasania (co 30 minut).
Graf zależności (rdzeń)
MarketPlace
├── ConfigManager config.yml (settings, fee, flagi)
├── GuiConfigManager gui.yml
├── MessageManager messages.* z config.yml
├── VaultHook ServicesManager Economy
├── NexoHook / OraxenHook refleksja API packów
├── CustomItemsHook klon ItemStack; rebuild tylko przy AIR
├── ExtendedDataStore market-data.yml
├── StorageManager listings.yml
├── AntiAbuseManager
├── MailboxService
├── AlertService
├── StatsManager
├── ListingQueryService
├── ChatInputManager cancel / anuluj
├── MarketManager oferty, zakup, rezerwacje
├── GUIManager otwarte GUI
└── MarketAPI init(this)
Komendy: MarketCommand (/market), WystawCommand (/wystaw), AukcjeCommand (/aukcje). Listenerzy: GUIListener, PlayerJoinListener, ChatInputListener. PlaceholderAPI: PlaceholderHook (jeśli plugin jest obecny).
Warstwa rynku
MarketManager tworzy oferty, kupuje, usuwa, wygasza, refunduje. Trzyma zbiór reservedListings — oferta w trakcie zakupu. Reload jest blokowany, gdy ten zbiór nie jest pusty.
ListingQueryService filtruje i sortuje oferty do GUI (wyszukiwanie, kategorie).
StorageManager wczytuje / zapisuje listings.yml, robi backup, usuwa wygasłe oferty i przetwarza outbox wygaśnięć.
ExtendedDataStore trzyma dane rozszerzone w market-data.yml: historia, ulubione, skrzynka, alerty, oceny, statystyki gracza.
Warstwa GUI
GUIManager + GUIListener obsługują kliknięcia. Konkretne ekrany to m.in. MarketBrowseGUI, MarketDetailGUI, MarketConfirmGUI, MarketCategoryGUI, MyListingsGUI, FavoritesGUI, HistoryGUI, MailboxGUI, AlertsGUI, StatsGUI, SellerProfileGUI.
Rozmiar przeglądarki: gui.yml → browse.size. Pasek akcji browse (sloty 45–53) jest stały w MarketBrowseGUI. settings.gui-rows jest wczytywane i nie steruje GUI.
Hooki
| Klasa | Rola |
|---|---|
VaultHook | Economy z ServicesManager; wpłaty po UUID; format() → $X / $X.XX |
NexoHook | NexoItems.idFromItem / itemFromId + build() |
OraxenHook | OraxenItems.getIdByItem / exists / getItemById + build() |
CustomItemsHook | preferuje sklonowany zapisany stack |
PlaceholderHook | identifier grybciorynek, odświeżanie cache co 20 ticków |
Essentials nie ma klasy hooka. Jest tylko softdepend w plugin.yml, żeby Vault Economy zdążyło się zarejestrować.
Dane na dysku
plugins/GrzybcioRynek/
├── config.yml
├── gui.yml
├── listings.yml
└── market-data.yml
Komunikaty są w config.yml pod messages.*. Osobnego messages.yml nie ma.
Web — poza pluginem
GrzybcioRynek-main/
├── PLugin/ kod Paper 1.0.3
├── Strona/ Next.js 16 — mock UI, brak połączenia
└── Wiki/ ta dokumentacjaNie ma warstwy HTTP. Strona/ nie czyta listings.yml i nie woła pluginu.
🚧 Planned
HTTP API nie jest zaimplementowane.