Skip to content

定时刷新 ​

LyPlaceholder 可以按固定间隔或指定日期刷新玩家变量与服务器变量。刷新规则分别存放在以下目录:

规则类型配置目录作用范围
玩家规则plugins/LyPlaceholder/playerPlaceholderRefresh每名玩家独立保存和刷新
服务器规则plugins/LyPlaceholder/serverPlaceholderRefresh全服共用一份变量数据

两个目录都会递归读取子目录中的 .yml 文件,一个文件可以包含多条规则。

插件只会跳过完整文件名为 示例玩家变量刷新配置_不会启用.yml 和 示例系统变量刷新配置_不会启用.yml 的内置示例。其他 .yml 文件即使名称中包含“示例”,也会正常载入。

规则结构 ​

刷新配置的顶层节点名称是规则 ID。实际写入的变量 ID 由 script 中的 设置值() 决定,规则 ID 与变量 ID 不需要相同。

yaml
规则ID:
  enable: true
  trigger-time:
    - '每隔 30m'
  condition: []
  script: |-
    设置值("变量ID", 0)
  message: []
  command: []
配置项玩家规则服务器规则说明
enable可用可用是否启用规则,省略时默认为 true
trigger-time必填必填触发时间列表,至少填写一条
condition可选忽略玩家刷新条件,多条条件必须全部满足
script必填必填刷新时执行的非空脚本
message可选可选每个变量写入后发送的消息列表
command可选可选每个变量写入后执行的命令列表

规则 ID 和变量 ID 只能包含中文、字母、数字、下划线或短横线。变量 ID 最长为 128 个字符,规则 ID 最长为 127 个字符。

同一作用域内不能出现重复的规则 ID,包括不同文件或不同子目录中的规则。玩家规则与服务器规则属于不同作用域,可以使用相同的规则 ID。

旧版 value 配置已经移除。规则中出现 value 时会导致重载失败,必须改用脚本中的 设置值()。

玩家规则 ​

玩家规则会为每名玩家分别读取和写入变量,可以通过 condition 限制需要执行刷新的玩家。

yaml
每日积分刷新:
  enable: true
  trigger-time:
    - '定时:每天 00:00'
  condition:
    - 'permission: lyplaceholder.daily'
  script: |-
    设置值("每日积分", 0)
  message:
    - '&a每日积分已刷新为 &f{value}'
  command: []

玩家必须在线且变量数据已经加载完成,规则才会在触发时处理该玩家。

玩家条件 ​

condition 中的条件必须全部满足。条件类型和参数之间必须使用半角英文冒号。

格式通过条件
permission: 权限节点玩家拥有指定权限
nopermission: 权限节点玩家没有指定权限
papi: 判断表达式PlaceholderAPI 表达式计算结果为真
yaml
condition:
  - 'permission: lyplaceholder.example.enable'
  - 'nopermission: lyplaceholder.example.blocked'
  - 'papi: %player_level% >= 5'

papi: 条件支持比较、数学运算以及逻辑组合,例如:

yaml
condition:
  - 'papi: %player_level% >= 5 && %player_level% < 10'

玩家规则使用 PAPI 条件时,需要服务器已经启用 PlaceholderAPI。如果 PlaceholderAPI 暂时不可用,插件不会将本次触发记录为已经处理,依赖恢复后仍可重新检测和补偿。

服务器规则 ​

服务器规则修改全服共用的服务器变量,不读取、校验或判断 condition。即使配置了 condition,也会直接忽略。

yaml
活动状态刷新:
  enable: true
  trigger-time:
    - '定时:每周 周一 09:00'
  script: |-
    设置值("活动状态", "已开启")
    全服消息("&e本周活动已经开启")
    控制台指令("say 本周活动已经开启")
  message: []
  command: []

服务器脚本没有当前玩家上下文,只能读取服务器变量旧值。不要在服务器脚本中依赖玩家 PlaceholderAPI 变量,也不要使用 玩家消息()、玩家指令() 或 OP指令()。

服务器规则脚本可以使用 全服消息() 和 控制台指令()。其中脚本只执行一次,不需要为在线玩家重复调用。

规则节点中的 message 和 command 属于刷新后的玩家动作。服务器规则执行这些列表时,会遍历全部在线玩家,并针对脚本写入的每个变量分别执行。因此需要全服只执行一次的消息或命令时,优先写在脚本中。

触发时间 ​

trigger-time 是字符串列表,可以填写多条表达式。任意一条到达时间都会触发规则。

固定间隔 ​

写法说明
每隔 30s每隔 30 秒
每隔 5m每隔 5 分钟
每隔 2h每隔 2 小时
每隔 1d每隔 1 天

