指令用法
LyCamp 是一个以阵营对抗为核心的 PVP 插件。玩家加入阵营后,可以在指定 PVP 世界内与敌对阵营玩家战斗,通过击杀获得当前声望和累计声望,并根据累计声望获得称号与阵营属性。
插件使用 /lyzy 作为主命令。项目以 Paper API 1.16.5-R0.1-SNAPSHOT 编译,代码与构建目标使用 Java 8。项目未在 plugin.yml 中声明命令权限,当前指令实现统一要求发送者为 OP。
依赖与兼容
| 项目 | 说明 |
|---|---|
| Paper API | 项目编译目标为 1.16.5-R0.1-SNAPSHOT。 |
| PlaceholderAPI | 可选。用于提供 LyCamp 变量,也用于处理部分指令和称号命令中的 PlaceholderAPI 变量。 |
| ProtocolLib | 可选。安装后启用更底层的玩家攻击拦截;未安装时仍会使用 Bukkit 伤害事件处理 PVP 逻辑。 |
| 属性插件 | 可选。支持 AttributePlus、SX-Attribute2、SX-Attribute3、AttributeSystem 和 ItemLoreOrigin。 |
| LyMySQLCore | 使用 MySQL 存储时必须安装,并且必须成功连接数据库;否则 MySQL 存储和相关玩家数据功能不会生效。 |
attribute-plugin 修改后需要重启服务器才能切换属性插件。
指令总览
<> 表示必填参数。玩家名称、阵营名称和世界名称必须使用当前服务器中的实际名称。
| 指令 | 权限 | 说明 |
|---|---|---|
/lyzy | OP | 查看指令帮助。 |
/lyzy reload | OP | 重载配置、阵营、PVP 世界和 PlaceholderAPI 变量默认文本,同时重新启动自动保存与每日刷新任务。 |
/lyzy tp <玩家> <世界名> | OP | 将在线玩家传送到指定 PVP 世界中该玩家所属阵营的重生点。 |
/lyzy setcamp <玩家> <阵营> | OP | 设置在线玩家的阵营。阵营必须已在 camp 配置中定义。 |
/lyzy setcamp <玩家> null | OP | 让玩家退出阵营,并清空当前声望、累计声望、今日声望额度和每日刷新记录。 |
/lyzy givec <玩家> <值> | OP | 增加玩家的累计声望。 |
/lyzy takec <玩家> <值> | OP | 扣除玩家的累计声望。 |
/lyzy setc <玩家> <值> | OP | 设置玩家的累计声望。 |
/lyzy given <玩家> <值> | OP | 增加玩家的当前声望,同时增加累计声望并扣除今日可获得额度。 |
/lyzy taken <玩家> <值> | OP | 扣除玩家的当前声望,不返还今日可获得额度,也不会扣除累计声望。 |
/lyzy setn <玩家> <值> | OP | 设置玩家的当前声望。增加时会受到今日额度、当前声望上限和累计声望上限限制。 |
所有涉及玩家的指令都要求目标玩家在线,并且玩家数据已经加载完成。
基础指令
查看帮助
text
/lyzy只有 OP 执行时会显示帮助内容。未验证完成时,插件客户端部分仅显示重载提示;验证通过后由核心模块注册完整指令处理逻辑。
重载配置
text
/lyzy reload重载内容包括:
config.yml;camp阵营配置;pvp-worldPVP 世界配置;- PlaceholderAPI 变量默认文本;
- 自动保存任务;
- 每日声望额度刷新任务。
如果修改了 attribute-plugin,不能只执行重载,需要重启服务器。
设置阵营
text
/lyzy setcamp <玩家> <阵营>
/lyzy setcamp <玩家> null加入已配置阵营时,玩家会收到加入阵营提示,并开始使用该阵营的数据。
退出阵营时,插件会清空以下数据:
- 当前声望;
- 累计声望;
- 今日可获得声望额度;
- 每日刷新时间记录。
退出阵营不会删除阵营配置,也不会影响其他玩家。
传送到 PVP 世界
text
/lyzy tp <玩家> <世界名>该指令会检查:
- 玩家在线且数据已加载;
- 玩家拥有阵营;
- 世界已经配置在
pvp-world中; - 该 PVP 世界存在玩家所属阵营的重生点。
满足条件后,玩家会被传送到对应阵营的重生点。该指令使用配置中的重生点,不是普通世界出生点。
声望指令
LyCamp 保存三类与声望相关的数据:累计声望、当前声望和今日可获得额度。
累计声望
累计声望用于判断累计声望区间、称号、称号属性和称号首次达成指令。累计声望上限取当前阵营 prestige 配置区间中的最大值。
| 指令 | 处理方式 |
|---|---|
/lyzy givec <玩家> <值> | 增加累计声望,不能通过负数减少;超过阵营上限时按上限处理。 |
/lyzy takec <玩家> <值> | 扣除累计声望,最低为 0。 |
/lyzy setc <玩家> <值> | 直接设置累计声望,低于 0 时按 0 处理,超过阵营上限时按上限处理。 |
累计声望增加并跨过某个 prestige 区间的起始值时,会执行该区间的 command。降低累计声望不会重复执行称号指令。
当前声望
当前声望是玩家当前可使用的阵营声望。当前声望的增加会同步增加累计声望,并消耗今日可获得额度;当前声望的扣除只影响当前声望。
| 指令 | 处理方式 |
|---|---|
/lyzy given <玩家> <值> | 增加当前声望,同时增加累计声望并消耗今日可获得额度。 |
/lyzy taken <玩家> <值> | 扣除当前声望,最低为 0。 |
/lyzy setn <玩家> <值> | 设置当前声望。目标值高于当前值时按增加处理,低于当前值时按扣除处理。 |
增加当前声望时同时受到以下限制:
- 今日剩余额度不能为
0; - 当前声望不能超过阵营累计声望区间的最大值;
- 累计声望不能超过阵营上限;
- 实际增加值可能小于指令中的目标值或增加值。
今日额度按服务器默认时区的每日 0 点刷新。阵营可以通过 every-day-max-get-prestage-value 为默认值或拥有指定权限的玩家配置不同额度。
PVP 世界机制
在 pvp-world 中配置的世界会启用 LyCamp 的 PVP 世界规则。
阵营对战
攻击发生在已配置的 PVP 世界时,插件会检查:
- 攻击者和目标的玩家数据是否已加载;
- 攻击者是否拥有有效阵营;
- 目标是否拥有有效阵营;
- 目标阵营是否属于攻击者阵营的
hostiles; - 当前时间是否处于该世界的 PVP 时间段。
未通过检查时,攻击会被取消。无阵营玩家不能在该 PVP 世界内正常攻击或受到阵营 PVP 伤害。
PVP 时间段
pvp-start-time 和 pvp-end-time 使用 Quartz 六字段 Cron 表达式:
yaml
pvp-start-time: '0 0 9 * * ?'
pvp-end-time: '0 0 18 * * ?'示例配置表示每天 09:00 至 18:00 之间开放阵营 PVP。非开放时间攻击玩家会被取消,并发送 not-pvp-message 中配置的消息。
进入与离开世界
当 must-have-camp-to-teleport 为 true 时,没有阵营或没有对应重生点的玩家不能传送进入该 PVP 世界。
从 PVP 世界传送到其他世界时,非 OP 玩家会被阻止。配置注释中说明,玩家在 PVP 世界内通常不能自行传出;需要由 OP 使用指令强制传送。
PVP 世界内的指令限制
非 OP 玩家在 PVP 世界内默认不能使用指令。只有以 allow-command 中配置的字符串开头的指令可以使用。
yaml
allow-command:
- '/say'该配置按指令前缀匹配,不是权限列表。OP 不受此限制。
击杀、死亡与掉落
声望变化
在 PVP 时间内于配置的 PVP 世界击杀敌对阵营玩家时:
- 击杀者增加
kill-give-prestige配置值的当前声望; - 增加当前声望时同步增加累计声望,并消耗今日额度;
- 被击杀者扣除
dead-take-prestige配置值的当前声望; - 击杀者当天第一次击杀敌对阵营玩家时,执行所属阵营的
every-day-first-kill-run-command; - 击杀记录按服务器默认时区的日期判断。
非击杀方式死亡或在 PVP 世界内退出游戏时,在 PVP 时间内会执行死亡掉落处理,并扣除配置的当前声望。
强制掉落物品
force-drop-item-lore 用于筛选可能被强制掉落的背包物品。插件会检查玩家背包前 36 个格子,只要物品 Lore 中包含配置文本,就会进入候选列表。
随后按照 force-drop-item-amount 随机选择物品掉落。该数量按背包格子计算,选中的格子中的整组物品都会掉落。
yaml
force-drop-item-lore:
- '&6在PVP地图内死亡可能掉落'independent-of-the-world-force-drop-item-lore 用于配置必定掉落的物品。匹配到的物品不受 force-drop-item-amount 数量限制,只要符合 Lore 就会掉落。
yaml
independent-of-the-world-force-drop-item-lore:
- '&6在PVP地图内死亡&c必定&6掉落'击杀死亡和异常死亡使用不同的掉落提示:
| 配置键 | 使用场景 |
|---|---|
drop-item-message | 玩家被其他玩家击杀。支持 {killer} 和 {camp}。 |
abnormal-death-drop-item-message | 玩家意外死亡或在 PVP 世界内退出游戏。 |
掉落物提示中的物品会逐项列出。必定掉落的物品会额外显示“必定掉落”标识。
配置文件
配置文件为 plugins/LyCamp/config.yml。以下配置键均来自项目默认配置或代码读取逻辑。
placeholder
用于配置 PlaceholderAPI 变量在无有效数据时的返回文本。
| 配置键 | 说明 |
|---|---|
placeholder.no-camp | 无阵营时显示的文本。 |
placeholder.no-tag | 无称号时显示的文本。 |
placeholder.has-first-kill | 今日首杀尚未完成时显示的文本。 |
placeholder.not-first-kill | 今日首杀已经完成时显示的文本。 |
attribute-plugin
用于选择属性接入方式,可填写以下值:
| 值 | 属性插件 |
|---|---|
AttributePlus | AttributePlus。 |
SX-Attribute2 | SX-Attribute2。 |
SX-Attribute3 | SX-Attribute3。 |
AttributeSystem | AttributeSystem。 |
ItemLoreOrigin | ItemLoreOrigin。 |
| 空字符串 | 不接入上述属性插件。 |
阵营基础属性和累计声望区间属性会合并后同步到所选属性插件。
message
用于配置加入阵营、声望变化、PVP 限制和传送限制等消息。支持的消息键如下:
| 配置键 | 说明 |
|---|---|
message.join-camp | 加入阵营提示,支持 {camp}。 |
message.quit-camp | 退出阵营提示,支持 {camp}。 |
message.give-prestige | 获得当前声望提示,支持 {value}、{today_value}。 |
message.take-prestige | 失去当前声望提示,支持 {value}。 |
message.today-max-prestige | 今日额度达到上限时提示。 |
message.cumulative-max-prestige | 累计声望达到上限时提示,支持 {value}。 |
message.target-not-camp | 目标没有有效阵营时提示。 |
message.player-not-camp | 攻击者没有有效阵营时提示。 |
message.must-have-camp-to-teleport | 无法进入 PVP 世界时提示。 |
message.allow-command | PVP 世界内禁止使用指令时提示。 |
消息使用 & 颜色代码,发送给玩家时会转换为 Minecraft 颜色代码。
mysql
用于启用 MySQL 玩家数据存储。开启或关闭数据库需要重启服务器。
yaml
mysql:
enable: false
databasename: mc2
username: mc2
password: mc1234
port: 3306
ip: 127.0.0.1| 配置键 | 说明 |
|---|---|
mysql.enable | 是否启用 MySQL 存储。 |
mysql.databasename | 数据库名称。 |
mysql.username | 数据库用户名。 |
mysql.password | 数据库密码。 |
mysql.port | 数据库端口。 |
mysql.ip | 数据库地址。 |
必须安装 LyMySQLCore,并且 LyMySQLCore 成功连接数据库后,MySQL 玩家数据加载与保存才会生效。连接失败时,配置了 MySQL 的服务器会阻止玩家进入。
关闭 MySQL 后,玩家数据会保存到:
text
plugins/LyCamp/data/<玩家UUID>.ymlpvp-world
每个键代表一个 PVP 世界名称。
yaml
pvp-world:
'pvp_world':
force-drop-item-amount: 2
drop-item-message:
- '&7您被 &c{camp} &7阵营的 &c{killer} &7所击杀, 您身上的如下物品已掉落在地:'
abnormal-death-drop-item-message:
- '&7您意外死亡或离线, 您身上的如下物品已掉落在地:'
pvp-start-time: '0 0 9 * * ?'
pvp-end-time: '0 0 18 * * ?'
not-pvp-message:
- '&7不在可PVP时间内,无法造成伤害!'
respawn-location:
潜伏者: '100,100,100,0,0'
保卫者: '-100,100,-100,0,0'
kill-give-prestige: 1
dead-take-prestige: 1
must-have-camp-to-teleport: true
allow-command:
- '/say'| 配置键 | 说明 |
|---|---|
pvp-world.<世界名>.force-drop-item-amount | 被筛选为可能掉落的物品中,随机掉落的背包格子数量。 |
pvp-world.<世界名>.drop-item-message | 被玩家击杀时的掉落提示,支持 {killer}、{camp}。 |
pvp-world.<世界名>.abnormal-death-drop-item-message | 非玩家击杀或退出游戏时的掉落提示。 |
pvp-world.<世界名>.pvp-start-time | PVP 开始时间,使用 Quartz 六字段 Cron 表达式。 |
pvp-world.<世界名>.pvp-end-time | PVP 结束时间,使用 Quartz 六字段 Cron 表达式。 |
pvp-world.<世界名>.not-pvp-message | 非 PVP 时间攻击玩家时发送的消息列表。 |
pvp-world.<世界名>.respawn-location.<阵营> | 阵营重生点,格式为 x,y,z,yaw,pitch。 |
pvp-world.<世界名>.kill-give-prestige | 击杀敌对阵营玩家时增加的当前声望。 |
pvp-world.<世界名>.dead-take-prestige | 死亡时扣除的当前声望。 |
pvp-world.<世界名>.must-have-camp-to-teleport | 是否要求玩家拥有阵营和对应重生点才能进入世界。 |
pvp-world.<世界名>.allow-command | PVP 世界内允许使用的指令前缀列表。 |
配置注释中使用的 <世界名>、<阵营> 仅表示配置路径中的替换部分,实际填写时不要保留尖括号。
camp
每个键代表一个阵营名称。
yaml
camp:
潜伏者:
attribute:
- '攻击力+5'
hostiles:
- '保卫者'
prestige:
1-1000:
tag: '&6潜伏者新人'
attribute:
- '攻击力+10'
command:
- '[console]tell %player_name% 你获得了称号: {tag}'
every-day-max-get-prestage-value:
default: 1000
vip_1: 2000
every-day-first-kill-run-command:
- '[console]tell %player_name% 你第一次击杀了敌对玩家'| 配置键 | 说明 |
|---|---|
camp.<阵营>.attribute | 加入阵营后获得的基础属性列表。 |
camp.<阵营>.hostiles | 允许在 PVP 世界内攻击的敌对阵营列表。 |
camp.<阵营>.prestige | 累计声望区间、称号、区间属性和首次达到区间时执行的指令。 |
camp.<阵营>.every-day-max-get-prestage-value | 每日可获得声望额度。 |
camp.<阵营>.every-day-first-kill-run-command | 每日首次击杀敌对阵营玩家时执行的指令列表。 |
prestige 区间
区间键可以使用 最小值-最大值,也可以使用单个数字。区间中的配置键如下:
| 配置键 | 说明 |
|---|---|
tag | 该累计声望区间对应的称号。 |
attribute | 处于该累计声望区间时获得的属性列表。 |
command | 玩家首次达到该区间时执行的指令列表。 |
command 支持以下前缀:
| 前缀 | 执行方式 |
|---|---|
[op] | 临时以 OP 身份执行玩家指令。 |
[console] | 以控制台身份执行指令。 |
| 无前缀 | 以玩家身份执行指令。 |
指令会先处理 PlaceholderAPI 变量,并支持 {tag} 替换为当前区间称号。
每日额度
every-day-max-get-prestage-value 的默认额度为 1000。除 default 外的键会转换为权限节点:配置键中的下划线 _ 会替换为点号 .。
yaml
every-day-max-get-prestage-value:
default: 1000
vip_1: 2000上例中,vip_1 对应权限 vip.1。玩家拥有该权限且其额度高于默认值时,使用该额度。
PlaceholderAPI 变量
安装并启用 PlaceholderAPI 后,LyCamp 注册的变量前缀为 lyzy。
变量格式如下:
text
%lyzy_<变量名>%| 变量 | 返回内容 |
|---|---|
%lyzy_camp% | 当前阵营。无阵营时返回 placeholder.no-camp。 |
%lyzy_tag% | 当前累计声望区间称号。无阵营、阵营不存在或没有匹配区间时返回 placeholder.no-tag。 |
%lyzy_max_cumulative_prestige% | 当前阵营的累计声望上限。无有效阵营时返回 0。 |
%lyzy_cumulative_prestige% | 当前累计声望。无有效阵营时返回 0。 |
%lyzy_now_prestige% | 当前声望。无有效阵营时返回 0。 |
%lyzy_today_prestige% | 今日剩余可获得声望额度。无有效阵营时返回 0。 |
%lyzy_max_today_prestige% | 当前玩家每日可获得声望上限。无有效阵营时返回 0。 |
%lyzy_first_kill% | 今日首杀状态,文本由 placeholder.has-first-kill 和 placeholder.not-first-kill 配置。 |
玩家数据尚未加载时,变量请求会返回空字符串。
数据保存
未启用 MySQL 时,玩家数据保存为独立 YAML 文件,路径为:
text
plugins/LyCamp/data/<玩家UUID>.yml保存字段包括:
| 字段 | 说明 |
|---|---|
camp | 玩家阵营。 |
cumulative-prestige-value | 累计声望。 |
now-prestige-value | 当前声望。 |
today-prestige-value | 今日剩余可获得声望额度。 |
last-refresh-time | 上次每日额度刷新时间。 |
last-kill-time | 上次完成每日首杀的时间。 |
启用 MySQL 后,数据写入 LyCamp 对应的数据表,表中保存玩家名称和 YAML 序列化数据。玩家加入、退出、被踢出服务器和服务器关闭时会触发保存;数据发生变化后也会由自动保存任务异步保存。
常见问题
玩家无法进入 PVP 世界
检查以下内容:
- 玩家是否已经加入阵营;
- PVP 世界是否已配置在
pvp-world下; - 玩家所属阵营是否配置了该世界的
respawn-location; must-have-camp-to-teleport是否为true;- 玩家数据是否已经加载完成。
玩家无法攻击目标
检查以下内容:
- 攻击者和目标是否都有有效阵营;
- 目标阵营是否位于攻击者阵营的
hostiles列表; - 当前时间是否在
pvp-start-time与pvp-end-time之间; - 当前世界名称是否与
pvp-world下的配置键完全一致。
MySQL 已开启但玩家数据功能不生效
LyCamp 的 MySQL 模式必须同时满足以下条件:
- 已安装 LyMySQLCore;
- LyMySQLCore 已成功连接数据库;
mysql.enable已设置为true;- 数据库地址、端口、库名、用户名和密码正确;
- 重启服务器使数据库模式生效。
如果数据库未连接成功,LyCamp 会阻止玩家进入服务器,并在控制台输出连接失败信息。
当前声望增加后为什么累计声望也增加
当前声望的增加会同步增加累计声望,并消耗今日可获得额度。这是 given、setn 增加值和 PVP 击杀奖励的统一处理逻辑。
退出阵营后数据是否保留
不保留。执行 /lyzy setcamp <玩家> null 后,当前声望、累计声望、今日额度和每日刷新记录都会清零。
为什么配置了属性但玩家没有获得
检查以下内容:
attribute-plugin是否填写了受支持的值;- 对应属性插件是否已安装并启用;
- 修改
attribute-plugin后是否重启服务器; - 阵营的
attribute和prestige.<区间>.attribute是否填写正确。
PVP 世界内为什么不能使用指令
非 OP 玩家在 PVP 世界内默认禁止使用所有指令。只有指令文本以 allow-command 中某一项开头时才允许执行,例如配置 /say 后允许以 /say 开头的指令。