Skip to content

Commands and Permissions ​

Every EmakiStorage command, permission node and common failure is listed below, so you can run them straight from the tables

EmakiStorage's main command is /emakistorage, aliased to /estorage. Examples in the docs use /estorage

The command is not declared in paper-plugin.yml; it is registered through CoreLib when the plugin enables, and /estorage is the only alias. The /storage written in config.yml comments is a historical form and is not registered

Run /estorage with no arguments to open your own warehouse; it requires emakistorage.use (emakistorage.admin also passes). Admin subcommands all require emakistorage.admin; reload and debug have their own dedicated permissions which emakistorage.admin can also replace

Command List ​

CommandPermissionDescription
/estorageemakistorage.useOpens your own warehouse. Players only
/estorage helpemakistorage.useShows help. The whole command is gated by its command-level permission; the help branch adds no extra check but still requires it
/estorage open <player>emakistorage.adminOpens a target player's warehouse as an admin. The sender must be a player
/estorage slot grant <player> <amount>emakistorage.adminAdjusts the target's granted slot pool. A negative amount reclaims slots
/estorage stacklimit player <player> <limit>emakistorage.adminSets the target's player-level per-slot ceiling
/estorage stacklimit slot <player> <slot> <limit>emakistorage.adminSets the entry-level ceiling of one logical slot
/estorage info <player>emakistorage.adminPrints the capacity breakdown, page count, stackLimit, sort mode and total amount
/estorage export <player>emakistorage.adminExports the warehouse as readable YAML into exports/export-<uuid>.yml
/estorage autopickup [on|off|toggle]emakistorage.autopickupManages your personal auto-pickup switch. on (true / enable are equivalent) enables it; off (false / disable are equivalent) disables it; omitting the argument or passing anything else toggles. Also requires auto_pickup.enabled: true, otherwise it reports the feature as disabled
/estorage reloademakistorage.reload or emakistorage.adminReloads config, language and GUI templates, then reports the loaded template count
/estorage debug ...emakistorage.debug or emakistorage.adminManages debug modules. Available modules are storage and chat_input; subcommands come from CoreLib's DebugCommand

Examples ​

text
/estorage
/estorage help
/estorage open Steve
/estorage slot grant Steve 10
/estorage slot grant Steve -5
/estorage stacklimit player Steve 100000
/estorage stacklimit player Steve max
/estorage stacklimit player Steve 10k
/estorage stacklimit slot Steve 3 5000
/estorage info Steve
/estorage export Steve
/estorage autopickup on
/estorage autopickup
/estorage reload
/estorage debug storage on

Argument Formats ​

ArgumentAccepted inputNotes
<amount> (slot grant)Decimal integer, may be negativeNegative values reclaim granted slots
<limit> (stacklimit)Decimal number, compact units (k m b t p e), max, 0max resolves to Long.MAX_VALUE. 0 is the explicit "restore inheritance" form: 0 at entry level falls back to the player level, and 0 at player level falls back to capacity.default_stack_limit. Any other result <= 0, plus overflow, is rejected outright rather than truncated, so a mistyped figure never silently becomes a different ceiling
<slot>Logical slot index (0-based)When that slot holds no entry the command reports "slot empty" and no entry is created

Write Operations Require the Target Online ​

Why online is required: slot grant and stacklimit are refused outright when the target is offline, reporting command.target_offline. The reason is that these operations mutate the in-memory storage object: writing directly into an unloaded save would race the player's next login and could overwrite or discard the change

Thread note: for online targets the write is dispatched to that player's own region thread, not the caller's. If the target's storage is still loading, the command reports general.data_loading; retry shortly

Read-only commands do not share this restriction: info and export use the snapshot read path, which loads from disk when necessary, so they work for offline players too. open <player> also works for offline targets

Permission Nodes ​

PermissionDefaultScope
emakistorage.usetrueOpening your own warehouse
emakistorage.unlock.purchasetrueUsing paid expansion in the GUI. Also requires unlock.purchase_enabled: true
emakistorage.autopickuptrueUsing /estorage autopickup and the auto-pickup feature itself
emakistorage.reloadopUsing /estorage reload. Can be replaced by emakistorage.admin
emakistorage.debugopUsing /estorage debug .... Can be replaced by emakistorage.admin
emakistorage.adminopUsing open, slot, stacklimit, info and export, and replacing the dedicated reload/debug permissions

Numeric Tier Permissions ​

To give some players more slots or a higher ceiling, grant the two numeric tier permissions below. They are not declared in paper-plugin.yml; simply grant the node with a numeric suffix

Permission prefixEffectResolution rule
emakistorage.slots.<n>Adds n slotsScans every effective permission and takes the highest numeric suffix. Tiers do not stack
emakistorage.stacklimit.<n>Provides a player-level per-slot ceiling of nAlso takes the highest value

Note: neither supports wildcards; a node such as emakistorage.slots.* is skipped. Some permission plugins expand a wildcard into "holds every n", which would silently push the player to the maximum tier, so the implementation only accepts a purely numeric suffix and ignores suffixes containing . or non-digits

Common LuckPerms examples:

text
/lp group default permission set emakistorage.use true
/lp group default permission set emakistorage.unlock.purchase true
/lp group vip permission set emakistorage.slots.100 true
/lp group vip permission set emakistorage.stacklimit.100000 true
/lp group admin permission set emakistorage.admin true

reload Behaviour ​

When you run /estorage reload, the plugin performs the following work:

  1. Releases missing default resources, controlled by config.yml > release_default_data
  2. Re-reads config.yml, lang/*.yml, unlock_costs.yml and gui/storage_gui.yml
  3. Recomputes the GUI layout for the new gui.storage_rows
  4. Purges expired flow logs and reports how many GUI templates were loaded

How to tell the reload actually took effect: the reload goes through CoreLib's config-precheck gate, and when the precheck fails (for example a missing config.yml or gui/ directory, or an unavailable precheck service) the whole reload is rolled back, the previous configuration stays in effect and the precheck report goes to the console. The command still prints its "reload succeeded" summary, so judge success from the console precheck output and the config values themselves

Check the console afterwards: a gui.storage_rows outside 1–5 is clamped with a console warning, see Configuration

Common Failure Reasons ​

SituationExplanation
Player not foundThe name does not match exactly and no cached offline player exists
Player ... is offline, cannot perform this writeslot grant and stacklimit targets must be online
Storage data is still loading, try again shortlyThe target is online but their storage has not finished loading
Slot emptyThe logical slot given to stacklimit slot currently holds no entry
stacklimit argument rejectedThe parsed value is <= 0 (other than 0 itself) or out of long range. Use a positive integer, a compact unit, max or 0
Warehouse window fails to openThe GUI template was not loaded or failed to parse; check console warnings