Skip to content

福利·称号 LyTag

MySQL 前置要求

启用 MySQL 存储时,必须安装 LyMySQLCore,并确认它已成功连接数据库。否则玩家数据无法正常读取、保存和同步,相关功能不会生效。

LyTag 是一款 Minecraft 称号插件。管理员可以创建称号并按分类注册,玩家可以在 GUI 中查看已拥有或未拥有的称号,分别设置每个分类的显示称号和属性称号。称号支持永久时间、限时时间、收集属性、佩戴属性、药水效果,以及按点击或定时触发的动作。

兼容信息

项目说明
项目版本1.0.4
插件名称LyTag
编译 APIPaper API 1.16.5-R0.1-SNAPSHOT
版本兼容处理项目包含旧版数字物品 ID、英文物品 ID 和新版本材质名的兼容处理;完整支持范围以实际服务端测试结果为准
主命令/ltag

功能

  • 使用 YAML 文件或 MySQL 保存玩家称号数据。
  • 支持递归读取 plugins/LyTag/tag 目录下的 .yml 称号文件。
  • 支持称号分类;称号文件中的称号必须在 config.ymltag-class 中注册后才能使用。
  • 每个分类最多显示前 9 个分类按钮。
  • 支持永久称号和限时称号。
  • 支持每个分类分别设置显示称号和属性称号。
  • 支持称号收集属性;获得称号后自动计算并接入已选择的属性插件。
  • 支持称号佩戴属性;玩家右键佩戴属性称号后生效。
  • 支持按称号配置药水效果,属性称号生效期间持续刷新。
  • 支持左键点击、右键点击和定时 tick 触发动作。
  • 支持动作触发概率和毫秒级冷却时间。
  • 支持发送消息、释放 MythicMobs 技能、执行控制台指令、以玩家身份执行指令和以 OP 身份执行指令。
  • GUI 支持分页、切换称号分类和筛选已拥有、未拥有、全部称号。
  • 支持 PlaceholderAPI 变量。
  • 支持从旧插件 LegendTitle 的部分 YAML 玩家数据转换为 LyTag 数据。

依赖

依赖是否必需用途与条件
PlaceholderAPI可选注册 LyTag 变量;动作中的 command_consolecommand_opcommand 结果也会使用 PlaceholderAPI 解析变量
LyMySQLCoreMySQL 模式必需mysql.enable: true 时负责 MySQL 玩家数据加载与保存事件;必须成功连接数据库后才会生效
AttributePlus属性接入可选attribute-plugin 设置为 AttributePlus 时接入称号属性
SX-Attribute属性接入可选attribute-plugin 设置为 SX-Attribute2SX-Attribute3 时使用;对应版本必须与配置匹配
AttributeSystem属性接入可选attribute-plugin 设置为 AttributeSystem 时接入称号属性
ItemLoreOrigin属性接入可选attribute-plugin 设置为 ItemLoreOrigin 时接入称号属性
MythicMobs按功能需要称号动作配置使用 mmskill: 结果时需要;未使用该结果类型时不需要用于称号动作

命令

命令使用者限制说明
/ltagOP显示管理员帮助;验证完成后显示完整命令帮助
/ltag reloadOP重载 config.yml、称号文件、分类和相关运行任务;MySQL 开关或属性插件配置修改需要重启
/ltag open玩家打开称号界面;界面默认进入第一个已注册分类
/ltag give <玩家> <称号ID> <时间:秒>OP给在线玩家发放已注册称号;时间为 0 时保存为永久称号,其他时间按秒转换为毫秒
/ltag remove <玩家> <称号ID>OP移除在线玩家的已注册称号
/ltag LegendTitleOP执行旧 LegendTitle 数据转换,将 plugins/LegendTitle/data 下的玩家数据转换到 LyTag 的 YAML 数据格式

giveremove 只能操作已经在 tag-class 中注册的称号。玩家必须在线且已完成 LyTag 数据加载。

数据保存

YAML

mysql.enablefalse 时,玩家数据保存到:

text
plugins/LyTag/data/<玩家UUID>.yml

数据结构包含以下部分:

节点说明
attribute-tag.<分类ID>每个分类当前佩戴的属性称号 ID
show-tag.<分类ID>每个分类当前显示的称号 ID
all-tag.<称号ID>玩家拥有的称号及到期时间;0 表示永久

玩家加入、退出或被踢出时会读取或保存数据。玩家数据发生变化后,也会进行异步自动保存。

MySQL

mysql.enabletrue 时,LyTag 会通过 LyMySQLCore 的安全玩家加载和保存事件处理数据,并在数据库中使用 LyTag 表保存玩家名称和 YAML 序列化数据。

