Skip to content

图鉴重置版 LyGuideReload

MySQL 前置要求

启用 MySQL 存储时,必须安装 LyMySQLCore,并确认它已成功连接数据库。否则本插件的 MySQL 数据读取、保存、同步和相关记录不会生效。

LyGuideReload 是一款 Minecraft 图鉴收集插件。管理员可以配置图鉴、图鉴套装、收集条件、收集次数、收藏分、属性和奖励指令,玩家通过击杀怪物、使用物品或管理指令增加图鉴收集进度。

插件提供图鉴套装总览、套装详情、套装分类和分页界面,可用于怪物图鉴、装备收藏、材料消耗、成就进度、收藏分阶段奖励和套装属性等玩法。

插件信息

项目内容
插件名LyGuideReload
插件版本1.0.6
作者Liyuan
主命令/tjr
Bukkit API 版本1.13
Java 编译版本Java 8
图鉴目录plugins/LyGuideReload/guide
套装目录plugins/LyGuideReload/suit
YAML 数据目录plugins/LyGuideReload/data

项目的 plugin.yml 声明 Bukkit API 版本为 1.13,构建配置使用 Java 8。项目文件没有提供更具体的 Minecraft 服务端版本范围,安装前应根据实际服务端和依赖插件版本进行兼容性测试。

依赖与软依赖

插件在 plugin.yml 中将下列插件声明为软依赖。插件本体可以在部分软依赖缺失时加载,但对应功能不会生效。

插件用途使用要求
LyMySQLCoreMySQL 玩家数据存储启用 mysql.enable 时必须安装,并确认数据库连接成功
PlaceholderAPI插件变量、界面变量、Lore 变量和 papi 收集条件未安装时,相关变量和变量条件不可用
AttributePlus应用图鉴、套装和收藏分属性attribute-plugin 设置为 AttributePlus
SX-AttributeSX-Attribute 2 或 3 属性适配attribute-plugin 设置为 SX-Attribute2SX-Attribute3
AttributeSystem属性插件选项当前项目中的实际属性写入代码被注释,不能确认属性会生效
ItemLoreOrigin通过虚拟物品 Lore 提供属性attribute-plugin 设置为 ItemLoreOrigin
MythicMobsMythicMobs 怪物击杀监听插件会根据 MythicMobs 主版本注册 4.x 或 5.x 监听器

PlaceholderAPI 不只是变量扩展。图鉴条件、图鉴 Lore、套装 Lore和收藏分界面也会调用 PlaceholderAPI,因此使用相关内容时应安装该插件。

核心功能

功能说明
独立图鉴配置每个图鉴拥有 ID、名称、Lore、图标、基础收藏分和最大收集次数
图鉴收集条件支持已有图鉴、未拥有图鉴、权限、反权限和 PlaceholderAPI 表达式
多次收集同一图鉴可以重复收集,收集次数不会超过 max-collect-count
概率收集收集方式和 /tjr try 支持 01 的概率
怪物击杀记录保存怪物累计击杀次数和首次击杀记录
物品使用收集可按主手物品名称、Lore 行或数字物品 ID 匹配,匹配后消耗一个物品
图鉴收藏分按基础收藏分乘以当前收集次数计算
收藏分阶段根据总收藏分选择已达到的最高阶段称号和属性
图鉴属性可按单独次数或次数范围配置属性文本,并支持公式计算
属性额外加成可通过 PlaceholderAPI 变量按百分比放大图鉴属性公式结果
图鉴套装多个图鉴组成套装,集齐后获得收藏分并执行一次套装指令
套装属性可要求累计收集次数、总收藏分和全部部件已收集
套装分类可将多个套装归入分类,并打开指定分类界面
图鉴界面支持套装总览、套装分类、套装详情和每页 45 项的分页浏览
图鉴点击指令点击套装详情中的图鉴图标时执行该图鉴的 click-command
已收集标记已收集图鉴可添加耐久附魔效果,并在套装列表显示次数和上限
获得提示增加图鉴次数时可以显示标题和副标题
数据存储支持本地 YAML 文件和 MySQL 两种模式
自动保存按配置间隔异步保存发生过数据变更的在线玩家
YAML 备份恢复正常保存玩家 YAML 数据时使用安全写入与备份恢复工具
PlaceholderAPI提供收藏分、称号、收集次数、属性和触发记录变量
开发者 API提供增加、扣除、设置、读取和概率尝试收集的方法
指令补全支持子命令、在线玩家、图鉴 ID、套装 ID、分类 ID、次数和概率补全

图鉴玩法机制

收集次数

每个图鉴通过 max-collect-count 设置最大收集次数。增加或设置次数时,插件会把结果限制在 0 到最大收集次数之间。

