安装与配置
Snow-Welcome
新玩家第一次进服时全服广播一条带点击按钮的欢迎消息,其他玩家点击(或输入 /welcome <玩家名>)来欢迎他,欢迎者获得奖励。
环境要求
| 项目 | 要求 |
|---|---|
| 服务端 | Paper 及其衍生(Leaves、Purpur 等) |
| 版本 | 1.21+(api-version: 1.13,实际用到 Adventure API) |
| 硬依赖 | Vault(写在 depend 里,不装插件不会启动) |
| 奖励依赖 | 按你配的奖励命令而定,如 Essentials(money)、PlayerPoints(points) |
plugin.yml 里写了 depend: [Vault],服务器上没有 Vault 插件时 Snow-Welcome 根本不会加载。但插件代码本身没有调用 Vault API——发钱是靠 Bukkit.dispatchCommand 执行你配置的命令。也就是说 Vault 只是个必须存在的门槛,实际发钱依赖的是你配的那条命令对应的插件。安装
- 把 jar 放进
plugins/ - 启动服务器,插件会释放
plugins/Welcome/config.yml - 控制台出现
Welcome enabled! Author: SnowyMC即成功
插件目录下会生成两个文件:
plugins/Welcome/
├── config.yml # 全部配置
└── data.yml # 新玩家记录与「谁欢迎过谁」
工作流程
新玩家首次加入
插件检查 data.yml 里有没有这个 UUID。没有就登记(记下名字与加入时间戳),然后按 welcome-message 全服广播。
其他玩家点击「点我欢迎新玩家」
按钮实际执行的是 /welcome <新玩家名>,等同于手动输入。
校验四件事
依次检查:目标玩家在线、不是欢迎自己、目标在 data.yml 里登记过、距离登记时间没超过 welcome-limit-seconds、自己没欢迎过这个人。
发奖 + 代替欢迎者发言
任一校验失败就发对应提示并中止。全部通过则先发奖励,再从 sender-messages 随机抽一条以欢迎者身份发到聊天。
config.yml 全部字段
welcome-message: |
<white>————————————————
<white>⻬:offset_-1:⻭
<white>
<green>欢迎新玩家 <player> 加入服务器!</green>
<red><click:run_command:/welcome <player>> [点我欢迎新玩家]</click></red>
<white>————————————————
sender-messages:
- "厥新人!厥新人!厥新人!!"
# - "<player> 来啦,欢迎欢迎!"
# - "新人 <player>,多多关照!"
welcome-limit-seconds: 90
welcome-limit-seconds-message: "§c时间过了!"
welcomed: "§c你已经欢迎过该玩家了!"
not-new: "§c不是新玩家或过期了"
rewards:
money:
enable: true
min: 100
max: 800
command: "money give %player% %amount%"
playerpoints:
enable: true
min: 1
max: 2
command: "points give %player% %amount%"
command:
enable: true
commands:
- "titlemsg %sender% -in:10 -out:10 -keep:20 \n⻪:offset_-1:⻫"
| 字段 | 类型 | 说明 |
|---|---|---|
welcome-message | 文本(多行) | 新人加入时的全服广播,MiniMessage 格式 |
sender-messages | 列表 | 欢迎成功后,随机抽一条以欢迎者身份发到聊天 |
welcome-limit-seconds | 整数 | 新人加入后多少秒内可以被欢迎,默认 90 |
welcome-limit-seconds-message | 文本 | 超时提示,§ 颜色码 |
welcomed | 文本 | 重复欢迎同一人的提示 |
not-new | 文本 | 目标不在新人记录里的提示 |
rewards.money.* | — | 见下文 |
rewards.playerpoints.* | — | 见下文 |
rewards.command.* | — | 见下文 |
welcome-message 走 MiniMessage(<green>、<click:run_command:...> 这类标签);而四条提示消息(welcomed、not-new 等)是直接原样发送的,只能用 § 传统颜色码。两套语法不通用,别弄混。欢迎消息里的可点击按钮
默认配置里那行是关键:
<red><click:run_command:/welcome <player>> [点我欢迎新玩家]</click></red>
<player> 会被替换成新玩家的名字,所以点击就等于执行 /welcome 那个新人。想改按钮文字只改 [点我欢迎新玩家] 部分,<click:run_command:...> 结构别动。
想加悬浮提示:
<red><hover:show_text:'<gray>点一下就有奖励哦'><click:run_command:/welcome <player>> [点我欢迎新玩家]</click></hover></red>
奖励配置
三类奖励互相独立,可以只开其中一部分,也可以全开(会一起发)。
金币与点券:随机数额
rewards:
money:
enable: true
min: 100 # 最小值
max: 800 # 最大值(含)
command: "money give %player% %amount%"
插件在 min ~ max 之间抽一个整数,替换进命令后以控制台身份执行。
| 占位符 | 替换为 |
|---|---|
%player% | 欢迎者的名字(不是新玩家) |
%amount% | 本次随机出的数额 |
max 小于 min 时不会报错,而是直接取 min。两个都填 0 就是固定发 0,等于白跑一条命令——不想发就把 enable 设成 false。money 与 playerpoints 这两个键名只是分类标签,实际发什么完全由 command 决定。你可以把 playerpoints 那条改成任何命令,比如发经验:
playerpoints:
enable: true
min: 50
max: 200
command: "experience add %player% %amount%"
自定义命令:固定内容
rewards:
command:
enable: true
commands:
- "titlemsg %sender% -in:10 -out:10 -keep:20 \n⻪:offset_-1:⻫"
- "give %sender% diamond 1"
- "broadcast &e%sender% &f欢迎了新人 &b%newplayer%"
这一组按顺序全部执行,没有随机数额,占位符也不同:
| 占位符 | 替换为 |
|---|---|
%sender% | 欢迎者的名字 |
%newplayer% | 被欢迎的新玩家名字 |
%player% 在这一组里不生效——它只用于 money 和 playerpoints。自定义命令组用的是 %sender%。这是最容易配错的地方:写了 %player% 不会报错,命令会带着字面的 %player% 执行然后失败。全部命令都以控制台身份执行,所以不受玩家权限限制。
命令与权限
| 命令 | 用法 | 权限 |
|---|---|---|
/welcome <玩家名> | 欢迎一个新玩家 | 无权限节点 |
插件没有定义任何权限节点,/welcome 所有人都能用。这符合设计——它本来就是给全服玩家点的按钮。
config.yml 需要重启服务器,或用第三方插件(如 PlugManX)重载 Welcome。data.yml 数据结构
new-players:
069a79f4-44e9-4726-a5be-fca90e38aaf5:
name: Notch
join-time: 1754000000000
welcomed-by:
- 853c80ef-3c37-49fd-aa49-938b674adae6
| 字段 | 含义 |
|---|---|
| 顶层键 | 新玩家的 UUID |
name | 当时的玩家名(仅供人看,逻辑不用它) |
join-time | 首次加入的毫秒时间戳,超时判定基于它 |
welcomed-by | 欢迎过他的玩家 UUID 列表,用于防重复 |
数据在插件关闭时保存,每次登记与欢迎也会立即写盘。
data.yml 会持续变大。它只用于「是否新人」与「超时判定」,超过 welcome-limit-seconds 的记录实际已无用——需要瘦身可以在停服时手动删掉旧条目。data.yml,不是服务器的 hasPlayedBefore。 所以删掉 data.yml 后,所有老玩家下次进服都会被当成新人广播一遍。迁移服务器或清理数据时注意这一点。已知限制
| 现象 | 说明 |
|---|---|
默认 data.yml 里有 players: [] | 插件释放的模板残留,代码从不读它。可以忽略,也可以删掉 |
没有 /welcome reload | 改配置要重启,或用 PlugManX 之类重载 |
| 没有权限节点 | /welcome 对所有人开放 |
| 奖励发给欢迎者 | 新玩家本人不会获得任何奖励,插件没有这个功能 |
| Vault 装了但没被调用 | 硬依赖,必须装;实际发钱靠你配的命令 |
排错
新人进服没有广播
- 确认这个 UUID 不在
data.yml的new-players下(他可能之前进过服) - 确认
welcome-message不是空的——留空会直接跳过广播,不报错
点击按钮提示「不是新玩家或过期了」
目标 UUID 不在 data.yml 里。常见于服务器重启后 data.yml 未正确保存,或点的是老玩家。
点击按钮提示「时间过了」
超过 welcome-limit-seconds(默认 90 秒)。想放宽就调大这个值。
奖励没发出来
奖励是以控制台身份执行命令,所以要先确认:
- 那条命令在控制台手动敲能不能成功(比如
money give Notch 100) - 对应插件是否安装(
money需要经济插件,points需要 PlayerPoints) - 占位符是否用对:
money/playerpoints用%player%,command组用%sender%
欢迎者的发言没出现在聊天里
sender-messages 是通过让玩家「说话」实现的,会被聊天插件、静音、聊天频道等机制影响。若消息渲染后开头是 /,插件会自动加一个零宽字符防止被当成命令执行。