Farmstead Mods
RU

Economy

Balances, transfers, /baltop, chest and NPC shops, Vault API.

On this page

Commands 15#

CommandSyntaxAliasesPermissionDescription
/bal/bal—neoessentials.economy.balanceCheck your balance (alias)A separate registration in BalanceCommand, the root is also neoessentials.economy.balance: only your own balance, there is no <player> argument. Another player's account — only via /balance <player>.
/balance/balance [player]—neoessentials.economy.balanceCheck your balanceThe /balance, /bal and /money roots are gated by neoessentials.economy.balance. Bare /balance shows your own account. The [player] branch is gated by neoessentials.economy.balance.others (or OP 2). The name is resolved via EconomyPlayerUtil — offline too. The console does not pass: executeOther calls getPlayerOrException on the sender. The /money alias in the same file shows only your own balance, like /bal.
/balancetop/balancetop [page]—neoessentials.economy.baltopView top balances (alias)Same node as /baltop: the {baltop, balancetop, btop} loop in BaltopCommand.register.
/baltop/baltop [page]—neoessentials.economy.baltopView top balancesneoessentials.economy.baltop; the console passes (player == null). Without [page] — page 1, IntegerArgumentType from 1. The page size of 10 and the 60 s cache TTL are hardcoded in BaltopCommand; economy.json has no keys for them. Players with neoessentials.economy.baltop.exempt are left out of the table. The /btop alias is registered in the same loop and has no separate card.
/chestshop/chestshop [list [player] | info | convert | remove [<x> <y> <z>] | setprice <buy|sell|both> <price> | stats | limit | export | import [create] | reload | pricing | hologram enable|disable|enablepos <x> <y> <z>|move <x> <y> <z>]—neoessentials.chestshopSign-based chest shop systemBare /chestshop prints help; the root requires neoessentials.chestshop (the console passes). Targeting for info/convert/setprice/remove without coordinates/hologram is player.pick(5.0). list [player] — others' only with neoessentials.shop.list.others or OP 3, and online only. convert — neoessentials.shop.create. remove without coordinates — the owner or shop.admin.remove/OP 3; with coordinates — admins only. setprice — shop.setprice or shop.admin.setprice; someone else's sign — only admin.setprice. hologram enablepos is invoked by the chat button after creating a sign. reload — OP 3 or shop.admin.reload. There is no /shop alias in the code, despite the ShopCommand javadoc.
/cshop/cshop [list [player] | info | convert | remove [<x> <y> <z>] | setprice <buy|sell|both> <price> | stats | limit | export | import [create] | reload | pricing | hologram enable|disable|enablepos <x> <y> <z>|move <x> <y> <z>]—neoessentials.chestshopSign-based chest shop (alias)A redirect to the chestshop node, and only if both the chestshop and cshop keys are enabled in commands. If only cshop is enabled, nothing is registered.
/eco/eco give|take <player> <amount> | set <player> <amount> | reset <player> | history [player]—neoessentials.economy.ecoAdmin economy commandsRoot — OP 2 or neoessentials.economy.eco; there is no bare /eco. give/take — amount from 0.01, set — from 0.0 (negatives are rejected in execute). Names resolve offline via the profile; a string starting with @ is a vanilla selector, online only (quests: /eco give @p 100). history without an argument — your own feed; [player] additionally requires source.hasPermission(2) specifically, the eco node alone is not enough. The /economy alias — the same tree. The 10% percentage syntax is not supported.
/npcshop/npcshop [create <name> | remove | additem <shopId> <item> <buyPrice> <sellPrice> <quantity> | removeitem <shopId> <index> | list | info <shopId> | reload | respawn <shopId> | entitytype <shopId> <entityType> <ai>]—neoessentials.shop.npc.manageNPC entity shop managementThe whole node — OP 3 or neoessentials.shop.npc.manage; bare /npcshop — help. <name> for create is greedyString (spaces allowed). <shopId> — a UUID or an unambiguous prefix from /npcshop list. additem: <item> — word(), the listing always stores "minecraft:" + the item without the minecraft: prefix; buy/sell from −1 (−1 disables that side), quantity from 1. remove — the nearest shop entity within 5 blocks. Buying in the GUI requires neoessentials.shop.use (right-click — buy, left-click — sell).
/pay/pay <player> <amount>—neoessentials.economy.paySend money to another playerPermission neoessentials.economy.pay (a .requires node plus a repeat check in execute). <amount> — DoubleArgumentType from 0.01; Brigadier will not accept percentages like 10%. Name suggestions are online only, but with neoessentials.economy.pay.offline the transfer goes to a cached profile. The /p alias is registered in the same PayCommand; it has no separate command in this file. There is no cooldown in the config: ConfigManager.getPayCooldownSeconds() always returns 0.
/payconfirmtoggle/payconfirmtoggle—neoessentials.payconfirmtoggle by conventionToggle payment confirmation promptsRegistered by MiscItemCommands, not EconomyCommands. Permission neoessentials.payconfirmtoggle. Player only. The flag lives in an in-memory Set and resets on restart. /pay does not read this flag — see knownIssues.
/paytoggle/paytoggle—neoessentials.economy.paytoggleToggle receiving paymentsneoessentials.economy.paytoggle (or OP 2). Player only: getPlayerOrException. The value is written immediately to the pay_toggles collection. Until a record exists, economy.json → paytoggleDefault applies (true in the template — payments are accepted).
/pt/pt—neoessentials.item.powertoolBind commands to items (alias)Bare /pt is paytoggle: PayToggleCommand registers literal("pt").executes before PowertoolCommand. After Brigadier merges them, /pt list, /pt remove and /pt <command> belong to powertool (neoessentials.item.powertool), not the economy. Do not treat the subcommands as part of paytoggle.
/sell/sell [hand [amount] | inventory|all|invent | <item> [amount]]—neoessentials.sell by conventionSell items for moneyRoot — neoessentials.sell. Bare /sell and the hand branch additionally require neoessentials.sell.hand; inventory/all/invent — neoessentials.sell.bulk. <item> — StringArgumentType.word() (no spaces, colons are fine). The multiplier is config.json → economy.sellMultiplier plus the neoessentials.economy.sellmultiplier.N tiers. Renamed items (CUSTOM_NAME) are not sold unless economy.allowSellNamedItems is true.
/setworth/setworth <item> <price|remove>—neoessentials.setworth by conventionSet the sell price of an itemneoessentials.setworth. <item> — ResourceLocationArgument: diamond and minecraft:diamond are both valid; there is no hand literal, the string hand is normalized to minecraft:hand and then the main hand is used. <price> — DoubleArgumentType from 0; 0 in WorthManager.setPrice removes the price just like the remove literal. Writes to the item_worth collection immediately; /neoe reload is not needed.
/worth/worth [hand [amount] | <item> [amount]]—neoessentials.worth by conventionCheck the sell value of an itemneoessentials.worth; without arguments and with /worth hand — the item in the main hand (qty = stack size if amount is not given). The <item> branch is greedyString: a trailing number is read as the quantity ("diamond 64", "thermal:copper_ingot 16"), otherwise qty = 1. The command is not registered if modules.economyEnabled is off or commands.worth = false.

