Плагин InTrade - Система обмена между игроками [2.1.0]

InTrade - Система обмена между игроками
Краткое описание:
Обмен предметами, деньгами, опытом и поинтами между игроками на сервере
7
89

Предыдущие версии [3]

Последние обновления

2.1.0

Предметы в открытом обмене больше нельзя потерять или продублировать из-за сбоя сервера...

InTrade 2.0.0

Суммы валют теперь хранятся в BigDecimal, TradeOffer тоже использует BigDecimal (изменение API)...
Смотреть еще...
Для версий
  1. 1.21.✘
  2. 26.✘
Java
  1. Java 21
  2. Java 22
  3. Java 23
  4. Java 25
Исходный код
https://github.com/SpolzerMod/InTrade
E12e4dab f9d6 4415 aeb3 fe84a6b69653

Удобный и безопасный обмен между игроками: предметы, деньги, уровни опыта и поинты в одном окне с двойным подтверждением.​


О плагине
InTrade - серверный плагин для прямого обмена между игроками. Слева ваше предложение, справа - предложение партнёра. У каждого по 16 слотов для предметов и кнопки доступных валют. Никаких модов на клиенте не нужно, всё работает через обычное меню.

Главная задача плагина - сделать обмен честным. Подменить предмет в последний момент не получится: любое изменение сбрасывает готовность обоих игроков и сразу подсвечивается у партнёра.



Возможности
  • Одно окно на двоих - по 16 слотов на каждую сторону. ЛКМ добавляет стак, ПКМ — один предмет.
  • Несколько валют - деньги (Vault), целые уровни опыта, PlayerPoints. Сумму можно вводить как 1500, 2.5k или 1m.
  • Защита от подмены - после любого изменения кнопка «Готов» блокируется на 3 секунды, изменённые предметы подсвечиваются 6 секунд, на месте убранного остаётся красная отметка. Финальный отсчёт после подтверждения обоих — 3 секунды, и любое изменение его останавливает.
  • Просмотр шалкеров и мешков - содержимое контейнеров партнёра можно посмотреть до обмена.
  • Проверка места в инвентаре - обмен не завершится, если предметам некуда поместиться.
  • Возврат предметов - всё, что не поместилось при возврате, и предметы участника, погибшего во время обмена, сохраняются для /trade claim.
  • История обменов - меню с предметами и валютами каждого завершённого обмена.
  • Статистика и топ - счётчик обменов и таблица лидеров, которые не сбрасываются при очистке истории.
  • SQLite или MySQL/MariaDB - работает из коробки, а при необходимости несколько серверов могут использовать общую базу.
  • Язык по клиенту - в режиме auto каждый игрок видит меню и сообщения на языке своей игры. В комплекте русский и английский, тексты в формате MiniMessage.
  • Поддержка Bedrock - игроки через Geyser/Floodgate вводят сумму в нативной форме.
  • Доступ по рангам - обмен и отдельные валюты можно открывать с нужного ранга через LuckPerms.
  • Быстрый запрос - Shift + ПКМ по игроку.
  • PlaceholderAPI и API для разработчиков.


Скриншоты
1790142804575

Окно обмена

1790142828775

История обменов​


Как проходит обмен
  1. Отправьте /trade <игрок> или нажмите ПКМ по игроку, удерживая Shift. Он принимает запрос командой /trade accept.
  2. Добавьте предметы из инвентаря. Чтобы забрать предмет обратно, нажмите на него в окне обмена.
  3. Выберите валюту и введите сумму.
  4. Проверьте предложение партнёра и нажмите «Готов». Когда подтвердят оба, начнётся короткий отсчёт, после которого обмен завершится.


Требования
  • Paper 1.21.7 или новее.
  • Java той версии, которую требует ваш Paper (минимум 21).
  • Доступ к интернету при первом запуске: Paper сам скачает нужные библиотеки.

Необязательные интеграции:
ПлагинЧто добавляет
Vault + плагин экономикиДеньги в окне обмена
PlayerPointsОбмен поинтами
FloodgateНативная форма ввода суммы для Bedrock-игроков
PlaceholderAPIПлейсхолдеры статистики и состояния игрока
Предметы и уровни опыта работают без каких-либо зависимостей.


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


Команды
КомандаОписание
/trade <игрок>Отправить запрос или принять входящий от этого игрока
/trade accept [игрок]Принять запрос
/trade deny [игрок]Отклонить запрос
/trade toggleВключить или выключить входящие запросы
/trade claimЗабрать сохранённые для вас предметы
/trade history [игрок]Своя история; для администрации — история другого игрока
/trade reloadПерезагрузить конфигурацию и переводы
Алиас: /intrade. По умолчанию запрос действует 60 секунд, задержка между запросами - 5 секунд.


