mc.pvpers.us
Online
← The Frontier Suite

FrontierTrade

v1.0.0QoL

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.

CommandWhoWhat it does
/trade <player>EveryoneSend 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
/tradeacceptEveryoneAccept 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
/tradedenyEveryoneDecline 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.*.

NodeDefaultGrants
frontier.trade.usetrue/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

KeyDefaultWhat it controls
request-timeout30Seconds 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-distance0Max 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-rows3Item 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 /trade the 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.yml will not work — the plugin dispatches on the exact labels trade / tradeaccept / tradedeny.

Looking for something specific? Search the whole suite.