Examples#

First money on an empty server#

The module is already on (modules.economyEnabled), but players only have the starting balance, and you need to test transfers, tax and the rich list before the wipe opens.

/eco give Steve 1000
/pay Alex 200
/balance Alex
/baltop

The template economy.json has no startingBalance key — new UUIDs get 100.0 from code. /eco give writes to the economy_balances collection and sends online targets "received_give". /pay deducts exactly 200 from the sender: with taxPercentage 0 the fee is 0 and the recipient sees the same amount. Set taxPercentage: 5 and repeat — the sender still loses 200, the recipient gets 190, and 10 is burned (not credited to the server). /balance Alex requires neoessentials.economy.balance.others; without the node only /balance by Alex himself works. The first /baltop often replies "building" — the cache is built asynchronously; a second later the command shows the top and the cache age in seconds.

A /sell price list from scratch, without editing worth.json by hand#

Players should sell diamonds and all ores with a command, not through a chest. Prices live in the item_worth store, not in the config.

/setworth minecraft:diamond 25
/setworth hand 4
/worth diamond 64
/sell hand
/sell inventory

The first command sets 25 per diamond. The second takes the id from the main hand (hold an iron_ingot) — that is minecraft:hand, not a separate literal. /worth diamond 64 prints 1600 with the symbol from economy.json only if you look at /pay; /worth and /sell read currencySymbol from the economy section of config.json, not from economy.json — that key no longer exists in config.json, so you will almost always see $. Bare /sell = /sell hand and does not bypass neoessentials.sell.hand. inventory/all/invent require sell.bulk and skip items with CUSTOM_NAME while allowSellNamedItems is false — chat shows named_items_skipped. The multiplier is 1.0 in config.json → economy.sellMultiplier; the tier neoessentials.economy.sellmultiplier.150 gives ×1.5 on top if it is higher than the global one.

