Плагин InOrders - Заказы на предметы между игроками [1.0.0]

InOrders - Заказы на предметы между игроками
Краткое описание:
Заказы на предметы: продавцы сдают товар и сразу получают деньги
6
90
Для версий
  1. 1.21.✘
  2. 26.✘
Java
  1. Java 21
  2. Java 22
  3. Java 23
  4. Java 25
Исходный код
https://github.com/SpolzerMod/InOrders
Заказы на предметы: игрок оплачивает нужное заранее, а тот, у кого это есть, сдаёт товар и сразу получает деньги.​


О плагине
InOrders
- плагин заказов, устроенный наоборот по сравнению с аукционом. Здесь не ждут покупателя: игрок сам пишет, что ему нужно, например «64 дубовых брёвен по 2 монеты за штуку». Вся сумма списывается сразу и лежит в заказе, поэтому продавцу не приходится верить покупателю на слово.

Любой, у кого есть подходящие предметы, сдаёт их в пару кликов и тут же получает оплату. Заказчик забирает покупку, когда ему удобно, даже если в момент сдачи был не в сети.



Возможности
  • Поиск на двух языках - алмаз и diamond, починка и mending находят одно и то же.
  • Заказ по образцу - можно заказать точно такой же предмет, как в руке, вместе с чарами и эффектами зелий.
  • Количество стаками - 640, 10ст или 2.5к. Цена указывается за штуку, в деньгах Vault или поинтах PlayerPoints.
  • Подсветка подходящих заказов - заказы, для которых у вас уже есть предметы, выделены в списке. Shift + ЛКМ сдаёт всё сразу.
  • Только точные совпадения - повреждённые, переименованные предметы и предметы с другими чарами не принимаются. Если двое сдают одновременно, заказ не возьмёт больше, чем нужно.
  • Возврат денег - при отмене или окончании срока неизрасходованная сумма возвращается заказчику, уже купленное остаётся в заказе.
  • Уведомления - заказчик узнаёт о каждой сдаче, а при входе на сервер получает напоминание, если его что-то ждёт.
  • Слоты по рангам - сколько заказов можно держать открытыми, задаётся правами LuckPerms.
  • Bedrock и старые клиенты - игроки через Geyser/Floodgate и клиенты младше 1.21.6 через ViaVersion получают те же формы в виде меню-сундуков.
  • SQLite или MySQL/MariaDB - работает сразу после установки, несколько серверов могут делить одну базу.
  • Язык по клиенту - в режиме auto каждый видит меню на языке своей игры. В комплекте русский и английский, тексты в формате MiniMessage.
  • API для разработчиков с событиями создания, сдачи и отмены заказов.

​
Скриншоты

1790290927653

Список заказов

1790290931907

Создание заказа

1790290936668

Сдача предметов​


Как это работает
Заказчик

  1. Откройте /orders и нажмите «Создать заказ».
  2. Найдите предмет в каталоге или возьмите его из своего инвентаря.
  3. Укажите количество, цену за штуку и срок. Проверьте итог и подтвердите: сумма спишется сразу.
  4. Заберите купленное в «Моих заказах» (/orders my).

Продавец
  1. Откройте /orders. Заказы, для которых у вас есть предметы, подсвечены.
  2. Нажмите на заказ и выберите ползунком, сколько сдать, или сдайте всё через Shift + ЛКМ.
  3. Оплата приходит сразу после сдачи.


Требования
  • Paper 1.21.7 - 26.3, один jar на все версии.
  • Java той версии, которую требует ваш Paper (минимум 21).
  • Хотя бы одна валюта: Vault с плагином экономики или PlayerPoints.
  • Доступ к интернету при первом запуске: Paper сам скачает нужные библиотеки.

интеграции:
ПлагинЧто добавляет
Vault (обязательно)Заказы за деньги
PlayerPointsЗаказы за поинты
LuckPermsЧисло слотов через мету inorders-limit с учётом мира и сервера
FloodgateНативные формы ввода для Bedrock-игроков
ViaVersionМеню-сундуки для клиентов младше 1.21.6
Иконки предметов на кнопках каталога видны начиная с 1.21.11 на сервере и клиенте, на более старых версиях кнопки показывают только название.


Установка
  1. Положите InOrders-x.x.x.jar в папку plugins.
  2. Перезапустите сервер.
  3. При необходимости настройте plugins/InOrders/config.yml и выполните /orders reload.


Команды
КомандаОписание
/ordersОткрыть список заказов
/orders myВаши заказы: сколько уже сдали, получение покупок, отмена
/orders create [hand]Создать заказ; с hand - на предмет из руки
/orders search <текст>Найти заказы по названию предмета
/orders open <игрок> [my]Открыть меню другому игроку, например из NPC
/orders reloadПерезагрузить конфигурацию и переводы
Алиасы: /order, /inorders.


