常见问题
插件加载后技能、条件和选择器没有生效怎么办?
按以下顺序检查:
- 确认
MythicMobs已经正常启用。插件只有检测到 MythicMobs 后,才会注册扩展技能、条件和选择器。 - 确认配置中的
load-mythic-function为true。设为false会停止注册全部 MythicMobs 扩展。 - 查看控制台中的前置检测信息,确认没有出现
MythicMobs 未启动。 - 修改配置后先执行
/lamm reload,再执行/mm reload,让 MythicMobs 重新解析技能配置。
插件正常接入 MythicMobs 后,会自动从控制台执行一次 mm reload。
/lamm 指令没有反应怎么办?
/lamm 只处理 OP 执行者,没有单独定义权限节点。
| 指令 | 执行要求 | 说明 |
|---|---|---|
/lamm | OP | 查看插件内置指令提示 |
/lamm reload | OP | 重载本插件的 config.yml |
/lamm use 技能ID | OP 玩家 | 让执行者释放指定 MythicMobs 技能,不能由控制台使用 |
/lamm cast 技能ID 玩家名 | OP 或控制台 | 强制指定在线玩家释放技能 |
使用 /lamm cast 时,如果玩家不在线或玩家名无法匹配,指令会直接结束。技能 ID 不存在时,目标玩家会收到技能不存在的提示。
修改配置后为什么效果没有变化?
/lamm reload 只重新读取本插件的 config.yml,不会让 MythicMobs 重新解析已经加载的技能文件。
| 修改内容 | 需要执行 |
|---|---|
attack-mode、debug、no-clear-attribute | /lamm reload |
load-mythic-function | /lamm reload 后执行 /mm reload |
replace-mythic-summon | /lamm reload 后执行 /mm reload |
| MythicMobs 技能、条件或选择器配置 | /mm reload |
如果关闭 load-mythic-function,已有 MythicMobs 技能可能仍保留之前解析的对象。修改后应同时重载 MythicMobs。
修改 replace-mythic-summon 后为什么 summon 没变化?
replace-mythic-summon 决定 MythicMobs 解析 summon 时,是否使用插件提供的召唤实现。MythicMobs 已经加载过的技能不会因为 /lamm reload 自动重新解析。
修改后依次执行:
text
/lamm reload
/mm reload也可以直接在技能中使用 ly-summon,不依赖原生 summon 的替换开关。
召唤物释放属性技能时找不到原始玩家怎么办?
damage-ap、attr-ap、damage-sx、attr-sx 和 heal-papi 会尝试沿召唤链查找最上级召唤者,最多向上查找 8 层。
只有通过以下机制创建的 MythicMob 会记录本插件使用的召唤关系:
ly-summon- 被
replace-mythic-summon: true替换后的summon attribute-summon
如果技能链中混用了没有被替换的原生 summon,召唤关系可能在中途断开。请将对应位置改为 ly-summon,或者开启替换后执行 /mm reload。
召唤关系保存在运行时内存中。服务器重启后,重启前已经存在的实体不会重新写入这份关系记录。
damage-ap 没有造成伤害怎么办?
按以下项目检查:
- 确认
AttributePlus已经安装并正常启用。 - 确认目标是存活且有效的生物实体。
- 确认属性键与 AttributePlus 实际注册的属性名称完全一致。无法识别的属性键会被忽略。
- 如果由召唤物释放,确认召唤链由
ly-summon、替换后的summon或attribute-summon建立。 - 检查
attack-mode。模式1使用基于v1_12_R1的原版近战攻击实现,并且最上级攻击者必须是玩家类型;配置文件建议使用模式2至4。 - 开启
debug: true,查看伤害源解析和本次提交的 AttributePlus 属性。
damage-ap 只会向 AttributePlus 提交已经注册的属性。配置了错误的属性名称时,不会自动创建该属性。
damage-ap 的 清除属性 有什么作用?
清除属性 或 clear 默认为 true。启用时,插件会在攻击前临时抵消攻击者当前的大部分 AttributePlus 属性,再加入本次技能配置的伤害属性,攻击完成后移除这些临时来源。
不希望被抵消的属性需要写入 no-clear-attribute:
yaml
no-clear-attribute:
- '生命力'
- '移速加成'虽然默认配置注释称该列表可以忽略,但当前代码仍会读取并使用它。涉及生命、防御、移动速度等不应临时清除的属性时,应保留对应名称。
damage-ap 的伤害事件被其他插件取消后会怎样?
插件会为本次 damage-ap 攻击临时写入专用标记,并在高优先级伤害监听器中解除已经取消的伤害事件。攻击结束后会立即移除标记。
如果仍然没有伤害,需要继续检查:
- 是否存在更晚执行的监听器再次取消事件。
attack-mode是否适合当前服务端环境。- AttributePlus 是否成功计算本次临时属性。
- 目标是否处于无效、死亡或不可受伤状态。
attr-ap 没有添加属性怎么办?
确认以下条件:
- 目标必须是存活且有效的生物实体。
- 必须能够解析到最上级召唤者或当前生物施法者。
- AttributePlus 必须正常启用。
- 属性名称必须与 AttributePlus 的属性名一致。
time使用 Tick,最小值会被限制为1。
开启 debug: true 后,控制台会输出最上级召唤者和本次生成的属性列表。
如果填写 唯一 参数,属性来源 ID 会固定为 lamm_attr_参数值;不填写时,每次释放都会生成独立来源 ID。
属性公式为什么没有被计算?
不同技能使用的公式格式并不完全相同。
| 使用位置 | 支持格式 | 说明 |
|---|---|---|
attribute-summon 的生命和附加属性 | {math:表达式} | 先解析玩家 PAPI 变量,再计算公式 |
damage-ap、attr-ap | 数值运算 或 <表达式> 对应的半角尖括号格式 | 纯运算字符串和尖括号内公式会尝试计算 |
damage-sx、attr-sx | <表达式> 对应的半角尖括号格式及数值运算 | 使用最上级召唤者解析 PAPI |
heal-papi、sethealth-papi、setmaxhealth-papi | 直接填写算式 | 使用逆波兰表达式计算器处理 |
尖括号公式应写在技能代码中,例如:
text
attr-ap{time=200;物理伤害=<100+20>}公式计算器支持整数、小数、括号以及 +、-、*、/、^。如果公式包含无法识别的内容,可能保留原字符串、输出公式错误,或导致数值转换失败。
PAPI 变量没有被替换怎么办?
确认 PlaceholderAPI 已经启用。插件启动时会在控制台输出 PlaceholderAPI 的检测结果。
变量上下文根据技能不同而变化:
| 技能 | 主要变量上下文 |
|---|---|
damage-ap、attr-ap | 最上级召唤者是玩家时,使用该玩家解析 PAPI |
damage-sx、attr-sx | 最上级召唤者是玩家时,使用该玩家解析 PAPI |
attribute-summon | 召唤物主人是玩家时,使用主人解析 PAPI |
lycmd | 使用技能目标玩家解析 PAPI |
heal-papi | 根据 origin 选择目标或最上级召唤者作为数值来源 |
sethealth-papi、setmaxhealth-papi | 使用目标玩家解析 PAPI |
如果上下文实体不是玩家,对应的 PAPI 变量不会被解析。
attribute-summon 召唤成功但没有继承属性怎么办?
检查以下内容:
- 召唤类型必须是 MythicMob。直接生成普通 MythicEntity 的分支不会附加属性。
- 召唤物必须成功设置 owner,没有主人时不会继承属性。
属性、additionalattributes或aa不能为空。插件、plugin或attributeplugin应填写ap、sx2或sx3。- 对应属性插件及其 API 必须正常加载。
- 属性字符串必须符合对应属性插件的格式。
生命、health或hp计算结果必须大于0,否则保留 MythicMob 默认生命。
插件会在控制台输出召唤物名称和最终生成的属性列表,可根据该输出检查变量与公式结果。
attribute-summon 设置生命后没有变化怎么办?
生命配置会先解析 PAPI 和 {math:表达式},然后转换为数字。只有结果大于 0 时,插件才会同时设置召唤物的最大生命和当前生命。
以下情况会保留怪物默认生命:
- 未填写生命参数。
- 最终结果为
0或负数。 - 使用的 PAPI 没有正确解析。
- 公式或最终文本无法转换为数字。
damage-sx 或 attr-sx 没有效果怎么办?
先确认 SX-Attribute 已正常启用,并且版本号以 2 或 3 开头。其他主版本会被识别为无法兼容。
当前代码中,attr-sx 构造 SX 属性数据后,实际写入和移除实体临时属性数据的调用处于注释状态。damage-sx 中写入临时 SX 属性数据的调用同样处于注释状态。因此,这两个机制不能保证按配置生成临时 SX 属性,不应将其视为与 AttributePlus 实现完全等价。
启动时可通过控制台确认插件最终注册的是 SX-Attribute 2 还是 SX-Attribute 3 的实现。
gtag、ltag、etag 条件一直不通过怎么办?
当前条件实际读取的参数如下:
| 参数 | 别名 | 说明 |
|---|---|---|
tag | t | 标签 ID |
layer | l | 用于比较的层数 |
条件中的层数应使用 l 或 layer,不是旧配置注释中的 v。
text
gtag{t=怒气;l=3}
ltag{t=怒气;l=10}
etag{t=怒气;l=5}另外还需要确认:
- 目标已经通过
ly-settag、ly-addtag或ly-taketag写入同名标签。 - 标签名称完全一致。
- 标签由本插件写入。条件只读取归属于本插件的实体 metadata。
- 没有标签时,三个比较条件都会返回不通过。
标签层数会自动限制为零以上吗?
不会。
ly-addtag会在当前值上直接增加配置值。ly-taketag会在当前值上直接减去配置值。ly-settag会直接覆盖为配置值。
插件没有设置最小值或最大值,因此标签层数可以为负数。标签技能可以使用 value、v、layer 或 l 指定变化值。
dp 或 dm 队友条件无法判断怎么办?
dp 对应 DungeonPlus,dm 对应 DungeonMaster。对应副本插件没有正常启用时,相关条件无法工作。
| 参数值 | 结果 |
|---|---|
s=true | 目标必须是队友,默认值 |
s=false | 目标必须不是队友 |
s=allow | 不限制队友关系,条件始终通过 |
队友条件不包含施法者本人。施法者或目标如果是召唤物,插件会尝试沿最多 8 层召唤链解析最终玩家主人。
DungeonPlus 条件只检查队伍中符合 NO_DEATH 状态的玩家。DungeonMaster 条件要求施法者已经处于副本实例中,并检查该实例的玩家 UUID 列表。
DungeonPlus 或 DungeonMaster 选择器选不到目标怎么办?
先确认施法者确实位于对应队伍或副本中,再检查选择器类型和半径。
dptm、dpotm、dmtm、dmotm只选择队友。dpntp、dpontp、dmntp、dmontp选择排除自己及队伍成员后的玩家。dpnte、dponte、dmnte、dmonte选择排除自己及队伍成员后的实体。- 名称中带
o的选择器使用技能基础坐标作为范围中心,适合放置物等场景。 - 不带
o的选择器以自身为范围中心。
可以先将 r 设为 -1 排除距离和世界限制。能够选中后,再改为实际半径。数字参数支持 PAPI 和四则运算时,还需要确认 PlaceholderAPI 已启用且最终结果可以转换为数字。
autofollow 或 moveto 没有移动怎么办?
这两个机制直接使用 v1_12_R1 的 NMS 寻路与移动控制器,施法者必须是具有 AI 和移动控制器的生物实体。
请检查:
- 技能目标是存活且有效的生物实体。
- 施法者与目标位于同一世界。
- 施法者不是没有原版 AI 控制器的实体类型。
speed是有效数字;小于等于0时会回退到0.35。- 实体没有在技能执行期间更换移动控制器或导航对象。
移动任务最长运行 200 Tick,距离目标约 2 格时会停止。对同一实体再次释放会取消上一次移动任务。
autofollow 中,如果双方距离超过 border,目标会被传送到施法者身后;施法者已有存活攻击目标时,不会启动新的跟随寻路。双方不在同一世界时,当前施法者会被设置为死亡。
runfunc 没反应怎么办?
runfunc 依赖 DragonCore,技能目标必须是在线、存活且有效的玩家。怪物或其他非玩家实体不能接收客户端方法调用。
可以先使用简单方法测试客户端通信:
text
runfunc{s=方法.屏幕抖动(3,15,10,3)} @self如果没有效果,检查 DragonCore 服务端插件、玩家客户端和对应方法名称是否正常。runfunc 只读取 s 参数。
bindentity 没反应或报 UUID 错误怎么办?
bindentity 依赖 DragonCore,技能目标必须是玩家。参数中的 entity 和 owner 会直接通过 UUID.fromString 转换,必须是完整有效的 UUID 字符串。
| 参数 | 默认值 | 说明 |
|---|---|---|
entity | 无 | 被绑定实体的 UUID |
owner | 无 | 绑定目标实体的 UUID |
forward | 0 | 前后偏移 |
offsetY | 0 | 垂直偏移 |
sideways | 0 | 左右偏移 |
bindYaw | true | 是否绑定水平朝向 |
bindPitch | true | 是否绑定俯仰角 |
缺少 UUID、UUID 格式错误或参数无法转换为数字、布尔值时,技能可能抛出解析异常。
camera 没反应怎么办?
camera 依赖 GermPlugin,最终技能目标必须是玩家。目标是怪物时不会发送镜头数据。
| 参数 | 说明 |
|---|---|
t | GermPlugin 的镜头类型 |
m | 移动到目标镜头值所需时间 |
s | 镜头持续时间,配置注释说明 -1 表示持续 |
v | 镜头数值 |
r | 是否旋转,填写 true 或 false |
已确认的镜头类型包括:
CAMERA_PITCHCAMERA_ROLLCAMERA_YAWOFFSET_XOFFSET_YOFFSET_ZPITCHROLLYAW
t 会直接通过枚举名称解析,大小写或名称错误会导致解析失败。
lycmd 没有执行指令怎么办?
lycmd 的目标必须是在线、存活且有效的玩家。cmd 中的 PAPI 变量使用目标玩家解析。
| 前缀 | 执行方式 |
|---|---|
| 无前缀 | 由目标玩家执行 |
[op] | 临时给予目标玩家 OP 后执行,完成后恢复原状态 |
[console] | 由控制台执行 |
不要在命令内容前添加 /,插件会直接将处理后的文本提交给 Bukkit 指令调度器。cmd 为空时不会执行任何内容。
heal-papi 的数值来源不正确怎么办?
heal-papi 支持 v、value 和 origin 参数。
origin | 数值变量来源 |
|---|---|
target | 使用技能目标,默认值 |
me | 使用解析到的最上级召唤者 |
目标不是玩家时不会解析目标的 PAPI 变量,只会计算纯数字公式。治疗结果不会超过目标最大生命,负数结果会降低生命,但最终不会低于 0。
sethealth-papi 或 setmaxhealth-papi 对怪物报错怎么办?
虽然技能入口接受生物实体,但当前实现会将目标直接转换为玩家并使用 PlaceholderAPI。因此这两个技能应只对玩家目标使用。
sethealth-papi 会把最终生命限制在 0.01 到目标当前最大生命之间。
setmaxhealth-papi 同样会把数值限制在 0.01 到目标当前最大生命之间,因此当前实现不能把最大生命提高到原最大生命以上,只能保持或降低最大生命。
开启 debug 后为什么玩家看不到信息?
不同机制的调试输出位置不同:
damage-ap的属性列表只发送给作为最上级召唤者的 OP 实体,部分伤害源信息写入控制台日志。attr-ap的最上级召唤者和属性列表输出到控制台。damage-sx的属性列表发送给作为最上级召唤者的 OP 实体。attr-sx的属性列表输出到控制台。- 其他技能可能只在发生公式或指令错误时输出异常。
排查时应同时查看游戏内 OP 消息和服务端控制台。
服务端版本不一致时出现 NMS 错误怎么办?
当前项目中的攻击、自动跟随和移动实现直接引用 net.minecraft.server.v1_12_R1 与 org.bukkit.craftbukkit.v1_12_R1。
如果服务端不是对应的 v1_12_R1 实现,可能出现类不存在、方法不兼容或技能无法执行。仅修改 Java 构建目标或 Paper API 依赖不能消除这种 NMS 版本绑定,必须使用与插件实现匹配的服务端环境。