掉落规则
LyDropReload 的掉落规则写在插件目录下的 drop/*.yml 文件中。每个文件可以包含一个或多个掉落组,顶层节点名称就是掉落组 ID,不是怪物 ID。怪物与掉落组的对应关系写在 config.yml 的 monster-drop-allocation 或 drop-monster-allocation 中。
重载时会扫描 drop 目录及其子目录中的 .yml 文件,并载入所有掉落组。插件自动生成的 示例掉落配置.yml 仅供参考,重载时不会作为实际掉落组载入。
掉落组结构
一个掉落组可以包含以下节点:
| 节点 | 作用 |
|---|---|
drop-type | 确定哪些玩家参与本次掉落。 |
use-drop-add-attribute | 是否允许该掉落组受到掉宝率加成影响。 |
drop-add-placeholder | 当前掉落组使用的掉宝率变量;留空时使用全局变量。 |
condition | 参与玩家触发掉落前必须满足的条件。 |
group-select | 根据条件选择经验、货币和物品掉落分组。 |
exp | 按掉落分组配置经验数值。 |
currency | 按掉落分组配置货币数值。 |
drop | 按掉落分组配置指令、独立概率掉落和权重掉落。 |
notice | 为标记注册全服公告内容。 |
tag-limit | 为标记配置全服剩余次数限制。 |
player-tag-limit | 为标记配置每名玩家独立的剩余次数限制。 |
掉落对象
drop-type 决定掉落计算会分配给哪些玩家。
| 写法 | 说明 |
|---|---|
killer | 只处理击杀者。 |
participant#30 | 处理最近 30 秒内对实体造成过伤害的玩家。时间单位为秒。 |
nearby#8 | 处理实体附近范围内的玩家,范围值为 8。 |
nearby_random#8 | 从实体附近范围内的玩家中随机选择一名。 |
world | 处理当前世界中的玩家。 |
server | 处理服务器当前在线的玩家。 |
nearby 和 nearby_random 的数字会同时作为 X、Y、Z 方向的范围值使用。nearby 是否强制加入击杀者由 config.yml 的 add-killer-to-the-nearby 控制。
当 viewer-mode-can-get-drop 为 false 时,旁观模式玩家不会参与 world、server、nearby、nearby_random 和 participant 掉落;killer 仍按击杀者流程处理。
条件判断
总条件
condition 会在每名参与玩家身上执行。列表中的条件需要全部通过,否则该玩家不会继续进行分组判断。
yaml
condition:
- "permission:{kill.测试怪物}"
- "nopermission:{drop.blocked}"
- "papi:{%player_level% < 100}"| 写法 | 说明 |
|---|---|
permission:{权限节点} | 玩家必须拥有指定权限。 |
nopermission:{权限节点} | 玩家不能拥有指定权限。 |
papi:{表达式} | 先解析 PlaceholderAPI 变量,再使用四则运算表达式判断。 |
分组条件
group-select 用于选择当前玩家实际使用的掉落分组。经验、货币和 drop 节点都按选中的分组读取。
yaml
group-select:
当前等级:
- "papi:{%player_level% >= 0 && %player_level% <= 10}"
高于等级:
- "papi:{%player_level% > 10}"每个分组内的条件需要全部通过。代码会继续检查后续分组;如果多个分组都通过,后面匹配到的分组会覆盖前面已经匹配的分组。因此,多个分组条件不要设计成同时成立,除非明确需要后面的分组优先。
表达式支持数字、小数、括号和以下四则运算符:
| 运算符 | 作用 |
|---|---|
+ | 加法。 |
- | 减法。 |
* | 乘法。 |
/ | 除法。 |
经验掉落
exp 按选中的分组配置经验数量。数值可以写固定值,也可以写 最小值-最大值,范围会随机取值。
yaml
exp:
当前等级: "50-100"
高于等级: "12-25"经验不会受到掉宝率加成影响。插件不会直接调用经验接口,而是使用 config.yml 的 exp-command 执行发放指令;该配置为空时不会发放经验。
exp-command 中的 {exp} 会替换为本次经验数量,PlaceholderAPI 变量也会在执行前解析。
货币掉落
currency 按选中的分组配置。数值支持固定值和随机范围。
yaml
currency:
当前等级:
eco: "50-100"
point: "5-10"
LyShopReload货币ID: "1-5"
CX_变量ID: "10-20"| 货币 ID | 处理方式 |
|---|---|
eco | 通过 Vault 经济服务发放金币。需要可用的 Vault 经济服务。 |
point | 通过 PlayerPoints 发放点券。 |
CX_变量ID | 使用 CraftX 变量接口增加对应变量的数值。CX_ 后面的内容作为变量 ID。 |
| 其他 ID | 当 LyShopReload 已启用时,交给 LyShopReload 发放对应货币。 |
货币是否受到掉宝率加成由 config.yml 的 drop-add-attribute-compatible-with-currency 控制。货币还可以通过 currency-add-attribute-placeholder.<货币ID> 配置独立的货币加成变量,变量数值按百分比增加货币数量。
eco 受每日金币上限限制。实际到账数量可能小于配置数量;达到上限时会发送 message.eco-limit-reached 配置的提示。
物品与指令掉落
drop 按分组选项配置。每个分组可以包含 command、default 和 weight。
yaml
drop:
当前等级:
command:
- "tell %player_name% 你触发了当前等级掉落"
default:
- "mm{材料1#1} 0.5 标记1"
- "ni{材料2#1} 0.25"
weight:
- "mm{稀有材料#1} 100 标记4"
- "ni{特殊材料#1} 50 标记5"
- "cmd{mm i give %player_name% 极品材料 1} 20 标记6"command
command 中的每一条指令会在该掉落分组完成后执行,不经过 default 或 weight 的概率判断。可以直接写指令,也可以使用 cmd{指令} 格式。
default
default 中的每一条记录独立进行概率判断。每条记录的基本格式为:
text
类型{物品ID#数量} 概率 [标记]数量支持固定值、随机范围和四则运算表达式;概率也支持四则运算表达式。概率判断通过后,才会消耗标记限制并发放掉落。
weight
weight 中的记录按权重进行一次抽取。每条记录格式为:
text
类型{物品ID#数量} 权重 [标记]权重不是百分比。插件会先排除当前标记限制不足的记录,再按剩余记录的权重总和随机选择一条。被选中的记录按一次掉落处理。
掉落类型
| 类型 | 格式 | 说明 |
|---|---|---|
mm | mm{物品ID#数量} | 从 MythicMobs 物品库获取物品。 |
lis | lis{物品ID#数量} | 使用 MythicMobs 物品管理器获取物品。 |
ni | ni{物品ID#数量} | 从 NeigeItems 获取物品。 |
si | si{物品ID#数量} | 从 SX-Item 获取物品。 |
nf | nf{物品ID#数量} | 从 NeonFlash 获取物品。 |
af | af{物品ID#数量} | 从 AzureFlow 获取物品。 |
cmd | cmd{指令} | 执行指令,不生成物品。 |
重载掉落文件时,插件会检查 default 和 weight 中的 mm、lis、ni、si、nf、af 物品 ID。对应物品插件未启用时不会执行存在性检查;插件已启用但物品不存在时,会在控制台输出无效物品配置提示。
掉落加成
掉宝率变量由 config.yml 的 drop-add-attribute-placeholder 提供。掉落组配置了非空的 drop-add-placeholder 时,优先使用掉落组自己的变量。
掉宝率计算规则如下:
- 每 100 点掉宝率增加一次完整掉落计算。
- 不足 100 点的部分按百分比概率增加一次掉落计算。
- 基础掉落始终执行一次,因此掉宝率为 0 时仍会执行一次
default和weight判断。 - 每次额外掉落都会重新执行该分组的
default和weight。 - 经验不会受到掉宝率影响。
- 货币是否随额外掉落增加由
drop-add-attribute-compatible-with-currency控制。
掉宝率触发额外掉落时,如果 drop-add-message-enable 为 true,插件会向玩家发送 drop-add-message 中的提示,并将 {count} 替换为当前额外触发次数。
掉落组的 use-drop-add-attribute 默认为 true。设置为 false 后,该掉落组不会执行额外掉落计算。
MythicMobs 原生掉落加成
当 drop-add-attribute-mythicmob 为 true 时,掉宝率加成还会影响 MythicMobs 怪物的原生物品掉落。该功能只处理原生物品掉落,不影响原生经验、金币或其他效果,并且不保证兼容所有 MythicMobs 掉落写法。
drop-add-attribute-mythicmob-event 为 true 时,每次额外处理后会再次发送 MythicMobs 掉落事件,供其他插件接收额外掉落流程。
掉落发放位置
物品生成后,插件按以下顺序处理:
- 如果玩家当前为仓库优先,并且配置的仓库插件可以接收该物品,则发送到对应仓库。
- 如果未发送到仓库且
drop-to-inv为true,尝试放入玩家背包。 - 背包放不下的部分掉落到实体死亡位置附近的地面。
- 如果
drop-to-inv为false,直接掉落到地面。
custom-drop-index 只控制仓库之间的尝试顺序,不会强制启用仓库插件。当前代码支持以下仓库标识:
| 标识 | 检测的插件或仓库 |
|---|---|
llwh | LyLootsWareHouse。 |
lyck | LyWarehouse。 |
srp | YeeCore 的灵魂空间。 |
ds | StarStorage。 |
玩家可以通过插件提供的切换功能在仓库优先和背包优先之间切换。玩家每次加入服务器时,会根据 default-drop-to-warehouse 重新设置状态。
标记与公告
物品或指令记录末尾可以添加标记:
yaml
default:
- "mm{稀有材料#1} 0.5 稀有材料"标记可以同时用于公告、全服限制和个人限制。一次掉落通过概率判断后,插件会先检查标记限制;限制不足时不会产生该掉落。掉落成功后才会扣减对应次数。
全服公告
notice 按标记注册公告。普通文本会发送给所有在线玩家;以 cmd{} 开头的内容会作为指令执行。
yaml
notice:
稀有材料:
- "&e%player_name% 获得了稀有材料"
- "cmd{tell %player_name% 恭喜获得稀有材料}"公告文本会解析 PlaceholderAPI 变量。公告指令和掉落指令支持以下实体及玩家位置变量:
| 变量 | 说明 |
|---|---|
{t_world} | 被击杀实体所在世界。 |
{t_x} | 被击杀实体 X 坐标,保留一位小数。 |
{t_y} | 被击杀实体 Y 坐标,保留一位小数。 |
{t_z} | 被击杀实体 Z 坐标,保留一位小数。 |
{p_world} | 掉落玩家所在世界。 |
{p_x} | 掉落玩家 X 坐标,保留一位小数。 |
{p_y} | 掉落玩家 Y 坐标,保留一位小数。 |
{p_z} | 掉落玩家 Z 坐标,保留一位小数。 |
全服限制
tag-limit 为服务器范围的标记限制。count 是每个刷新周期内的最大产出次数,update-time 的单位为秒。
yaml
tag-limit:
稀有材料:
count: 3
update-time: 3600全服限制的当前剩余次数会保存到插件目录下的 taglimit.yml,服务器重启后会尝试恢复已保存的剩余次数。执行标记限制重载时,计数会重新按照配置上限初始化。
个人限制
player-tag-limit 为每名玩家单独计算的标记限制。玩家数据会保存个人标记的当前次数、最大次数和下次刷新时间。
yaml
player-tag-limit:
稀有材料:
count: 2
update-time: 3600个人限制需要玩家数据保存功能。未启用 MySQL 时,数据保存到插件目录下 playerdata/<玩家UUID>.yml;启用并成功连接 MySQL 后,数据保存到 MySQL。
**MySQL 存储要求:**必须安装 LyMySQLCore,并且 LyMySQLCore 成功连接数据库后,个人限制的 MySQL 读写功能才会生效。仅在 config.yml 中填写 mysql 配置并不能保证数据库已经连接成功。
全服限制和个人限制会同时检查。带有掉宝率加成产生的额外掉落也会正常扣减标记次数。
玩家数据与每日金币
插件会保存以下玩家数据:
| 数据 | 说明 |
|---|---|
| 每日金币上限 | 根据 eco-daily-limit 和玩家权限计算。 |
| 今日已获得金币 | 用于计算当前剩余金币。每天本地时间 0 点重置。 |
| 个人标记限制 | 保存每个标记的当前次数、最大次数和刷新时间。 |
eco-daily-limit.default 是没有匹配到权限时使用的默认上限,值为 -1 时表示不限制。权限规则中的值为 -1 时也表示不限制;多个匹配权限同时存在时,插件使用更高的正数上限,任意匹配到 -1 时直接视为不限制。
auto-save-interval 控制玩家数据和全服标记限制的自动保存间隔,单位为秒。玩家退出、被踢出和插件关闭时也会执行保存。
触发来源
插件会根据服务器环境注册不同的实体死亡监听:
| 环境 | 处理方式 |
|---|---|
| MythicMobs 4 | 使用 MythicMobs 4 的怪物死亡事件,并支持 MythicMobs 4 原生掉落加成监听。 |
| MythicMobs 5 | 使用 MythicMobs 5 的怪物死亡事件。 |
| 未启用 MythicMobs | 使用 Bukkit 实体死亡事件,并读取实体自定义名称或 CustomNPC 名称。 |
击杀者为玩家时,使用该玩家作为掉落触发者。部分 MythicMobs 事件没有直接击杀者时,插件会尝试使用怪物当前目标或附近最近的玩家作为触发玩家。狼击杀实体时,会将狼主人作为掉落触发者。
插件会记录玩家对生物造成伤害的时间,用于 participant#秒数 掉落方式。实体死亡后,该实体的伤害记录会参与筛选;超过配置时间的伤害记录不会获得掉落。
物品发放事件
物品最终发放前会调用插件提供的物品掉落事件。其他插件可以监听并取消事件,或修改事件中的物品。事件被取消时,该物品不会继续进入仓库、背包或地面。
常见问题
修改了掉落文件但没有生效
确认文件扩展名为 .yml,并且掉落组顶层 ID 已经在怪物分配配置中引用。修改后需要执行插件重载;重载时控制台会输出已载入的掉落组数量。
掉落组存在但没有任何掉落
依次检查:
group-select是否存在且至少有一个分组条件通过。- 被选中的分组是否同时存在于
drop、exp或currency对应节点。 default中的概率和weight中的权重是否写在花括号之后。- 标记是否已经达到全服或个人限制。
- 对应物品库中的物品 ID 是否存在。
为什么没有匹配到分组
group-select 中所有条件都没有通过时,插件不会执行该玩家的掉落。多个条件写在同一分组下时,它们需要全部满足。多个分组同时满足时,以配置顺序中后面匹配到的分组为准。
为什么配置了个人限制但仍然没有数据
确认已安装 LyMySQLCore,并确认数据库连接成功。未连接数据库时,相关个人数据会按本地 YAML 方式保存;如果配置要求使用 MySQL,则必须先解决数据库连接问题。个人限制只在玩家数据成功加载后才能准确恢复。
为什么金币到账数量少于配置值
检查玩家的每日金币上限、今日已获得金币数量和 eco-daily-limit 权限规则。达到上限时,插件只发放剩余可获得数量,并发送金币上限提示。
为什么物品没有进入仓库
仓库插件必须已启用,并且对应仓库能够识别当前物品。custom-drop-index 只决定尝试顺序;所有仓库都无法接收时,插件会根据 drop-to-inv 决定尝试背包或直接掉地。
为什么观察者没有获得掉落
当 viewer-mode-can-get-drop 设置为 false 时,观察者不会参与范围、世界、全服和参与者掉落。将该配置设为 true 后,观察者才会被加入这些掉落对象列表。
为什么重载后控制台提示物品不存在
插件会在重载时校验已启用物品插件中的物品 ID。检查提示中的文件名、掉落组、分组、节点和物品 ID;确认物品插件已经启动,并确认配置使用了正确的前缀和物品 ID。