FrontierTrade
Scam-proof player-to-player item trading.
What it does
/trade <player> sends a request; on /tradeaccept both players get the same shared chest GUI — your items on the left, theirs on the right, a confirm button in the middle. The trade only executes when both have confirmed, and any change to either side un-confirms both, so the classic "confirm, then swap the diamond for dirt" scam is impossible.
No economy, no database, no persistence — a session lives in memory and is unwound (items handed back) when either player closes the GUI, disconnects, or the plugin disables, so items can never get stuck in the window.
Requires & integrates with
- Required
- Paper 26.2+, Java 25+
- Optional
- None.
- Used by
- None.
Commands
All player-only. /trade tab-completes online players other than yourself.
| Command | Who | What it does |
|---|---|---|
| /trade <player> | Everyone | Send a request. Refused if either of you is already trading, the target is offline or yourself, you’re farther than max-distance (or in another world, when a limit is set), or you already have a live request to them |
| /tradeaccept | Everyone | Accept the request currently addressed to you and open the trade GUI for both. Refused if the requester logged off or either of you is now in another trade |
| /tradedeny | Everyone | Decline the pending request; the requester is told |
Permissions
Player features default to true, staff features to op. Every node follows frontier.<plugin>.<action>, so a LuckPerms setup is e.g. lp group default permission set frontier.shop.use true. Wildcards work: frontier.reputation.*.
| Node | Default | Grants |
|---|---|---|
| frontier.trade.use | true | /trade, /tradeaccept, /tradedeny |
Config reference
File
plugins/FrontierTrade/config.yml
To apply changes
Restart required — values are read per request/session, so /reload confirm also works
| Key | Default | What it controls |
|---|---|---|
| request-timeout | 30 | Seconds a request stays open; when it lapses both players get an "expired" message. A newer request to the same target overrides an older one |
| max-distance | 0 | Max block distance for /trade <player>; 0 = unlimited. When > 0 the players must also be in the same world. Checked at request time only, not on accept |
| trade-rows | 3 | Item rows per side (clamped 1–3). Each side gets rows × 3 slots; the GUI is rows + 1 tall (extra row = status panes and confirm button) |
Good to know
- +Pending requests are keyed by target: if two people
/tradethe same player, the second request silently replaces the first, and the target accepts whoever asked most recently. - +Completion moves the offered stacks straight into the other player’s inventory; anything that doesn’t fit drops at their feet. If a player disconnects mid-trade their offered items are dropped at their last location for anyone to pick up — trade near your base, not in the wilderness.
- +Any close of the trade GUI (including the client-side close on respawn or disconnect) cancels the whole session for both players; there is no pause.
- +Command aliases defined in
commands.ymlwill not work — the plugin dispatches on the exact labelstrade/tradeaccept/tradedeny.
← Previous
FrontierMail
Offline messages + item mailbox; other plugins deliver into it
Next →
FrontierEnderTracker
Per-player Ender Dragon damage tracking, live sidebar, fight history
Looking for something specific? Search the whole suite.