HyVote - Votifier & Rewards (NuVotifier Voting Vote Listener)
🧩 All in one - Votifier (v1&v2), Rewards, Vote Command, Reminders, Colors, Broadcasts, Sounds, Forwarding, Notifications and custom UI!
Описание
️ HyVote
Мощный плагин Hytale, который вознаграждает игроков за голосование по спискам серверов, используя протоколы Votifier V1 и V2.
Если вам нужна помощь, присоединяйтесь к нашим разногласиям! https://discord.gg/fWgDuCThj2
Особенности
- Обсуждение Reward Commands Выполнять команды сервера, когда игроки голосуют
- Трансляция сообщений Объявить голоса всем онлайн-игрокам с несколькими сообщениями
- Цветовая поддержка - Полное форматирование цветов с помощью тегов TaleMessage (
<green>,<золото>,<aqua>и т.д. - Уведомления о голосовании Отправка внутриигровых уведомлений UI избирателям
- Пользовательские звуки Играйте звуки, когда игроки получают вознаграждение за голосование
- Меню голосования -
/голосоватьКоманда открывает GUI с кликабельными ссылками на сайт голосования и лучшими избирателями - Голосование лидеров -
/votetopЕжемесячные и все время лучшие избиратели - Напоминания о голосовании Напомните игрокам, которые не голосовали в течение долгого времени.
- База данных голосования База данных JSON отслеживает голоса, ежемесячную статистику и ожидаемые вознаграждения.
- Двойной протокол Поддержка Votifier V1 (RSA) и V2 (HMAC-SHA256) на одном и том же порту
- Голосуйте за продвижение Голосование за другие серверы в вашей сети
- Система событий -
Голосование получено СобытиеДля других плагинов для интеграции - Полностью переводимый - Все сообщения, настраиваемые через JSON-конфигурации
- Режим Debug - Детальная регистрация для устранения неполадок
Команды
- /голосовать Открывает меню голосования с сайтами голосования и топ-избирателей
- /votetop В этом месяце лучшие избиратели с вашим рангом
- /votetop all Показывает лучших избирателей всех времен с вашим рангом
- Предыдущий /votetop Показаны лучшие избиратели предыдущего месяца
- /Гиво - Показывает команды администратора HyVote
- /hyvote test <player> Отправить тестовое голосование за игрока (разрешение):
hytalist.hyvote.admin) - /hyvote скачать - Перезагрузка всех конфигурационных файлов (разрешение):
hytalist.hyvote.admin) - /testvote <player> - Alias для тестирования, если он не взят другим плагином (разрешение:
hytalist.hyvote.admin)
Цветовое форматирование
Все сообщения поддерживают цветные теги: <green>, <золото>, <aqua>, <red>, <желтый>, <серый>, <White>и т.д.
Пример: <green>%player%</green> <gray>voted on</gray> <gold>%service%</gold>
Смотреть все варианты в Обсуждение TaleMessage CurseForge
Config.json
Основная конфигурация для сервера Votifier и глобальной трансляции голосования.

