HyVotifier - Votifier 插件与模组 (NuVotifier)

HyVotifier - Votifier 插件与模组 (NuVotifier)

✨ 专为Hytale服务器设计的Votifier(支持V1和V2投票协议)。自定义界面!发送通知、音效、广播、命令及更多功能!奖励用户投票的最简单方式!投票时间到!

实用

HyVotifier Banner

HyVotifier 是一个专为现代 Hytale 服务器打造的高性能 Hytale Votifier 模组/插件。如果你正在寻找一个可靠的 Hytale Votifier,HyVotifier 通过完全可定制的功能,让你轻松追踪投票、奖励玩家并提升服务器活跃度。

🌟 功能

  • 向投票玩家发送自定义聊天信息
  • 当有人投票时,向全服广播投票公告
  • 投票后自动执行奖励命令(可与其他模组和插件配合)
  • 投票后随机奖励(可与其他模组和插件配合)
  • 基于投票来源的奖励(可与其他模组和插件配合)
  • 显示屏幕投票通知,提供即时反馈和可见性
  • 玩家投票时播放自定义音效
  • 每日投票提醒,鼓励持续投票并提升投票数量
  • 使用游戏内命令测试投票,验证所有设置是否正确
  • 自定义投票 GUI 命令,打开一个完全可配置的菜单,玩家可以轻松复制投票链接!
  • 聊天中的可点击投票链接,方便地将玩家引导至你选择的投票网站。
  • 跨服务器投票转发,在服务器网络间共享投票数据。
  • 离线投票,让未在线的玩家不错过奖励。
  • 投票排行榜,显示服务器上前 10 名投票者。
  • 投票里程碑,奖励持续支持的玩家。

Discord 图标 加入我们的 Discord 获取快速支持和报告 Bug! 配置文件遇到问题?使用此工具检查格式错误:https://jsonlint.com/

使用 /plugin reload HSL:Votifier 重载插件!


✨ 颜色格式化

MiniMessage 风格的颜色支持已在 1.3 版本中添加。 你现在可以自定义消息颜色。

HyVotifier 使用 TaleMessage 进行颜色格式化。可用的标签:

<black>, <dark_blue>, <dark_green>, <dark_aqua>, <dark_red>, <dark_purple>, <gold>, <gray>, <dark_gray>, <blue>, <green>, <aqua>, <red>, <light_purple>, <yellow>, <white>

示例:

<gray>感谢你在 <gold>%from%</gold> 的投票。<green>请享用你的奖励!</green>

你甚至可以制作彩虹色!示例:

<gradient:red:yellow:green:blue:purple>彩虹渐变!</gradient>


✨ 常规设置

示例 config.json:

{
  "BindHost": "0.0.0.0",
  "BindPort": 8193,
  "DisableV1Protocol": false,
  "DebugMode": false,
  "Tokens": {
    "HytaleServerList.me": "ugp71IWvPERCSxnh"
  }
}

BindHost: Votifier 监听的 IP,如果你想使用服务器的公网 IP,请保留为 0.0.0.0 BindPort: 用于监听投票的端口,默认为 8192 DisableV1Protocol: 使 HyVotifier 不再监听 V1 协议投票。 Tokens: V2 协议令牌。除非你使用的是 V2 投票协议的网站,否则无需指定令牌。请向下滚动到“🔐 安全性与工作原理”部分,了解何时需要令牌。


✨ 奖励

奖励消息示例

你可以以控制台执行命令的形式设置奖励。可以配置每次投票都执行的命令,也可以配置基于概率的随机命令。

示例 rewards.json:

