Java example: GitHub Packages
Referencecom.kitemc:kitemarket-ui-api:1.0.0 with compileOnly, never bundling or relocating the SDK. Runnable source is in the public examples/ui-java project, without proprietary core dependencies.
First merge the market API’s Packages registry and authentication configuration, then add these dependencies.
Public packages also need a classic PAT with read:packages, provided through user-level gpr.user/gpr.key or GITHUB_ACTOR/GITHUB_TOKEN. Never store tokens in the project. Confirm that the repository’s Packages list contains the version before using it; this guide does not claim the package is already uploaded.
github-kitemarket registry and settings.xml credentials, then add:
KiteMarket-UI-API-1.0.0.jar directly from GitHub Releases as a fallback compile dependency without a Packages Token. No reference method allows bundling, shading or relocating the SDK.
Resources and provider implementations
Providers render and capture input; the shared server controller handles transactions. Callbacks must use server-registered action/input identifiers, never client-supplied amounts, identities, or stale pages. Closing pages, expiry, and repeated confirmations retain the shared session safeguards.Registration and callbacks
The publicKiteMarket-UI-API module targets Java 11 under its own MIT License. Reference it with compileOnly, never bundling a second SDK.
Implement com.kitemc.market.api.ui.UiProvider, obtain KiteMarketUiApi through Bukkit’s ServicesManager, and call api.register(owningPlugin, provider). Close the returned handle on plugin disable. Registration does not check official DLC ownership.
UiPage.token()/pageVersion() and UiPrompt.token() describe page/field identity; UiPage.actions() and opening parameters supply opaque action identifiers.
Return interactions only through UiCallbacks.action(token), input(raw), and closed(); the bound callback validates and schedules them again.
Page updates and resource changes
UiProvider.update(...) defaults to open(...). A native interface may update in place only if it replaces the page identity, every action token and all callbacks, including close handling.
After a genuine vendor event changes client/resource readiness, update the provider’s own state and call api.changed(owningPlugin) for re-evaluation. Only enabled owners with a live registration may notify; the method itself is not proof that resources are ready.
Display refresh within one page
OptionalUiProvider.refresh(player, page, theme) refreshes display data within the same page, such as a countdown, and defaults to false.
The token, page version, action map and existing callbacks stay unchanged. Update display clones in the current open view only; never reopen an inventory or invoke an action. Return true after applying it, or false when unsupported or closed.
Existing providers retain static snapshots until normal navigation or a player refresh; unsupported refreshes do not periodically reopen menus. Verify current page identity so a late result cannot overwrite a replacement page.
IA resource checks
An IA adapter can call the read-onlyapi.itemsAdderUnavailable(player, page, theme) in the player’s scheduling context to reuse the host’s observed font registry, actual sent UUID/SHA-1 and matching successful load.
Only null means the page resource is ready; other values describe a fallback reason. This check neither sends packs, changes preferences, evaluates official DLC rights nor grants trading authority.
Its default returns IA_READINESS_UNSUPPORTED for existing service implementations and does not treat unknown state as readiness. Calling it requires a KiteMarket version shipping this method; do not bundle a replacement SDK into a provider.
Real IA example
Publicexamples/ui/ contains the minimal white-frame configuration theme, and examples/ui-java/ contains a real Java IA adapter.
The latter targets Java 21 with a compile-only public vendor API and the real TexturedInventoryWrapper. It registers example.itemsadder to render actual market pages and registered actions; it never invents balances or transaction outcomes.
The public SDK remains Java 11. Do not install this example on Java 11 Legacy or unverified Folia nodes.
Inventory rendering order
The IA adapter fills the protected inventory returned byTexturedInventoryWrapper.getInternal(), registers the replacement holder, actions and callbacks, then calls the public showInventory(player) to display the font title.
Opening only the internal inventory through Bukkit leaves IA’s placeholder title. Retain this order and whole-view protection so a previous close is handled separately from the new page.
Install the example bundle
TheKiteMarket-Examples-1.0.0.zip example bundle combines query and IA examples, including runnable JARs, themes, MIT resources, bilingual instructions and source/build files.
Install the IA example JAR, place theme.yml in plugins/KiteMarket/themes/example-ia-java.yml, and copy itemsadder/ into plugins/ItemsAdder/contents/km_example/. Rebuild/send the pack using the installed IA instructions, register its identity and select /km ui itemsadder example-ia-java.
Updates, stale closes, repeated clicks and chat input retain the shared safeguards.
Licensing and recorded scope
Source and resources identified as MIT in the configuration and Java examples may be modified for commercial interfaces without an additional KiteMC theme license. Other themes retain their own licenses. The examples’ real publishing pages have been opened on the representative environment; this record does not certify other packs or every page. Source, compilation and registration do not replace actual client verification.Troubleshooting
Pages, actions and lifecycle
Check templates, action tokens, input and provider contracts across all 35 pages.