ПравоПо умолчаниюДоступ
inorders.playerвсеВсе права игрока
inorders.useвсеСписок заказов и «Мои заказы»
inorders.createвсеСоздание заказов
inorders.deliverвсеСдача предметов
inorders.cancelвсеОтмена своих заказов
inorders.currency.moneyвсеЗаказы за деньги Vault
inorders.currency.playerpointsвсеЗаказы за поинты
inorders.limit.<число>нетСколько заказов можно держать открытыми
inorders.limit.unlimitedнетБез ограничения на открытые заказы
inorders.bypass.feeнетБез комиссии при создании заказа
inorders.bypass.taxнетБез налога при сдаче
inorders.adminopВсе права администрации
inorders.admin.cancelopСнятие чужих заказов с возвратом денег заказчику
inorders.admin.openop/orders open
inorders.admin.reloadopПерезагрузка настроек
inorders.admin.worldsopЗаказы в мирах из disabled-worlds
Общие узлы: inorders., inorders.currency., inorders.bypass.*.

Заказы с определённого ранга. Укажите в конфиге:
YAML:
permissions:
  open-to-everyone: false
Выполните /orders reload и откройте доступ нужной группе:
Код:
/lp group rank3 permission set inorders.player true
При настроенном наследовании старшие ранги тоже получат доступ. Отдельные валюты открываются так же, например деньги только с пятого ранга:
Код:
/lp group rank3 permission set inorders.currency.money false
/lp group rank5 permission set inorders.currency.money true

Слоты заказов. Без прав действует orders.max-active из конфига. Право inorders.limit.<число> заменяет это значение, из нескольких берётся наибольшее, так что лимит можно и уменьшить:
Код:
/lp group default permission set inorders.limit.3 true
/lp group vip permission set inorders.limit.5 true
/lp group admin permission set inorders.limit.unlimited true
С LuckPerms удобнее мета, она учитывает вес групп и контексты вроде мира или сервера:
Код:
/lp group vip meta set inorders-limit 5
Проверяется по порядку: inorders.limit.unlimited, мета inorders-limit, наибольшее inorders.limit.<число>, max-active.

YAML:
# InOrders configuration.
# Messages and menu texts are in lang/<language>.yml.

# "auto" shows every player the messages in their game language. English and Russian are included,
# other languages can be added as new files in lang/. Any other value (for example "ru") uses one
# language for everyone.
language: auto
# Used for the console and for game languages without a file in lang/.
default-language: en

permissions:
  # true: all players can use orders by default.
  # false: players need inorders.player (or individual permissions) from a permissions plugin such as LuckPerms.
  # Staff permissions are always limited to operators by default.
  open-to-everyone: true

menus:
  # How forms are shown: creating an order, choosing an amount, entering a price or a search.
  # auto: game dialogs (Minecraft 1.21.6 and newer), chest menus for Bedrock players and older clients.
  # dialog: dialogs wherever the client supports them.
  # chest: chest menus and chat input for everyone.
  # With dialogs the item catalog is a dialog too, with item icons for clients 1.21.11 and newer.
  # Order lists are always chest menus.
  forms: auto
  # Creative tabs hidden from the item catalog. Tab ids: building_blocks, colored_blocks, natural_blocks,
  # functional_blocks, redstone_blocks, tools_and_utilities, combat, food_and_drinks, ingredients, spawn_eggs.
  hidden-tabs:
    - spawn_eggs

orders:
  # Open orders per player without a limit permission. inorders.limit.<number> or the LuckPerms meta
  # inorders-limit replace it, inorders.limit.unlimited removes the limit.
  max-active: 7
  # Largest number of items in one order. 2304 is a full inventory of 64-item stacks.
  max-amount: 2304
  # Durations in days a player can choose from.
  durations: [1, 3, 7]
  default-duration: 3
  # Paid on top of the order price when it is created. Not returned when the order is cancelled.
  fee-percent: 0
  # Taken from the money a seller receives for delivered items.
  tax-percent: 0

currencies:
  # Requires Vault and an economy plugin.
  money:
    enabled: true
    # Price limits for one item. 0 as max-price means no limit.
    min-price: 0.01
    max-price: 0
  # Requires PlayerPoints.
  playerpoints:
    enabled: true
    min-price: 1
    max-price: 0

# Items that cannot be ordered.
blocked-items: []
#  - BEDROCK
#  - BARRIER

# Worlds where the order menus cannot be opened.
disabled-worlds: []

notifications:
  # Tell online owners when items are delivered to their orders.
  deliveries: true
  # Remind players on join that they have items or refunds to collect.
  join-reminder: true