{
  "RewardCommands": [
    "give %player% Food_Wildmeat_Cooked --quantity=10",
    "give %player% Potion_Health_Small --quantity=3"
  ],
  "RewardMessages": [
    "<gray>感谢你在 <gold>%from%</gold> 的投票。<green>请享用你的奖励!</green>"
  ],
  "BroadcastWhenOffline": false,
  "RewardBroadcasts": [
    "<gray>玩家 <gradient:red:yellow:green:blue:purple>%player%</gradient> 为我们的服务器投了票!</gray>"
  ],
  "RngRewardsEnabled": true,
  "RngRewardsNothingChance": 0.0,
  "RngRewards": [
    {
      "Percentage": 10.0,
      "Commands": [
        "give %player% Food_Popcorn --quantity=25"
      ],
      "BroadcastMessages": [
        "<gray>玩家 <gold>%player%</gold> 投票获得了特殊奖励!<dark_gray>(%chance%% 概率)</dark_gray>"
      ],
      "Messages": [
        "<green>你获得了 <gold>爆米花</gold> 作为特殊投票奖励!"
      ]
    },
    {
      "Percentage": 10.0,
      "Commands": [
        "give %player% Food_Wildmeat_Cooked --quantity=25"
      ],
      "BroadcastMessages": [
        "<gray>玩家 <gold>%player%</gold> 投票获得了特殊奖励!<dark_gray>(%chance%% 概率)</dark_gray>"
      ],
      "Messages": [
        "<green>你获得了 <gold>熟野肉</gold> 作为特殊投票奖励!"
      ]
    },
    {
      "Percentage": 5.0,
      "Commands": [
        "give %player% Ore_Adamantite --quantity=12"
      ],
      "BroadcastMessages": [
        "<gray>玩家 <gold>%player%</gold> 投票获得了 <green>稀有奖励</green>!<dark_gray>(%chance%% 概率)</dark_gray>"
      ],
      "Messages": [
        "<green>你获得了 <gold>精金矿</gold> 作为 <green>稀有</green> 投票奖励!"
      ]
    }
  ]
}

RewardCommands: 玩家投票后在控制台执行的命令列表。留空以禁用。支持的占位符:%player% ServiceRewardCommands: 服务奖励命令允许你通过输入服务名称和命令列表,配置仅针对特定投票网站执行的命令。这些命令在你常规的 RewardCommands 之上执行。要禁用,请将其设置为 "ServiceRewardCommands": {} RewardMessages: 直接发送给投票玩家的消息列表。留空以禁用。支持的占位符:%player%, %from% RewardBroadcasts: 有人投票时广播给所有在线玩家的消息列表。留空以禁用。支持的占位符:%player%, %from% BroadcastWhenOffline: 设置为 true 时,即使投票玩家离线,也会向所有玩家发送奖励广播。设置为 false 时,仅当投票玩家在线时才进行广播。 RngRewardsEnabled: RNG(随机)奖励系统的主开关。设置为 true 以在玩家投票时启用随机奖励选择。 RngRewardsNothingChance: 玩家投票时未获得任何 RNG 奖励的概率(0-100)。设置为 0 以禁用。例如,25.0 表示有 25% 的概率什么也得不到。 RngRewards: 玩家投票时可能随机选中的特殊奖励列表。每个奖励都有其自身的百分比概率、命令和消息。百分比按比例运作,无需总和为 100%。 Percentage: 此奖励被选中的相对权重/概率。百分比按比例运作——如果奖励 A 有 10%,奖励 B 有 20%,那么奖励 B 被选中的频率将是奖励 A 的两倍。 Commands: 当此特定 RNG 奖励被选中时执行的命令列表。留空以禁用。支持的占位符:%player% Messages: 直接发送给获得此 RNG 奖励的玩家的消息列表。留空以禁用。支持的占位符:%player%, %from%, %chance% BroadcastMessages: 当此特定 RNG 奖励被选中时,广播给所有在线玩家的消息列表。留空以禁用。支持的占位符:%player%, %from%, %chance%


✨ 通知

投票通知

示例 notification.json:

{
  "Enabled": true,
  "TitleMessage": "<#e2b0ff>收到投票!</#e2b0ff>",
  "TitleColor": "#e2b0ff",
  "DescriptionMessage": "<gray>感谢你在 <#9f44d3>%from%</#9f44d3> 的投票!</gray>",
  "DescriptionColor": "#9f44d3",
  "IconItem": "Ingredient_Voidheart"
}

