HyVote - Votifier & Rewards (NuVotifier Voting Vote Listener)

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!

590.0 загрузок
Обновлён 6 дней назад

Скриншоты

Описание

️ HyVote

Мощный плагин Hytale, который вознаграждает игроков за голосование по спискам серверов, используя протоколы Votifier V1 и V2.

image Если вам нужна помощь, присоединяйтесь к нашим разногласиям! 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 и глобальной трансляции голосования.

image

{
"Порт": 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 временная метка голосования

. уведомление. Джонсон

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

image

{
Название: {
"Включено": ложное,
«Название»: «<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 или оба.

image

image

{
"Включено": правда,
"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>==========================================================================================
?
?

image

Варианты

  • включенный - Включить/отключить команду /vote полностью (правда/ложь)
  • Голосуйте Линкс Карта имен сайтов для голосования URL (объект)

Варианты UI

  • включенный - Показать результаты голосования (правда/ложь)
  • Название - Заголовок отображается в верхней части GUI (струна)
  • VoteLinkTitle - Ярлык над текстовым полем URL (струна)
  • VoteLinkОписание - Текст в поле URL перед выбором (струна)

Чат опционы

  • включенный Отправьте ссылки для голосования в чат (правда / ложь)
  • Заголовок Сообщение, отображаемое перед ссылками, поддерживает цвета (струна)
  • Формат Формат для каждой ссылки с заполнителями: %iterator % (число, начинающееся с 1), %site url%, %site Имя % (струна)
  • флюгер Сообщение, отображаемое после ссылок, поддерживает цвета (струна)

The % игроков % Заполнитель в URL-адресах будет заменен именем пользователя игрока (оба % игроков % и {игрок} форматы работы.


voteTopCommand.json

Конфигурировать /votetop командные доски. Вы можете переключать UI, Chat или оба (UI включен по умолчанию).

image

{
"Включено": правда,
"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

Настройка напоминаний для игроков, которые не голосовали в последнее время.

image

image

{
"Включено": правда,
"Послезавтра": 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 целевого сервера (струна)

Как это работает

  1. Когда HyVote получает голос, он обрабатывает его локально (награды, трансляции и т. д.).
  2. Если переадресация включена, она отправляет голосование на все настроенные цели.
  3. Форвардинг использует протокол Votifier V2 с аутентификацией HMAC-SHA256
  4. Каждый целевой сервер получает голос, как если бы он пришел непосредственно с сайта голосования.
  5. Продвижение вперед происходит асинхронно и не замедляет обработку местных голосов.

Пример использования Cases

  • Прокси-сервер BackendПолучите голоса на вашем прокси-сервере и перейдите на игровые серверы
  • Hub — игровые серверыГолоса вперед от сервера хаба до нескольких серверов игрового режима
  • избыточность: Передние голоса на резервный сервер для регистрации / статистики

Примечание: На целевом сервере должен работать HyVote (или другой плагин Votifier V2). Убедитесь, что токен соответствует конфигурации целевого сервера.


Статистика голосования

HyVote автоматически отслеживает статистику голосования база данных папка:

  • Голосование.json - Магазины общего количества голосов на одного игрока (все время)
  • Источник: YYYY-MM.json - Ежемесячные файлы голосования (например, Голосование-2025-01.json)
  • _rewards.json - Очередь вознаграждений для офлайн-игроков (авто-очистка через 3 дня)

Эти данные полномочия:

  • /votetop Команда, показывающая ежемесячные таблицы лидеров
  • /votetop all Команда, показывающая все время таблицы лидеров
  • Топ-3 избирателей, представленных в /голосовать Меню UI
  • ранг игрока, показанный в нижней части таблицы лидеров

Старые ежемесячные файлы хранятся для исторических записей и могут быть безопасно удалены, если в этом нет необходимости.


Создание сайтов для голосования

Для Votifier V2 (рекомендуется)

  1. Получи свой токен из config.json (автогенерируется при первом запуске)
  2. Настройка списка серверов с:
    • IP/Host: Ваш сервер IP
    • Порт: 8192 (или конфигурированный порт)
    • Токен: Копия с конфигураций. Джонсон
    • Протокол: Водитель V2

Votifier V1 (Наследие)

  1. Получите публичный ключ из rsa/publickey (автогенерируется при первом запуске)

  2. Настройка списка серверов с:

    • IP/Host: Ваш сервер IP
    • Порт: 8192 (тот же порт, что и V2)
    • Публичный ключ: Копирование контента от общественности. ключ
    • Протокол: Водитель V1
  3. Испытание установки позволяя DebugMode и голосование


Устранение неполадок

Голоса не принимаются

  1. ► Включить DebugMode вfig.json
  2. ✅ Проверьте брандмауэр - убедитесь, что порт Votifier открыт
  3. Проверьте совпадения токенов между конфигурацией и сайтом голосования
  4. ✅ Проверьте журналы сервера для Гипотеза сообщения

Общие вопросы

  • "Недействительная подпись" (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&lt;/url&gt;     </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.

image 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 - /vote command opens a GUI with clickable vote site links and top voters
  • 🏆 Vote Leaderboards - /votetop shows 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 - VoteReceivedEvent for 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.

image

{
  "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 give commands. 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 WaitForPlayer is 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.

image

{
  "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.

image

image

{
  "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>"
  }
}

image

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).

image

{
  "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.

image

image

{
  "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

  1. When HyVote receives a vote, it processes it locally (rewards, broadcasts, etc.)
  2. If forwarding is enabled, it sends the vote to all configured targets
  3. Forwarding uses Votifier V2 protocol with HMAC-SHA256 authentication
  4. Each target server receives the vote as if it came directly from the vote site
  5. 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:

  • /votetop command showing monthly leaderboards
  • /votetop all command showing all-time leaderboards
  • Top 3 voters displayed in the /vote UI 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)

  1. Get your token from config.json (auto-generated on first run)
  2. 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)

  1. Get your public key from rsa/public.key (auto-generated on first run)

  2. 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
  3. Test the setup by enabling DebugMode and voting


🔧 Troubleshooting

Votes not being received

  1. ✅ Enable DebugMode in config.json
  2. ✅ Check firewall - ensure Votifier port is open
  3. ✅ Verify token matches between config and vote site
  4. ✅ Check server logs for HyVote messages

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&lt;/url&gt;
    </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

Последние версии

HyVote-1.7.2.jar

Early Access 28.01.2026 2.1 МБ
Скачать

HyVote-1.7.1.jar

Early Access 27.01.2026 2.1 МБ
Скачать

HyVote-1.7.0.jar

Early Access 27.01.2026 2.1 МБ
Скачать

HyVote-1.6.0.jar

Early Access 25.01.2026 2.1 МБ
Скачать

HyVote-1.5.3.jar

Early Access 25.01.2026 2.0 МБ
Скачать