必须同时满足以下条件:

  1. 安装 LyMySQLCore
  2. 正确填写 mysql 配置。
  3. LyMySQLCore 成功连接数据库。
  4. LyTag 成功初始化数据库表。

如果数据库未连接完成,玩家登录会被阻止,直到数据库连接可用。

GUI 交互

LyTag 使用 54 格称号界面:

位置功能
顶部前 9 格切换称号分类
中间 27 格显示当前分类的称号
底部第 1 格上一页
底部第 5 格切换筛选模式
底部第 9 格下一页
底部第 4 格当前显示称号;点击可卸除
底部第 6 格当前属性称号;点击可卸除

称号筛选模式按照以下顺序循环:

text
已拥有 -> 未拥有 -> 全部 -> 已拥有

在称号物品上:

  • 左键:设置为当前分类的显示称号。
  • 右键:设置为当前分类的属性称号。
  • 未拥有的称号不能佩戴,也不能设置为显示称号或属性称号。

称号过期后会从玩家拥有列表中清理;对应的显示称号和属性称号也会被自动移除。

称号文件

称号文件放置在:

text
plugins/LyTag/tag/

插件会递归读取该目录下所有 .yml 文件。一个文件可以包含多个称号,顶层键名就是称号 ID。

称号字段

配置键类型说明
<称号ID>.title字符串玩家佩戴显示称号时使用的文本;未配置时使用称号 ID
<称号ID>.info字符串列表称号介绍,可在 GUI lore 中通过 {info} 显示
<称号ID>.collect-attribute字符串列表玩家拥有该称号后获得的收集属性
<称号ID>.attribute字符串列表玩家佩戴该称号为属性称号后获得的属性
<称号ID>.effect键值映射属性称号生效期间持续施加的药水效果;值为药水等级,代码使用的等级从 0 开始
<称号ID>.action映射属性称号生效期间的触发动作配置

称号示例

yaml
# 称号 ID,用于指令和 config.yml 的 tag-class
离渊插件牛逼:
  # 佩戴显示称号时显示的文本
  title: '&7[&6离渊福利插件&7]'
  info:
    - '&7这个称号确实牛逼'
  # 获得称号后获得的收集属性
  collect-attribute:
    - '攻击力+1'
  # 佩戴属性称号后获得的属性
  attribute:
    - '攻击力+1'
  action:
    left:
      chance: 0.1
      cooldown: 5000
      result:
        - 'mmskill:技能'
        - 'tell:你触发了左键技能'
        - 'command_console:tell %player_name% 执行控制台指令'
        - 'command_op:tell %player_name% 执行OP指令'
        - 'command:tell %player_name% 执行玩家指令'

示例称号:
  title: '&7[&a示例称号&7]'
  info:
    - '&7这个称号属实牛逼'
  collect-attribute:
    - '攻击力+1'
  attribute:
    - '攻击力+1'
  effect:
    SPEED: 0

称号写入文件后,还必须在 config.ymltag-class 中注册。例如:

yaml
tag-class:
  普通称号:
    - '离渊插件牛逼'
  示例称号分类:
    - '示例称号'

同一个称号不能重复注册到多个分类。配置最多支持 9 个分类按钮,因为 GUI 顶部第一行只有 9 个分类位置。

动作机制

动作必须配置在称号的 action 节点下,并且只有玩家将该称号设置为属性称号后才会检查。

触发类型

类型触发条件
left玩家左键点击空气或方块
right玩家右键点击空气或方块
tick定时检查;运行任务每 10 tick 检查一次符合条件的属性称号

动作字段

配置键类型说明
chance小数触发概率;代码使用随机数与该值比较
cooldown整数冷却时间,单位为毫秒;未配置时默认 1000
result字符串列表触发后依次执行的结果

结果类型

前缀说明
tell:向玩家发送消息,支持 & 颜色代码
mmskill:由玩家释放指定 MythicMobs 技能
command_console:由控制台执行指令;执行前解析 PlaceholderAPI 变量
command_op:以玩家身份执行指令,并临时给予 OP 权限;执行前解析 PlaceholderAPI 变量
command:以玩家身份执行普通指令;执行前解析 PlaceholderAPI 变量

cooldown 的时间单位是毫秒,不是秒。chance 未配置时默认为 0,动作不会触发。

药水效果

药水效果写在称号的 effect 节点中,键名使用 Bukkit 药水效果名称,例如:

yaml
effect:
  SPEED: 0
  NIGHT_VISION: 0