Enabled: 启用或禁用此功能。 TitleMessage: 通知中显示在顶部的主要消息。 TitleColor: 标题的十六进制颜色。(不再需要,请参阅颜色支持部分) DescriptionMessage: 通知中显示在底部的次要消息。 DescriptionColor: 描述的颜色。(不再需要,请参阅颜色支持部分) IconItem: 在通知左侧渲染的物品名称。可以是服务器上可用的任何 Hytale 物品!


✨ 投票提醒

投票提醒

示例 voteReminder.json:

{
  "Enabled": true,
  "SendOnJoin": true,
  "ExpireAfterHours": 24,
  "DelayInMinutes": 1,
  "Message": "<red><b>注意!</b></red> <gray>你今天还没有投票!使用 <green>'/vote'</green> 投票即可获得免费奖励!</gray>",
  "Title": {
    "Enabled": true,
    "Title": "提醒标题!",
    "SubTitle": "别忘了 /vote 获取免费奖励!",
    "DurationSeconds": 3,
    "FadeInSeconds": 0.5,
    "FadeOutSeconds": 0.5
  },
  "Notification": {
    "Enabled": true,
    "TitleMessage": "<#e2b0ff>提醒通知!</#e2b0ff>",
    "DescriptionMessage": "<gray>别忘了 <#9f44d3>/vote</#9f44d3> 获取免费奖励!</gray>",
    "IconItem": "Tool_Growth_Potion"
  },
  "Sound": {
    "Enabled": true,
    "Sound": "SFX_Player_Pickup_Item",
    "SoundCategory": "UI"
  }
}

Enabled: 启用或禁用此功能。 SendOnJoin: 如果玩家尚未投票,则在玩家进入服务器后立即发送提醒。 ExpireAfterHours: 投票保持有效的时长。如果此时间到期,玩家将再次开始接收提醒。 DelayInMinutes: 提醒消息发送的频率。 Message: 提醒的消息。(留空以禁用)

标题(屏幕顶部中央)

投票提醒标题

通知(右下角)

投票提醒通知


✨ 音效

示例 sound.json:

{
  "Enabled": true,
  "SoundName": "SFX_Portal_Neutral_Open",
  "SoundCategory": "UI"
}

Enabled: 启用或禁用此功能。 SoundName: 用户投票后想要播放的音效。 SoundCategory: 音效的类别。不完全确定具体用途,所以作为可配置选项添加。保留为 UI 以使用所有默认的 Hytale 音效。


✨ 可点击投票链接和自定义 GUI

投票 GUI

示例 voteCommand.json:

{
  "Enabled": true,
  "OpenCustomGui": true,
  "SendChatMessage": true,
  "ChatMessageHeader": [
    "<gray>----------------- <gold><b>我们的投票链接</b></gold> -----------------</gray>",
    "<white>点击投票链接在浏览器中打开。"
  ],
  "ChatMessageFooter": [
    "<gray>----------------- <gold><b>我们的投票链接</b></gold> -----------------</gray>"
  ],
  "ChatMessageTemplate": "<gold>[<yellow>#%id%</yellow>]</gold> <yellow><click:%link%>%name% <b>(点击)</b></click></yellow>",
  "VoteLinks": {
    "HytaleServerList.me": "https://hytaleserverlist.me/download-votifier-for-hytale"
  }
}

Enabled: 启用或禁用此功能。 VoteLinks: 用户访问以为你的服务器投票的链接。你可以对投票链接使用 %player% 占位符,将用户名插入链接中。 OpenCustomGui: 启用时打开自定义 GUI。 SendChatMessage: 启用时发送带有可点击链接的聊天消息。 ChatMessageHeaderChatMessageFooterChatMessageTemplate聊天中的投票链接

点击后会打开一个确认弹窗,并将玩家直接重定向到网站! 链接确认弹窗


✨ 离线投票

示例 offlineVoting.json:

