AutoMessage [1.21]
⚡ AutoMessage — высокопроизводительный плагин для полностью настраиваемых автоматических сообщений по всему серверу.
- Загрузчики
- FabricForgePaperPurpur
- Скачиваний на Modrinth
- 12,7 тыс.
- Подписчиков на Modrinth
- 45
- версий
- 17
- Обновлён
- 11 октября 202611 окт.
- Опубликован
- в 2023
Коротко о моде
Автор не указал, где нужен мод
Не очередной чат-ротатор. Полноценный движок объявлений.
Адресные, локализованные и привязанные к событиям рассылки для современных серверов и сетей Minecraft.
6 платформ · 8 способов показа · 8 правил аудитории · 3 триггера событий · 3 языка из коробки · один рендер на язык · без базы данных
🧭 Зачем нужен AutoMessage | ⚙️ Установка и настройка |
📣 Рассылки должны привлекать внимание
Игроки привыкают игнорировать объявления, когда каждое сообщение приходит всем подряд. AutoMessage делает общение сервера осознанным: у каждого потока своё расписание, каждое сообщение само выбирает аудиторию, а текст приходит на том языке, на котором игрок действительно играет — из одного общего ядра, работающего на Bukkit, Folia, Sponge, Velocity, Fabric и Minestom.
Один набор объявлений в игре на одном сервере: отсчёт в боссбаре, полноэкранный титул и строка чата.
Полное объявление, от начала до конца
Поприветствуй вернувшихся ветеранов через три секунды после входа — не по таймеру, не новичков и на их родном языке. Всё это описывают два файла:
# scheduledMessages.yml - кто получает и когда
messages:
- name: welcome-back
trigger:
type: JOIN
delay: 3s
rules:
- type: PLAYTIME
min: 10h# lang/en.yml - что говорится
announcements:
welcome-back:
- chat: "<gray>Welcome back, <aqua>{PLAYER}<gray>."
sound: "entity.player.levelup MASTER 1.0 1.2"И вот что сервер делает с ними:
Это весь набор функций в миниатюре: событие вместо часов, аудитория вместо всех и текст, который живёт рядом со всеми остальными переводами.
⚖️ Больше, чем ротация списка
Слоган — не маркетинг. Ротатор отвечает на один вопрос — что мне сказать дальше? — и отправляет ответ всем, на одном языке, по одним часам.
| Обычный ротатор | AutoMessage | |
|---|---|---|
| Кто получает | Все онлайн | Права, группа, мир, число онлайн, время игры — комбинируются через ANY_OF, NONE_OF, NOT |
| Когда срабатывает | Один глобальный интервал | Расписание для каждого канала плюс триггеры JOIN, FIRST_JOIN и перезаряжаемый PLAYER_COUNT |
| Как выглядит | Строка чата | Чат, экшенбар, титул, субтитул, боссбар и звук, объединённые в одно объявление |
| Что говорит | Один текст для всех | Родной язык игрока с запасным вариантом для каждого сообщения |
| Где работает | Один тип сервера | Bukkit, Folia, Sponge, Velocity, Fabric и Minestom, каждый — нативный артефакт |
Детали под капотом
🔀 Четыре стратегии ротацииSHUFFLE, SEQUENTIAL, RANDOM или взвешенная — выбирается для каждого канала. Shuffle раздаёт всю колоду, прежде чем что-то повторится. | 🧩 Конфигурация под среду выполнения Прокси никогда не видит правило мира или триггер первого входа. Опции, которые платформа не может выполнить, не пишутся в файл, а не пишутся и игнорируются. | 👁 Предпросмотр перед публикацией `/automessage view ` показывает настоящее локализованное сообщение только тебе, игнорируя правила аудитории. |
| ↗ За пределами сервера Зеркалирование содержимого чата в вебхук Discord с удалением плейсхолдеров только для игроков и отключёнными автоматическими упоминаниями. | ♻ Перезагрузка, а не рестарт/automessage reload применяет расписания, сообщения и языки на месте — включая файл перевода, добавленный во время работы сервера. | 🪶 Лёгкий путь отправки Без базы данных. Пустой сервер завершается досрочно, плейсхолдеры сканируются один раз на сообщение, а не один раз на объявление, и все, читающие один и тот же текст на одном языке, обслуживаются одним рендером. |
🎯 Охватите именно тех, кто должен это услышать
Правила комбинируются. Каждое правило верхнего уровня должно пройти, а ANY_OF, NONE_OF и NOT вкладываются внутрь них, когда аудитории нужно больше, чем просто И.
Те же правила применяются к сообщению, отправленному по событию, поэтому приветствие при входе, ограниченное разрешением, никогда не дойдёт до того, у кого его нет, просто потому что он зашёл на сервер.
⚡ Срабатывай по событию, а не по таймеру
Сообщение с триггером полностью покидает ротацию своего канала и ждёт, пока что-то произойдёт.
PLAYER_COUNT стоит прочитать дважды: он срабатывает один раз при росте и перезаряжается только после того, как сервер опустится ниже порога, так что население, колеблющееся на границе, не объявляет одну и ту же веху каждый раз, когда кто-то заходит.
🪶 Почти ничего не стоит вашему серверу
Форматирование — самая дорогая часть объявления. Цвета, градиенты, текст при наведении и плейсхолдеры — всё это нужно разобрать, прежде чем хоть один символ дойдёт до кого-либо, и очевидный способ сделать это — по разу для каждого игрока, который его получает. Пятьсот игроков онлайн означают, что одно и то же предложение собирается пятьсот раз, чтобы сказать одну вещь, в главном потоке, пока остальной тик ждёт своей очереди.
AutoMessage собирает его один раз на язык и передаёт готовый результат всем, кто его читает.
| Форматирование на игрока | AutoMessage | |
|---|---|---|
| Разборов на объявление | Один на игрока, то есть 500 | Один на язык, который действительно читают |
| Время в главном потоке | 5.16 мс | 0.34 мс |
| Доля от тика в 50 мс | ~10%, каждое объявление | ~0.7% |
Это в 15 раз меньше времени главного потока на объявление, измерено на реальном пути отправки при 500 зрителях онлайн — а не на микробенчмарке одной функции. Остаётся лишь передать готовый текст каждому соединению, чего не избежать ни одному плагину.
Экономия растёт с количеством игроков, и настройка ничего вам не стоит: нет кэша, который нужно подбирать по размеру, нет параметра для тюнинга и не нужно ни от чего отказываться.
Он никогда не меняет корректность на скорость. Сообщение, которое читается по-разному для каждого игрока — называющее {PLAYER} или содержащее любой токен PlaceholderAPI — всё равно собирается для каждого из них, потому что только расширение за этим токеном знает, увидят ли два игрока одно и то же. Группировка применяется ровно там, где текст действительно идентичен, и нигде больше.
Ещё три места, где путь отправки отказывается делать лишнюю работу:
- Плейсхолдеры сканируются один раз на сообщение, а не один раз на объявление. Какие токены содержит сообщение, определяется текстом, поэтому это вычисляется при чтении файлов и запоминается до перезагрузки — вместо того чтобы выводиться заново каждый раз, когда срабатывает канал.
- Пустой сервер замыкается накоротко. Никого онлайн — значит, никакого выбора, никакого форматирования и никакой работы.
- Ничто не трогает диск во время объявления. Ни базы данных, ни записей игроков, ни I/O на горячем пути.
🌐 Один движок. Шесть сред выполнения
AutoMessage использует общее платформенно-нейтральное ядро и небольшой адаптер среды выполнения для каждого типа сервера. Это значит, что поведение остаётся привычным, а планирование, зрители, права и хуки жизненного цикла остаются нативными для нижележащей платформы.
| Артефакт | Среда выполнения | Поддерживаемая линейка | Java | Примечания по платформе |
|---|---|---|---|---|
| Bukkit | Spigot, Paper, Purpur и другие серверы на базе Bukkit | Minecraft 1.21–26.2 | 21+ | Полный набор функций; опциональная интеграция с PlaceholderAPI |
| Folia | Folia | Minecraft 1.21–26.2 | 21+ | Отдельное региональное планирование; опциональная интеграция с PlaceholderAPI |
| Sponge | Sponge API 17 | Minecraft 1.21.10 | 21+ | Полный набор функций, кроме PlaceholderAPI |
| Velocity | Прокси Velocity 3.5.1 | Среда выполнения прокси | 21+ | Нет мира, времени игры, первого входа и возможностей PlaceholderAPI |
| Fabric | Выделенный сервер Fabric | Minecraft 1.21.11 | 21+ | Серверный мод; требуется Fabric API; нет PlaceholderAPI |
| Minestom | Встроенная библиотека Minestom | Протокол 1.21.11 | 25+ | Библиотека в classpath; нет мира, времени игры, первого входа и PlaceholderAPI; правила прав/групп требуют вашего колбэка |
[!NOTE] Java 21 — это минимальная версия байткода для плагинов, а не обещание, что каждая версия сервера Minecraft работает на Java 21. Используйте JVM, требуемую вашим сервером; сам Minestom требует Java 25.
Каждый артефакт создаёт конфигурацию с учётом платформы. Опции, которые среда выполнения не может соблюсти, опускаются, а не генерируются и молча игнорируются.
А как же Quilt?
Отдельного артефакта для Quilt нет. Quilt умеет читать метаданные Fabric, но эта ветка не заявляет протестированную версию Quilt. Считайте jar-файл Fabric на Quilt экспериментальным и принесите совместимый Fabric API сами.
🗂 Модель конфигурации
AutoMessage разделяет когда, кто и что. Добавление языка никогда не требует копирования правил планирования, а изменение интервала канала никогда не затрагивает текст сообщения.
flowchart LR
schedule["config.yml<br/>КОГДА<br/>каналы · периоды · селекторы"]
audience["scheduledMessages.yml<br/>КТО<br/>правила · веса · триггеры"]
content["lang/*.yml<br/>ЧТО<br/>локализованные уведомления MiniMessage"]
minecraft["Minecraft<br/>ВЫВОД ИГРОКУ"]
discord["discordWebhook.yml<br/>ОПЦИОНАЛЬНОЕ ЗЕРКАЛО"]
schedule --> audience --> content --> minecraft
content -. "текст чата" .-> discord
classDef config fill:#11182d,stroke:#8b7cf6,color:#eef0ff,stroke-width:1px;
classDef output fill:#0d2028,stroke:#45d7e8,color:#ecfeff,stroke-width:1px;
class schedule,audience,content config;
class minecraft,discord output;| Файл | Ответственность |
|---|---|
config.yml | Главный переключатель, язык по умолчанию, каналы, задержки запуска, периоды и селекторы |
scheduledMessages.yml | Названия сообщений, привязка к каналам, веса, правила аудитории и триггеры событий |
`lang/.yml` | Локализованные ответы команд и сами полезные нагрузки объявлений MiniMessage |
discordWebhook.yml | Опциональный вебхук Discord, отображаемое имя и аватар |
📥 Get AutoMessage
| Что нужно | Где взять |
|---|---|
| Актуальная публичная сборка Bukkit | Modrinth · SpigotMC · Hangar |
| История релизов и списки изменений | GitHub Releases |
| Мультиплатформенные артефакты из этой ветки | Собрать все шесть из исходников |
[!IMPORTANT] Статус релиза: этот README описывает локальную мультиплатформенную ветку. Текущие публичные страницы всё ещё относятся к прежней линейке релизов, ориентированной на Bukkit. Пока новый релиз на GitHub не опубликует все шесть артефактов, собирайте мультиплатформенные jar-файлы командой
./gradlew dist.
🚀 Быстрый старт
- Возьмите артефакт, собранный под вашу среду выполнения. Jar-файлы для платформ намеренно разделены.
- Положите его в директорию
plugins/илиmods/вашей платформы. Для Minestom добавьте jar в classpath приложения и используйте билдер, показанный ниже. - Запустите сервер один раз. AutoMessage создаст размеченную конфигурацию и рабочие примеры объявлений.
- Отредактируйте
config.yml,scheduledMessages.ymlи файлы внутриlang/. - Выполните
/automessage reload, затем проверьте сообщение командой `/automessage view `.
[!TIP] Начните с созданных файлов. Это не пустые шаблоны: каждое доступное поле объяснено рядом с рабочим примером, а содержимое подстраивается под платформу, которая их создала.
🛠 Создайте своё первое объявление
Пример ниже создаёт независимый поток событий, добавляет в него одно объявление и отображает несколько типов уведомлений из одной локализованной нагрузки.
1. Запланируйте поток
# config.yml
enabled: true
fallbackLanguage: en
channels:
- name: default
enabled: true
initialDelay: 1m
period: 5m
selector: SHUFFLE
- name: events
enabled: true
initialDelay: 30s
period: 15m
selector: SEQUENTIAL2. Зарегистрируйте объявление
# scheduledMessages.yml
messages:
- name: event-night
channel: events3. Продумайте, что увидят игроки
# lang/en.yml
announcements:
event-night:
- chat:
- "<dark_gray>[<gold>EVENT<dark_gray>] <gray>The arena opens in <gold>5 minutes<gray>."
- "<gray>Click <click:run_command:'/warp arena'><hover:show_text:'<yellow>Teleport'><aqua><u>here</u></aqua></hover></click> to join."
actionbar: "<yellow>Prepare your loadout - the event starts soon"
title: "<gradient:#ffd166:#ff6b6b><bold>EVENT NIGHT</bold></gradient>"
subtitle: "<gray>The arena opens in 05:00"
times: "500ms 3s 500ms"
bossbar:
message: "<light_purple>Event countdown"
duration: 10s
color: PURPLE
overlay: PROGRESS
progress: 0.75
sound: "block.note_block.pling MASTER 1.0 1.0"
Используйте только те части, которые подходят сообщению. Простое объявление в чате может быть одной строкой; демонстрационное объявление может сочетать все поверхности выше.
📖 Справочник
Каналы объявлений и селекторы
У каждого канала своё расписание и независимое состояние селектора:
channels:
- name: tips
enabled: true
initialDelay: 1m
period: 5m
selector: SHUFFLE
- name: promotions
enabled: true
initialDelay: 2m
period: 20m
selector: WEIGHTED| Селектор | Поведение |
|---|---|
SHUFFLE | Перемешивает порядок и показывает каждое сообщение по разу, прежде чем что-то повторится |
SEQUENTIAL | Идёт строго по настроенному списку |
RANDOM | Выбирает независимо; одно и то же сообщение может выпасть два раза подряд |
WEIGHTED | Выбирает случайно пропорционально weight каждого сообщения |
SEQUENTIAL и SHUFFLE сохраняют свою позицию при обычной перезагрузке конфигурации. Вес 0 закрепляет сообщение только в канале WEIGHTED; остальные селекторы веса не учитывают.
Правила аудитории
Правила верхнего уровня работают как логическое И. Вкладывай ANY_OF, NONE_OF и NOT, когда аудитории нужна более выразительная логика.
| Правило | Совпадение |
|---|---|
PERMISSION | Зрители с правом доступа |
GROUP | Зрители с `group.`; это проверка прав, а не прямой запрос к LuckPerms/Vault |
WORLD | Зрители в одном из настроенных миров |
PLAYER_COUNT | Пока живой онлайн находится в заданном диапазоне |
PLAYTIME | Зрители, чьё нативное время игры на платформе попадает в заданный диапазон |
ANY_OF | Хотя бы одно вложенное правило |
NONE_OF | Ни одно из вложенных правил |
NOT | Обратное к одному вложенному правилу |
messages:
- name: vip-event
channel: events
rules:
- type: ANY_OF
rules:
- type: PERMISSION
permission: rank.vip
- type: PERMISSION
permission: rank.staff
- type: PLAYER_COUNT
min: 10
max: 100Правила всё ещё применяются к сообщениям, отправленным по триггеру события. Правила под конкретную платформу создаются только там, где среда выполнения может предоставить нужные данные.
Триггеры событий
Сообщение по триггеру полностью выходит из ротации своего канала по времени:
messages:
- name: welcome-back
trigger:
type: JOIN
delay: 3s
- name: first-join-welcome
trigger:
type: FIRST_JOIN
delay: 3s
- name: one-hundred-online
trigger:
type: PLAYER_COUNT
threshold: 100PLAYER_COUNT срабатывает один раз при достижении порога и перезаряжается только после того, как онлайн опустится ниже него. FIRST_JOIN недоступен на средах выполнения, которые не предоставляют постоянный сигнал первого входа.
[!NOTE]
/automessage enableи/automessage disableуправляют каналами по расписанию. Объявления по триггерам событий работают независимо.
Языки и поведение при отсутствии перевода
AutoMessage поставляется с en, pl и de. Добавь другой язык, скопировав файл в `lang/.yml`, переведя его и выполнив `/automessage reload`.
Для игрока с pt_br AutoMessage ищет:
lang/pt_br.ymllang/pt.ymlfallbackLanguageизconfig.yml
Отсутствующее объявление откатывается по отдельности, так что новый перевод не обязан быть полным, чтобы приносить пользу.
MiniMessage, плейсхолдеры и части уведомлений
Весь текст использует Kyori MiniMessage, включая цвета, градиенты, оформление, текст при наведении и действия по клику.
Встроенные плейсхолдеры:
| Привязанные к игроку | Привязанные к серверу |
|---|---|
{PLAYER} · {DISPLAY_NAME} · {UUID} · {WORLD} | {ONLINE} · {MAX_PLAYERS} · {DATE} · {TIME} |
На Bukkit и Folia установленный PlaceholderAPI определяется автоматически. Стандартные токены %placeholder_name%, содержащие буквы, цифры и подчёркивания, можно использовать вместе со встроенными.
Доступные ключи уведомлений:
| Ключ | Значение |
|---|---|
обычная строка / chat | Одна строка чата или список строк |
actionbar | Текст MiniMessage, отображаемый над хотбаром |
title / subtitle | Слои заголовка; любой из них можно использовать независимо |
times | Три длительности: появление, удержание, исчезновение |
hideTitle | Явно очистить текущий заголовок |
bossbar | Сообщение, длительность, цвет, оверлей и необязательный прогресс 0.0–1.0 |
sound | Ключ звука или key source volume pitch |
Нужна наглядная отправная точка? Попробуйте внешний EternalCode Notification Generator и адаптируйте сгенерированное уведомление под структуру языкового файла выше.
Формат времени
Каждая длительность принимает явную единицу измерения, и единицы можно комбинировать:
| Единица | Значение | Пример |
|---|---|---|
ms | миллисекунды | 500ms |
s | секунды | 30s |
m | минуты | 5m |
h | часы | 2h |
d | дни | 1d |
1m30s допустимо. Обычное число интерпретируется как секунды. Периоды каналов короче 50ms нормализуются, а среды выполнения на основе тиков в конечном счёте выполняются на границах тиков.
Зеркалирование в Discord через вебхук
Установите enabled: true и укажите URL вебхука Discord в discordWebhook.yml, чтобы зеркалировать запланированные и триггерные объявления.
Интеграция намеренно консервативна:
- зеркалируются только части чата;
- MiniMessage преобразуется в обычный текст;
- используется настроенный резервный язык;
- серверные плейсхолдеры подставляются, а значения, привязанные к игроку, удаляются;
- автоматические упоминания в Discord отключены;
- вебхук должен использовать HTTPS и хост/путь вебхука Discord;
- ответы с ограничением частоты повторяются с задержкой.
Вебхук включается по желанию и не выполняет исходящих запросов, пока отключён или не имеет допустимого URL. Перезапустите AutoMessage после изменения состояния включения или URL вебхука, чтобы соединение было пересоздано.
Команды и права
| Команда | Право | Описание |
|---|---|---|
/automessage enable | command.automessage.enable | Возобновить запланированные каналы объявлений |
/automessage disable | command.automessage.disable | Приостановить запланированные каналы объявлений |
/automessage reload | command.automessage.reload | Перезагрузить расписания, определения сообщений и языки |
| `/automessage view ` | command.automessage.view | Предпросмотр одного локализованного сообщения; только для игрока, с автодополнением |
/automessage next | command.automessage.next | Показать, что каждый канал объявит следующим и сколько времени до срабатывания, не расходуя его |
| `/automessage send ` | command.automessage.send | Отправить следующее объявление этого канала сейчас; его интервал перезапускается с этого момента |
/automessage toggle | command.automessage.toggle | Игрок отключает объявления для себя или включает обратно; сохраняется между перезапусками |
/automessage stats | command.automessage.stats | По каждому каналу: сколько он пронёс, когда вышло последнее и когда ожидается следующее, затем то же самое по каждому сообщению |
Встраивание AutoMessage в Minestom
У Minestom нет каталога плагинов. Инициализируй его, помести AutoMessage в classpath и включи библиотеку после инициализации самого Minestom:
MinecraftServer.init();
AutoMessageMinestom autoMessage = AutoMessageMinestom.builder()
.dataDirectory(Path.of("automessage"))
.permissions((sender, node) -> myPermissions.check(sender, node)) // optional
.enable();
// During your server shutdown:
autoMessage.shutdown();Без колбэка разрешений AutoMessage использует уровень оператора Minestom для защиты своих команд. Правила для разрешений и групп тогда опускаются, потому что среда выполнения не может ответить на них точно.
🔨 Сборка из исходников
Для сборки каждой среды выполнения требуется JDK 25. Из корня репозитория выполни:
./gradlew distЗадача запускает все проверки, собирает jar для каждой платформы и синхронизирует шесть устанавливаемых артефактов в build/dist:
- Bukkit
- Folia
- Sponge
- Velocity
- Fabric
- Minestom
Если какая-либо проверка не проходит, дистрибутив не создаётся. Обычный ./gradlew build выполняет те же проверки проекта, но оставляет артефакты внутри их отдельных модулей.
💛 Поддержать проект
AutoMessage — бесплатный, открытый и поддерживаемый независимо.
| Нашёл проблему? | Хочешь внести вклад? | Хочешь поддержать разработку? |
|---|---|---|
| Открыть отчёт об ошибке или запрос на новую функцию | Прочитай руководство по вкладу и открой pull request | GitHub Sponsors · PayPal |
Пожалуйста, соблюдай Кодекс поведения проекта во всех сообществах. AutoMessage распространяется под GNU General Public License v3.0.
Если AutoMessage улучшает общение на твоём сервере, поставь репозиторию звезду.
Это помогает другим владельцам серверов узнать о проекте.
Частые вопросы
Как установить AutoMessage [1.21]?
Установите Fabric под свою версию Minecraft, скачайте AutoMessage [1.21] под ту же версию и загрузчик, положите файл в папку mods и запустите игру с профилем загрузчика.
Для каких версий Minecraft есть AutoMessage [1.21]?
У AutoMessage [1.21] есть сборки для Minecraft 1.17–26.3.