每隔 后必须填写正整数和小写单位:

单位含义
s秒
m分钟
h小时
d天

指定日期 ​

写法说明
定时:每天 12:00每天指定时间
定时:每天 12:00:30每天指定时间,精确到秒
定时:每周 周一 09:00每周指定一天
定时:每周 周一,周三,周五 09:00每周指定多天
定时:每周 周一至周五 09:00每周指定连续日期范围
定时:每月 3号 12:00每月指定一天
定时:每月 1号,15号,最后一天 12:00每月指定多天或最后一天
定时:每月 1-5号 12:00每月指定连续日期范围
定时:每年 1月 1日 00:00每年指定日期

每天、每周、每月和每年表达式均支持 HH:mm 或 HH:mm:ss。

星期可以使用以下写法:

  • 周一 至 周日、周天
  • 星期一 至 星期日、星期天

列表逗号支持半角 , 和全角 ,。范围分隔符支持 ~、~、至、- 和 -。

定时: 前缀和时间中的冒号必须使用半角英文冒号。时间格式错误会使本次配置重载失败,原有刷新任务继续运行。

刷新脚本 ​

每条规则都必须提供非空的 script 字符串,建议使用 YAML 多行文本 |-。

yaml
script: |-
  设置值("累计次数", 数字(变量值("累计次数")) + 1)
  if (数字(变量值("累计次数")) >= 10) {
    设置值("阶段", "高级")
  } else {
    设置值("阶段", "普通")
  }

脚本只通过 设置值("变量ID", 内容) 创建或更新变量。同一脚本可以写入多个变量;同一个变量被设置多次时,以最后一次设置的值为准。

脚本没有调用 设置值() 时不会修改变量。规则节点中的 message 和 command 也不会执行,因为这两类动作会针对本次脚本实际写入的变量逐个处理。

变量值() 读取的是脚本执行前的变量快照。同一脚本中先调用 设置值(),不会改变后续 变量值() 读取到的旧值。

数据函数 ​

函数作用
变量值("变量ID")读取刷新前的变量值,不存在时返回空文本
设置值("变量ID", 内容)创建或更新指定变量
数字(内容)转换为数字,空文本或无法转换时得到 0
字符串(内容)转换为文本
占位符("%变量%")读取 PlaceholderAPI 变量,主要用于玩家规则
最大值(数字1, 数字2, ...)返回多个数字中的最大值
最小值(数字1, 数字2, ...)返回多个数字中的最小值
绝对值(数字)返回数字的绝对值
向下取整(数字)向下取整
向上取整(数字)向上取整
四舍五入(数字)四舍五入为整数

动作函数 ​

函数玩家规则服务器规则作用
玩家消息("文本")可用不执行向当前玩家发送消息,并转换 & 颜色代码
全服消息("文本")禁止可用向全部在线玩家广播消息
玩家指令("命令")可用不执行以当前玩家身份执行命令
OP指令("命令")可用不执行临时以当前玩家的管理员身份执行命令
控制台指令("命令")可用可用以服务器控制台身份执行命令

命令可以带 /,执行前会自动移除开头的 /。

玩家规则脚本中使用 全服消息() 会在配置重载校验时被拒绝。服务器规则没有玩家上下文,玩家相关动作函数不会执行。

脚本动作函数与规则节点中的 message、command 会同时执行。如果不需要重复发送消息或执行命令,只使用其中一种方式。

运算与判断 ​

脚本支持以下表达式:

类型写法
数学运算+、-、*、/、%
比较运算>、>=、<、<=、==、!=
逻辑运算&&、||、!
三元表达式条件 ? 成立值 : 不成立值
条件块if、else if、else
列表[内容1, 内容2, ...]
yaml
script: |-
  设置值("累计次数", 数字(变量值("累计次数")) + 1)
  if (数字(占位符("%player_level%")) >= 20) {
    设置值("等级奖励", 200)
    设置值("等级称号", "大师")
  } else if (数字(占位符("%player_level%")) >= 10) {
    设置值("等级奖励", 100)
    设置值("等级称号", "高级")
  } else {
    设置值("等级奖励", 50)
    设置值("等级称号", "普通")
  }

三元表达式可以直接作为变量值:

yaml
script: |-
  设置值("阶段", 数字(变量值("累计次数")) >= 10 ? "高级" : "普通")

文本方法 ​

文本方法写在一个表达式后,例如 变量值("变量ID").长度()。

方法作用
长度()获取文本长度
包含(内容)判断是否包含指定内容
前缀判断(内容)判断是否以指定内容开头
后缀判断(内容)判断是否以指定内容结尾
替换(旧内容, 新内容)替换文本内容
转小写()将英文字母转换为小写
转大写()将英文字母转换为大写
去空白()移除文本首尾空格
截取(开始位置)从指定位置截取到末尾,位置从 0 开始
截取(开始位置, 结束位置)截取指定范围,不包含结束位置
等于(内容)判断文本是否完全相同