# Format: "<sound> [volume] [pitch]". Leave empty to turn a sound off.
sounds:
  click: "ui.button.click 0.4 1.2"
  success: "entity.player.levelup 0.6 1.4"
  sell: "entity.experience_orb.pickup 0.8 1.1"
  claim: "entity.item.pickup 0.8 0.9"
  notify: "block.note_block.chime 0.8 1.2"
  error: "entity.villager.no 0.6 1"

# Changes in this section require a server restart.
storage:
  # sqlite: local file plugins/InOrders/orders.db, no setup required.
  # mysql: MySQL or MariaDB server, configured below.
  type: sqlite
  # Unique name of this server. Only needed when several servers use the same MySQL database.
  server-id: main
  # true: orders from every server sharing the database are visible everywhere.
  # Only enable this when all these servers share one economy, otherwise money moves between economies.
  shared-orders: false
  mysql:
    host: localhost
    port: 3306
    database: minecraft
    user: root
    password: ""
    # Number of connections.
    pool-size: 4
    # Additional JDBC driver properties.
    properties:
      useSSL: false
      allowPublicKeyRetrieval: true

SQLite работает без настройки, база лежит в plugins/InOrders/orders.db. Для MySQL или MariaDB укажите storage.type: mysql, заполните раздел storage.mysql и перезапустите сервер. Таблица inorders_orders создаётся сама.

Каждое изменение заказа выполняется одной транзакцией, все записи одного сервера идут по очереди. Суммы хранятся в целых сотых, поэтому ошибок округления нет.

Сеть серверов. Серверы с общей базой различаются по storage.server-id и по умолчанию видят только свои заказы. storage.shared-orders: true делает заказы общими для всей сети, но включать это стоит только при общей экономике.

Модуль api открывает доступ к заказам и событиям. Подключите его как compileOnly и добавьте InOrders в depend или softdepend своего плагина.

Java:
import me.spolzer.inorders.api.InOrders;

InOrders orders = InOrders.get();
orders.orders(player.getUniqueId()).thenAccept(list ->
    getLogger().info(player.getName() + " has " + list.size() + " orders"));

  • OrderCreateEvent приходит до списания оплаты, OrderDeliverEvent до изъятия предметов у продавца, OrderCancelEvent при отмене. Все три можно отменить.
  • InOrders#openMenu(Player) открывает список заказов.
  • Данные возвращаются через CompletableFuture. Для работы с Bukkit-объектами вернитесь в основной поток сервера.
  • Order#priceCents() отдаёт цену в сотых: 250 для 2.50, 500 для 5 поинтов.

Нужен ли мод или ресурспак на клиенте?
Нет, всё работает на стандартных окнах Minecraft.

Почему каталог не помещается в маленькое окно?
Сервер не знает размер окна игрока, поэтому ширина каталога постоянная. Разверните игру на весь экран или уменьшите масштаб интерфейса.

Можно ли обойтись без игровых окон?
Да, menus.forms: chest переводит все формы на меню-сундуки.

Можно ли запретить заказывать определённые предметы?
Да, через список blocked-items в конфиге.

Что будет, если заказчик не в сети, когда заказ выполнили или отменили?
Предметы и деньги дождутся его в заказе, а при входе плагин напомнит о них.

Как добавить свой язык?
Создайте файл lang/<код>.yml по образцу en.yml или ru.yml.

Защищён ли плагин от падения сервера?
После каждой сдачи файл продавца сохраняется сразу, так что предметы не окажутся одновременно и у него, и в заказе. Операции, которые база уже записала, доводятся до конца даже при выключении сервера. Но плагин экономики и база данных остаются разными системами, поэтому при аварийном завершении посреди операции полной гарантии дать нельзя.


Ссылки
GitHub • Поддержка

Нашли ошибку или есть идея? Пишите в обсуждении ресурса или открывайте issue на GitHub.​

Автор

Spolzer

Еще ресурсы от Spolzer

InTrade - Система обмена между игроками
InTrade - Система обмена между игроками
Обмен предметами, деньгами, опытом и поинтами между игроками на сервере
[Spolzer] Avatar History
История аватаров пользователя
[Spolzer] Solution List
Просмотр решений пользователя
[Spolzer] Watermark
вотермарка на вложения
[Spolzer] Email Reply
Ответы в темах и личных переписках прямо из почты
[Spolzer] Sticky Post
Закрепляет любой один пост в теме и всегда показывает его первым на каждой странице обсуждения.
Русский язык для [Spolzer] Watermark
Перевод плагина на русский язык
[Spolzer] Promote Tools
Выдача групп через инструменты модератора
[Spolzer] Thread Prefix by reaction
Плагин для работы с темой в зависимости от реакции на главном сообщении темы.
Стиль форума ArizonaRP 2025
Стиль форума ArizonaRP 2025
НЕ полная копия стиля Arizona RP
ВерхНиз