A player chest shop with the item from hand and a hologram#

A player sells an enchanted bow, not a "bare" minecraft:bow. The name on the sign's 4th line carries no NBT.

/chestshop convert
/chestshop hologram enable
/chestshop info
/chestshop limit

Place a chest and a sign on an adjacent block. Line 1 (index 0) empty or [Shop], line 2 — quantity (1…3456), line 3 — B 50:S 20 (or B FREE / S 1K), line 4 — ?. You have 30 s after placing to fill in the sign, otherwise the pending entry expires. convert is needed if the sign was written before the handler saw it; a normal placement registers itself as soon as all 4 lines are filled. Right-clicking the sign with the bow in hand "bakes in" the DataComponents; without that, a chest with the same bow is "out of stock". After creation a clickable button appears in chat — it sends /chestshop hologram enablepos ; enable does the same if you are looking at the sign (no farther than 5 blocks). The hologram id is like shop__, off by default. Right-clicking someone else's sign buys, left-clicking sells; both require neoessentials.shop.use; the owner sees info instead of a trade. To break the sign: shift+left-click, otherwise the hit is intercepted as a sale. A double chest shares its 54 slots between both signs.

An admin shop without a chest or a slot limit#

Spawn sells food infinitely. The player limit maxShopsPerPlayer does not apply to admin signs.

/chestshop list
/chestshop setprice buy 8
/chestshop stats

Write exactly Admin Shop on line 1 — you need neoessentials.shop.create.admin, otherwise "no_permission_admin". No chest is looked for and stock never runs out. The template config.json has no shop.maxShopsPerPlayer key; for regular players the code limit is 10; admin signs do not count toward it. list without an argument — your signs; other names only online and with shop.list.others. setprice changes the price on the sign you are looking at and rewrites the sign text; a type outside {buy,sell,both} fails in execute. An admin shop's hologram can be enabled only by someone with shop.create.admin: plain OP and shop.admin.remove do not count for this (isShopOwner).

NPC shop: create, stock, change the entity#

A trader without a chest or sign, with a GUI like an admin ChestShop: items are minted and destroyed directly.

/npcshop create Spawn Armorer
/npcshop list
/npcshop additem ab12cd34 diamond 50 -1 1
/npcshop additem ab12cd34 emerald -1 20 16
/npcshop info ab12cd34
/npcshop entitytype ab12cd34 minecraft:villager true

create spawns an invulnerable ArmorStand at your coordinates and prints the full UUID plus an 8-character prefix — use that. additem with −1 for sell makes the slot buy-only; the command rejects both −1. Right-clicking the NPC opens the GUI (neoessentials.shop.use): right-click a slot — buy, left-click — sell, if a sell price is set. entitytype recreates the entity in place; true for a mob enables AI but "tethers" it to the spawn point (radius 6). If the void ate the entity — /npcshop respawn ; listings in npc_shops are not lost. /npcshop reload re-reads the store; /neoe reload does not.

Edge cases#

Bare /pt is paytoggle, /pt list is powertool#

PayToggleCommand.register sets literal("pt").executes(paytoggle) from EconomyCommands (formerly in NeoEssentials.java). Later PowertoolCommand.registerPtAlias attaches list, remove and greedy <command> to the same literal without a root .executes(). Brigadier merges the nodes: the first .executes() survives and the children are added. Result: /pt toggles receiving payments (neoessentials.economy.paytoggle), /pt list / /pt remove / /pt <command> are powertool (neoessentials.item.powertool). PayToggle always registers /pt, without checking commands.pt; the powertool children appear only if commands.pt is on. If commands.paytoggle is off, bare /pt has no .executes() and counts as an incomplete command.

What to do: Give players /paytoggle for opting out of transfers. Explain powertool to admins: the binding list is /pt list or /powertool list, not bare /pt.

/bal does not show other accounts; offline for /pay and /balance.others are different nodes#

/bal is registered without an argument: only your own balance. /balance <player> is gated by neoessentials.economy.balance.others and resolves offline via the profile. The console cannot open someone else's balance — executeOther requires a player sender. /pay allows offline only with neoessentials.economy.pay.offline; without the node — offline_not_allowed, even if the name is in the cache. /pay and /eco completion shows online players only. Ignoring (IgnoreManager) blocks /pay only if the recipient is online — an offline transfer does not see the ignore. /chestshop list <player> does not look up offline players at all: only getPlayerByName.