数字与列表方法 ​

数据类型可用方法
数字绝对值()、向下取整()、向上取整()、四舍五入()
列表长度()、读取(位置)、包含(内容)、为空()

普通表达式按行执行,可以使用分号结尾。if、else if 和 else 条件块可以跨多行。空行以及以 # 或 // 开头的行会被忽略。

消息与命令 ​

message 和 command 会在脚本成功写入变量后执行,并针对本次写入的每个变量分别处理一次。

yaml
每月等级奖励规则:
  trigger-time:
    - '定时:每月 3号 12:00'
  condition:
    - 'papi: %player_level% >= 5'
  script: |-
    设置值("等级奖励金币", 100)
    设置值("等级奖励次数", 1)
  message:
    - '&7规则 &a{id} &7已将变量刷新为 &f{value}'
  command:
    - '[console]tell %player_name% 规则{id}已经刷新为{value}'
    - '[op]tell %player_name% 规则{id}已经刷新为{value}'
    - 'tell %player_name% 规则{id}已经刷新为{value}'

文本替换 ​

内容替换结果
{id}当前刷新规则 ID
{value}当前正在处理的变量最终值
PlaceholderAPI 变量安装并启用 PlaceholderAPI 时按当前玩家解析
& 颜色代码message 发送时转换为 Minecraft 颜色代码

脚本一次写入多个变量时,同一条消息或命令会按变量写入顺序执行多次,{value} 每次对应当前变量的值。

命令执行身份 ​

写法执行方式
[console]命令服务器控制台执行
[op]命令当前玩家临时取得管理员身份后执行
命令当前玩家直接执行

玩家规则中的当前玩家是被刷新的玩家。服务器规则会遍历全部在线玩家执行 message 和 command,因此 [op] 和无前缀命令也会分别以每名在线玩家的身份执行。

离线补偿 ​

玩家规则会按规则 ID 保存最后一次触发时间。玩家变量数据加载完成后,插件会检查该玩家离线期间是否错过规则触发点。

  • 如果 (上次触发时间, 当前时间] 内存在任意触发点,会按玩家当前状态检测条件并补刷新一次。
  • 即使离线期间错过多个触发点,同一规则本次上线也只补刷新一次。
  • 新规则没有历史触发时间时,只会将当前时间设为初始时间,不追溯更早的触发事件。
  • 正常触发时,条件不满足也会记录本次规则触发时间,表示该触发点已经处理。
  • PAPI 条件当前无法计算时,不会记录触发时间,待 PlaceholderAPI 恢复后仍可再次检测。

刷新时间按规则 ID 保存,不再为脚本写入的每个变量分别保存刷新时间。因此修改规则 ID 会被视为一条新规则。

倒计时变量 ​

安装并启用 PlaceholderAPI 后,可以读取当前规则距离下一次触发的倒计时。

变量返回内容
%lybl_countdown_player_规则ID%玩家刷新规则下一次触发倒计时
%lybl_countdown_server_规则ID%服务器刷新规则下一次触发倒计时

规则配置多个 trigger-time 时,返回距离当前最近的一次触发。不存在对应规则时返回空文本。

倒计时会省略左侧连续为零的单位,例如 0天 0时 5分 3秒 会显示为 5分 3秒。

重载与错误处理 ​

使用以下指令重新读取全部刷新配置:

指令权限说明
/lybl reloadlyplaceholder.admin校验并重载玩家规则、服务器规则和自动保存配置

重载时会校验全部已启用规则,包括规则 ID、触发时间、玩家条件和脚本格式。任何文件或规则校验失败时,本次重载失败,当前正在运行的刷新任务会继续保留。

重载成功后,插件会输出实际载入的配置文件和规则 ID。没有载入任何规则时,也会给出对应提示。

以下问题会导致重载失败:

  • enable 不是布尔值。
  • 同一作用域存在重复规则 ID。
  • 规则 ID 包含非法字符或超过长度限制。
  • trigger-time 缺失、为空或格式错误。
  • 玩家 condition 前缀、冒号或判断表达式错误。
  • script 不是字符串、内容为空或语法错误。
  • 配置中继续使用已经移除的 value 节点。
  • 玩家脚本使用只允许服务器规则调用的函数。

脚本执行期间发生除零、未知函数、非法变量 ID 等错误时,本次脚本不会写入变量。该触发点仍会被记录为已经处理,控制台会输出对应规则的刷新失败信息。