药水效果只有在该称号作为属性称号佩戴时生效。插件会定时刷新属性称号提供的药水效果;同一种药水效果同时来自多个称号时,使用等级较高的配置。

可使用的效果名称以当前服务端 Bukkit API 支持的 PotionEffectType 名称为准。项目示例中使用了以下名称:

text
SPEED
FAST_DIGGING
SLOW_DIGGING
INCREASE_DAMAGE
HEAL
HARM
JUMP
CONFUSION
REGENERATION
DAMAGE_RESISTANCE
FIRE_RESISTANCE
WATER_BREATHING
INVISIBILITY
BLINDNESS
NIGHT_VISION
HUNGER
WEAKNESS
POISON
WITHER
HEALTH_BOOST
ABSORPTION
SATURATION
FIRE

配置文件

主配置文件为:

text
plugins/LyTag/config.yml

修改 MySQL 开关和属性插件配置后需要重启插件或服务器;原配置注释明确标记这两项需要重启。

mysql

配置键默认值说明
mysql.enablefalse是否启用 MySQL 存储;启用后必须安装并连接 LyMySQLCore
mysql.databasenamemc2数据库名称
mysql.usernamemc2数据库用户名
mysql.passwordmc1234数据库密码
mysql.port3306数据库端口
mysql.ip127.0.0.1数据库地址

配置示例:

yaml
mysql:
  enable: false
  databasename: mc2
  username: mc2
  password: mc1234
  port: 3306
  ip: 127.0.0.1

attribute-plugin

配置键可用值说明
attribute-plugin空字符串不接入属性插件
attribute-pluginAttributePlus接入 AttributePlus
attribute-pluginSX-Attribute2接入 SX-Attribute 2 属性接口
attribute-pluginSX-Attribute3接入 SX-Attribute 3 属性接口
attribute-pluginAttributeSystem接入 AttributeSystem
attribute-pluginItemLoreOrigin通过物品 Lore 属性接口接入 ItemLoreOrigin

示例:

yaml
attribute-plugin: ''

该配置只决定称号属性的接入方式,不会改变称号收集、显示和 GUI 功能。选择某个属性插件时,服务端必须安装对应前置。

placeholder

配置键默认值说明
placeholder.not-tag&7无没有显示称号或属性称号时的默认变量返回值
placeholder.not-tag-<分类ID>未固定指定分类没有称号时的变量返回值;存在时覆盖 placeholder.not-tag
placeholder.forever-tag-format&7到期时间: &6永久永久称号在 GUI 中显示的时间文本
placeholder.limited-time-tag-format&7到期时间: &b{time}限时称号在 GUI 中显示的时间文本;{time} 会替换为 yyyy-MM-dd HH:mm:ss

tag-class

tag-class 用于注册称号分类。键名是分类 ID,列表内容是称号 ID。

配置键类型说明
tag-class.<分类ID>字符串列表注册到该分类的称号 ID;只有注册后的称号才能被玩家使用

示例:

yaml
tag-class:
  普通称号:
    - '离渊插件牛逼'
  示例称号分类:
    - '示例称号'

gui

配置键默认值说明
gui.title&0当前分类: &n&l{class}GUI 标题;{class} 替换为当前分类 ID
gui.fill-item160:0填充物品
gui.fill-name&7封锁填充物品名称
gui.last-item341:0上一页物品
gui.last-name&6上一页上一页名称
gui.next-item341:0下一页物品
gui.next-name&6下一页下一页名称
gui.class-button-item332:0分类按钮物品
gui.class-button-name&e{class}分类按钮名称;{class} 替换为分类 ID
gui.tag-item403:0已拥有称号物品
gui.tag-name&7称号: &f{tag}已拥有称号名称;{tag} 替换为称号显示文本
gui.tag-lore字符串列表已拥有称号 lore;支持 {info}{collect_attribute}{attribute}{time}{tag}
gui.not-collected-tag-item340:0未拥有称号物品
gui.not-collected-tag-name&7称号: &f{tag}未拥有称号名称
gui.not-collected-tag-lore字符串列表未拥有称号 lore;支持 {info}{collect_attribute}{attribute}{tag}
gui.show-tag-item403:0当前显示称号物品
gui.show-tag-name&7当前显示称号: {tag}当前显示称号名称
gui.show-tag-lore字符串列表当前显示称号 lore;支持 {info}{collect_attribute}{attribute}{time}{tag}
gui.attribute-tag-item403:0当前属性称号物品
gui.attribute-tag-name&7当前属性称号: {tag}当前属性称号名称
gui.attribute-tag-lore字符串列表当前属性称号 lore;支持 {info}{collect_attribute}{attribute}{time}{tag}
gui.not-show-tag-item330:0没有显示称号时的物品
gui.not-show-tag-name&7当前显示称号: 无没有显示称号时的名称
gui.not-attribute-tag-item330:0没有属性称号时的物品
gui.not-attribute-tag-name&7当前属性称号: 无没有属性称号时的名称
gui.filter-switch-item339:0筛选按钮物品
gui.filter-owned-name&a筛选: 已拥有已拥有筛选模式名称
gui.filter-unowned-name&c筛选: 未拥有未拥有筛选模式名称
gui.filter-all-name&e筛选: 全部全部筛选模式名称
gui.filter-switch-lore字符串列表筛选按钮 lore