What to do: For staff: the pair balance + balance.others. For treasurers making offline payouts — pay.offline. To view others' signs — shop.list.others, and the target must be in the game.

The /pay tax burns the difference instead of crediting the server#

EconomyAPI.payPlayer deducts the full <amount> from the sender, credits the recipient amount − fee, and the fee goes nowhere. taxPercentage in economy.json is a percentage (5 = 5%). The rate comes from EconomyModifierManager.getEffectiveTaxRate: neoessentials.economy.taxexempt zeroes it (via hasPermissionStrict; OP by itself gives no exemption while permissions.opsBypassEconomyModifierPermissions is false). With a tax ≥ 100%, net ≤ 0 and the transfer is rejected. The cap for a single transfer is maxTransferAmount (template 10000) or the neoessentials.economy.paylimit.N tier / LuckPerms meta; bypass — neoessentials.economy.pay.bypass.limit.

What to do: State in the rules that the fee is burned. For exempt players — neoessentials.economy.taxexempt, not "just OP".

paytoggle is on by default and survives restarts#

paytoggleDefault: true means "I accept /pay". Until a player has called /paytoggle at least once, they are not in the cache and every /pay to them goes through. After toggling, the record goes straight into the pay_toggles collection of the active storage.type (the legacy paytoggles.json is imported once). The refusal message is the same as for ignore (pay.toggled_off) — from chat you cannot tell "turned off receiving" from "ignored".

What to do: If newcomers must not be sent money before they agree, set paytoggleDefault: false. You can check your own status only by running /paytoggle again (there is no separate get).

The hologram above a sign is opt-in, not auto-created#

ShopData.hologramEnabled is false by default. After a sign is created, chat offers the button /chestshop hologram enablepos x y z. Only the owner can enable/move a player shop's hologram: isShopOwner ignores OP and shop.admin.remove. An Admin Shop has ownerUUID == null, so neoessentials.shop.create.admin is needed. The move offset is clamped by Brigadier to ±4.5. The id has the shop_ prefix. ShopHologramManager does not check modules.hologramEnabled and writes directly to HologramManager. /chestshop reload, after re-reading the chest_shops collection, cleans up orphaned shop_* holograms.

What to do: Tell players to press the chat button or look at their sign and run /chestshop hologram enable. Moderators remove others' holograms with /hologram remove <id>, not /chestshop hologram disable.

What /neoe reload does and does not do#

ConfigManager.loadAll() clears the cache, so the next /pay already sees the new taxPercentage / currencySymbol from economy.json. EconomyManager.reinitialize() fires only if the singleton never finished initializing at startup (the module appeared disabled in a load race) — live balances are not re-read from disk. WorthManager.reload() re-reads item_worth. /neoe reload does not touch the chest_shops and npc_shops collections: for signs — /chestshop reload (which also re-reads shop.pricing in config.json), for NPCs — /npcshop reload. modules.economyEnabled / modules.shopEnabled and the commands.* flags are read at registration: enabling /pay or shops after changing the key requires a restart.

What to do: Editing economy.json (tax, symbol, cap) — /neoe reload. Editing signs in the store or dynamic prices — /chestshop reload. Editing NPCs — /npcshop reload. Changing modules.* — restart.

The template economy.json has no startingBalance#

The getter looks up the startingBalance key in economy.json and, not finding it, returns 100.0. /eco reset sets exactly this value, not "zero". The duplicate key in config.json was removed in v32 — edit economy.json. cleanupInactiveAccounts + inactiveAccountCleanupDays (30) purge inactive accounts once an hour; /eco reset does not do that.

What to do: Add startingBalance to config/neoessentials/economy.json and run /neoe reload — new UUIDs and reset pick up the number. Existing balances do not change by themselves.

/npcshop additem always prepends the minecraft: namespace#

executeAddItem stores "minecraft:" + itemId.replace("minecraft:", ""). diamond and minecraft:diamond both become minecraft:diamond. thermal:copper_ingot turns into minecraft:thermal:copper_ingot and does not match the real item in the GUI. On a ChestShop sign a modded id on the 4th line resolves fine (ShopParser does not force minecraft:), as does /setworth thermal:copper_ingot.

What to do: In an NPC shop write the short id for vanilla items. A modded item cannot be set correctly in an NPC shop with this command — only by editing the npc_shops collection and /npcshop reload, or sell it through a sign.

/eco history of another player needs vanilla OP 2, not the eco node#

