Skip to content

掉落规则

LyDropReload 的掉落规则写在插件目录下的 drop/*.yml 文件中。每个文件可以包含一个或多个掉落组,顶层节点名称就是掉落组 ID,不是怪物 ID。怪物与掉落组的对应关系写在 config.ymlmonster-drop-allocationdrop-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处理服务器当前在线的玩家。

nearbynearby_random 的数字会同时作为 X、Y、Z 方向的范围值使用。nearby 是否强制加入击杀者由 config.ymladd-killer-to-the-nearby 控制。

viewer-mode-can-get-dropfalse 时,旁观模式玩家不会参与 worldservernearbynearby_randomparticipant 掉落;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.ymlexp-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.ymldrop-add-attribute-compatible-with-currency 控制。货币还可以通过 currency-add-attribute-placeholder.<货币ID> 配置独立的货币加成变量,变量数值按百分比增加货币数量。

eco 受每日金币上限限制。实际到账数量可能小于配置数量;达到上限时会发送 message.eco-limit-reached 配置的提示。

物品与指令掉落

drop 按分组选项配置。每个分组可以包含 commanddefaultweight

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 中的每一条指令会在该掉落分组完成后执行,不经过 defaultweight 的概率判断。可以直接写指令,也可以使用 cmd{指令} 格式。

default

default 中的每一条记录独立进行概率判断。每条记录的基本格式为:

text
类型{物品ID#数量} 概率 [标记]

数量支持固定值、随机范围和四则运算表达式;概率也支持四则运算表达式。概率判断通过后,才会消耗标记限制并发放掉落。

weight

weight 中的记录按权重进行一次抽取。每条记录格式为:

text
类型{物品ID#数量} 权重 [标记]

权重不是百分比。插件会先排除当前标记限制不足的记录,再按剩余记录的权重总和随机选择一条。被选中的记录按一次掉落处理。

掉落类型

类型格式说明
mmmm{物品ID#数量}从 MythicMobs 物品库获取物品。
lislis{物品ID#数量}使用 MythicMobs 物品管理器获取物品。
nini{物品ID#数量}从 NeigeItems 获取物品。
sisi{物品ID#数量}从 SX-Item 获取物品。
nfnf{物品ID#数量}从 NeonFlash 获取物品。
afaf{物品ID#数量}从 AzureFlow 获取物品。
cmdcmd{指令}执行指令,不生成物品。

重载掉落文件时,插件会检查 defaultweight 中的 mmlisnisinfaf 物品 ID。对应物品插件未启用时不会执行存在性检查;插件已启用但物品不存在时,会在控制台输出无效物品配置提示。

掉落加成

掉宝率变量由 config.ymldrop-add-attribute-placeholder 提供。掉落组配置了非空的 drop-add-placeholder 时,优先使用掉落组自己的变量。

掉宝率计算规则如下:

  • 每 100 点掉宝率增加一次完整掉落计算。
  • 不足 100 点的部分按百分比概率增加一次掉落计算。
  • 基础掉落始终执行一次,因此掉宝率为 0 时仍会执行一次 defaultweight 判断。
  • 每次额外掉落都会重新执行该分组的 defaultweight
  • 经验不会受到掉宝率影响。
  • 货币是否随额外掉落增加由 drop-add-attribute-compatible-with-currency 控制。

掉宝率触发额外掉落时,如果 drop-add-message-enabletrue,插件会向玩家发送 drop-add-message 中的提示,并将 {count} 替换为当前额外触发次数。

掉落组的 use-drop-add-attribute 默认为 true。设置为 false 后,该掉落组不会执行额外掉落计算。

MythicMobs 原生掉落加成

drop-add-attribute-mythicmobtrue 时,掉宝率加成还会影响 MythicMobs 怪物的原生物品掉落。该功能只处理原生物品掉落,不影响原生经验、金币或其他效果,并且不保证兼容所有 MythicMobs 掉落写法。

drop-add-attribute-mythicmob-eventtrue 时,每次额外处理后会再次发送 MythicMobs 掉落事件,供其他插件接收额外掉落流程。

掉落发放位置

物品生成后,插件按以下顺序处理:

  1. 如果玩家当前为仓库优先,并且配置的仓库插件可以接收该物品,则发送到对应仓库。
  2. 如果未发送到仓库且 drop-to-invtrue,尝试放入玩家背包。
  3. 背包放不下的部分掉落到实体死亡位置附近的地面。
  4. 如果 drop-to-invfalse,直接掉落到地面。

custom-drop-index 只控制仓库之间的尝试顺序,不会强制启用仓库插件。当前代码支持以下仓库标识:

标识检测的插件或仓库
llwhLyLootsWareHouse。
lyckLyWarehouse。
srpYeeCore 的灵魂空间。
dsStarStorage。

玩家可以通过插件提供的切换功能在仓库优先和背包优先之间切换。玩家每次加入服务器时,会根据 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 是否存在且至少有一个分组条件通过。
  • 被选中的分组是否同时存在于 dropexpcurrency 对应节点。
  • 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。