Ящики
Ящики с взвешенными наградами, ключи, физические блоки и анимация открытия.
Команды 1#
Примеры#
Собрать первый ящик целиком из игры#
Нужен рабочий ящик, а редактировать crates.json руками не хочется. Все админ-команды пишут прямо в конфиг, поэтому ящик можно собрать не выходя из игры.
/crate admin create vote &6Vote Crate
/crate admin addreward vote 50
/crate admin addreward vote 30
/crate admin addreward vote 5
/crate admin setanimation vote roulette
/crate admin setkey vote
/crate key give Steve vote 1
/crate open vote
После create в чат приходит «Created crate vote. Saved to config/neoessentials/crates.json». Каждый addreward берёт предмет из основной руки — перед каждым вызовом возьмите нужный предмет (сам предмет не расходуется), вес относительный, в сумму 100 приводить не нужно. setkey так же забирает предмет из руки и делает его ключом. Свежесозданный ящик пуст: если открыть его до первого addreward, будет не «нет ключей», а «Crate ... has no rewards configured yet» — ключ при этом не списывается. Последняя команда открывает GUI с прокруткой в стиле CS:GO, после остановки барабана приходит «You opened ... and won: ...», а награда падает в инвентарь.
Поставить физический ящик у спавна#
Игроки должны открывать ящик кликом по сундуку, а не командой — и видеть над ним подпись.
/crate admin setblock vote
/hologram setline crate_vote 2 &eПравый клик — открыть, левый — шансы
/hologram setscale crate_vote 1.3
Встаньте так, чтобы блок (любой, тип из поля block чисто декоративный) был точно под прицелом не дальше 6 блоков, и выполните setblock: приходит «That block is now a physical ...», а в 1.5 блока над ним появляется обычная голограмма с id crate_vote — её видно в автодополнении /hologram и можно менять любой подкомандой. Теперь правый клик по блоку открывает ящик (ключ спишется), левый — бесплатное окно шансов; шифт+левый клик проваливается в обычную ломку блока. Снимается привязка командой /crate admin removeblock, стоя перед тем же блоком, вместе с голограммой.
Выдать ключи, которые можно передать другому игроку#
Ключи как награда за донат или приз, который победитель может подарить или продать. Виртуальный баланс так не работает — он привязан к игроку намертво.
/crate admin setkeyname vote &eКлюч Vote Crate
/crate key giveitem Steve vote 5
/crate keys Steve
Steve получает 5 настоящих предметов-ключей (стек разбивается по максимальному размеру стека предмета-ключа, лишнее падает под ноги). Их можно выбросить, положить в сундук, обменять — открыть ящик сможет тот, у кого они окажутся в руке. При этом /crate keys Steve покажет для vote по-прежнему 0: виртуальный баланс и предметы-ключи — два независимых счёта. Порядок команд важен: имя ключа «впекается» в предмет в момент выдачи, поэтому setkeyname нужно выполнить до giveitem — уже выданные ключи сохранят старое имя.
Добавить редкую награду с оповещением и командой#
Нужна награда, которой в руках не подержишь — выдача права, роли или денег — плюс объявление на весь сервер. Через addreward такое не сделать: он умеет только предмет из руки.
/crate admin reload
/crate preview vote
Впишите в crates.json в массив rewards нужного ящика запись вида {"id": "vip", "weight": 1, "commands": ["lp user {player} parent addtemp vip 7d"], "broadcastRare": true, "broadcastMessage": "&6{player} &7выбил VIP!"} и выполните /crate admin reload — «Crates config reloaded». Команды выполняются от имени консоли с подстановкой {player}, broadcastMessage уходит всем онлайн-игрокам. Учтите две детали: /neoe reload крейты не перечитывает, только /crate admin reload; а награда без поля item отображается в /crate preview и в анимации пустым слотом — если хотите её показать, добавьте к ней предмет-«иконку».
Тонкие места#
Право на превью само по себе бесполезно#
Корневой узел /crate объявлен с проверкой neoessentials.crate.open, и Brigadier применяет её ко всему поддереву. Игрок, которому выдали только neoessentials.crate.preview, не увидит и не выполнит ни /crate preview, ни /crate list. При этом левый клик по физическому блоку идёт мимо команды и проверяет ровно neoessentials.crate.preview, а правый — neoessentials.crate.open.
Что делать: Обычной группе выдавайте пару neoessentials.crate.open + neoessentials.crate.preview. Если хочется дать «только посмотреть» — это возможно лишь через физический блок, командой не получится.
Все цели — только онлайн, и баланс чужих ключей видно всем#
/crate keys <player>, /crate key give, take и giveitem ищут игрока через getPlayerByName, то есть только среди онлайн. Для вышедшего игрока придёт «player not found», очереди отложенной выдачи нет. Отдельно: /crate keys <player> лежит вне ветки key, так что смотреть чужие балансы может любой игрок с neoessentials.crate.open, без прав администратора.
Что делать: Выдачу офлайн-игроку либо откладывайте до входа, либо оформляйте через награду за голос в votifier.json (она умеет догонять игрока при входе). Если чужие балансы показывать не хочется — закрывать нечем, права на этот подузел отдельно не предусмотрено.
Два независимых кошелька ключей и правило выбора#
Виртуальный баланс (/crate key give|take, хранится в neoessentials/store/crate_keys.json) непередаваем и тратится только своим владельцем. Предмет-ключ (/crate key giveitem) — самостоятельный предмет с NBT-меткой на конкретный ящик; при правом клике по блоку обработчик сначала смотрит основную руку, и только если валидного ключа там нет, списывает виртуальный. То есть с ключом в руке виртуальный баланс не тратится, и наоборот.
Что делать: Если игрок жалуется, что «ключ пропал, а баланс не уменьшился» — это штатное поведение: списался предмет. Проверить баланс: /crate keys <player>, плейсхолдер {crate_keys:<crateId>} (показывает только собственный баланс смотрящего).
Что перечитывает /crate admin reload, а что нет#
/crate admin reload сбрасывает кэш конфигов, заново читает crates.json и подчищает голограммы над блоками несуществующих ящиков. Он не перерегистрирует команды: modules.cratesEnabled читается один раз при старте, поэтому включение модуля требует перезапуска. /neoe reload crates.json не трогает вообще — в его список систем крейты не входят. Привязки блоков, балансы ключей и история открытий лежат не в конфиге, а в neoessentials/store/ и читаются живьём, перезагрузка им не нужна.
Что делать: После ручной правки crates.json — всегда /crate admin reload, а не /neoe reload. После правки modules.cratesEnabled — перезапуск сервера.
Удаление ящика не снимает привязки блоков#
/crate admin delete <crate> убирает определение из crates.json и сметает осиротевшие голограммы, но записи в коллекции crate_blocks остаются. Блок при этом просто перестаёт быть ящиком: обработчик выходит раньше, чем отменяет событие, поэтому сундук снова открывается как обычный сундук. Если позже создать ящик с тем же id, все старые блоки молча оживут.
Что делать: Перед удалением ящика пройдитесь по его блокам с /crate admin removeblock — либо помните, что id переиспользовать нельзя без сюрпризов.
Голограмма над блоком: id, дубликаты и выключенный модуль#
setblock создаёт голограмму с id crate_<id ящика>; если у этого ящика уже есть блок с таким id, добавляется суффикс — crate_common_2, crate_common_3. Связка «блок → голограмма» хранится отдельно, поэтому повторный setblock по тому же блоку (даже для другого ящика) переиспользует существующую голограмму, а не плодит вторую, и связь переживает перенос голограммы через /hologram moveto|movehere. При modules.hologramEnabled: false голограмма не создаётся вовсе — блок работает, подписи над ним нет.
Что делать: Свою подпись задавайте обычными командами /hologram setline|setscale|... по id crate_<id>; она переживает всё, кроме removeblock, который удаляет голограмму вместе с привязкой.
Награды с нулевым весом видны, но никогда не выпадают#
Выбор награды идёт по сумме положительных весов: запись с weight ≤ 0 не может выпасть никогда. Но в /crate preview она всё равно занимает слот с подписью «0.00% chance», а в барабане анимации может мелькать — фон анимации набирается равномерно из всего списка наград, без учёта весов.
Что делать: Временно отключить награду лучше, вырезав её из массива rewards (с последующим /crate admin reload), а не обнуляя вес. Если весь пул нулевой — ящик считается пустым, ключ не спишется, придёт «has no rewards configured yet».
Что видно в превью и куда попадает награда#
В /crate preview собственное описание (lore) предмета-награды заменяется одной строкой с шансом, так что авторский текст там не увидеть; страница вмещает 45 наград, дальше — кнопки листания. Награда выдаётся в инвентарь, а если места нет — падает под ноги игрока. Награда без поля item (только commands) выглядит пустым слотом и в превью, и в анимации.
Что делать: Ничего чинить не нужно — но если полагаетесь на lore как на описание награды, продублируйте его в названии предмета или в голограмме над блоком.
Оба GUI — только для просмотра, копии предметов вычищаются#
Слоты обоих окон подменяют контейнер на read-only и помечают каждый показанный предмет (включая кнопки листания и заполнители) скрытой меткой. Пока окно открыто, инвентарь игрока сканируется каждые 250 мс, и после закрытия — ещё несколько раз в течение примерно 4 секунд: любой помеченный предмет, вытащенный клиентским модом-«pull» (подтверждено на Quark), удаляется молча.
Что делать: Если игрок утверждает, что «предмет из превью исчез из инвентаря» — так и задумано. Настоящая награда метку не несёт и под свип не попадает.
Ключи за голосование приходят только на виртуальный баланс#
Секция keys в votifier.json начисляет ключи через тот же счёт, что и /crate key give — предметы-ключи она не выдаёт. Голос за офлайн-игрока кладётся в очередь и выдаётся при входе. Если modules.cratesEnabled выключен, блок начисления ключей пропускается целиком, и эта часть награды теряется без следа.
Что делать: Для «голосовых» ящиков держите модуль включённым; если нужен именно передаваемый предмет-ключ — выдавайте его командой в поле commands того же сайта: crate key giveitem {player} vote 1.
Любая админ-команда переписывает crates.json целиком#
create, delete, addreward, setkey, setanimation, setchatname, setkeyname сохраняют конфиг через Gson — файл перезаписывается сериализованным JSON, и комментарии из поставляемого шаблона исчезают навсегда. Там же: setanimation с неизвестным значением не ошибается, а молча ставит sequential (это же значение по умолчанию у нового ящика, хотя в шаблоне указан roulette).
Что делать: Держите свою копию crates.json под рукой, а после setanimation проверяйте ответ команды — в нём указано реально применённое значение.
Известные проблемы#
«У вас нет ключей» при открытии командой, хотя ключ-предмет лежит в руке#
Вопреки описанию в английской вики и в changelog, /crate open <crate> предметы-ключи не учитывает: обработчик команды проверяет только виртуальный баланс и передаёт в выдачу null вместо предмета из руки. Физический ключ работает исключительно при правом клике по блоку, зарегистрированному через /crate admin setblock.
Что делать: Либо ставьте физический блок (тогда ключ-предмет работает как задумано), либо выдавайте виртуальные ключи /crate key give. Если ящик открывается только командой — предметы-ключи для него не выдавайте.
Закрытие окна с анимацией roulette до остановки барабана съедает ключ без награды#
Ключ списывается до открытия GUI, а награда выдаётся в конце анимации. У roulette каждый следующий шаг планируется из предыдущего, и при закрытии окна планировщик останавливается — цепочка обрывается, финал не наступает, grantReward не вызывается (в консоли при этом возможна ошибка RejectedExecutionException). У sequential все кадры запланированы заранее, поэтому там награда выдаётся даже при досрочном закрытии, а instant выдаёт её ещё до появления окна.
Что делать: Предупреждайте игроков не закрывать окно до конца прокрутки; для нетерпеливой аудитории ставьте /crate admin setanimation <crate> sequential или instant. Пострадавшему вернуть ключ: /crate key give <player> <crate> 1.
Опечатка в id ящика в votifier.json уносит ключи в никуда#
Комментарий в votifier.json обещает, что начисление «молча пропускается» без подходящего ящика, но кода проверки нет: addKeys создаёт запись баланса для любой строки-идентификатора. Ключи для несуществующего vote_crate реально копятся в хранилище, но не показываются ни в /crate keys, ни в плейсхолдере (оба перебирают только объявленные ящики) и никогда не тратятся.
Что делать: Сверяйте ключи секции keys с выводом /crate list — регистр не важен, написание важно. Уже «потерянные» ключи проще перевыдать вручную через /crate key give.
Файл истории открытий растёт бесконечно и никем не читается#
Каждое открытие пишет запись в коллекцию crate_history (игрок, ящик, награда, время). Ни одной команды, страницы веб-панели или отчёта, которые бы её читали, в моде нет, а на дефолтном JSON-бэкенде каждая запись перезаписывает весь файл neoessentials/store/crate_history.json — на активном сервере это заметная дисковая нагрузка и постоянно растущий файл.
Что делать: Либо переведите хранилище на SQLite/MySQL, либо периодически удаляйте neoessentials/store/crate_history.json на остановленном сервере — на работу ящиков он не влияет.
Все сообщения системы ящиков выводятся по-английски#
В поставляемом ru_ru.json ключей commands.neoessentials.crate.* нет вообще. При старте недостающие ключи домердживаются из en_us, поэтому на сервере с localization.language: ru_ru игроки видят английские тексты («You don't have any keys for ...»), а не непереведённый ключ.
Что делать: Переведите их прямо в своём файле neoessentials/languages/custom/ru_ru.json — после первого старта английские значения уже лежат там, слияние затрагивает только отсутствующие ключи и ваши правки не перетирает.
Конфигурация#
crates.json#
Подробное руководство#
Раздел ниже — исходная документация проекта (docs/Wiki/neoecrates.md). Ссылки на другие страницы вики переписаны на этот сайт; текст самих руководств не редактируется, чтобы синк с апстримом не давал конфликтов.
Config file: config/neoessentials/crates.json
Module toggle: modules.cratesEnabled (config.json)
Introduced: v1.0.6
Overview#
Keys, weighted reward pools, and an animated GUI reveal (like the Spigot plugin
ExcellentCrates), openable either virtually (/crate open) or by right-clicking a physical
crate block placed in the world.
Votifier can be configured to grant crate keys as a vote reward — the common "vote
crate" server setup — but the two systems work fully independently too.
Keys — two independent wallets#
A player can hold crate keys two ways, fully independently of each other:
- Virtual balance (
/crate key give\|take) — a non-transferable per-player count
(CrateKeyManager, mirrors how the economy balance works). Can't be given away, dropped, or
stolen; only ever spent by that specific player.
- Physical key item (
/crate key giveitem) — a real, giveable ItemStack tagged to one
crate. Holding a valid one is by itself enough to open that crate (right-clicking a crate
block, or holding it when using /crate open) — it doesn't touch or require any virtual
balance. Consuming the item (shrinking the stack by one) is what prevents reuse, so it's safe
to give, drop, or trade between players like any other item; whoever ends up holding it can
redeem it.
/crate admin setkey <crate> sets the key item to whatever you're holding — any vanilla or
modded item, with its full NBT/components (enchantments, custom model data, existing lore, etc)
preserved, the same way crate rewards support modded items. There's no restriction to a fixed
item list.
Display names — displayName vs chatDisplayName vs crateKeyDisplayName#
A crate has three separate display-name concepts, because each is shown through a different
channel with different animation capabilities:
displayName — the crate's visual identity, shown in its hologram line (via
/crate admin setblock's auto-created hologram) and its GUI titles (open/preview menus). These
can genuinely re-render, so {animation:NAME}/<gradient:...>/<rainbow> here actually
animate/refresh live, same as any other hologram text.
chatDisplayName (optional, /crate admin setchatname <crate> <name>) — used in every
chat/command-feedback message (no keys, no rewards, reward-added, keys given/taken, block set,
the "won a rare reward" broadcast, etc). A chat message is one line appended to an append-only
log, delivered once and never touched again — there's no packet channel to "animate" it
afterward the way a hologram/tablist/scoreboard line can be continuously re-sent. If
displayName uses {animation:NAME}, reusing it here would resolve a different random
snapshot frame in every single message, which reads as inconsistent/flickery rather than
animated. Falls back to displayName if not set (existing crates keep working unchanged) —
set this explicitly to a plain colored string whenever displayName is animated.
crateKeyDisplayName (optional, /crate admin setkeyname <crate> <name>) — the physical
key item's name. Same one-shot-snapshot limitation as chat: an item sitting in someone's
inventory can't be repainted, so an animated name here is a snapshot of whichever frame was
current the moment that specific key was minted, not something that animates while held — give
out a batch of keys over time and each one can show a different frame. Falls back to
"&6" + displayName + " Key" if not set.
Right-clicking a crate block prefers a valid physical key in your hand first, and only falls
back to your virtual balance if you aren't holding one.
Config (crates.json)#
Crates are primarily authored as config (like leaderboard.json boards) — in-game admin
commands are convenience helpers on top, not a full editor:
"crates": {
"common": {
"displayName": "&7Common Crate",
// "chatDisplayName": "&7Common Crate", // optional, see Display names above
// "crateKeyDisplayName": "&7Common Key", // optional, see Display names above
"block": "minecraft:chest", // cosmetic only
"animation": "roulette", // "roulette" | "sequential" | "instant"
"keyItem": { "item": "minecraft:tripwire_hook", "count": 1 },
"rewards": [
{ "id": "diamonds", "weight": 30, "item": { "item": "minecraft:diamond", "count": 3 } },
{ "id": "emerald_block", "weight": 5, "item": { "item": "minecraft:emerald_block", "count": 1 },
"broadcastRare": true, "broadcastMessage": "&6{player} won an Emerald Block!" }
]
}
}
weight is relative (doesn't need to sum to 100). Reward items support full item data
(enchantments, custom names, etc. — same {item, count, components} serialization kits.json
already uses). broadcastRare + broadcastMessage ({player} substituted) announces
server-wide when that specific reward is won.
Opening animations#
roulette — a CS:GO-style horizontal strip scrolls and decelerates onto the winning
reward, ~3-4 seconds.
sequential — a handful of slots flicker random rewards a few times before settling,
~1.5 seconds — much lighter than roulette.
instant — no animation, reward granted and announced immediately.
The reward is always resolved before the animation starts — the animation only reveals an
already-determined outcome, it never influences it.
Physical crate blocks#
/crate admin setblock <crate> while looking directly at a block registers that exact world
position as a live instance of the crate:
- Right-click it (with a key, physical or virtual) to open it.
- Left-click it to show the reward-odds preview at no cost — same as /crate preview.
Shift+left-click bypasses the preview and falls through as a normal break attempt.
/crate admin removeblock unregisters. This is a position-mapping (like a ChestShop sign), not
a new custom block type — any vanilla block works, purely cosmetic.
setblock also auto-creates a floating Hologram above the block (default:
the crate's display name + "Right-click to open!"), requires modules.hologramEnabled.
It's a completely ordinary hologram — same registry, same /hologram commands — just given a
predictable id based on the crate's own name (crate_<crateId>, e.g. crate_common) so it's
actually findable in /hologram tab-completion, not an opaque coordinate string. If that crate
already has another physical block's hologram using the base name, later ones get a numeric
suffix (crate_common_2, crate_common_3, ...) — the block → hologram link is tracked
internally, so this stays correct even if you move the hologram elsewhere with
/hologram moveto/movehere. Customize it with any /hologram subcommand:
/hologram setline crate_common 2 &6Rare loot inside!, plus scale, spin, background color,
hover animation, or anything else /hologram supports. removeblock removes it again;
/crate admin reload and /crate admin delete sweep away any hologram left over a block whose
crate no longer exists.
Commands#
| Command |
Permission |
Description |
/crate list |
neoessentials.crate.open |
List defined crates |
/crate open <crate> |
neoessentials.crate.open |
Open virtually (consumes a virtual key) |
/crate preview <crate> |
neoessentials.crate.preview |
Show the reward pool + odds, no key cost |
/crate keys [player] |
neoessentials.crate.open |
Show key balances |
/crate key give\|take <player> <crate> <amount> |
neoessentials.crate.admin |
Adjust a player's virtual key balance |
/crate key giveitem <player> <crate> <amount> |
neoessentials.crate.admin |
Give real, tradeable physical key item(s) |
/crate admin create <id> <displayName> |
neoessentials.crate.admin |
Define a new crate |
/crate admin delete <crate> |
neoessentials.crate.admin |
Delete a crate |
/crate admin addreward <crate> <weight> |
neoessentials.crate.admin |
Add your held item as a reward |
/crate admin setkey <crate> |
neoessentials.crate.admin |
Set the crate's key item to your held item |
/crate admin setchatname <crate> <name> |
neoessentials.crate.admin |
Set the plain chat-message display name |
/crate admin setkeyname <crate> <name> |
neoessentials.crate.admin |
Set the key item's display name |
/crate admin setanimation <crate> <type> |
neoessentials.crate.admin |
roulette|sequential|instant |
/crate admin setblock / removeblock |
neoessentials.crate.admin |
Physical block placement (see above) |
/crate admin reload |
neoessentials.crate.admin |
Reload crates.json |
Placeholders#
{crate_keys:<crateId>} — the viewing player's own key balance for that crate.
Back to Wiki Home · See also Votifier