{
  "Enabled": true,
  "MaxClaimAmount": 5,
  "ReminderMessage": "<green>你有 <gold>%offlineVotes%</gold> 个离线投票待领取!使用 <yellow>/claimvotes</yellow> 领取它们!",
  "MaxLifetimeHours": 48,
  "MessageNotInWorld": "<red>你不在世界中!</red>",
  "MessageDisabled": "<red>离线投票已禁用!</red>",
  "MessageNoPlayerRef": "<red>找不到玩家引用!</red>",
  "MessageNoOfflineVotes": "<red>你没有可领取的离线投票!</red>",
  "MessageClaimFailed": "<red>领取投票失败。它们可能已过期。</red>",
  "MessageClaimSuccess": "<green>成功领取了 <gold>%claimedVotes%</gold> 个投票!</green>",
  "MessageRemainingVotes": "<gray>你还有 <gold>%remainingVotes%</gold> 个离线投票。再次使用 <yellow>/claimvotes</yellow> 来领取它们!</gray>"
}

Enabled: 启用或禁用离线投票系统。禁用时,玩家离线时收到的投票将不会被存储。 MaxClaimAmount: 玩家执行一次 /claimvotes 命令可领取的最大离线投票数量。 ReminderMessage: 当玩家加入服务器时,如果有待领取的离线投票,会显示此消息。支持 %offlineVotes% 占位符,代表离线投票数量。 MaxLifetimeHours: 离线投票过期并自动移除前的最长保留时间(小时)。过期的投票无法领取。 MessageNotInWorld: 当玩家尝试领取投票但当前不在世界中时显示的错误消息。 MessageDisabled: 当玩家尝试使用 /claimvotes 但离线投票系统已禁用时显示的错误消息。 MessageNoPlayerRef: 当系统找不到玩家的引用(内部错误)时显示的错误消息。 MessageNoOfflineVotes: 当玩家使用 /claimvotes 但没有可领取的离线投票时显示的消息。 MessageClaimFailed: 领取投票失败时显示的错误消息,通常是由于投票过期或其他错误。 MessageClaimSuccess: 成功领取投票后显示的成功消息。支持 %claimedVotes% 占位符,代表已领取的投票数量。 MessageRemainingVotes: 领取投票后,如果玩家仍有剩余的离线投票,会显示此信息性消息。支持 %remainingVotes% 占位符,代表剩余投票数量。


✨ 投票转发

投票转发工作示例

投票转发让一次投票能在多个 Hytale 服务器上生效。 这对于服务器网络非常有用,因此你所有的服务器都能收到相同的投票奖励。

示例 voteForwarding.json:

{
  "Enabled": true,
  "ForwardingSecret": "RGqLbdYrgUte",
  "SendToTargets": false,
  "ForwardingTargets": [
    {
      "Name": "示例目标",
      "ForwardingSecret": "转发密钥",
      "Address": "localhost",
      "Port": 8195
    }
  ]
}

Enabled: 启用后将监听转发的投票。 ForwardingSecret: 这是 HyVotifier 插件特定实例的密钥。 SendToTargets: 启用后,此实例将尝试将收到的投票转发给所有配置的 ForwardingTargets。 ForwardingTargets: 这是一个 HyVotifier 实例数组。你需要为每个目标输入转发密钥、IP 和端口。 Name: 目标的名称,用于在日志文件中识别。 Forwarding Secret: 目标的转发密钥。 Address: 服务器的 IP 地址。如果服务器运行在同一台机器上,请保留为 localhostPort: 目标的 Votifier 端口。

设置说明

如果你在多台服务器上使用 HyVotifier,每台服务器都需要自己的端口号

1) 为每台服务器分配不同的端口

  • 主服务器: 选择一个端口并将其设为公开(开放)。
  • 其他服务器: 为每台服务器选择不同的端口,但这些端口可以保持私有/关闭

你的主服务器必须能够访问其他服务器的端口(即使这些端口没有公开)。

2) 仅将投票网站连接到你的主服务器

当你在投票网站上添加服务器时:

仅需填写:

  • 你的主服务器IP
  • 你的主服务器端口

除非你清楚自己在做什么,否则不要将其他服务器添加到网站。

