Плагин SoulAuction [2.2.0]

SoulAuction
Краткое описание:
Аукцион нового поколения
40
667
  • Лайк 0
Реакции:5 пользователей

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

Другие версии

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

2.2.0

Vault — хранилище просроченных, /ah vault, expire → vault, per-auction override Resell — /ah...

2.1.0

Рынок регионов (WorldGuard) Игроки могут выставлять свои WorldGuard-регионы на аукцион за валюту...

1.3.2

Теперь поиск сбрасывается если закрыть GUI
Смотреть еще...

Описание плагина SoulAuction:​

Один аукцион на всю сеть: несколько витрин, любая экономика, Folia и защита сделок — без fat-jar и без дюпов на клике.
SoulAuction — аукцион для Paper 1.21+ и Folia, когда экономика не должна ломаться от region-threading, а «купил два раза» на прокси — недопустимо.
1234567891011121314


Зачем админу SoulAuction:​

Несколько аукционов в одном плагине — обычный, VIP, ивентовый, «за донат-валюту». У каждого своя валюта (Vault, PlayerPoints, опыт, CoinsEngine, предметы), свои права и свои правила. Не три разных AH и не зоопарк на синхронизацию.

Folia first-class — region-aware потоки, без legacy-scheduler на горячих путях. Для сети, которая уже на Folia или переезжает, это не «nice to have», а база.

Мультисервер — общая MySQL + Redis: один каталог по сети, распределённые локи на покупку/продажу, атомарные переходы лота в БД. Pub/sub обновляет витрину; истина в SQL, не в «кто последний записал файл».

Игрокам — нормальный AH: GUI, категории, сортировки, поиск и фильтры, избранные продавцы, hub «мои лоты / claim / история». Сообщения — MiniMessage, HEX, градиенты; тексты в lang/messages_*.yml.

Экономика под контролем: налоги с продавца и покупателя, bypass/discount по пермишенам, лимиты слотов по правам, cooldown, blacklist, запрет миров, whitelist/blacklist предметов, правила под ItemsAdder / Oraxen / MMOItems. TTL лотов; если инвентарь полный — предмет уходит в claim, а не в void.

Операционка: история сделок (снимок предмета в GUI, в т.ч. custom items), audit, админ-GUI логов (игрок / id лота), purge, recover claim, Discord/Telegram на сделки — тексты в lang, async HTTP. /ah reload подхватывает конфиг и сообщения.