The /eco root allows OP 2 or neoessentials.economy.eco. The history <player> branch additionally has .requires(src -> src.hasPermission(2)). A player with only the eco node and no OP can use /eco give and their own /eco history, but not /eco history Steve. The feed limit is transactionHistoryLimit (50 in the template; if you remove the key, the getter gives 20).

What to do: Give history auditors OP 2 (or the console). For giving money neoessentials.economy.eco is enough.

Shop sign: line format and the 30 s timeout#

Indices are 0…3; this matches "line 1" of the old English wiki in the human sense, but people confuse it with the price line: line 0 — name / Admin Shop / [Shop] / empty; 1 — an integer 1…3456; 2 — B 10, S 5, B 10:S 5, K/M suffixes, FREE; 3 — an id or ?. A player sign needs an adjacent ChestBlockEntity (6 sides + under the sign). While the player is editing the text, the handler waits up to 30 s. After registration the sign text is cosmetic: the source of truth is the chest_shops collection, not the sign.

What to do: Do not change prices by editing the sign in the world — use /chestshop setprice or a CSV import. Did not fill it in within 30 s — break and place the sign again, or run /chestshop convert while looking at it.

Known issues#

/payconfirmtoggle does nothing to /pay#

A comment in MiscItemCommands promises the behaviour of Essentials Commandpayconfirmtoggle: "toggle whether /pay asks for confirmation". The command puts the UUID into an in-memory Set, and the getter isPayConfirmDisabled is not called anywhere else. PayCommand has neither a confirmation nor any reference to this Set — the transfer goes through right after the balance, tax and paytoggle checks. The flag is not even written to disk; a restart clears it.

What to do: Do not promise players "confirm the transfer first". If you need confirmations, this is not the command; currently it only prints a chat line about its internal flag.

Configuration#

economy.json#

KeyDefaultDescription
currencySymbol"$"Symbol shown before money amounts (e.g. "$100.00")
currencyName"coins"Singular currency name shown in messages
currencyNamePlural"coins"Plural currency name
onboardingCompletionReward25000Coins awarded once when a genuinely new player completes the Farmstead onboarding route. Set to 0 to disable.
maxBalance999999999.99Maximum balance a player can hold (999999999.99 = ~1 billion)
taxPercentage0.0Global tax percentage on all transfers (0.0 = no tax)
allowNegativeBalancesfalseAllow player balances to go negative
logTransactionstrueLog every transaction to logs/neoessentials/transactions.log
transactionHistoryLimit50Maximum number of transactions kept per player for /history
maxTransferAmount10000.0Maximum amount that can be sent in a single /pay transfer
paytoggleDefaulttrueDefault state of /paytoggle (true = payments enabled on join)
cacheMaximumSize10000Caffeine cache maximum size for in-memory balance lookups
cacheExpireAfterAccessMinutes60Minutes after last access before a cache entry expires
cleanupInactiveAccountstrueRemove economy accounts for players inactive longer than inactiveAccountCleanupDays
inactiveAccountCleanupDays30—

Permissions 30#

NodeIn registryWhat it grants
neoessentials.chestshopregistry: noUse /chestshop (and /cshop) command tree
neoessentials.economy.adminregistry: noEconomy administration
neoessentials.economy.admin.giveregistry: noGive money to players
neoessentials.economy.admin.setregistry: noSet player balance
neoessentials.economy.admin.takeregistry: noTake money from players
neoessentials.economy.balanceregistry: yesCheck own balance
neoessentials.economy.balance.othersregistry: noCheck others' balance
neoessentials.economy.baltopregistry: yesView balance leaderboard
neoessentials.economy.baltop.exemptregistry: noExclude self from baltop ranking
neoessentials.economy.ecoregistry: noRun /eco admin commands (give/take/set/reset)
neoessentials.economy.payregistry: yesSend payments to online players
neoessentials.economy.pay.offlineregistry: noSend payments to offline players
neoessentials.economy.pay.toggleregistry: yesToggle payment acceptance
neoessentials.payconfirmtoggleregistry: yesToggle payment confirmation prompts
neoessentials.sellregistry: yesUse the /sell command
neoessentials.sell.bulkregistry: yesSell entire inventory (/sell inventory|all)
neoessentials.sell.handregistry: yesSell item in hand (/sell hand)
neoessentials.setworthregistry: noSet item sell prices (/setworth)
neoessentials.shop.admin.csv.exportregistry: noExport shops to CSV file
neoessentials.shop.admin.csv.importregistry: noImport shops from CSV file
neoessentials.shop.admin.reloadregistry: noReload shop data from disk
neoessentials.shop.admin.removeregistry: noForce-remove any shop
neoessentials.shop.admin.setpriceregistry: noSet price on any shop sign
neoessentials.shop.createregistry: yesCreate player chest shops
neoessentials.shop.create.adminregistry: noCreate admin chest shops
neoessentials.shop.list.othersregistry: noList shops owned by other players
neoessentials.shop.npc.manageregistry: noCreate/remove/manage NPC shops (/npcshop)
neoessentials.shop.setpriceregistry: yesSet price on own shop sign (/chestshop setprice)
neoessentials.shop.useregistry: yesUse (buy/sell at) shops
neoessentials.worthregistry: yesCheck the sell value of an item (/worth)