增加图鉴收集次数时会执行以下处理:

  1. 更新玩家的图鉴收集次数。
  2. 执行当前次数对应的 get-command
  3. 显示获得图鉴的标题和副标题。
  4. 检查相关套装是否首次集齐。
  5. 重新计算玩家的图鉴、套装和收藏分属性。
  6. 将玩家数据标记为需要自动保存。

扣除或直接设置图鉴次数不会执行图鉴获得指令和获得提示,但仍会检查套装状态并刷新属性。

收集前置条件

图鉴的 collect-condition 支持以下条件:

条件格式判定规则
guide:{图鉴ID}玩家已经收集过指定图鉴
noguide:{图鉴ID}玩家尚未收集指定图鉴
permission:{权限}玩家拥有指定权限
nopermission:{权限}玩家没有指定权限
papi:{表达式}PlaceholderAPI 替换后,表达式结果为真

所有条件必须同时满足。papi 表达式的实现支持 &&||>=<===!=>< 等判断。

通过 /tjr give 或开发者 API 的增加方法直接发放图鉴时,不检查 collect-condition。通过 /tjr try 或 API 的概率尝试方法收集时,会先检查这些条件。

收集方式

项目配置示例列出了以下收集方式:

收集方式参数设计用途
first_killnamechance首次击杀指定怪物时尝试收集
killnameamountchance对指定怪物累计击杀,每达到对应倍数时尝试收集
pickup_namenamechance拾取显示名称完全匹配的物品时尝试收集
pickup_lorelorechance拾取包含完全匹配 Lore 行的物品时尝试收集
pickup_ididchance拾取数字物品 ID 和数据值匹配的物品时尝试收集
use_namenamechance右键使用显示名称完全匹配的主手物品
use_lorelorechance右键使用包含完全匹配 Lore 行的主手物品
use_ididchance右键使用数字物品 ID 和数据值匹配的主手物品

kill 会记录 kill_怪物ID,只有当前累计次数是 amount 的整数倍时才进行概率判定。原版怪物监听使用实体类型名称;MythicMobs 监听使用 MythicMobs 内部 ID。

use_nameuse_loreuse_id 在物品匹配且前置条件通过后,会先扣除主手中的一个物品,再进行概率判定。概率失败时物品不会返还,并会发送 message.use-item-failed

当前版本实现限制

项目中的 GuideData 只注册了 first_killkilluse_nameuse_loreuse_id。虽然存在拾取监听器和拾取配置示例,但 pickup_namepickup_lorepickup_id 没有在图鉴加载阶段注册,按当前代码无法触发。

首次击杀监听会先写入 first_kill_怪物ID,随后又在图鉴判断中因该记录已存在而跳过,因此 first_kill 按当前代码也无法正常触发。需要使用当前构建实测,或改用 killuse_*/tjr try/tjr give

怪物监听

类型行为
Bukkit 实体enable-bukkit-death-event: true 时注册 EntityDeathEvent 监听
普通实体默认使用 Bukkit 实体类型名称作为怪物 ID
自定义名称实体特定实体类型下可能使用实体自定义名称
CustomNPCs 实体检测到对应实体类型时读取实体名称
MythicMobs 4监听 MythicMobs 4 的怪物死亡事件,使用内部 ID
MythicMobs 5监听 MythicMobs 5 的怪物死亡事件,使用内部 ID

关闭 enable-bukkit-death-event 只会关闭 Bukkit 原版实体死亡监听,不会阻止已安装的 MythicMobs 监听注册。

收藏分与属性

图鉴收藏分

图鉴收藏分按照以下规则计算:

text
图鉴收藏分 = base-point × 当前收集次数

例如图鉴的 base-point5,玩家收集了 3 次,该图鉴提供 15 点收藏分。

套装收藏分

套装内所有有效图鉴至少收集一次后,套装视为完成,并提供套装文件中 point 配置的收藏分。

玩家总收藏分由以下内容相加:

text
总收藏分 = 所有图鉴收藏分 + 所有已完成套装收藏分

同一个图鉴可以同时属于多个套装。图鉴自身收藏分只会在总收藏分中计算一次,但每个已完成套装的套装收藏分会分别计入。

收藏分阶段

主配置的 point 节点可以按总收藏分配置称号和属性。玩家同时达到多个阶段时,插件选择数值最高且已达到的阶段,不会叠加多个阶段的属性。

对应称号可以通过 %tjr_tag_point% 获取,阶段属性会加入玩家的总属性列表。

图鉴属性

图鉴的 attribute 节点支持单独次数和次数范围:

yaml
attribute:
  1:
    - '§a攻击力 +5'
  2-9:
    - '§a攻击力 +<{count}*1~%.0f>'
  10:
    - '§a攻击力 +10'