{
"Порт": 8192,
"Хозяин": "0.0.0.0",
«Token»: «auto-generated-secure-token»
"DisableV1Protocol": ложный,
"BroadcastMessage": правда,
"BroadcastWhenOffline": правда,
"BroadcastMessages":
«<green>%player%</green> <gray> проголосовал за </gray> <aqua>%service%</aqua><gray>!</gray>».
"<gold>Vote with <aqua>/vote</aqua> and check your stats with <aqua>/votetop</aqua></gold>"
]
"DebugMode": ложный,
"CheckForUpdates": правда
?
- Порт - порт сервера Votifier (по умолчанию: 8192)
- ведущий - Связанный адрес (по умолчанию: "0.0.0.0")
- токен - Автоматический токен аутентификации V2
- Инвалидный протокол V1 - Протокол V1 (RSA) с отключением (по умолчанию: ложный)
- Трансляция Включить трансляцию глобального голосования для всех игроков (по умолчанию: правда)
- Трансляция Когда Оффлайн - Трансляция голосов, даже если избиратель находится в автономном режиме (по умолчанию: правда)
- Сообщения Сообщения, транслируемые всем игрокам на каждом голосовании
- DebugMode - Заготовка вербозы (по умолчанию: ложная)
- CheckForUpdates Проверка обновлений для стартапа (по умолчанию: правда)
Примечание: RSA-ключи для протокола V1 генерируются автоматически. rsa/publickey и rsa/private.key.
Вознаграждение. Джонсон
Конфигурация вознаграждения с двумя системами: Вознаграждение (независимые рулоны) и Случайная награда (взвешенный выбор, один результат). Настройка "Включено": ложное Отключить все вознаграждения (полезно для серверов хабов, которые транслируют только голоса).
{
"Включено": правда,
"Награды":
{
"WaitForPlayer": правда,
"Команда":
"Дайте % игрока % Rock_Gem_Diamond - количество 1",
"дай % игроку % Rock_Gem_Emerald --количество 5.
]
?
{
"Шанс": 50.0,
"WaitForPlayer": правда,
"Команда":
"дай % игроку % Ингредиент_Бар_Серебряный - количество 5
]
?
{
"Разрешение": "vip.example",
"Команда":
«Деньги дают % игрокам % 5000»
]
?
]
"RandomReward": {
"Включено": ложное,
"Уровни": []
?
?
Вознаграждение
Каждая группа катится самостоятельно со своим шансом. Все команды в группе имеют одинаковую проверку шансов и разрешений - либо вся группа запускает, либо нет.
- Шанс - Возможность запуска этой группы, 0-100 (по умолчанию: 100)
- Исполнитель: WaitForPlayer Очередь команд и сообщений игрока до тех пор, пока игрок не выйдет в Интернет (по умолчанию: ложные). Рекомендуется для
даватькоманды. Ожидание вознаграждения истекает через 3 дня. - Разрешение Требуемое разрешение; группа пропускается, если игрок находится в автономном режиме или не имеет разрешения (факультативно)
- командование Список команд для выполнения (массив строк)
- Сообщения Сообщения транслируются всем онлайн-игрокам, когда эта группа запускает (необязательно). Отправляется немедленно, даже если избиратель находится в автономном режиме.
- Игровые сообщения - Сообщения, направленные непосредственно избирателю при запуске этой группы (факультативно). Если избиратель офлайн и
Исполнитель: WaitForPlayerЭто правда, сообщения стоят в очереди и доставляются, когда игрок присоединяется.
Случайная награда
Взвешенная система, в которой один Выбирается на голосование (или ничего). Полезно для наград в стиле ящика / лута. Все шансы на уровне суммируются — если сумма меньше 100, остальная часть — это шанс ничего не получить.
Пример с уровнями, суммирующими до 30 (70% шансов получить ничего):
"RandomReward": {
"Включено": правда,
"Уровни":
{
"Шанс": 20.0,
"WaitForPlayer": правда,
"Команда": ["дайте %-плеер% Rare_Crate - количество 1"],
"PlayerMessages": [<aqua> Вы получили <white>Rare</white> crate!</aqua>
?
{
"Шанс": 10.0,
"WaitForPlayer": правда,
«Commands»: [»give %player% Legendary_Crate — количество] 1"]
"PlayerMessages": [<gold> Вы получили <white>Legendary</white> crate!</gold>
«BroadcastMessages»: [<gold>%player%</gold> <gray>found a</gray> <gold>Legendary</gold> <gray>crate!</gray>
?
]
?
Каждый уровень поддерживает те же варианты, что и группы вознаграждения: Шанс (вес), Исполнитель: WaitForPlayer, Разрешение, командование, Сообщения, Игровые сообщения.
Уровни с a Разрешение Требование исключено из списка для игроков, у которых нет разрешения - остальные уровни сворачиваются, как будто ограниченного уровня не существует.
️ Помещики
Используйте их в командах и сообщениях. %placeholder % и [заместитель] Поддерживаемые форматы:
- % игроков % Имя пользователя игрока, проголосовавшего
- % сервисное обслуживание % - Наименование службы голосования
- %адрес % - IP-адрес избирателя
- %timesamp % - Unix временная метка голосования
. уведомление. Джонсон
Настройка уведомлений, отправляемых игрокам при голосовании. Поддерживает несколько типов уведомлений.

{
Название: {
"Включено": ложное,
«Название»: «<green>Reward Received!</green>»
«Подзаголовок»: «<gray>Спасибо за голосование по </gray> <aqua>%service%</aqua><gray>!»
"Второй период": 3,
"FadeInSeconds": 0,5,
"FadeOutSeconds": 0,5
?
"Уведомление": {
"Включено": правда,
«Название»: «<green>Reward Received!</green>»
"Описание": "<gray>Спасибо за ваш голос по </gray> <aqua>%service%</aqua><gray>!"
«Икона»: «Rock_Gem_Diamond»
?
"Чат": {
"Включено": ложное,
"Сообщения":
"<green>Reward Received!</green>"
"<gray>Спасибо за ваш голос по </gray> <aqua>%service%</aqua><gray>!</gray>"
]
?
"Звук": {
"Включено": правда,
"Имя": "SFX_Player_Pickup_Item"
?
?
Название Варианты (Большой текст на экране)
- включенный Название шоу на экране (истинное/ложное, по умолчанию: ложное)
- Название - Основной текст заголовка, поддерживает цвета и заполнители (струна)
- Подзаголовок - Текст подзаголовка (струна)
- Продолжительность второй Как долго название остается на экране (целое число)
- FadeInSeconds - Fade in duration (плавание)
- FadeOutSecond - Fade out duration (плыть)
Варианты уведомлений (небольшие всплывающие окна)
- включенный - Показать всплывающее окно уведомления (правда / ложь, по умолчанию: правда)
- Название - Название уведомления, поддерживает цвета и заполнители (струна)
- Описание - Описание уведомлений, поддерживает цвета и заполнители (струны)
- икона - Иконка элемента для отображения (струна)
Чат опционы
- включенный Отправляйте сообщения в чат избирателя (правда / ложь, по умолчанию: ложные)
- Сообщения - Массив сообщений для отправки, поддерживает цвета и заполнители (массив строк)
Звуковые опции
- включенный - воспроизведение звука при голосовании (правда/ложь, по умолчанию: правда)
- Имя - Звуковое название мероприятия, например.
SFX_Player_Pickup_Item(струна)
voteCommand.json
Конфигурировать /голосовать командовать и голосовать по ссылкам сайта. Вы можете переключать UI, Chat или оба.


{
"Включено": правда,
"VoteLinks": {
"Hytalist.com":https://hytalist.com/test-server?nick=%player%"
"AnotherServerList":https://exmple.com"
?
"UI": {
"Включено": правда,
"Название": "Голосуйте за сервер",
«VoteLinkTitle»: «Vote Link (Copy and open in Browser)»
«VoteLinkDescription»: «Нажмите на сайт выше, чтобы увидеть ссылку для голосования»
?
"Чат": {
"Включено": правда,
«Глава»: «<gray>=========== <green>Голосуйте за ссылки</green> ========</серый>
"Формат": "<yellow>#[</yellow><aqua>%%iterator%</aqua><yellow>]</yellow><white><click:%siteUrl%>%siteUrl%</click></white>"
«Footer»: «<gray>==========================================================================================
?
?

Варианты
- включенный - Включить/отключить команду /vote полностью (правда/ложь)
- Голосуйте Линкс Карта имен сайтов для голосования URL (объект)
Варианты UI
- включенный - Показать результаты голосования (правда/ложь)
- Название - Заголовок отображается в верхней части GUI (струна)
- VoteLinkTitle - Ярлык над текстовым полем URL (струна)
- VoteLinkОписание - Текст в поле URL перед выбором (струна)
Чат опционы
- включенный Отправьте ссылки для голосования в чат (правда / ложь)
- Заголовок Сообщение, отображаемое перед ссылками, поддерживает цвета (струна)
- Формат Формат для каждой ссылки с заполнителями:
%iterator %(число, начинающееся с 1),%site url%,%site Имя %(струна) - флюгер Сообщение, отображаемое после ссылок, поддерживает цвета (струна)
The % игроков % Заполнитель в URL-адресах будет заменен именем пользователя игрока (оба % игроков % и {игрок} форматы работы.
voteTopCommand.json
Конфигурировать /votetop командные доски. Вы можете переключать UI, Chat или оба (UI включен по умолчанию).

{
"Включено": правда,
"UI": {
"Включено": правда,
"Ограничение": 25,
"Титул": "Высшие избиратели",
«MonthlyTitle»: «Этот месяц»
«Предыдущий месяц»: «Предыдущий месяц»
«AllTimeTitle» — «Все время»
«YourRankLabel» — «Ваш ранг»
"Новости": "Никаких голосов пока не зафиксировано",
«NoRankYet»: «Голосуй, чтобы тебя оценили!»
«PlayerDescription»: «%votesThisMonth% в этом месяце / %votes% всего»
?
"Чат": {
"Включено": ложное,
"Ограничение": 10,
«Глава»: «<gray>==========</gray> <green>Лучшие избиратели</green> <gray>(%period%)</gray> <gray>=======</gray>,
«Формат»: «<yellow>#%rank%</yellow> <aqua>%player%</aqua> <gray> (голоса: %votes%)</gray>»,
"Footer": "<серый>------------------------------------------------------------------------------------------------------------------------------------------------"----------------------------------------------------------------------------------------------------
«YourRankFormat»: «<gray>Ваш ранг:</gray> <aqua>#%rank%</aqua> <gray>(голоса: %votes%)</gray>»,
"NoVotesYet": "<gray>No votes recorded yet.</gray>"
«NoRankYet»: «<gray>Ваш ранг:</gray> <dark_gray>» Пока нет голосов </dark_gray>
?
?
Варианты
- включенный Включить / отключить команду /votetop полностью (правда / ложь)
Варианты UI
- включенный - Показать лучший GUI с 3 вкладками: Этот месяц, предыдущий месяц, все время (правда / ложь, по умолчанию: правда)
- предел - Максимальное количество лучших избирателей (целое число, по умолчанию: 25)
- Название - Заголовок отображается в верхней части GUI (струна)
- Ежемесячный титул - Метка для вкладки текущего месяца (струна)
- Предыдущий MonthTitle - Метка для вкладки предыдущего месяца (струна)
- Название AllTime - Label for the all-time tab (строка)
- YourRankLabel - Метка выше ранга игрока (струна)
- NoVotesYet - Сообщение, когда голоса не записаны (строка)
- NoRankYet Сообщение, когда игрок не имеет ранга (струн)
- Игровое описание Описание, приведенное ниже каждого имени игрока с заполнителями:
%votesThisMonth%,% голос %(струна)
Чат опционы
- включенный Отправьте таблицу лидеров в чат (истинно/ложно, по умолчанию: ложно)
- предел - Максимальное количество лучших избирателей (целое число, по умолчанию: 10)
- Заголовок - Заголовок сообщения
% период %«Январь 2025» или «Все время» (струна) - Формат Формат для каждого входа избирателя с держателями мест:
% ранг %,% игроков %,% голос %(струна) - флюгер - Фотер-сообщение (струна)
- Ваш RankFormat Формат для показа собственного ранга игрока (струна)
- NoVotesYet - Сообщение, когда голоса не записаны (строка)
- NoRankYet Сообщение, когда игрок не имеет ранга (струн)
Напоминание.json
Настройка напоминаний для игроков, которые не голосовали в последнее время.


{
"Включено": правда,
"Послезавтра": 24,
"Вторая задержка": 60,
"CheckIntervalSeconds": 60,
Название: {
"Включено": правда,
"Название": "Напоминание голоса",
«Подзаголовок»: «Использовать /голосовать за поддержку сервера!»,
"Второй период": 3,
"FadeInSeconds": 0,5,
"FadeOutSeconds": 0,5
?
"Уведомление": {
"Включено": ложное,
"Название": "<gold>Vote Reminder</gold>",
«Описание»: «<серый> Вы не голосовали какое-то время!</серый> <aqua>Использовать/голосовать</aqua>»,
«Икона»: «Rock_Gem_Diamond»
?
"Чат": {
"Включено": ложное,
"Сообщения":
«Вы не голосовали какое-то время!»
<gray>Поддержать сервер путем голосования: </gray> <aqua>/vote</aqua>
]
?
"Звук": {
"Включено": правда,
"Имя": "SFX_UI_Quest_Objective_Complete"
?
?
Варианты
- включенный - Включить/отключить напоминания о голосовании (истинно/ложно)
- Через несколько часов Напомните игрокам, которые не голосовали в X-часах (целое число, по умолчанию: 24)
- Задержка во втором Подождите X секунд после того, как игрок присоединится, прежде чем проверить (целое число, по умолчанию: 60)
- Проверьте IntervalSeconds Как часто проверять напоминания (целое число, по умолчанию: 60)
Название Варианты (Большой текст на экране)
- включенный Название шоу на экране (истинное/ложное, по умолчанию: истинное)
- Название - Основной заголовок текста (струна)
- Подзаголовок - Текст подзаголовка (струна)
- Продолжительность второй Как долго название остается на экране (целое число)
- FadeInSeconds - Fade in duration (плавание)
- FadeOutSecond - Fade out duration (плыть)
Варианты уведомлений (небольшие всплывающие окна)
- включенный Показать всплывающее окно уведомления (истинное/ложное, по умолчанию: ложное)
- Название - Заголовок уведомления, поддерживает цвета (струна)
- Описание - Описание уведомлений, поддерживает цвета (струна)
- икона - Иконка элемента для отображения (струна)
Чат опционы
- включенный Отправляйте напоминания в чат (правда / ложь, по умолчанию: ложные)
- Сообщения - массив сообщений для отправки (массив строк)
Звуковые опции
- включенный - воспроизведение звука с напоминанием (правда/ложь, по умолчанию: правда)
- Имя - Звуковое название мероприятия (струна)
Пересылка. Джонсон
Голосуйте за другие серверы в вашей сети. Полезно для настроек в стиле BungeeCord / Velocity, где вы хотите, чтобы голоса, полученные на прокси-сервере, передавались на серверы бэкэнда или наоборот.
{
"Включено": ложное,
"Цели":
{
"Хозяин": "127.0.0.1",
"Порт": 8192,
«Token»: «target-server-token»
?
{
"Хозяин": "192.168.1.100",
"Порт": 8192,
«Токен»: «другой сервер-токен»
?
]
?
Варианты
- включенный - Включить/отключить переадресацию голосов (истинно/ложно, по умолчанию: ложно)
- Цели - массив целевых серверов для переадресации голосов
Целевые варианты
- ведущий IP-адрес или имя хоста целевого сервера (струна)
- Порт - порт Votifier целевого сервера (целое число, по умолчанию: 8192)
- токен - Токен Votifier V2 целевого сервера (струна)
Как это работает
- Когда HyVote получает голос, он обрабатывает его локально (награды, трансляции и т. д.).
- Если переадресация включена, она отправляет голосование на все настроенные цели.
- Форвардинг использует протокол Votifier V2 с аутентификацией HMAC-SHA256
- Каждый целевой сервер получает голос, как если бы он пришел непосредственно с сайта голосования.
- Продвижение вперед происходит асинхронно и не замедляет обработку местных голосов.
Пример использования Cases
- Прокси-сервер BackendПолучите голоса на вашем прокси-сервере и перейдите на игровые серверы
- Hub — игровые серверыГолоса вперед от сервера хаба до нескольких серверов игрового режима
- избыточность: Передние голоса на резервный сервер для регистрации / статистики
Примечание: На целевом сервере должен работать HyVote (или другой плагин Votifier V2). Убедитесь, что токен соответствует конфигурации целевого сервера.
Статистика голосования
HyVote автоматически отслеживает статистику голосования база данных папка:
- Голосование.json - Магазины общего количества голосов на одного игрока (все время)
- Источник: YYYY-MM.json - Ежемесячные файлы голосования (например,
Голосование-2025-01.json) - _rewards.json - Очередь вознаграждений для офлайн-игроков (авто-очистка через 3 дня)
Эти данные полномочия:
/votetopКоманда, показывающая ежемесячные таблицы лидеров/votetop allКоманда, показывающая все время таблицы лидеров- Топ-3 избирателей, представленных в
/голосоватьМеню UI - ранг игрока, показанный в нижней части таблицы лидеров
Старые ежемесячные файлы хранятся для исторических записей и могут быть безопасно удалены, если в этом нет необходимости.
Создание сайтов для голосования
Для Votifier V2 (рекомендуется)
- Получи свой токен из
config.json(автогенерируется при первом запуске) - Настройка списка серверов с:
- IP/Host: Ваш сервер IP
- Порт: 8192 (или конфигурированный порт)
- Токен: Копия с конфигураций. Джонсон
- Протокол: Водитель V2
Votifier V1 (Наследие)
Получите публичный ключ из
rsa/publickey(автогенерируется при первом запуске)Настройка списка серверов с:
- IP/Host: Ваш сервер IP
- Порт: 8192 (тот же порт, что и V2)
- Публичный ключ: Копирование контента от общественности. ключ
- Протокол: Водитель V1
Испытание установки позволяя
DebugModeи голосование
Устранение неполадок
Голоса не принимаются
- ► Включить
DebugModeвfig.json - ✅ Проверьте брандмауэр - убедитесь, что порт Votifier открыт
- Проверьте совпадения токенов между конфигурацией и сайтом голосования
- ✅ Проверьте журналы сервера для
Гипотезасообщения
Общие вопросы
- "Недействительная подпись" (V2) - Несоответствие токенов, проверьте токен на сайте голосования
- «Не удалось расшифровать» (V1) - Несоответствие открытого ключа, копирование полного контента из rsa/public. ключ
- "Нет ответа" - Проверьте конфигурацию брандмауэра/порта
для разработчиков
Полная документация API доступна по адресу github.com/hytalist/hyvote-api. API позволяет получать голоса игроков, ежемесячную статистику, рейтинги и многое другое.
установка
Добавьте API HyVote в свой проект:
Котлин ДСЛ (Kotlin DSL)
репозитории {
maven { url = uri()https://jitpack.io") }
?
зависимости {
compileOnly («com.github.hytalist:hyvote-api:1.6.0»)
?
Грейдл (Groovy)
репозитории {
{url }https://jitpack.io " ?
?
зависимости {
составлять Только 'com.github.hytalist:hyvote-api:1.6.0 "
?
Мэйвен
<репозитории>
<репозиторий>
<id>jitpack.io</id>
<url>https://jitpack.io</url> </Repository>
</repositories>
<зависимости>
<зависимость>
<groupId>com.github.hytalist</groupId>
<artifactId>hyvote-api</artifactId>
<version>1.6.0</version>
<scope>предоставлено </scope>
</зависимость>
</зависимость>
Голосование получено Событие
Слушайте события голосования из других плагинов:
Java
Импорт com.hytalist.hyvote.event.Vote событие;
Импорт com.hytalist.hyvote.model. Голосовать;
@Override
Публичная установка void() {
eventRegistry.registerGlobal (VoteReceivedEvent.class, event -> {)
Голосование = event.getVote();
Струнный игрок = vote.getUsername();
струнный сервис = vote.getServiceName();
// Отменить вознаграждение по умолчанию
event.setCancelled (правда)
// Работа с пользовательской логикой
}
?
Котлин
Импорт com.hytalist.hyvote.event.Vote Событие
Override Fun Setup (альбом) {
eventRegistry.registerGlobal (VoteReceivedEvent::class.java)
val vote = event.vote
val player = vote.username
val service = vote.service
// Отменить вознаграждение по умолчанию
event.setCancelled (правда)
// Работа с пользовательской логикой
?
?
Кредиты
- Протокол на основе спецификации NuVotifier
- Цветовое оформление powered by TaleMessage
Сделано для сообщества Hytale
Показать оригинальное описание (English)
🗳️ HyVote
A powerful Hytale plugin that rewards players for voting on server lists using both Votifier V1 and V2 protocols.
If you need any help, join our discord! https://discord.gg/fWgDuCThj2
✨ Features
- 🎁 Reward Commands - Execute any server commands when players vote
- 📢 Broadcast Messages - Announce votes to all online players with multiple messages
- 🎨 Color Support - Full color formatting with TaleMessage tags (
<green>,<gold>,<aqua>, etc.) - 🔔 Vote Notifications - Send in-game UI notifications to voters
- 🔊 Custom Sounds - Play sounds when players receive vote rewards
- 🔗 Vote Menu -
/votecommand opens a GUI with clickable vote site links and top voters - 🏆 Vote Leaderboards -
/votetopshows monthly and all-time top voters - ⏰ Vote Reminders - Remind players who haven't voted in a while
- 💾 Vote Database - JSON database tracks votes, monthly statistics, and pending rewards
- 🔐 Dual Protocol Support - Both Votifier V1 (RSA) and V2 (HMAC-SHA256) on the same port
- 📡 Vote Forwarding - Forward votes to other servers in your network
- 🎯 Event System -
VoteReceivedEventfor other plugins to integrate - 🌍 Fully Translatable - All messages configurable via JSON configs
- 🔧 Debug Mode - Detailed logging for troubleshooting
🎮 Commands
- /vote - Opens the vote menu with vote sites and top voters
- /votetop - Shows top voters this month with your rank
- /votetop all - Shows top voters of all time with your rank
- /votetop previous - Shows top voters from the previous month
- /hyvote - Shows HyVote admin commands
- /hyvote test <player> - Send a test vote for a player (permission:
hytalist.hyvote.admin) - /hyvote reload - Reload all configuration files (permission:
hytalist.hyvote.admin) - /testvote <player> - Alias for testing if not taken by another plugin (permission:
hytalist.hyvote.admin)
🎨 Color Formatting
All messages support color tags: <green>, <gold>, <aqua>, <red>, <yellow>, <gray>, <white>, etc.
Example: <green>%player%</green> <gray>voted on</gray> <gold>%service%</gold>
See all options at TaleMessage CurseForge Page
📄 config.json
Main configuration for the Votifier server and global vote broadcast.

{
"Port": 8192,
"Host": "0.0.0.0",
"Token": "auto-generated-secure-token",
"DisableV1Protocol": false,
"BroadcastMessage": true,
"BroadcastWhenOffline": true,
"BroadcastMessages": [
"<green>%player%</green> <gray>has voted on</gray> <aqua>%service%</aqua><gray>!</gray>",
"<gold>Vote with <aqua>/vote</aqua> and check your stats with <aqua>/votetop</aqua></gold>"
],
"DebugMode": false,
"CheckForUpdates": true
}
- Port - Votifier server port (default: 8192)
- Host - Bind address (default: "0.0.0.0")
- Token - Auto-generated V2 authentication token
- DisableV1Protocol - Disable V1 (RSA) protocol (default: false)
- BroadcastMessage - Enable global vote broadcast to all players (default: true)
- BroadcastWhenOffline - Broadcast votes even when the voter is offline (default: true)
- BroadcastMessages - Messages broadcast to all players on every vote
- DebugMode - Verbose logging (default: false)
- CheckForUpdates - Check for updates on startup (default: true)
Note: RSA keys for V1 protocol are auto-generated in rsa/public.key and rsa/private.key.
🎁 rewards.json
Reward configuration with two systems: Rewards (independent rolls) and RandomReward (weighted pick, one result). Set "Enabled": false to disable all rewards (useful for hub servers that only broadcast votes).
{
"Enabled": true,
"Rewards": [
{
"WaitForPlayer": true,
"Commands": [
"give %player% Rock_Gem_Diamond --quantity 1",
"give %player% Rock_Gem_Emerald --quantity 5"
]
},
{
"Chance": 50.0,
"WaitForPlayer": true,
"Commands": [
"give %player% Ingredient_Bar_Silver --quantity 5"
]
},
{
"Permission": "vip.example",
"Commands": [
"money give %player% 5000"
]
}
],
"RandomReward": {
"Enabled": false,
"Tiers": []
}
}
Rewards
Each group rolls independently with its own chance. All commands within a group share the same chance and permission check -- either the whole group triggers or it doesn't.
- Chance - Chance for this group to trigger, 0-100 (default: 100)
- WaitForPlayer - Queue commands and player messages until player comes online (default: false). Recommended for
givecommands. Pending rewards expire after 3 days. - Permission - Required permission; group is skipped if player is offline or lacks permission (optional)
- Commands - List of commands to execute (array of strings)
- BroadcastMessages - Messages broadcast to all online players when this group triggers (optional). Sent immediately, even if the voter is offline.
- PlayerMessages - Messages sent directly to the voter when this group triggers (optional). If the voter is offline and
WaitForPlayeris true, messages are queued and delivered when the player joins.
RandomReward
A weighted tier system where exactly one tier is picked per vote (or nothing). Useful for crate/loot table style rewards. All tier chances are summed -- if the total is less than 100, the remainder is the chance of getting nothing.
Example with tiers summing to 30 (70% chance of getting nothing):
"RandomReward": {
"Enabled": true,
"Tiers": [
{
"Chance": 20.0,
"WaitForPlayer": true,
"Commands": ["give %player% Rare_Crate --quantity 1"],
"PlayerMessages": ["<aqua>You received a <white>Rare</white> crate!</aqua>"]
},
{
"Chance": 10.0,
"WaitForPlayer": true,
"Commands": ["give %player% Legendary_Crate --quantity 1"],
"PlayerMessages": ["<gold>You received a <white>Legendary</white> crate!</gold>"],
"BroadcastMessages": ["<gold>%player%</gold> <gray>found a</gray> <gold>Legendary</gold> <gray>crate!</gray>"]
}
]
}
Each tier supports the same options as reward groups: Chance (weight), WaitForPlayer, Permission, Commands, BroadcastMessages, PlayerMessages.
Tiers with a Permission requirement are excluded from the roll for players who lack the permission -- the remaining tiers are rolled among as if the restricted tier didn't exist.
🏷️ Placeholders
Use these in commands and messages (both %placeholder% and {placeholder} formats supported):
- %player% - Username of the player who voted
- %service% - Name of the voting service
- %address% - IP address of the voter
- %timestamp% - Unix timestamp of the vote
🔔 notification.json
Configure notifications sent to players when they vote. Supports multiple notification types.

{
"Title": {
"Enabled": false,
"Title": "<green>Reward Received!</green>",
"Subtitle": "<gray>Thanks for voting on</gray> <aqua>%service%</aqua><gray>!</gray>",
"DurationSeconds": 3,
"FadeInSeconds": 0.5,
"FadeOutSeconds": 0.5
},
"Notification": {
"Enabled": true,
"Title": "<green>Reward Received!</green>",
"Description": "<gray>Thanks for your vote on</gray> <aqua>%service%</aqua><gray>!</gray>",
"IconItem": "Rock_Gem_Diamond"
},
"Chat": {
"Enabled": false,
"Messages": [
"<green>Reward Received!</green>",
"<gray>Thanks for your vote on</gray> <aqua>%service%</aqua><gray>!</gray>"
]
},
"Sound": {
"Enabled": true,
"Name": "SFX_Player_Pickup_Item"
}
}
Title Options (Big text on screen)
- Enabled - Show title on screen (true/false, default: false)
- Title - Main title text, supports colors & placeholders (string)
- Subtitle - Subtitle text below the title (string)
- DurationSeconds - How long the title stays on screen (integer)
- FadeInSeconds - Fade in duration (float)
- FadeOutSeconds - Fade out duration (float)
Notification Options (Small popup)
- Enabled - Show notification popup (true/false, default: true)
- Title - Notification title, supports colors & placeholders (string)
- Description - Notification description, supports colors & placeholders (string)
- IconItem - Item icon to display (string)
Chat Options
- Enabled - Send messages to voter's chat (true/false, default: false)
- Messages - Array of messages to send, supports colors & placeholders (array of strings)
Sound Options
- Enabled - Play sound on vote (true/false, default: true)
- Name - Sound event name, e.g.
SFX_Player_Pickup_Item(string)
🔗 voteCommand.json
Configure the /vote command and vote site links. You can toggle UI, Chat or both.


{
"Enabled": true,
"VoteLinks": {
"Hytalist.com": "https://hytalist.com/test-server?nick=%player%",
"AnotherServerList": "https://example.com"
},
"UI": {
"Enabled": true,
"Title": "Vote for the Server",
"VoteLinkTitle": "Vote Link (Copy and open in Browser)",
"VoteLinkDescription": "Click a site above to see the vote link"
},
"Chat": {
"Enabled": true,
"Header": "<gray>========== <green>Vote Links</green> ==========</gray>",
"Format": "<yellow>#[</yellow><aqua>%iterator%</aqua><yellow>]</yellow> <white><click:%siteUrl%>%siteUrl%</click></white>",
"Footer": "<gray>===================================</gray>"
}
}

Options
- Enabled - Enable/disable the /vote command entirely (true/false)
- VoteLinks - Map of site names to vote URLs (object)
UI Options
- Enabled - Show the vote GUI (true/false)
- Title - Title displayed at the top of the GUI (string)
- VoteLinkTitle - Label above the URL text field (string)
- VoteLinkDescription - Placeholder text in URL field before selection (string)
Chat Options
- Enabled - Send vote links to chat (true/false)
- Header - Message shown before the links, supports colors (string)
- Format - Format for each link with placeholders:
%iterator%(number starting from 1),%siteUrl%,%siteName%(string) - Footer - Message shown after the links, supports colors (string)
The %player% placeholder in URLs will be replaced with the player's username (both %player% and {player} formats work).
🏆 voteTopCommand.json
Configure the /votetop command leaderboards. You can toggle UI, Chat or both (UI enabled by default).

{
"Enabled": true,
"UI": {
"Enabled": true,
"Limit": 25,
"Title": "Top Voters",
"MonthlyTitle": "This Month",
"PreviousMonthTitle": "Previous Month",
"AllTimeTitle": "All Time",
"YourRankLabel": "Your Rank",
"NoVotesYet": "No votes recorded yet",
"NoRankYet": "Vote to get ranked!",
"PlayerDescription": "%votesThisMonth% this month / %votes% total"
},
"Chat": {
"Enabled": false,
"Limit": 10,
"Header": "<gray>=========</gray> <green>Top Voters</green> <gray>(%period%)</gray> <gray>=========</gray>",
"Format": "<yellow>#%rank%</yellow> <aqua>%player%</aqua> <gray>(votes: %votes%)</gray>",
"Footer": "<gray>-----------------------------------------</gray>",
"YourRankFormat": "<gray>Your rank:</gray> <aqua>#%rank%</aqua> <gray>(votes: %votes%)</gray>",
"NoVotesYet": "<gray>No votes recorded yet.</gray>",
"NoRankYet": "<gray>Your rank:</gray> <dark_gray>No votes yet</dark_gray>"
}
}
Options
- Enabled - Enable/disable the /votetop command entirely (true/false)
UI Options
- Enabled - Show the vote top GUI with 3 tabs: This Month, Previous Month, All Time (true/false, default: true)
- Limit - Maximum number of top voters to display (integer, default: 25)
- Title - Title displayed at the top of the GUI (string)
- MonthlyTitle - Label for the current month tab (string)
- PreviousMonthTitle - Label for the previous month tab (string)
- AllTimeTitle - Label for the all-time tab (string)
- YourRankLabel - Label above the player's rank (string)
- NoVotesYet - Message when no votes recorded (string)
- NoRankYet - Message when player has no rank (string)
- PlayerDescription - Description shown below each player name with placeholders:
%votesThisMonth%,%votes%(string)
Chat Options
- Enabled - Send leaderboard to chat (true/false, default: false)
- Limit - Maximum number of top voters to display (integer, default: 10)
- Header - Header message with
%period%placeholder for "January 2025" or "All Time" (string) - Format - Format for each voter entry with placeholders:
%rank%,%player%,%votes%(string) - Footer - Footer message (string)
- YourRankFormat - Format for showing player's own rank (string)
- NoVotesYet - Message when no votes recorded (string)
- NoRankYet - Message when player has no rank (string)
⏰ reminder.json
Configure vote reminders for players who haven't voted recently.


{
"Enabled": true,
"AfterHours": 24,
"DelayInSeconds": 60,
"CheckIntervalSeconds": 60,
"Title": {
"Enabled": true,
"Title": "Vote Reminder",
"Subtitle": "Use /vote to support the server!",
"DurationSeconds": 3,
"FadeInSeconds": 0.5,
"FadeOutSeconds": 0.5
},
"Notification": {
"Enabled": false,
"Title": "<gold>Vote Reminder</gold>",
"Description": "<gray>You haven't voted in a while!</gray> <aqua>Use /vote</aqua>",
"IconItem": "Rock_Gem_Diamond"
},
"Chat": {
"Enabled": false,
"Messages": [
"<gold>You haven't voted in a while!</gold>",
"<gray>Support the server by voting:</gray> <aqua>/vote</aqua>"
]
},
"Sound": {
"Enabled": true,
"Name": "SFX_UI_Quest_Objective_Complete"
}
}
Options
- Enabled - Enable/disable vote reminders (true/false)
- AfterHours - Remind players who haven't voted in X hours (integer, default: 24)
- DelayInSeconds - Wait X seconds after player joins before checking (integer, default: 60)
- CheckIntervalSeconds - How often to check for reminders (integer, default: 60)
Title Options (Big text on screen)
- Enabled - Show title on screen (true/false, default: true)
- Title - Main title text (string)
- Subtitle - Subtitle text below the title (string)
- DurationSeconds - How long the title stays on screen (integer)
- FadeInSeconds - Fade in duration (float)
- FadeOutSeconds - Fade out duration (float)
Notification Options (Small popup)
- Enabled - Show notification popup (true/false, default: false)
- Title - Notification title, supports colors (string)
- Description - Notification description, supports colors (string)
- IconItem - Item icon to display (string)
Chat Options
- Enabled - Send reminder messages to chat (true/false, default: false)
- Messages - Array of messages to send (array of strings)
Sound Options
- Enabled - Play sound with reminder (true/false, default: true)
- Name - Sound event name (string)
📡 forwarding.json
Forward votes to other servers in your network. Useful for BungeeCord/Velocity-style setups where you want votes received on a proxy to be forwarded to backend servers, or vice versa.
{
"Enabled": false,
"Targets": [
{
"Host": "127.0.0.1",
"Port": 8192,
"Token": "target-server-token"
},
{
"Host": "192.168.1.100",
"Port": 8192,
"Token": "another-server-token"
}
]
}
Options
- Enabled - Enable/disable vote forwarding (true/false, default: false)
- Targets - Array of target servers to forward votes to
Target Options
- Host - IP address or hostname of the target server (string)
- Port - Votifier port of the target server (integer, default: 8192)
- Token - Votifier V2 token of the target server (string)
How It Works
- When HyVote receives a vote, it processes it locally (rewards, broadcasts, etc.)
- If forwarding is enabled, it sends the vote to all configured targets
- Forwarding uses Votifier V2 protocol with HMAC-SHA256 authentication
- Each target server receives the vote as if it came directly from the vote site
- Forwarding happens asynchronously and won't slow down local vote processing
Example Use Cases
- Proxy → Backend: Receive votes on your proxy server and forward to game servers
- Hub → Game Servers: Forward votes from a hub server to multiple game mode servers
- Redundancy: Forward votes to a backup server for logging/statistics
Note: The target server must have HyVote (or another Votifier V2 compatible plugin) running. Make sure the token matches the target server's config.
📊 Vote Statistics
HyVote automatically tracks vote statistics in the database/ folder:
- votes.json - Stores total vote count per player (all-time)
- votes-YYYY-MM.json - Monthly vote files (e.g.,
votes-2025-01.json) - pending_rewards.json - Queued rewards for offline players (auto-cleaned after 3 days)
This data powers:
/votetopcommand showing monthly leaderboards/votetop allcommand showing all-time leaderboards- Top 3 voters displayed in the
/voteUI menu - Player rank shown at the bottom of leaderboards
Old monthly files are kept for historical records and can be safely deleted if not needed.
🌐 Setting Up Vote Sites
For Votifier V2 (Recommended)
- Get your token from
config.json(auto-generated on first run) - Configure your server list with:
- IP/Host: Your server IP
- Port: 8192 (or your configured port)
- Token: Copy from config.json
- Protocol: Votifier V2
For Votifier V1 (Legacy)
Get your public key from
rsa/public.key(auto-generated on first run)Configure your server list with:
- IP/Host: Your server IP
- Port: 8192 (same port as V2)
- Public Key: Copy content from public.key
- Protocol: Votifier V1
Test the setup by enabling
DebugModeand voting
🔧 Troubleshooting
Votes not being received
- ✅ Enable
DebugModein config.json - ✅ Check firewall - ensure Votifier port is open
- ✅ Verify token matches between config and vote site
- ✅ Check server logs for
HyVotemessages
Common Issues
- "Invalid signature" (V2) - Token mismatch, check token on vote site
- "Failed to decrypt" (V1) - Public key mismatch, copy full content from rsa/public.key
- "No response" - Check firewall/port configuration
👨💻 For Developers
Full API documentation is available at github.com/hytalist/hyvote-api. The API allows you to retrieve player votes, monthly statistics, rankings, and more.
Installation
Add the HyVote API to your project:
Gradle (Kotlin DSL)
repositories {
maven { url = uri("https://jitpack.io") }
}
dependencies {
compileOnly("com.github.hytalist:hyvote-api:1.6.0")
}
Gradle (Groovy)
repositories {
maven { url 'https://jitpack.io' }
}
dependencies {
compileOnly 'com.github.hytalist:hyvote-api:1.6.0'
}
Maven
<repositories>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>com.github.hytalist</groupId>
<artifactId>hyvote-api</artifactId>
<version>1.6.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
VoteReceivedEvent
Listen to vote events from other plugins:
Java
import com.hytalist.hyvote.event.VoteReceivedEvent;
import com.hytalist.hyvote.model.Vote;
@Override
public void setup() {
eventRegistry.registerGlobal(VoteReceivedEvent.class, event -> {
Vote vote = event.getVote();
String player = vote.getUsername();
String service = vote.getServiceName();
// Cancel default rewards
event.setCancelled(true);
// Handle with custom logic
});
}
Kotlin
import com.hytalist.hyvote.event.VoteReceivedEvent
override fun setup() {
eventRegistry.registerGlobal(VoteReceivedEvent::class.java) { event ->
val vote = event.vote
val player = vote.username
val service = vote.serviceName
// Cancel default rewards
event.setCancelled(true)
// Handle with custom logic
}
}
🙏 Credits
- Protocol based on NuVotifier specification
- Color formatting powered by TaleMessage
Made with ❤️ for the Hytale community