3) 密钥 / 令牌(Votifier v1 与 v2)

取决于 Votifier 版本:

Votifier v1

  • 仅使用主服务器public.key

Votifier v2

  • 仅将网站令牌放入主服务器的 config.yml

✨ 投票里程碑

投票里程碑

示例 voteMilestones.json:

{
  "Enabled": true,
  "Milestones": [
    {
      "VoteRequirement": 5,
      "Commands": [
        "give %player% Food_Popcorn --quantity=10"
      ],
      "Messages": [
        "<green>你已达到 5 票!使用 /votemilestone 领取你的奖励!</green> <yellow>你将在 <gold>10 票</gold> 时解锁下一个里程碑!</yellow>"
      ]
    },
    {
      "VoteRequirement": 10,
      "Commands": [
        "give %player% Potion_Health_Small --quantity=5"
      ],
      "Messages": [
        "<green>你已达到 10 票!使用 /votemilestone 领取你的奖励!</green> <yellow>你将在 <gold>25 票</gold> 时解锁下一个里程碑!</yellow>"
      ]
    },
    {
      "VoteRequirement": 25,
      "Commands": [
        "give %player% Ore_Adamantite --quantity=3"
      ],
      "Messages": [
        "<gold>太棒了!25 票!使用 /votemilestone 领取你的奖励!</gold> <yellow>你已经解锁了最后一个里程碑!</yellow>"
      ]
    }
  ],
  "MessageDisabled": "<red>投票里程碑已禁用!</red>",
  "MessageNotInWorld": "<red>你不在世界中!</red>",
  "MessageUIClaimSuccess": "<green>成功领取了 <gold>%votes%</gold> 票的里程碑奖励!</green>",
  "MessageUIClaimError": "<red>无法领取此里程碑。它可能已被领取或尚未解锁。</red>",
  "MessageUIInvalidMilestone": "<red>无效的里程碑!</red>",
  "MessageUINotInWorld": "<red>你不在世界中!</red>",
  "MessageUIStatusClaimed": "[已领取]",
  "MessageUIStatusUnclaimed": "[未领取]",
  "MessageUIStatusLocked": "[已锁定]",
  "MessageMilestoneUnlocked": "<green>你解锁了一个新的投票里程碑(<gold>%votes%</gold> 票)!使用 <yellow>/votemilestone</yellow> 领取你的奖励!</green>",
  "MessageReminderUnclaimed": "<yellow>你有 <gold>%count%</gold> 个未领取的投票里程碑。输入 <green>/votemilestone</green> 领取它们!</yellow>",
  "MessageAdminProgressSet": "<green>已将 %player% 的投票进度设置为 %votes%。已领取的里程碑:%claimed%</green>",
  "MessageAdminMilestoneReset": "<green>已重置 %player% 的里程碑 %milestone% 的领取状态。</green>",
  "MessageAdminMilestoneClaimed": "<green>已将里程碑 %milestone% 标记为 %player% 已领取。</green>",
  "MessageAdminMilestoneUnclaimed": "<green>已将里程碑 %milestone% 标记为 %player% 未领取。</green>",
  "MessageAdminPlayerNotFound": "<red>未找到玩家 %player% 的进度数据。</red>",
  "MessageAdminMilestoneNotFound": "<red>在配置中未找到 %votes% 票的里程碑。</red>",
  "MessageAdminResetAll": "<green>已重置 %player% 所有已领取的里程碑。</green>"
}

✨ 命令

/testvote <player>

权限: votifier.test 描述: 为指定玩家运行模拟投票。用于测试你的配置!

/vote

权限: hsl.votifier.command.vote(自 1.4 版本起无需权限) 描述: 为玩家打开一个投票 GUI,方便复制投票链接!

/claimvotes

权限:描述: 允许用户领取他们累积的离线投票。

/votetop

别名: /vt /vtop /voteleaderboard 权限:描述: 显示服务器上前 10 名投票者。

/votetopadmin

别名: /vta /vtadmin /vtopadmin 权限: hyvotifier.leaderboard.admin 描述: 允许你添加/删除/设置/获取玩家的投票数以及重置排行榜。