写法说明
1收集次数等于 1 时使用
2-9收集次数在 29 之间时使用
{count}当前图鉴收集次数
`<公式~格式>`计算公式,并用指定数字格式输出

公式计算支持数字、括号以及 +-*/。未提供格式时默认使用 %.0f

attribute-addition-placeholder 可以填写一个 PlaceholderAPI 变量。变量结果大于 0 时,会按百分比增加公式结果。例如变量返回 20,公式最终结果乘以 1.2。该加成只影响尖括号公式,不会修改普通文本中的数字。

套装属性

套装属性必须同时满足以下条件:

  • 套装内所有有效图鉴至少收集一次。
  • 套装内所有图鉴的累计收集次数不低于 effective-attribute-need-count
  • 玩家总收藏分不低于 effective-attribute-point

套装首次集齐时会记录到玩家数据的 enabled-suit,并执行一次 collected-command。该记录用于防止套装集齐指令重复执行。

图鉴界面

插件使用 54 格箱子界面,其中前 45 格用于展示内容,最后一行用于翻页、填充和收藏分信息。

界面打开方式显示内容
套装总览/tjr opent所有已加载套装
套装分类/tjr class <分类ID>分类中存在且已加载的套装
套装详情/tjr opens <套装ID> 或点击套装套装中的图鉴条目

套装总览和分类界面会在套装 Lore 后追加各图鉴的收集状态。套装详情会处理图鉴 Lore 中的以下内容:

内容替换结果
{count}当前收集次数
{max}最大收集次数
{base_point}图鉴基础收藏分
{result_point}当前图鉴收藏分
{attribute}当前收集次数对应的属性列表
PlaceholderAPI 变量当前玩家对应的变量结果

玩家点击套装详情中的图鉴图标时,会执行该图鉴的 click-command。关闭插件界面时,插件会刷新玩家属性缓存。

数据存储

YAML 模式

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

text
plugins/LyGuideReload/data/玩家UUID.yml

保存内容包括:

数据节点内容
collected-guide各图鉴的收集次数
trigger-list击杀、拾取和使用行为的触发记录
enabled-suit已执行过首次集齐指令的套装 ID

玩家加入时异步读取数据,正常退出或被踢出服务器时异步保存数据。正常的 YAML 保存流程使用安全写入工具,并支持从备份恢复读取。

MySQL 模式

mysql.enabletrue 时,插件通过 LyMySQLCore 提供的安全加载和保存事件处理玩家数据,并将序列化后的 YAML 数据写入以插件名称命名的数据库表。

警告

MySQL 模式必须安装 LyMySQLCore,并确保它已经成功连接数据库。只填写 mysql 节点但未安装或未连接 LyMySQLCore,不会得到可用的 MySQL 玩家数据功能。

插件以玩家名称查询和更新数据库记录,而本地 YAML 模式使用玩家 UUID 作为文件名。

自动保存

auto-save-interval 以秒为单位。自动保存任务会异步扫描在线玩家,只保存已被标记为发生过数据变更的玩家。

插件重载时会停止旧的自动保存任务,重新载入配置、图鉴、套装和分类,然后重新启动任务。重载期间已打开的图鉴界面会被强制关闭。

指令

主命令为 /tjr。项目没有在 plugin.yml 中声明独立权限节点,管理指令直接通过 OP 状态判断。

指令使用者说明
/tjrOP显示插件指令帮助
/tjr reloadOP重载主配置、图鉴、套装和套装分类
/tjr update <玩家>OP刷新指定在线玩家的图鉴属性缓存
/tjr opent玩家打开图鉴套装总览
/tjr class <分类ID>玩家打开指定套装分类
/tjr opens <套装ID>玩家打开指定图鉴套装
/tjr addkill <玩家> <怪物ID> <次数>OP增加怪物击杀记录,并判断对应的击杀图鉴
/tjr give <玩家> <图鉴ID> <次数>OP增加图鉴收集次数,并执行获得效果
/tjr take <玩家> <图鉴ID> <次数>OP扣除图鉴收集次数,不执行获得效果
/tjr set <玩家> <图鉴ID> <次数>OP直接设置图鉴收集次数,不执行获得效果
/tjr try <玩家> <图鉴ID> <概率>OP检查收集条件后,按概率尝试增加一次图鉴收集次数

<玩家><怪物ID><图鉴ID><套装ID><分类ID> 是实际参数,使用时不输入尖括号。

指令行为

  • givetakesettryaddkill 只接受在线且数据已经加载的玩家。
  • givetakeset 会验证图鉴 ID 是否存在。
  • give 不检查图鉴的 collect-condition
  • try 会检查 collect-condition,大于 1 的概率会被限制为 1
  • takeset 不执行图鉴 get-command,但会刷新套装状态和属性。
  • give 会执行图鉴 get-command、获得标题和套装首次集齐检查。
  • reload 会覆盖插件内置的示例图鉴和示例套装文件。