Detailed guide#

The section below is the project's original documentation (docs/Wiki/EconomySystem.md). Links to other wiki pages are rewritten to this site; the guides themselves are not edited, so upstream syncs stay conflict-free.

Version: 1.0.5+build.54 · Config files: economy.json, config.json → economy section


Overview#

NeoEssentials provides a full server economy with player balances, payments, admin tools, an async leaderboard, a sign-based ChestShop, entity-based NPC shops, and Vault API integration.


Config (economy.json)#

Note: modules.economyEnabled (in config.json) is the master on/off switch — economy.json itself has no enabled key.

Key Default Description
startingBalance 100.0 Balance given to new players
currencySymbol "$" Symbol prepended to all amounts
currencyName (currency symbol) Full currency name (singular)
currencyNamePlural (currencyName) Full currency name (plural)
maxBalance 999999999.99 Maximum balance a player can hold
allowNegativeBalances false Allow balances below zero
taxPercentage 0.0 Tax applied to /pay transfers (as a percent, e.g. 5 = 5%)
maxTransferAmount 10000.0 Max single /pay amount (overridable per-player via LuckPerms meta)
paytoggleDefault true Whether players accept payments by default
logTransactions true Log transactions to logs/neoessentials/transactions.log
transactionHistoryLimit 50 Max entries kept per player for /eco history
cleanupInactiveAccounts true Automatically delete balances for long-inactive accounts
inactiveAccountCleanupDays 30 Inactivity threshold (days) before an account is cleaned up
cacheMaximumSize 10000 Max entries in the balance cache
cacheExpireAfterAccessMinutes 60 Cache entry expiry (minutes)

/sell's multiplier and named-item rule are read from config.json → economy (not economy.json):

Key Default Description
sellMultiplier 1.0 Global multiplier applied to all /sell prices
allowSellNamedItems false Allow selling renamed items
useExternalEconomy false Use a detected external economy mod (e.g. SG Economy API) instead of NeoEssentials' own internal balances, registered at higher priority into the Vault service registry. Off by default — switching which mod controls player money is opt-in.

/baltop's page size (10) and cache lifetime (60s) are currently hardcoded and not configurable.


Commands#

Player Commands#

Command Syntax Permission Description
/balance /balance [player] neoessentials.economy.balance (own) / neoessentials.economy.balance.others (other players) Check your balance
/bal alias same Alias
/pay /pay <player> <amount> neoessentials.economy.pay Send money to a player (applies tax; has a per-player cooldown)
/p alias same Alias
/paytoggle /paytoggle neoessentials.economy.paytoggle Toggle receiving payments
/pt alias same Alias
/baltop /baltop [page] neoessentials.economy.baltop View top balances (paginated, async, exempt via neoessentials.economy.baltop.exempt)
/balancetop, /btop alias same Aliases
/worth /worth [item\|hand] [qty] neoessentials.worth Check sell value of an item
/sell /sell hand\|inventory\|all\|<item> [qty] neoessentials.sell (+ neoessentials.sell.hand / neoessentials.sell.bulk) Sell items for money
/payconfirmtoggle /payconfirmtoggle neoessentials.payconfirmtoggle Toggle payment confirmation prompts (registered by the item/misc commands module, not the economy module)

/pt name collision: /pt is also registered separately as the Powertool system's shorthand (/pt list, /pt remove, …, permission neoessentials.item.powertool — see the Items/Powertool docs). Because Brigadier merges same-named literal nodes registered on the same dispatcher, bare /pt still runs paytoggle (its .executes() was registered first and is kept), but /pt list / /pt remove run the Powertool subcommands, not anything paytoggle-related. Don't assume /pt <subcommand> is part of the paytoggle command.

Admin Commands#