/votemilestone

别名: /claimmilestones /vm 权限:描述: 允许用户查看所有里程碑并领取待领取的奖励。

/votemilestoneadmin

别名: /vmadmin 权限: hyvotifier.milestones.admin 描述: 允许你管理用户的里程碑进度和解锁状态。


✨ 面向开发者

以下内容旨在帮助开发者将投票功能集成到他们自己的模组或像 HytaleServerList.me 这样的投票网站中。

🎗️ 自定义事件

当注册投票时,HyVotifier 会触发 PlayerVoteEvent,你可以在自己的模组中监听它。

me.hytaleserverlist.mods.hytalevotifier.event.PlayerVoteEvent

将我们的插件作为你项目的依赖添加,并按如下方式订阅事件:

getEventRegistry().registerGlobal(PlayerVoteEvent.class, (playerVoteEvent) -> {
    // 在这里执行一些操作
});
  • playerVoteEvent.getWorld() - 获取玩家的世界
  • playerVoteEvent.getPlayerRef() - 获取 PlayerRef 对象
  • playerVoteEvent.getVote() - 获取 Vote 对象
me.hytaleserverlist.mods.hytalevotifier.event.AsyncVoteReceivedEvent

此事件在 Votifier 线程上被异步调用。对于任何接收到的投票(包括转发的投票)都会触发,并且不包含玩家引用或世界信息。

  • asyncVoteReceivedEvent.getVote() - 获取 Vote 对象

📩 发送投票

此模组允许你使用 Votifier V1Votifier V2 协议向 Hytale 服务器发送投票。 它支持所有与流行的 NuVotifier 插件相同的已知功能。

NodeJS 投票发送包


🔐 安全性与工作原理

两种投票协议都是安全可靠的,但工作原理略有不同,你需要根据网站的实现来选择使用哪种。有些网站支持 V1 投票,有些支持 V2 投票,还有一些允许你选择自己喜欢的协议版本。

V1 协议(RSA 加密)

V1 协议使用 RSA 密钥对来加密投票。你需要将 rsa/public.key 文件的内容提供给网站。在这种情况下,你无需配置令牌。

  • 服务器所有者向投票网站提供他们的 RSA 公钥(位于 mods/HSL_Votifier/rsa/public.key

V2 协议(令牌/HMAC)

对于使用 V2 协议的网站,你需要配置一个令牌。网站会为你提供一个 serviceNametoken(有些网站允许你选择自己的令牌)。然后你可以将它们添加到你的 config.yml 中,如下所示:

"Tokens": {
    "<网站提供的服务名称>": "<网站提供的令牌/密钥>"
}

防火墙配置

如果你仍然无法收到投票网站发送的投票,很可能是你的 Votifier 端口不允许接收 TCP 流量 —— 也就是说端口是关闭的

要验证这一点,你可以使用端口检查网站,例如:https://ping.eu/port-chk/ 只需输入你的 Votifier IPVotifier 端口,然后点击 Go。如果你看到类似 “…… 端口已关闭” 的消息,则投票网站将无法连接到你的 Votifier 插件。

在这种情况下,你需要开放 Votifier 端口并允许 TCP 流量

如果你在使用带有终端/操作系统访问权限的 VPS 或专用服务器,可以使用以下任一命令:

sudo ufw allow <VOTIFIER_PORT>/tcp

或:

sudo iptables -A INPUT -p tcp --dport <VOTIFIER_PORT> -j ACCEPT

如果你正在使用游戏服务器托管商,则需要检查托管面板中的防火墙设置,或联系他们的支持团队,请求为 Votifier 通信额外开放一个端口。


✨ 鸣谢

详细文档请访问:https://hytaleserverlist.me/download-votifier-for-hytale

查看 Minecraft 版 NuVotifier:https://github.com/NuVotifier/NuVotifier

TaleMessage:https://github.com/InsiderAnh/TaleMessage

用于公共贡献的公共仓库将在接下来几天内建立。祝愉快!❤️