/tjr update 已知问题

帮助文本和参数补全要求使用 /tjr update <玩家>,但当前命令代码只在参数数量为 1 时进入该分支,随后又读取第二个参数。按当前代码,该指令存在参数判断错误,不能正常使用。

指令补全

插件提供以下 Tab 补全:

参数位置补全内容
一级子命令根据是否为 OP 和是否为玩家显示可用子命令
管理指令的玩家参数当前在线玩家名称
givetakesettry 的图鉴参数已加载的图鉴 ID
opens 的套装参数已加载的套装 ID
class 的分类参数已加载的分类 ID
次数参数11064100
概率参数00.10.51

addkill 的怪物 ID 补全只提供静态示例值,不代表服务器实际存在这些怪物。

PlaceholderAPI 变量

插件注册的变量标识符为 tjr。完整参数规则和返回值见 插件变量

变量说明
%tjr_all_point%玩家全部收藏分
%tjr_tag_point%当前收藏分阶段称号
%tjr_guide_point_图鉴ID%指定图鉴提供的收藏分
%tjr_suit_point_套装ID%指定套装及其子图鉴提供的总收藏分
%tjr_collect_count_图鉴ID%指定图鉴当前收集次数
%tjr_collect_max_图鉴ID%指定图鉴最大收集次数
%tjr_collect_suit_套装ID%指定套装内全部图鉴的累计收集次数
%tjr_trigger_kill_怪物ID%指定怪物的累计击杀次数
%tjr_trigger_first_kill_怪物ID%指定怪物的首次击杀记录
%tjr_trigger_pickup_name_物品名%按名称成功拾取收集的记录
%tjr_trigger_pickup_lore_物品Lore%按 Lore 成功拾取收集的记录
%tjr_trigger_pickup_id_物品ID%按数字 ID 成功拾取收集的记录
%tjr_trigger_use_name_物品名%按名称成功使用收集的次数
%tjr_trigger_use_lore_物品Lore%按 Lore 成功使用收集的次数
%tjr_trigger_use_id_物品ID%按数字 ID 成功使用收集的次数
%tjr_attribute_图鉴ID_次数_行数%指定收集次数下的属性行
%tjr_attribute_图鉴ID_now_行数%当前收集次数下的属性行
%tjr_attribute_图鉴ID_next_行数%下一收集次数下的属性行

属性变量的行数从 0 开始。玩家数据尚未加载时,插件变量返回空字符串。

开发者 API

插件客户端模块公开 LyGuideReloadAPI 接口,运行时由核心模块设置实现。主要方法如下:

方法说明
giveGuideCollectedCount(Player player, String id, int count)增加指定图鉴的收集次数
takeGuideCollectedCount(Player player, String id, int count)扣除指定图鉴的收集次数
setGuideCollectedCount(Player player, String id, int count)设置指定图鉴的收集次数
getGuideCollectedCount(Player player, String id)获取指定图鉴的收集次数
tryGiveGuide(Player player, String id, double chance)检查前置条件后,按概率尝试增加一次收集次数

API 只处理已经存在于玩家数据缓存中的玩家。玩家数据未加载时,增加、扣除和设置方法不会执行,读取方法返回 0

giveGuideCollectedCount 会触发图鉴获得指令、获得标题、套装首次集齐检查和属性刷新。收集次数仍受图鉴最大收集次数限制。

调用 tryGiveGuide 前应先确认图鉴 ID 存在。该方法本身直接读取图鉴对象,没有处理不存在的 ID。

已知实现差异

以下内容由当前 1.0.6 项目代码确认:

项目当前行为
拾取收集方式存在监听器和示例配置,但图鉴加载器没有注册 pickup_* 方法
首次击杀监听器先写入首次击杀记录,再检查记录,导致 first_kill 被跳过
属性插件 AttributeSystem配置选项存在,但实际属性调用代码被注释
/tjr update参数数量判断和参数读取不一致
获得图鉴音效默认配置键为 get-guide-sound,增加图鉴时读取的却是 get-suit-sound
示例文件每次重载都会以覆盖模式保存内置示例文件

建议不要直接修改 示例图鉴.yml示例套装.yml。应复制为其他文件名后再配置,并通过 load-default-config: false 跳过加载默认示例。

配置与扩展页面

页面内容
主配置说明config.yml 的属性插件、自动保存、怪物监听、MySQL、提示、界面、分类和收藏分配置
图鉴配置guide 目录下图鉴文件的字段、条件、收集方式、属性和指令
插件变量PlaceholderAPI 变量格式、参数和返回值
常见问题依赖、数据存储、收集触发、属性和界面问题排查
更新日志插件和文档更新记录