- Для версий
- 1.21.✘
- 26.✘
Описание плагина SoulAuction:
Один аукцион на всю сеть: несколько витрин, любая экономика, Folia и защита сделок — без fat-jar и без дюпов на клике.SoulAuction — аукцион для Paper 1.21+ и Folia, когда экономика не должна ломаться от region-threading, а «купил два раза» на прокси — недопустимо.
Зачем админу 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 | локи между инстансами + инвалидация кэша каталога |
Что умеет 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). |
| currencySymbolPosition | BEFORE или AFTER числа ($100 или 100 ₽). |
| currencySymbolPlaceholderApi | true — подставить %...% из PlaceholderAPI для игрока, который видит цену (нужен PlaceholderAPI). |
| listingTtlSeconds | Срок лота в секундах; 0 или меньше — без срока (не истекает). |
| world-guard-trade-regions | Ограничение по WG для предметов в этом аукционе: открыть GUI, sell, buy — только стоя в одном из регионов. Пустой список [] = везде. Не рынок регионов (region-market в config.yml). Примеры ниже. |
| telegram-chat-id | Telegram-канал только для этого аукциона, если в config.yml → notifications.telegram.chat-routing: PER_AUCTION. Пусто = этот аукцион молчит в Telegram. |
| override-vault-expire, expire-to-vault, vault-retention-hours | Override хранилища для просроченных лотов этого аукциона. |
| tag-price-rules, tag-price-global-max | Лимиты цены по тегам предмета для этого аукциона. |
YAML:
# без ограничения (по умолчанию)
world-guard-trade-regions: []
# регионы в текущем мире игрока (/rg list — id региона)
world-guard-trade-regions:
- shop
- market
# конкретный мир + регион
world-guard-trade-regions:
- world:mall
- world_nether:trade_hubСрок лотов (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 снимается из буфера до выдачи в инвентарь.
- Текст: ₽, мон., алм.
- MiniMessage / glyph: <glyph:coin> (ItemsAdder, Nexo и аналоги — по доке ресурспака)
- PAPI (с currencySymbolPlaceholderApi: true): %img_economy%
Сообщения (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>.yml | fake-activity-enabled: true / false (дефолт false) |
| /ah admin → ПКМ по аукциону | настройки аукциона |
| Меню → слот 22 | вкл/выкл (LIME_DYE / RED_DYE) → auctions/<id>.yml |
| Меню → слот 49 | пул, лимиты, тик (read-only) |
fake-activity-enabled: trueПул (plugins/SoulAuction/fake-activity/)
Путь задаётся в config.yml → fake-activity.directory (дефолт fake-activity). После первого старта создаются три файла:| Файл | Содержимое |
|---|---|
| settings.yml | таймеры, лимиты, цены по умолчанию, admin-fake |
| sellers.yml | список ников-продавцов (до 16 символов) |
| items.yml | пул предметов с весами и диапазонами цен |
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-name | true — только 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. |
Команды
| Команда | Действие |
|---|---|
| /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 my | GUI ваших лотов («Мои регионы»). |
| /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 | Купить регион |
Покупка региона = 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 |
| GUI | gui/vault.yml |
| Право | soulauction.command.vault |
| Поле | Назначение |
|---|---|
| enabled | вкл/выкл модуль |
| expire-to-vault | просроченный лот → vault вместо claim |
| retention-hours | автоудаление записей (0 = никогда) |
В GUI: забрать предмет или перевыставить на аукцион.
Resell (массовое перевыставление)
| Команда | /ah resell — vault + активные лоты всех аукционов |
| Hub | «Перевыставить всё» / «Из хранилища» / «Активные лоты» |
| Право | soulauction.command.resell |
| Поле | Назначение |
|---|---|
| enabled | вкл/выкл |
| cooldown-seconds | пауза между запусками (0 = нет) |
| include-vault / include-active | что перевыставлять |
| hub-scope-current-auction-only | true — кнопки hub только для текущего аукциона; /ah resell всегда по всем |
Slot rent (аренда слотов)
| Команда | /ah rent |
| GUI | gui/slot-rent.yml |
| Право | soulauction.command.rent |
| Поле | Назначение |
|---|---|
| enabled | вкл/выкл |
| payment-auction-id | аукцион, чья экономика списывает оплату |
| packages | пакеты: id, слоты, цена, длительность |
| max-stack-hours | потолок суммарной аренды при повторной покупке (0 = без лимита) |
Tag-price (лимит по тегам предмета)
Max-цена за единицу по NBT-тегам (ItemsAdder, Oraxen, custom items).Глобально — config.yml → tag-price:
| Поле | Назначение |
|---|---|
| enabled | вкл/выкл глобальных правил |
| global-max | fallback, если ни одно правило не подошло (0 = только обычные limits) |
| by-tag | список { tag, max } с wildcard |
Stock-bot (серверный бот)
Папка plugins/SoulAuction/stock-bot/ — реальная торговля сервер ↔ игрок. Не fake activity (декоративные лоты).| Файл | Назначение |
|---|---|
| settings.yml | enabled, имя бота, таймеры shop / instant-buy |
| shop.yml | бот продаёт предметы на витрине, пополняет stock после покупки / expire |
| instant-buy.yml | бот скупает лоты игроков по правилам; деньги продавцу, предмет сгорает |
Путь задаётся в config.yml → stock-bot.directory (дефолт stock-bot).
Скины продавцов (config.yml → seller-skins)
Текстуры голов продавцов в GUI «Избранные продавцы» (hub → звезда). Лоты в витрине показывают сам предмет, не голову.SkinsRestorer — softdepend; без него на offline/cracked серверах Mojang по нику часто не сработает.
source
| Значение | Поведение |
|---|---|
| auto | SkinsRestorer, если установлен; иначе 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-skin | lookup по нику продавца не дал текстуру → SR ищет этот custom skin / nick / URL |
| fake-seller-skin | все synthetic/fake продавцы получают этот скин; ник игнорируется |
Цепочка lookup (SkinsRestorer)
- findOrCreateSkinData(ник) — или fake-seller-skin, если продавец synthetic и поле задано
- findSkinData(fallback-skin) — если указан
- getSkinForPlayer(uuid, nick) — SR defaultSkins из конфига SkinsRestorer
Прогрев при старте
Async prefetch в кэш SkinsRestorer (пауза ~100 ms между запросами):- если задан fake-seller-skin — прогревается он (+ fallback-skin, если указан);
- иначе — все ники из пула фейков + fallback-skin.
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
| Значение | Поведение |
|---|---|
| auto | SkinsRestorer, если установлен; иначе 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-skin | lookup по нику продавца не дал текстуру → SR ищет этот custom skin / nick / URL |
| fake-seller-skin | все synthetic/fake продавцы получают этот скин; ник игнорируется |
Цепочка lookup (SkinsRestorer)
- findOrCreateSkinData(ник) — или fake-seller-skin, если продавец synthetic и поле задано
- findSkinData(fallback-skin) — если указан
- getSkinForPlayer(uuid, nick) — SR defaultSkins из конфига SkinsRestorer
Прогрев при старте
Async prefetch в кэш SkinsRestorer (пауза ~100 ms между запросами):- если задан fake-seller-skin — прогревается он (+ fallback-skin, если указан);
- иначе — все ники из пула фейков + fallback-skin.
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 — купить регион на рынке.
Аукцион-специфичные (задаются в 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 на все аукционы.
Налоги
- soulauction.tax.bypass — без налога продажи и покупки.
- soulauction.tax.discount.<процент> — скидка на налог продажи (берётся максимальная).
Границы цены
- Глобально: 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-ключ |
|---|---|---|---|
| items | broadcast-purchase | игрок купил предмет | announce-item-purchase |
| items | broadcast-listing | игрок выставил предмет | announce-item-listing |
| regions | broadcast-purchase | игрок купил регион WG | region-announce-purchase |
| regions | broadcast-listing | игрок выставил регион | region-announce-listing |
По умолчанию: покупки включены от 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: 0Discord и 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.
Telegram — пошагово
Два поля, не путать:| Поле | Что это |
|---|---|
| bot-token | Кто шлёт — токен бота из @BotFather. Не @username бота. |
| chat-id | Куда шлёт при chat-routing: GLOBAL — канал, группа staff или личка. Не id игрока в Minecraft. |
| chat-routing | GLOBAL (дефолт) — один chat-id на все аукционы; PER_AUCTION — id из auctions/<id>.yml → telegram-chat-id |
| reply-to-listing | reply под постом лота при продаже и смене цены (нужен notify-listed) |
| notify-price-changed | reply при смене цены владельцем |
Рекомендуется: канал или группа, не личка — иначе каждая продажа сыпется тебе в ЛС.
1. Бот (@BotFather)
/newbot → имя → username → скопируй token → bot-token в config.
2. Куда слать (выбери один вариант)
Канал (лучше для сервера)
- Создай канал.
- Добавь бота администратором с правом публиковать сообщения.
- chat-id: "@имя_канала" — только @…, без Telegram – a new era of messaging
- или числовой id -100… (см. ниже)
- @имяне работает — только числовой id
- Опубликуй в канале пост после того, как бот стал админом (хоть «test»)
- Открой https://api.telegram.org/bot<token>/getUpdates → "chat":{"id":-1001234567890,"type":"channel"}
- chat-id: "-1001234567890" — с минусом, в кавычках
- Пустой result → обнови страницу после поста; forward боту id канала не даёт
- Лайфхак: временно сделай канал публичным → возьми id → снова приватный (id не меняется)
- Создай группу, добавь бота.
- Напиши в группе любое сообщение.
- getUpdates → chat.id (обычно -100…) → chat-id: "-1001234567890".
- Если бот не видит сообщения: @BotFather → /setprivacy → Disable для бота.
- Напиши боту /start.
- getUpdates → "chat":{"id": 2050059107} → chat-id: "2050059107".
- Или @userinfobot → твой Id.
Не используй для продакшена с notify-listed: true — заспамит ЛС.
Публичный канал:
YAML:
telegram:
enabled: true
bot-token: "123456:ABC..."
chat-id: "@soul_auction_deals" YAML:
telegram:
enabled: true
bot-token: "123456:ABC..."
chat-id: "-1001234567890" 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: truePer-auction (только выбранные аукционы):
YAML:
telegram:
enabled: true
chat-routing: PER_AUCTION
bot-token: "123456:ABC..." YAML:
# auctions/regions.yml
telegram-chat-id: "@regions_deals"Ошибки → консоль сервера: Telegram notify failed / External notify HTTP ….
Не нужен Telegram → telegram.enabled: false.
Установка плагина SoulAuction:
Требования
- Paper 1.21+ или Folia (поддерживается из коробки)
- Плагин экономики— в зависимости от того, что указано в аукционе:
- Vault + провайдер денег (EssentialsX, CMI и т.п.) — основной вариант
- PlayerPoints — если аукцион на поинты
- CoinsEngine — если аукцион на кастомную валюту CE
- EXPERIENCE / ITEM — без отдельного плагина экономики (уровни / предметы)
Установка (один сервер)
- Скачай SoulAuction-2.2.0.jar (или актуальную версию).
- Останови сервер.
- Положи .jar в папку /plugins/.
- Запусти сервер.
- Дождись первого старта — создастся папка plugins/SoulAuction/ с конфигами, auctions/, lang/, gui/ и т.д.
- Проверь в игре: /ah — должна открыться витрина.
- При необходимости отредактируй plugins/SoulAuction/config.yml и plugins/SoulAuction/auctions/global.yml, затем /ah reload.
Первый запуск — что появится
| Путь | Назначение |
|---|---|
| config.yml | БД, лимиты, vault, resell, Telegram, … |
| auctions/global.yml | первый аукцион (валюта, права, TTL) |
| gui/*.yml | layout меню |
| lang/messages_ru.yml | тексты игрокам |
Сеть прокси (несколько серверов)
- В config.ymlна всех инстансах:
- storage.type: MYSQL + доступ к одной БД
- redis.enabled: true + один Redis
- Перезапуск или /ah reload после правок.
- На каждом сервере — тот же JAR и согласованный конфиг БД/Redis.
Обновление
- Останови сервер (или /ah reload только для конфигов/lang — JAR меняется при остановке).
- Замени старый .jar в /plugins/.
- Запусти сервер — новые ключи конфига допишутся сами при merge.