ПравоПо умолчаниюДоступ
intrade.playerвсеВсе права игрока
intrade.useвсеЗапросы и /trade claim
intrade.sneakвсеЗапрос через Shift + ПКМ
intrade.toggleвсеПереключение входящих запросов
intrade.historyвсеСвоя история
intrade.currency.moneyвсеДеньги Vault
intrade.currency.experienceвсеУровни опыта
intrade.currency.playerpointsвсеПоинты PlayerPoints
intrade.adminopВсе права администрации
intrade.history.othersopЧужая история
intrade.reloadopПерезагрузка настроек
intrade.bypass.distanceopОбход ограничений расстояния и миров
intrade.bypass.cooldownopОбход задержки запросов
intrade.bypass.blockedopОбмен запрещёнными предметами
Общие узлы: intrade.*, intrade.currency.*, intrade.bypass.*.

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

YAML:
# InTrade 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 trade by default.
  # false: players need intrade.player (or individual permissions) from a permissions plugin such as LuckPerms.
  # Staff permissions are always limited to operators by default.
  open-to-everyone: true

requests:
  # Time before an unanswered request expires.
  expire-seconds: 60
  # Minimum time between two requests from the same player.
  cooldown-seconds: 5
  # Allow sending a request by sneaking and right-clicking a player.
  sneak-click: true
  # Maximum distance between players. 0 disables the check.
  max-distance: 0
  # Allow trades only between players in the same world.
  same-world: false

safety:
  # Time after any change during which the "Ready" button is locked.
  change-lock-seconds: 3
  # Time a changed or removed item stays highlighted for the partner.
  highlight-seconds: 6
  # Countdown after both players are ready. Any change stops it.
  confirm-seconds: 3

currencies:
  # Requires Vault and an economy plugin.
  money:
    enabled: true
  # Whole experience levels.
  experience:
    enabled: true
  # Requires PlayerPoints.
  playerpoints:
    enabled: true

# Materials that cannot be traded.
blocked-items: []
#  - BEDROCK
#  - BARRIER

# Worlds where trades cannot be started.
disabled-worlds: []

history:
  enabled: true
  # Trades older than this are deleted on startup. 0 keeps all trades.
  # Trade counts and the top list are not affected.
  keep-days: 90

# Changes in this section require a server restart.
storage:
  # sqlite: local file plugins/InTrade/trades.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.
  # Items in open trade windows and /trade claim mail are kept per server,
  # trade history and trade counts are shared.
  server-id: main
  mysql:
    host: localhost
    port: 3306
    database: minecraft
    user: root
    password: ""
    # Number of connections. One is used for writing, the rest for reading.
    pool-size: 4
    # Additional JDBC driver properties.
    properties:
      useSSL: false
      allowPublicKeyRetrieval: true

ПлейсхолдерЗначение
%intrade_trades%Количество завершённых обменов игрока
%intrade_trading%Находится ли игрок сейчас в обмене
%intrade_accepting%Принимает ли игрок входящие запросы
%intrade_top_<1-10>_name%Ник игрока на указанном месте топа
%intrade_top_<1-10>_trades%Количество обменов у игрока на этом месте

По умолчанию история хранится 90 дней, очистка выполняется при запуске сервера. history.keep-days: 0 отключает удаление. Счётчики обменов и топ хранятся отдельно и при очистке не сбрасываются.

SQLite работает без настройки, база лежит в plugins/InTrade/trades.db. Для MySQL или MariaDB укажите storage.type: mysql, заполните раздел storage.mysql и перезапустите сервер. Таблицы с префиксом intrade_ создаются автоматически.

Сеть серверов. Несколько серверов могут использовать одну базу с общей историей и статистикой. Каждому серверу нужен уникальный storage.server-id: незавершённые предложения и предметы для /trade claim привязаны к конкретному серверу.

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

Java:
import me.spolzer.intrade.api.InTrade;

InTrade trade = InTrade.get();
trade.tradeCount(player.getUniqueId()).thenAccept(count ->
    getLogger().info("Completed trades: " + count));

  • TradeRequestEvent и TradeStartEvent можно отменить.
  • TradeCompleteEvent содержит оба предложения.
  • TradeCancelEvent сообщает причину отмены.
  • Статистика возвращается через CompletableFuture. Для работы с Bukkit-объектами переключайтесь на основной поток сервера.

Нужен ли мод на клиенте?
Нет, плагин полностью серверный.

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

Можно ли ограничить обмен по расстоянию или мирам?
Да: max-distance, same-world и disabled-worlds.

Что будет, если игрок выйдет или умрёт во время обмена?
Обмен отменяется, а предметы возвращаются владельцам. Если что-то не помещается в инвентарь, это сохраняется для /trade claim.

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

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


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

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

Автор

InteliJIdea

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

[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
ВерхНиз