GUI lore 中的特殊占位符:

占位符说明
{info}插入称号的 info 列表
{collect_attribute}插入称号的收集属性列表
{attribute}插入称号的佩戴属性列表
{time}插入永久或限时到期文本
{tag}插入称号的 title 文本
{class}插入当前分类 ID,仅用于 gui.titlegui.class-button-name

物品值支持项目内的旧版数字 ID 和 ID:数据值 格式,例如 160:0341:0

message

配置键默认值触发时机
message.tag-end-time&7您的 {tag} &7称号已过期!称号过期时发送;{tag} 替换为称号显示文本
message.set-show-tag&7成功佩戴显示称号: {tag}成功设置显示称号时发送
message.set-attribute-tag&7成功佩戴属性称号: {tag}成功设置属性称号时发送
message.cancel-show-tag&7已取消佩戴显示称号.卸除显示称号时发送
message.cancel-attribute-tag&7已取消佩戴属性称号.卸除属性称号时发送

PlaceholderAPI 变量

变量标识符为 ltag,完整变量格式如下:

变量返回值
%ltag_show_tag_<分类ID>%指定分类当前显示称号的 title;没有时返回 placeholder.not-tag 或对应分类的 placeholder.not-tag-<分类ID>
%ltag_attribute_tag_<分类ID>%指定分类当前属性称号的 title;没有时返回 placeholder.not-tag 或对应分类的 placeholder.not-tag-<分类ID>
%ltag_has_tag_<称号ID>%玩家是否拥有指定且已注册称号;拥有返回 true,否则返回 false

PlaceholderAPI 未安装时,LyTag 不会注册这些变量。

属性机制

玩家数据更新时,LyTag 会重新计算属性:

  • 所有已拥有称号的 collect-attribute 会加入属性列表。
  • 每个分类当前佩戴的属性称号的 attribute 会加入属性列表。
  • 属性列表会根据 attribute-plugin 配置接入对应属性系统。
  • 未配置 attribute-plugin 时,称号数据仍可正常保存、展示和管理,但不会接入这些属性插件。

FAQ

为什么称号文件写好了,但 GUI 中没有显示?

检查称号文件是否位于 plugins/LyTag/tag 目录或其子目录,并确认顶层称号 ID 已写入 config.ymltag-class。只写称号文件而不注册分类,称号不会进入可用数据。

为什么 MySQL 模式下玩家无法进入服务器?

MySQL 模式启用后,LyTag 会在数据库连接未完成时阻止玩家登录。确认已经安装 LyMySQLCore,检查 mysql.ipmysql.portmysql.databasenamemysql.usernamemysql.password,并确认 LyMySQLCore 已成功连接数据库。

为什么收集属性或佩戴属性没有生效?

检查 attribute-plugin 是否填写了正确的属性插件名称,并确认对应前置已安装。可用值为 AttributePlusSX-Attribute2SX-Attribute3AttributeSystemItemLoreOrigin。修改该配置后需要重启。

为什么动作没有触发?

确认以下内容:

  • 该称号已被玩家拥有。
  • 该称号已在 tag-class 注册。
  • 该称号当前被设置为属性称号。
  • 动作类型使用的是 leftrighttick
  • chance 大于 0
  • cooldown 尚未结束。
  • 使用 mmskill: 时已安装 MythicMobs,并且技能名称存在。

give 的时间单位是什么?

/ltag give 的时间参数单位是秒。插件会将输入值乘以 1000 转换为毫秒;输入 0 表示永久称号。

为什么限时称号过期后仍然显示?

称号到期会在玩家数据更新时清理。插件会定时更新在线玩家数据,关闭 GUI、修改称号或保存数据时也会触发更新。清理后对应的显示称号和属性称号会一并移除。

为什么 GUI 筛选默认显示已拥有?

打开界面时默认使用“已拥有”筛选模式。点击底部筛选按钮后,会依次切换为“未拥有”和“全部”。