Для кого: Paper/Folia-сеть, несколько режимов и валют, общий аукцион между прокси, анти-дюп важнее «ещё одной кнопки в GUI`.

Сеть и анти-дюп (кратко) в SoulAuction:​

РежимНазначение
JSON / YAMLодин сервер, простой старт
SQLITE / MYSQLперсистентность; MYSQL — основа для прокси
Redis + pub/subлоки между инстансами + инвалидация кэша каталога
На прокси: MYSQL + redis.enabled. Покупка/снятие/истечение идут через claim лота (лок + Redis NX + UPDATE … WHERE status='ACTIVE'), откат при ошибке оплаты или полного инвентаря. Sell: предмет в escrow в GUI; листинг из инвентаря — strict-снятие до записи в БД (/ah sell, не дублировать клон без consume).

Что умеет SoulAuction:​

Платформа и сеть​

  • Paper 1.21+ и Folia (folia-supported: true), region-aware потоки, без legacy-scheduler на hot path.
  • Один JAR, зависимости через Paper libraries (не shade / fat-jar).
  • Мульти-аукционы в одном плагине: auctions/<id>.yml, свои права, экономика, TTL, налоги, lore.
  • Хранение лотов: JSON / YAML / SQLITE / MYSQL; HikariCP, async миграции схемы.
  • Прокси-сеть: общая MySQL + Redis (локи покупки/продажи между серверами, pub/sub инвалидация кэша).
  • Анти-дюп: in-process locks + Redis NX + атомарный UPDATE … WHERE status='ACTIVE'; откат при ошибке оплаты / полном инвентаре.
  • Sell: escrow в GUI; /ah sell — strict-снятие предмета до записи в БД.
  • /ah admin migrate — перенос данных между режимами хранения; миграция legacy layout и zAH V3.
  • Проверка обновлений (async), bStats.

Экономика и лимиты​

  • Валюты: VAULT, PLAYER_POINTS, EXPERIENCE, COINS_ENGINE, ITEM; несколько allowed-economies на аукцион.
  • Per-auction знак валюты, позиция до/после числа, MiniMessage, PlaceholderAPI в символе.
  • Налоги: FLAT / VAT / CAPITALISM; saleTaxPercent, buyTaxPercent; bypass и discount по правам.
  • Глобальные и per-auction material-rules; custom-item-rules (ItemsAdder, Oraxen, MMOItems и др.).
  • Tag-price: max-цена по NBT-тегам (глобально + tag-price-rules в аукционе).
  • Лимиты лотов: soulauction.<auctionId>.<N>, soulauction.all.<N>; override per-player через admin.
  • Slot rent: игрок платит и временно получает доп. слоты сверх лимита по правам; /ah rent, повторная покупка продлевает срок.
  • Min/max цена: глобально, per-auction, per-player permission (soulauction.price.min/max.*).
  • Cooldown на sell; blacklist продавцов; запрет миров; whitelist/blacklist материалов.
  • Оффлайн-продавец: pending money claim; LuckPerms offline для налогов/лимитов.

Витрина и GUI игрока​

  • Browser-GUI: категории, сортировки, пагинация, live TTL в lore (тик раз в секунду).
  • Поиск: в чате (/ah search), fuzzy, regex (опционально), fix раскладки, мультиязычный индекс (ru,en).
  • Фильтры: min/max цена, только избранные продавцы, только избранные лоты, фильтр по продавцу.
  • Sell-GUI: ±1 количество, добор идентичных стаков из инвентаря (полная сериализация NBT), escrow до confirm.
  • Подтверждение покупки; preview контейнеров (сундуки и т.п.).
  • Hub (gui/hub.yml): избранное, мои лоты, claim, история, vault, rent, resell — live-счётчики в lore.
  • Избранные продавцы / избранные лоты; последние сделки аукциона.
  • Мои лоты: снятие, смена цены в GUI (→ Telegram reply при включённом notify).
  • Claim просроченных/снятых; уведомление продавцу при expire (онлайн / при входе).
  • Player vault: хранилище просроченных, /ah vault, expire → vault; забрать или перевыставить.
  • Resell: /ah resell + hub (всё / vault / активные); cooldown, scope по текущему аукциону в hub.
  • История покупок/продаж со снимком предмета в GUI (custom items).
  • Per-auction listing-lore-template; filler material / CMD per-auction.
  • WorldGuard trade regions: sell/buy/open только внутри указанных регионов (per-auction).

Рынок регионов (WorldGuard)​

  • Продажа и покупка WG-регионов за валюту аукциона; отдельный GUI и команды (/ah regions, /regions, алиасы).
  • Preview региона (spectator, cooldown); телепорт после покупки (auto / по кнопке).
  • История покупок/продаж регионов; лимит лотов регионов на игрока.
  • Перехват /rg sell|cancel|my|clear при установленном WorldGuard.

Автоматизация и «оживление»​

  • Fake activity: синтетические лоты per-auction, пул ников/предметов, таймер, /ah admin fake, toggle в админ-GUI.
  • Stock-bot (stock-bot/): серверный shop (бот продаёт, пополняет stock) + instant-buy (бот скупает лоты игроков); не fake activity.

Уведомления и трансляции​

  • Announcements в чат сервера: 4 переключателя (покупка/листинг × предметы/регионы), фильтр min-price.
  • Discord webhook, embed, аватарки игроков (Minotar/Crafatar).
  • Telegram: listed / sold / expired; reply под постом при sold и смене цены; HTML parse mode.
  • chat-routing: GLOBAL — один chat-id; PER_AUCTION — telegram-chat-id в auctions/*.yml (пусто = молчит).
  • Async HTTP, шаблоны в lang/messages_*.yml, locale для notify.

Админка​

  • /ah admin GUI: список аукционов, создать аукцион (wizard), настройки per-auction, toggle fake activity.
  • Логи: по игроку, по id лота, audit, purge истории, recover claim.
  • sellfor, fake, runtime blacklist, cache stats/rebuild/invalidate.
  • parse tags|nbt — разбор предмета в руке (custom items).
  • /ah view, /ah admin selling, GUI истории с иконками предметов.

Интеграции и прочее​

  • PlaceholderAPI %soulauction_*%: счётчики лотов, claim, лимиты, статистика сделок (per-currency), сортировка/категория игрока.
  • SkinsRestorer / Mojang — головы продавцов в избранном; общий скин для fake sellers.
  • MiniMessage в lang: ru + en, multi-line сообщения в чат.
  • Алиасы команд в config (ax, auction, …); /ah reload — конфиг + lang + GUI yml.
  • Экспериментальные флаги per-auction: bids-enabled, rent-enabled (задел в конфиге).

Отображение цен (auctions/*.yml)​

У каждого аукциона свои поля (дефолты в Java, после первого старта — в plugins/SoulAuction/auctions/global.yml и др.):

ПолеНазначение
currencySymbolЗнак или иконка в GUI и чате. Пусто — формат экономики (Vault $, PlayerPoints PP, предметы Nx MATERIAL).
currencySymbolPositionBEFORE или AFTER числа ($100 или 100 ₽).
currencySymbolPlaceholderApitrue — подставить %...% из PlaceholderAPI для игрока, который видит цену (нужен PlaceholderAPI).
listingTtlSecondsСрок лота в секундах; 0 или меньше — без срока (не истекает).
world-guard-trade-regionsОграничение по WG для предметов в этом аукционе: открыть GUI, sell, buy — только стоя в одном из регионов. Пустой список [] = везде. Не рынок регионов (region-market в config.yml). Примеры ниже.
telegram-chat-idTelegram-канал только для этого аукциона, если в config.yml → notifications.telegram.chat-routing: PER_AUCTION. Пусто = этот аукцион молчит в Telegram.
override-vault-expire, expire-to-vault, vault-retention-hoursOverride хранилища для просроченных лотов этого аукциона.
tag-price-rules, tag-price-global-maxЛимиты цены по тегам предмета для этого аукциона.
Примеры world-guard-trade-regions (в auctions/<id>.yml):
YAML:
# без ограничения (по умолчанию)
world-guard-trade-regions: []

# регионы в текущем мире игрока (/rg list — id региона)
world-guard-trade-regions:
  - shop
  - market

# конкретный мир + регион
world-guard-trade-regions:
  - world:mall
  - world_nether:trade_hub
Нужен WorldGuard. Это не /ah regions — там продаются сами регионы WG как лоты.

Срок лотов (TTL) и claim​

  • Пока лот ACTIVE, в витрине и в «Мои лоты» (если срок включён) в lore: осталось / до какого времени; в открытой витрине таймер обновляется раз в секунду.
  • Истёк срок, никто не купил: лот снимается (EXPIRED), предмет один раз попадает в claim (claims.json), не в void.
  • Продавец: в чат (онлайн сразу, оффлайн при входе) — что истекло и [Забрать в меню] → /ah expired [auctionId]; выдача предметов — /ah claim (меню просроченных только показывает, слоты не редактируются).
  • Выставление: в чат несколько строк — товар, кол-во, цена, аукцион; отдельно блок про срок или «без срока» (success-listed, success-listed-expiry-timed / success-listed-expiry-unlimited в lang/messages_*.yml).
  • На одном процессе: lock на listingId + при SQL переход ACTIVE → EXPIRED/SOLD/CANCELLED атомарный; claim снимается из буфера до выдачи в инвентарь.
Примеры currencySymbol:
  • Текст: ₽, мон., алм.
  • MiniMessage / glyph: <glyph:coin> (ItemsAdder, Nexo и аналоги — по доке ресурспака)
  • PAPI (с currencySymbolPlaceholderApi: true): %img_economy%
Цена с кастомным символом показывается везде: лоты в GUI, sell-меню, фильтр цены, покупка, история, чат (success-bought, announce и т.д.).

Сообщения (plugins/SoulAuction/lang/)​

  • prefix — префикс всех строк с {prefix}.
  • Ключи — MiniMessage; {price} уже с форматом аукциона, в который смотрит игрок.
  • Несколько строк в чате: ключ как YAML-список строк — плагин шлёт каждую строку отдельным сообщением (MessageService.send). Одна строка — как раньше. Поиск в чате, успех продажи, истечение лота, usage-команды — в этом формате.
  • Плейсхолдеры lore лота в GUI: {seller}, {price}, {id}, {auction}, {expires_in}, {expires_at} (последние два — если TTL включён); опционально listingLoreTemplate в auctions/*.yml.

PlaceholderAPI для плагина SoulAuction:​

Плейсы регистрируются автоматически, если PlaceholderAPI на сервере. Идентификатор — soulauction, т.е. %soulauction_<параметр>%. Числа форматируются под локаль игрока (разделители тысяч). У любого плейсхолдера есть вариант с суффиксом _raw — значение без форматирования (1500000 вместо 1 500 000, ключ enum вместо имени из lang) для скорбордов и плагинов, которым нужно голое число.
Плейсы регистрируются автоматически, если PlaceholderAPI на сервере. Идентификатор — soulauction, т.е. %soulauction_<параметр>%. Числа форматируются под локаль игрока (разделители тысяч). У любого плейсхолдера есть вариант с суффиксом _raw — значение без форматирования (1500000 вместо 1 500 000, ключ enum вместо имени из lang) для скорбордов и плагинов, которым нужно голое число.

Счётчики​

ПлейсхолдерЗначение
%soulauction_active_count%Активные лоты игрока (алиасы: sell_count, purchasable_count)
%soulauction_expired_count%Просроченные предметы игрока (claim с причиной EXPIRED)
%soulauction_total_active_count%Все лоты на аукционе
%soulauction_sell_limit%Общий лимит лотов игрока (права + override)
%soulauction_claims%Все предметы игрока в claim
%soulauction_listings_all% / %soulauction_listings_<auctionId>%Активные лоты игрока (все / в конкретном аукционе)
%soulauction_listings_total%Все лоты (без форматирования, legacy)

Настройки игрока​

ПлейсхолдерЗначение
%soulauction_selected_sorting%Выбранная сортировка
%soulauction_selected_category%Выбранная категория
%soulauction_selected_currency%Валюта последнего открытого аукциона (currency-* из lang)
%soulauction_categories_enabled%, %soulauction_expired_items_enabled%, %soulauction_auction_listing_confirmation_enabled%Всегда true — эти системы в SoulAuction не отключаются

Статистика сделок​

Персистентная (data/stats.json), при первом запуске один раз заполняется из существующей истории. Валюта в <currency> — тип экономики: vault, player_points, experience, coins_engine, item.

ПлейсхолдерЗначение
%soulauction_items_sold%Продано предметов игроком
%soulauction_items_purchased%Куплено предметов игроком
%soulauction_money_made%Заработано игроком (после налога)
%soulauction_money_spent%Потрачено игроком (с налогом покупателя)
%soulauction_items_sold_<currency>% и аналогиТо же, по конкретной валюте
%soulauction_total_items_sold%, %soulauction_total_money_made% и т.д.Глобально по серверу, включая _<currency>

Автофейки (fake activity)​

Синтетические лоты «оживляют» витрину: случайный ник из пула, случайный предмет, случайная цена в заданном диапазоне. Это не реальные игроки — покупка проходит как у обычного лота (деньги уходят «в никуда», предмет выдаётся покупателю). После покупки фейкового лота плагин через паузу может выставить новый.

Включение per-auction​

Глобального «вкл/выкл» в config.yml нет — только per-auction:

ГдеПоле / действие
auctions/<id>.ymlfake-activity-enabled: true / false (дефолт false)
/ah admin → ПКМ по аукционунастройки аукциона
Меню → слот 22вкл/выкл (LIME_DYE / RED_DYE) → auctions/<id>.yml
Меню → слот 49пул, лимиты, тик (read-only)
Пример в auctions/global.yml:
fake-activity-enabled: true

Пул (plugins/SoulAuction/fake-activity/)​

Путь задаётся в config.yml → fake-activity.directory (дефолт fake-activity). После первого старта создаются три файла:

ФайлСодержимое
settings.ymlтаймеры, лимиты, цены по умолчанию, admin-fake
sellers.ymlсписок ников-продавцов (до 16 символов)
items.ymlпул предметов с весами и диапазонами цен
На fresh install в пул попадает ~120 ников и ~120 vanilla-предметов (руды, еда, инструменты, редкости 1.21) — править можно сразу в YAML.

settings.yml (главное)​

ПолеНазначение
initial-fill-listingsсколько лотов создать сразу при старте (0 = до max-total-listings)
initial-delay-secondsпауза перед первым tick пополнения
tick-interval-secondsкак часто добивать лоты до лимитов
after-purchase-delay-secondsпауза после покупки фейка перед новым лотом того же продавца
min-price / max-priceдефолтный диапазон, если у предмета в items.yml min/max = 0
price-variance-percentслучайный разброс ±% к выбранной цене
max-listings-per-auctionпотолок фейков на один auctionId
max-total-listingsпотолок фейков на весь сервер
listing-age-spread-secondsслучайный «возраст» лота при создании (разные таймеры TTL)
listings-per-tickсколько лотов пытаться создать за один tick
auction-idsтолько эти аукционы ([] = все с fake-activity-enabled)
admin-fake.register-sellerпосле /ah admin fake дописать ник в sellers.yml
admin-fake.register-itemпосле /ah admin fake дописать предмет из руки в items.yml

items.yml — поля записи​

  • id — имя для себя
  • material / amount — vanilla-стек (игнорируется, если задан item-base64)
  • item-base64 — полный снимок предмета (NBT, custom items)
  • min-price / max-price — 0 = из settings.yml
  • auction-ids — пусто = любой аукцион; иначе только перечисленные
  • weight — относительный шанс выбора (больше = чаще)

Ручной фейк​

/ah admin fake <ник> <auctionId> <цена>
Предмет — в главной руке. Лот создаётся сразу как synthetic. При включённых admin-fake.* ник и/или предмет дописываются в пул async.

Поведение​

  • Фейки участвуют в сортировке, поиске, фильтрах как обычные лоты.
  • Снять /ah cancel может только админ с soulauction.command.cancel.any (продавец — synthetic UUID).
  • На прокси с MySQL+Redis фейки синхронизируются как обычные listing records.

Рынок регионов (WorldGuard)​

Продажа регионов WorldGuard через ту же экономику, что и предметный аукцион: цена списывается у покупателя, владение региона передаётся через WG. Лоты регионов хранятся в общей БД/файлах листингов.

Требования​

  • WorldGuard на сервере (softdepend).
  • В config.yml → region-market.enabled: true, затем /ah reload (или рестарт).
  • У продавца регион должен быть его (owner в WG); у покупателя — деньги на выбранном аукционе.

Включение (fresh install)​

Дефолт в Java — enabled: false. После true создаётся папка plugins/SoulAuction/regions/ (служебная)

YAML:
region-market:
  enabled: true
  hide-world-name: true
  ah-subcommand-aliases: [rg]
  standalone-commands: [regions]
  allowed-auction-ids: []
ПолеНазначение
hide-world-nametrue — только id региона (shop), без world:shop.
allowed-auction-idsПусто = любой аукцион с sell в auctions/*.yml.
ah-subcommand-aliasesКороткие подкоманды /ah, напр. rg → /ah rg sell ….
standalone-commandsВерхний уровень: /regions sell …. rg не добавляй, если есть WG — их /rg; используй /ah rg или своё имя.
max-listings-per-playerЛимит лотов регионов; 0 = общие лимиты из limits.
standalone-commands — только после рестарта сервера.

Команды​

КомандаДействие
/ah regionsРынок регионов (GUI).
/ah rgТо же (алиас).
/regionsТо же (standalone).
/rg sell …То же, если WorldGuard: перехват до WG (sell, cancel, my, clear).
/ah regions sell <region> <auctionId> <price>Выставить, напр. shop global 10000.
/ah regions sellВвод в чате; отмена — cancel.
/ah regions myGUI ваших лотов («Мои регионы»).
/ah regions cancel <id>Снять лот.
/ah regions clearСброс незавершённого sell в чате.

GUI​

Layout из gui/general.yml (как предметный AH). Регионы не в обычной витрине /ah. Клик по лоту — подтверждение покупки → смена owner в WG.

Права (два слоя)​

Рынок регионов:

ПравоНазначение
soulauction.command.regionsКоманды рынка
soulauction.region.sellПродать регион
soulauction.region.buyКупить регион
Валюта аукциона (auctions/<id>.yml): soulauction.buy.global, soulauction.sell.global, …

Покупка региона = region.buy + buy.<auctionId>.
Продажа = region.sell + sell.<auctionId>.

Без LuckPerms — дефолты true в plugin.yml. С LP — выдавай ноды в группах сам.

Vault, resell, slot rent и hub​

Vault здесь — хранилище просроченных предметов, не плагин Vault (экономика).

Hub (личный кабинет)​

Кнопка в витрине аукциона → hub: избранное, мои лоты, claim, история, vault, rent, resell (три варианта). Слоты и предметы — gui/hub.yml. В lore кнопок — live-счётчики (активные, vault, claim, аренда).

Player vault (хранилище)​

Команда/ah vault
GUIgui/vault.yml
Правоsoulauction.command.vault
config.yml → vault:

ПолеНазначение
enabledвкл/выкл модуль
expire-to-vaultпросроченный лот → vault вместо claim
retention-hoursавтоудаление записей (0 = никогда)
Per-auction в auctions/<id>.yml: override-vault-expire, expire-to-vault, vault-retention-hours.

В GUI: забрать предмет или перевыставить на аукцион.

Resell (массовое перевыставление)​

Команда/ah resell — vault + активные лоты всех аукционов
Hub«Перевыставить всё» / «Из хранилища» / «Активные лоты»
Правоsoulauction.command.resell
config.yml → resell:

ПолеНазначение
enabledвкл/выкл
cooldown-secondsпауза между запусками (0 = нет)
include-vault / include-activeчто перевыставлять
hub-scope-current-auction-onlytrue — кнопки hub только для текущего аукциона; /ah resell всегда по всем

Slot rent (аренда слотов)​

Команда/ah rent
GUIgui/slot-rent.yml
Правоsoulauction.command.rent
config.yml → slot-rent:

ПолеНазначение
enabledвкл/выкл
payment-auction-idаукцион, чья экономика списывает оплату
packagesпакеты: id, слоты, цена, длительность
max-stack-hoursпотолок суммарной аренды при повторной покупке (0 = без лимита)
Доп. слоты суммируются с permission-лимитами (soulauction.global.5 и т.д.).

Tag-price (лимит по тегам предмета)​

Max-цена за единицу по NBT-тегам (ItemsAdder, Oraxen, custom items).

Глобально — config.yml → tag-price:

ПолеНазначение
enabledвкл/выкл глобальных правил
global-maxfallback, если ни одно правило не подошло (0 = только обычные limits)
by-tagсписок { tag, max } с wildcard
Per-auction — auctions/<id>.yml → tag-price-rules, tag-price-global-max. Работает, даже если глобальный tag-price.enabled: false, когда список правил не пуст.

Stock-bot (серверный бот)​

Папка plugins/SoulAuction/stock-bot/ — реальная торговля сервер ↔ игрок. Не fake activity (декоративные лоты).

ФайлНазначение
settings.ymlenabled, имя бота, таймеры shop / instant-buy
shop.ymlбот продаёт предметы на витрине, пополняет stock после покупки / expire
instant-buy.ymlбот скупает лоты игроков по правилам; деньги продавцу, предмет сгорает
Дефолт enabled: false — включай в stock-bot/settings.yml, затем /ah reload.

Путь задаётся в config.yml → stock-bot.directory (дефолт stock-bot).

Скины продавцов (config.yml → seller-skins)​

Текстуры голов продавцов в GUI «Избранные продавцы» (hub → звезда). Лоты в витрине показывают сам предмет, не голову.

SkinsRestorer — softdepend; без него на offline/cracked серверах Mojang по нику часто не сработает.

source​

ЗначениеПоведение
autoSkinsRestorer, если установлен; иначе Mojang API
skins-restorerтолько SkinsRestorer
mojangтолько Mojang (online-mode, реальные ники)
offдефолтные головы Steve/Alex, без lookup

fallback-skin и fake-seller-skin​

YAML:
seller-skins:
  source: skins-restorer
  fallback-skin: "DefaultHead"
  fake-seller-skin: "ServerLogo"

ПолеКогда
fallback-skinlookup по нику продавца не дал текстуру → SR ищет этот custom skin / nick / URL
fake-seller-skinвсе synthetic/fake продавцы получают этот скин; ник игнорируется
Значения — имена скинов из SkinsRestorer (/sr set skin ServerLogo <url> и т.п.).

Цепочка lookup (SkinsRestorer)​

  1. findOrCreateSkinData(ник) — или fake-seller-skin, если продавец synthetic и поле задано
  2. findSkinData(fallback-skin) — если указан
  3. getSkinForPlayer(uuid, nick) — SR defaultSkins из конфига SkinsRestorer
При source: mojang fallback тоже работает, но через Mojang API по имени.

Прогрев при старте​

Async prefetch в кэш SkinsRestorer (пауза ~100 ms между запросами):

  • если задан fake-seller-skin — прогревается он (+ fallback-skin, если указан);
  • иначе — все ники из пула фейков + fallback-skin.
В консоли: SkinsRestorer — prefetched X/Y fake seller skins.

Lookup при открытии GUI — async; голова обновляется, когда текстура пришла (без RAM-кеша в SoulAuction).

Админ-GUI​

/ah admin или /ah admin gui [страница] — нужен soulauction.command.admin или OP.

ДействиеРезультат
ЛКМ по аукционуоткрыть витрину как игрок
ПКМ по аукционунастройки аукциона
Слот 22вкл/выкл автофейки (краситель)
Слот 49автофейки: пул и лимиты (просмотр)
Слот 45назад в список
Книга в нижнем рядусоздать новый аукцион

Скины продавцов (config.yml → seller-skins)​

Текстуры голов продавцов в GUI «Избранные продавцы» (hub → звезда). Лоты в витрине показывают сам предмет, не голову.

SkinsRestorer — softdepend; без него на offline/cracked серверах Mojang по нику часто не сработает.

source​

ЗначениеПоведение
autoSkinsRestorer, если установлен; иначе Mojang API
skins-restorerтолько SkinsRestorer
mojangтолько Mojang (online-mode, реальные ники)
offдефолтные головы Steve/Alex, без lookup

fallback-skin и fake-seller-skin​

seller-skins:
source: skins-restorer
fallback-skin: "DefaultHead"
fake-seller-skin: "ServerLogo"

ПолеКогда
fallback-skinlookup по нику продавца не дал текстуру → SR ищет этот custom skin / nick / URL
fake-seller-skinвсе synthetic/fake продавцы получают этот скин; ник игнорируется
Значения — имена скинов из SkinsRestorer (/sr set skin ServerLogo <url> и т.п.).

Цепочка lookup (SkinsRestorer)​

  1. findOrCreateSkinData(ник) — или fake-seller-skin, если продавец synthetic и поле задано
  2. findSkinData(fallback-skin) — если указан
  3. getSkinForPlayer(uuid, nick) — SR defaultSkins из конфига SkinsRestorer
При source: mojang fallback тоже работает, но через Mojang API по имени.

Прогрев при старте​

Async prefetch в кэш SkinsRestorer (пауза ~100 ms между запросами):
  • если задан fake-seller-skin — прогревается он (+ fallback-skin, если указан);
  • иначе — все ники из пула фейков + fallback-skin.
В консоли: SkinsRestorer — prefetched X/Y fake seller skins.

Lookup при открытии GUI — async; голова обновляется, когда текстура пришла (без RAM-кеша в SoulAuction).

Команды плагина SoulAuction:​

Команды для игроков​

  • /ah — открыть аукцион по умолчанию.
  • /ah <auctionId> — открыть конкретный аукцион.
  • /ah sell <price> — выставить предмет из руки в аукцион по умолчанию.
  • /ah sell <auctionId> <price> — выставить в выбранный аукцион.
  • /ah sell <price> <auctionId> — альтернативный порядок аргументов.
  • /ah my [auctionId] — показать свои активные лоты.
  • /ah selling [auctionId] — GUI активных лотов.
  • /ah expired [auctionId] — GUI просроченных предметов (claim).
  • /ah purchased [auctionId] — GUI истории покупок.
  • /ah history [auctionId] — GUI истории продаж.
  • /ah search <текст> — поиск: закрытие GUI, запрос в чате (кнопка отмены в сообщении); после ввода — обновлённая витрина и итог в чат.
  • /ah search <auctionId> <текст> — то же в выбранном аукционе.
  • /ah search cancel — отмена поиска и возврат в аукцион.
  • /ah page <номер> [auctionId] — открыть нужную страницу аукциона.
  • /ah claim [all] — забрать просроченные/снятые предметы.
  • /ah vault — GUI хранилища просроченных предметов.
  • /ah resell — массово перевыставить из vault и/или активных лотов.
  • /ah rent — GUI аренды доп. слотов листинга.
  • /ah cancel <id> — снять свой лот и вернуть предмет.
  • Рынок регионов (WorldGuard): /ah regions, /ah rg, /regions — см. раздел «Рынок регионов».
  • Алиасы команды настраиваются в config.yml через commandAliases (например ax, auction).

Команды для админов​

  • /ah reload — перезагрузка конфигов и сообщений.
  • /ah purge <days> — очистка истории сделок старше N дней.
  • /ah admin history <player> [limit] — история игрока (в игре — GUI с иконками предметов; консоль — текст в чат).
  • /ah admin logs [страница] — GUI логов: по игроку, по id лота, последние сделки, audit.
  • /ah admin selling <player> [auctionId] — GUI активных лотов игрока.
  • /ah admin blacklist add|remove <player> — runtime blacklist продажи.
  • /ah admin recover <claimId> — выдать claim в инвентарь.
  • /ah admin audit [limit] — последние audit-записи.
  • /ah admin cache stats|rebuild|invalidate — кэш каталога.
  • /ah admin sellfor <player> <auctionId> <price> — выставить лот от имени игрока (предмет в руке).
  • /ah admin fake <ник> <auctionId> <цена> — synthetic-лот от указанного ника (предмет в руке; см. автофейки).
  • /ah admin gui [страница] — GUI списка аукционов (кнопка «Логи и история»; ПКМ по аукциону — настройки).
  • /ah admin parse tags|nbt — разбор NBT/тегов предмета в руке (custom items).
  • /ah view <player> [auctionId] — GUI лотов игрока.

Права плагина SoulAuction​

Базовые​

  • soulauction.command.ah — использовать /ah.
  • soulauction.command.sell — использовать /ah sell.
  • soulauction.command.reload — использовать /ah reload.
  • soulauction.command.admin — админ-команды и purge.
  • soulauction.priority.10 — выше приоритет в сортировке лотах (любое N).
  • soulauction.command.my — использовать /ah my.
  • soulauction.command.claim — использовать /ah claim.
  • soulauction.command.vault — /ah vault.
  • soulauction.command.resell — /ah resell.
  • soulauction.command.rent — /ah rent.
  • soulauction.command.cancel.any — снимать чужие лоты командой /ah cancel.

Рынок регионов (WorldGuard)​

  • soulauction.command.regions — /ah regions, /regions и алиасы.
  • soulauction.region.sell — выставить регион на продажу.
  • soulauction.region.buy — купить регион на рынке.
Плюс права аукциона-валюты (soulauction.buy.global, soulauction.sell.global, …) — см. раздел «Рынок регионов».

Аукцион-специфичные (задаются в auctions/*.yml)​

Для каждого аукциона есть отдельные узлы:

  • openPermission — право открыть этот аукцион.
  • buyPermission — право покупать лоты в этом аукционе.
  • sellPermission — право выставлять лоты в этот аукцион.
Пример:

  • soulauction.open.vip
  • soulauction.buy.vip
  • soulauction.sell.vip

Динамические лимиты лотов по правам​

  • soulauction.<auctionId>.1 — лимит 1 активный лот в этом аукционе.
  • soulauction.<auctionId>.5 — лимит 5 активных лотов в этом аукционе.
  • soulauction.all.1 — общий лимит 1 на все аукционы.
  • soulauction.all.5 — общий лимит 5 на все аукционы.
Если выдано несколько узлов, берётся максимальный лимит. Если узлов нет, берутся дефолты из limits.

Налоги​

  • soulauction.tax.bypass — без налога продажи и покупки.
  • soulauction.tax.discount.<процент> — скидка на налог продажи (берётся максимальная).
В auctions/*.yml: saleTaxPercent (с продавца), buyTaxPercent (с покупателя).

Границы цены​

  • Глобально: limits.minPrice, limits.maxPrice в config.yml.
  • Per-auction: minPrice, maxPrice (0 = взять глобальные).
  • Tag-price: config.yml → tag-price и auctions/<id>.yml → tag-price-rules — см. раздел «Tag-price».
  • soulauction.price.min.<цена> — минимальная цена лота для игрока.
  • soulauction.price.max.<цена> — максимальная цена лота для игрока.

Объявления на весь сервер (чат)​

В config.yml → announcements — четыре отдельных переключателя (тексты в lang/messages_*.yml):

БлокПолеСобытиеLang-ключ
itemsbroadcast-purchaseигрок купил предметannounce-item-purchase
itemsbroadcast-listingигрок выставил предметannounce-item-listing
regionsbroadcast-purchaseигрок купил регион WGregion-announce-purchase
regionsbroadcast-listingигрок выставил регионregion-announce-listing
Фильтр по цене: min-purchase-price / min-listing-price в каждом блоке (0 = все сделки).
По умолчанию: покупки включены от 5000, выставление — выключено.

Пример:
YAML:
announcements:
  items:
    broadcast-purchase: true
    broadcast-listing: true
    min-purchase-price: 5000
    min-listing-price: 0
  regions:
    broadcast-purchase: true
    broadcast-listing: false
    min-purchase-price: 10000
    min-listing-price: 0
Старые ключи announcements.enabled / min-price заменены на items.broadcast-purchase / items.min-purchase-price.

Discord и Telegram​

Уведомления не для каждого игрока — один «ящик» на сервер: staff-группа, канал сделок или (для теста) личка админа. Игроки по-прежнему видят всё в игре (/ah, сообщения, GUI).

В config.yml → секция notifications:

  • Discord: notifications.discord.enabled, webhookUrl (Incoming Webhook канала Discord).
  • События: notify-sold, notify-listed, notify-expired, фильтр min-price.
  • notifications.locale— язык шаблонов (ru, en, …); тексты в lang/messages_*.yml:
    • notify-telegram-listed, notify-telegram-sold, notify-telegram-expired
    • notify-telegram-reply-sold, notify-telegram-reply-price — reply под постом лота
    • notify-discord-title-, notify-discord-field-
  • Плейсхолдеры: {auction} — display-name из auctions/<id>.yml (не internal id), {auction_id} — id файла (global), {seller}, {buyer}, {price} (с валютой), {item} (название из lang Minecraft по notifications.locale), {amount}, {id}, {region}, {world}.
  • Telegram HTML: notifications.telegram.parse-mode: HTML (дефолт). В шаблонах — <b>, <i>, <code>. Пустая строка: " " в YAML-списке. Редактируй lang/messages_*.yml → /ah reload.
  • Отправка асинхронная (Java HTTP), без бота на сервере Minecraft.
  • Аватарки в Discord: notifications.discord.show-player-avatars. CDN: avatar-provider = MINOTAR или CRAFATAR.
После /ah reload подхватываются URL, флаги и шаблоны из lang.

Telegram — пошагово​

Два поля, не путать:

ПолеЧто это
bot-tokenКто шлёт — токен бота из @BotFather. Не @username бота.
chat-idКуда шлёт при chat-routing: GLOBAL — канал, группа staff или личка. Не id игрока в Minecraft.
chat-routingGLOBAL (дефолт) — один chat-id на все аукционы; PER_AUCTION — id из auctions/<id>.yml → telegram-chat-id
reply-to-listingreply под постом лота при продаже и смене цены (нужен notify-listed)
notify-price-changedreply при смене цены владельцем
PER_AUCTION: заполни telegram-chat-id только в нужных auctions/*.yml. Пустое поле = этот аукцион молчит в Telegram. Пример: только регионы в канал — id только в auctions/regions.yml, остальные не трогай. Discord не затронут.

Рекомендуется: канал или группа, не личка — иначе каждая продажа сыпется тебе в ЛС.

1. Бот (@BotFather)
/newbot → имя → username → скопируй token → bot-token в config.

2. Куда слать (выбери один вариант)

Канал (лучше для сервера)


  1. Создай канал.
  2. Добавь бота администратором с правом публиковать сообщения.
Публичный канал (есть ссылка t.me/… и @username):

Приватный канал (без @username, только по invite-ссылке):

  • @имяне работает — только числовой id
  • Опубликуй в канале пост после того, как бот стал админом (хоть «test»)
  • Открой https://api.telegram.org/bot<token>/getUpdates → "chat":{"id":-1001234567890,"type":"channel"}
  • chat-id: "-1001234567890" — с минусом, в кавычках
  • Пустой result → обнови страницу после поста; forward боту id канала не даёт
  • Лайфхак: временно сделай канал публичным → возьми id → снова приватный (id не меняется)
Группа staff

  1. Создай группу, добавь бота.
  2. Напиши в группе любое сообщение.
  3. getUpdates → chat.id (обычно -100…) → chat-id: "-1001234567890".
  4. Если бот не видит сообщения: @BotFather → /setprivacy → Disable для бота.
Личка (только тест / один владелец)

  1. Напиши боту /start.
  2. getUpdates → "chat":{"id": 2050059107} → chat-id: "2050059107".
  3. Или @userinfobot → твой Id.
    Не используй для продакшена с notify-listed: true — заспамит ЛС.
3. Config (примеры)

Публичный канал:
YAML:
  telegram:
    enabled: true
    bot-token: "123456:ABC..."
    chat-id: "@soul_auction_deals"
Приватный канал:
YAML:
  telegram:
    enabled: true
    bot-token: "123456:ABC..."
    chat-id: "-1001234567890"
Полный блок (GLOBAL):
YAML:
notifications:
  locale: ru
  notify-listed: true
  notify-sold: true
  notify-expired: false
  min-price: 5000
  telegram:
    enabled: true
    chat-routing: GLOBAL
    bot-token: "123456:ABC..."
    chat-id: "-1001234567890"
    reply-to-listing: true
    notify-price-changed: true

Per-auction (только выбранные аукционы):​

YAML:
  telegram:
    enabled: true
    chat-routing: PER_AUCTION
    bot-token: "123456:ABC..."
YAML:
# auctions/regions.yml
telegram-chat-id: "@regions_deals"
4. /ah reload → выставь/купи лот для проверки.
Ошибки → консоль сервера: Telegram notify failed / External notify HTTP ….

Не нужен Telegram → telegram.enabled: false.

Установка плагина SoulAuction:​

Требования​

  • Paper 1.21+ или Folia (поддерживается из коробки)
  • Плагин экономики— в зависимости от того, что указано в аукционе:
    • Vault + провайдер денег (EssentialsX, CMI и т.п.) — основной вариант
    • PlayerPoints — если аукцион на поинты
    • CoinsEngine — если аукцион на кастомную валюту CE
    • EXPERIENCE / ITEM — без отдельного плагина экономики (уровни / предметы)
Опционально: PlaceholderAPI, WorldGuard (рынок регионов), SkinsRestorer, MySQL + Redis (сеть прокси).

Установка (один сервер)​

  1. Скачай SoulAuction-2.2.0.jar (или актуальную версию).
  2. Останови сервер.
  3. Положи .jar в папку /plugins/.
  4. Запусти сервер.
  5. Дождись первого старта — создастся папка plugins/SoulAuction/ с конфигами, auctions/, lang/, gui/ и т.д.
  6. Проверь в игре: /ah — должна открыться витрина.
  7. При необходимости отредактируй plugins/SoulAuction/config.yml и plugins/SoulAuction/auctions/global.yml, затем /ah reload.

Первый запуск — что появится​

ПутьНазначение
config.ymlБД, лимиты, vault, resell, Telegram, …
auctions/global.ymlпервый аукцион (валюта, права, TTL)
gui/*.ymllayout меню
lang/messages_ru.ymlтексты игрокам
Дефолтная экономика аукциона — Vault. Если Vault нет, смени economy в auctions/global.yml или поставь Vault + EssentialsX.

Сеть прокси (несколько серверов)​

  1. В config.ymlна всех инстансах:
    • storage.type: MYSQL + доступ к одной БД
    • redis.enabled: true + один Redis
  2. Перезапуск или /ah reload после правок.
  3. На каждом сервере — тот же JAR и согласованный конфиг БД/Redis.

Обновление​

  1. Останови сервер (или /ah reload только для конфигов/lang — JAR меняется при остановке).
  2. Замени старый .jar в /plugins/.
  3. Запусти сервер — новые ключи конфига допишутся сами при merge.

Автор

bobobo

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

Upgradeable Spawners
Upgradeable Spawners
Улучшения спавнера, лимиты, стакование сущностей, мясник, магазин сущностей
Executable Items PREMIUM
Executable Items PREMIUM
Кастомные предметы ✨ Поддержка Custom Craft ✅ Более 30 различных триггеров ⭐ Бесконечные возможности
⭐ ExecutableEvents ⭐ PREMIUM
⭐ ExecutableEvents ⭐ PREMIUM
Инструмент, позволяющий настраивать события, происходящие на вашем сервере.
ExecutableCrafting Premium
ExecutableCrafting Premium
Кастомный крафт — ультимативная система кастомных рецептов для серверов Minecraft!
Executable Blocks ⭐ PREMIUM
Executable Blocks ⭐ PREMIUM
Кастомные блоки, кастомные триггеры, создавайте эпические блоки! Поддерживает ItemsAdder, Oraxen!
Executable Levers
Executable Levers
Размещайте масштабируемые рычаги и настраивайте их триггеры
SCore
SCore
Библиотека для плагинов от Ssomar
⚡ X PRIVATE MINES ⚡ [1.13 - 26.X] ⭐#1 MINES PLUGIN ⭐Lag-Free & Feature-Packed ⭐
⚡ X PRIVATE MINES ⚡ [1.13 - 26.X] ⭐#1 MINES PLUGIN ⭐Lag-Free & Feature-Packed ⭐
Масштаб. Оптимизация. Функции. — Полный контроль над приватными шахтами.
GWarpPro
GWarpPro
✨ Создавайте продвинутые варпы, дома и спавны с помощью многочисленных функций телепортации ✨
GPet ⭐ Modern & Advanced Pet Plugin - [1.20 - 26.2] ✨
GPet ⭐ Modern & Advanced Pet Plugin - [1.20 - 26.2] ✨
✨ Заведи себе милых маленьких питомцев! ✨
ВерхНиз