Command Syntax Permission Description
/eco give /eco give <player> <amount> neoessentials.economy.eco Give money
/eco take /eco take <player> <amount> neoessentials.economy.eco Take money
/eco set /eco set <player> <amount> neoessentials.economy.eco Set balance
/eco reset /eco reset <player> neoessentials.economy.eco Reset to starting balance
/eco history [player] /eco history [player] none for self; op (level 2) for [player] View transaction history (own, or another player's)
/economy alias for /eco same Alias
/setworth /setworth <item\|hand> <price\|remove> neoessentials.setworth Set/remove an item's sell price

Note: /eco give\|take\|set take a plain numeric <amount> — percentage syntax (10%) is not supported.


ChestShop#

Sign-based shops that connect a chest to a sign for automated buy/sell.

Setup#

  1. Place a chest (double chests are supported — both sign-facing halves share the combined inventory, so two signs on the same double chest correctly draw from and restock into the full 54-slot inventory rather than each only seeing its own half)
  2. Place a sign on the chest (or adjacent block)
  3. Write the sign in this format:
Line 1: [leave blank or your name]   ← auto-assigns your name if blank
Line 2: 5                            ← quantity per trade
Line 3: B 10:S 5                     ← buy price : sell price  (B only, S only, or both)
Line 4: diamond                      ← item name, or ? to assign by right-clicking with item

Typing a name directly on line 4 only resolves a bare item ID — it can't carry enchantments, custom names, or modded NBT-backed data. Use ? (or shift+right-click afterward — see Item Data / NBT below) to assign the item by holding the exact stack instead, if it has data that needs to be preserved.

Price shortcuts: B FREE = free to buy · S FREE = free to sell · 1K = 1000 · 1.5M = 1500000

Admin Shops#

Use Admin Shop on line 1 — requires neoessentials.shop.create.admin. Admin shops have unlimited stock.

Item Data / NBT (Modded Items)#

Sign text alone can only encode a bare item ID (diamond, thermal:copper_ingot) — it cannot carry custom data (enchantments, custom names/lore, or a modded item's NBT-backed capability data). To make a shop trade an item with its data intact, assign it by holding the exact item and interacting with the sign/hologram rather than typing its name:

Gesture When it applies Effect
Right-click the sign/hologram while holding the item Sign's item line is ? (shop is "pending") One-time setup — captures the held item's data and activates the shop
Shift+right-click the sign/hologram while holding the item Shop already has an item assigned (including ones set by typing a name on the sign) Re-assigns the item, capturing its data — use this to attach/update NBT on an existing shop

Only the owner (or, for admin shops, a player with neoessentials.shop.create.admin) can do either. If a shop was created by typing an item name directly on the sign and buying/selling against a data-bearing item in the chest reports "out of stock" even though the chest visibly has stock, this is almost always the fix — the shop never captured the item's data, so it wasn't matching what's actually in the chest. Shift+right-click it with the correct item to fix.

Removing a Shop#

Left-click (attack) a shop sign to sell, same as always — but a single left-click swing on a shop sign is also the tool used to actually break it, so it's intercepted for the sell/info action by default. Sneak (shift) + left-click bypasses that interception and lets the swing through as a normal break attempt, removing the shop (if you're the owner or an admin).

Commands#

/chestshop (alias /cshop) with no arguments prints an in-game help listing.

Command Permission Description
/chestshop list [player] none (self) / neoessentials.shop.list.others (other player) List shops owned by you or another player
/chestshop info none Show info about the looked-at shop sign
/chestshop convert neoessentials.shop.create Register the looked-at (pre-existing) sign as a shop
/chestshop setprice <buy\|sell\|both> <price> shop owner, or neoessentials.shop.setprice / neoessentials.shop.admin.setprice Change the price(s) on the looked-at shop sign
/chestshop stats none Show your total shops, sales count, and top seller
/chestshop limit none Show how many shops you've placed vs. your shop.maxShopsPerPlayer limit
/chestshop pricing none Show whether the dynamic pricing engine is enabled and its rule count
/chestshop hologram enable shop owner (player shops), or neoessentials.shop.create.admin (admin shops) Enable a floating price hologram on the looked-at shop
/chestshop hologram disable shop owner (player shops), or neoessentials.shop.create.admin (admin shops) Remove the hologram from the looked-at shop
/chestshop hologram move <x> <y> <z> shop owner (player shops), or neoessentials.shop.create.admin (admin shops) Reposition the hologram (offset from the sign, ±4.5 blocks per axis)
/chestshop export neoessentials.shop.admin.csv.export Export all shops to a CSV file
/chestshop import [create] neoessentials.shop.admin.csv.import Import shops from CSV (create also creates new signs)
/chestshop remove shop owner, or neoessentials.shop.admin.remove / OP 3 Remove the shop you're currently looking at (sign or its linked chest)
/chestshop remove <x> <y> <z> neoessentials.shop.admin.remove Admin-only: remove a shop at specific coordinates, without needing to look at it
/chestshop reload neoessentials.shop.admin.reload Reload shop data and the dynamic pricing config

Dynamic Pricing & Holograms#

Shops support optional per-shop holograms (floating buy/sell display, clickable) and a configurable dynamic pricing engine (shop.pricing in config.json) with rules such as bulk-quantity discounts, time-based discounts, and supply/demand adjustment. These are off by default — /chestshop pricing reports current status.

Permissions#

Node Description
neoessentials.shop.create Create player shops / register signs via /chestshop convert
neoessentials.shop.create.admin Create admin shops
neoessentials.shop.use Buy/sell at shops
neoessentials.shop.list.others View other players' shops via /chestshop list <player>
neoessentials.shop.setprice Change prices on your own shops via /chestshop setprice
neoessentials.shop.admin.setprice Change prices on any shop
neoessentials.shop.admin.remove Remove any shop
neoessentials.shop.admin.reload Reload shop data
neoessentials.shop.admin.csv.export Export shops to CSV
neoessentials.shop.admin.csv.import Import shops from CSV

NPC Shops#

Entity-based shops — an invulnerable ArmorStand NPC that opens a virtual chest-style GUI listing configurable buy/sell offers, instead of a sign+chest pair. Unlike ChestShop, NPC shops have no linked chest: items are minted/sunk directly (like an admin ChestShop with unlimited stock), so there's no stock to run out of on the shop's side.

Setup#

  1. Stand where you want the NPC and run /npcshop create <name> — spawns the NPC at your current position.
  2. Add item listings with /npcshop additem <shopId> <item> <buyPrice> <sellPrice> <qty> (pass -1 for either price to disable that side of the trade — e.g. buy-only or sell-only listings).
  3. Right-click the NPC to open the shop GUI.

Buying and Selling#

Inside the shop GUI, each listing is shown as an item stack with buy/sell prices and a click hint in its lore:

  • Right-click a listing → buy (pay money, receive the item).
  • Left-click a listing → sell (give up the item, receive money) — only works if the listing has a sell price configured and you're carrying enough of the item.

Requires neoessentials.shop.use, same permission as ChestShop.

Commands#

/npcshop with no arguments prints an in-game help listing. All sub-commands require neoessentials.shop.npc.manage (or OP level 3).

Command Description
/npcshop create <name> Spawn a new NPC shop at your current position
/npcshop remove Remove the nearest NPC shop (within 5 blocks)
/npcshop additem <shopId> <item> <buyPrice> <sellPrice> <qty> Add a listing (-1 disables that side)
/npcshop removeitem <shopId> <index> Remove a listing by its index (see /npcshop info)
/npcshop list List all NPC shops
/npcshop info <shopId> Show a shop's name, ID, position, and listings
/npcshop reload Reload npc_shops.json from disk
/npcshop respawn <shopId> Re-summon a shop's NPC entity if it was ever lost (e.g. killed by void damage, or removed by an unrelated /kill) without losing its listings — the listings are keyed by shopId, independent of the in-world entity

shopId accepts either the full UUID or an unambiguous prefix (as shown by /npcshop list/create).

Permissions#

Node Description
neoessentials.shop.npc.manage Create/remove/configure NPC shops
neoessentials.shop.use Buy/sell at NPC shops (shared with ChestShop)

Vault API#

NeoEssentials registers itself as a Vault Economy, Chat, and Permission provider. Any mod/plugin using Vault will automatically use NeoEssentials.

Provider Class Notes
Economy NeoEssentialsEconomy Backed by EconomyManager; format() uses live currencySymbol
Chat NeoEssentialsChat Prefix/suffix routed through LuckPerms → FTBRanks → internal
Permission NeoEssentialsPermission playerHas() → PermissionAPI.hasPermission()

Use /vault to check provider status in-game.


Data Files#

File Contents
neoessentials/balances.json Player UUID → balance
neoessentials/transactions.json Transaction history log
neoessentials/worth.json Item ID → sell price
neoessentials/shops.json ChestShop data

Back to Wiki Home