MythicMobs 技能
云模型的技能名称与参数跟 ModelEngine 相同。从 ModelEngine 换过来时,怪物文件一行都不用改。
FrostDragon:
Type: ZOMBIE
Skills:
- model{mid=frost_dragon} @self ~onSpawn
- state{s=roar;li=2;lo=3} @self ~onAttack
- partvis{m=frost_dragon;p=wing_r;v=false} @self ~onDamaged
技能一览
| 技能 | 参数 | 说明 |
|---|---|---|
model | mid scale remove usestatemachine lockpitch inherit damagetint(d、tint) invisible(i) shownames(sn) nameoffset(nh) init seeself(vs) vr(viewrange) | 套上 / 移除模型;init=false 先建立模型、等 renderinit 才显示;seeself=false 模型在玩家身上时玩家自己看不到;vr = 可见距离倍率(1 = 64 格,再乘玩家的实体显示距离设置;不写依 config 的 render.view-range);shownames / nameoffset 见 生物名称;inherit 见 套在展示实体上;damagetint 与 ModelEngine 相同是开关(d=false = 受伤不闪红),也可以直接填颜色(例如 d=#FF4040);i=false = 不隐藏底下的实体 |
state | mid(m) s li lo speed(sp) loop remove(r) ignorelerp(i) onend(oe) oeoffset(oeo) | 播放 / 停止动画;onend 见 动画播完时执行技能 |
brightness | m p b s | 设置亮度(p 为骨骼,省略 = 整个模型;b 方块光、s 天空光) |
partvis | m p visible(v) | 显示 / 隐藏骨骼 |
tint | m p c | 染色,c 为 #RRGGBB,省略 = 还原 |
defaultstate | m t s | 修改自动动画:t 为 idle / walk / death / spawn,s 为动画名称 |
billboard | m p b em c | 让骨骼永远面向每个玩家的镜头,见 面向玩家(1.0.6 起) |
scale | m s hitbox(h) | 改变模型大小,见 缩放(1.0.15 起) |
changepart | m p nm np | 把一根骨骼换成另一个模型某根骨骼的方块,见 换零件(1.1.0 起) |
remapmodel(remap) | m n map | 整个模型按骨骼名称换成另一个模型的外观,动画照旧(1.1.0 起) |
submodel | m sp r | r=true 拿掉骨骼(含子骨骼)、r=false 放回来(1.1.0 起) |
mountmodel dismountmodel dismountallmodel(dismountall) | 见 座位 | 让玩家或怪物坐在模型的 p_ 骨骼上(1.1.0 起) |
bindhitbox | m p t | 在碰撞箱骨骼生成 MythicMobs 怪物并跟着骨骼走,见 名牌与碰撞箱(1.1.0 起) |
setmodeltag | m p tag v … | 在 tag_ 名牌骨骼显示文字(1.1.0 起) |
light | 同 brightness | ModelEngine 的旧名称,light{p=灯;block=15} 照样可用 |
animatemodel | m p em o r copy pos rot scl rm | 用技能直接控制骨骼的位置 / 旋转 / 缩放,见 第一人称与玩家模型(1.5.0 起) |
pairmodel | hidden(h) remove(r) | 施法者身上的模型对目标玩家强制显示或隐藏(1.5.0 起) |
renderinit(rendererinit) | m | model{init=false} 建立的模型开始显示(1.5.0 起) |
modelplayerskin(modelskin) | m p user uuid skin slim | 把玩家皮肤套到 limb[type=...] 肢体骨骼(1.5.0 起) |
lockmodel(lockrotation) | l | 锁住模型的转向(身体、头部、俯仰),l=false 解开(1.5.0 起) |
bodyrotation(bodyclamp) enchant | — | ModelEngine 专属,接受但不做任何事,避免旧技能报错 |
目标选择器 @ModelPart、@ModelPassengers、@MountedModel 与条件 ModelHasPassengers 也同 ModelEngine,见 目标选择器与条件(1.1.0 起)。
变量与算式
技能参数和 ModelEngine 一样支持 MythicMobs 的变量与算式,每次施放时才计算(1.0.10 起):
- setvariable{var=caster.size;value="%attribute_player_value_scale%";type=DOUBLE} @self
- model{mid=magical_slash;scale=2*<caster.var.size>} @self
- state{mid=magical_slash;s=<caster.var.anim>;speed=<caster.var.sp>*2} @self
| 技能 | 支持变量的参数 |
|---|---|
model | mid scale |
state | mid s speed li lo |
brightness | m p b s |
partvis | m p |
tint | m p c |
defaultstate | m t s |
billboard | m p |
scale | m s |
changepart | m p nm np |
remapmodel | m n map |
setmodeltag | m p tag |
@ModelPart | m p x y z |
state{} 找不到动画时会在后台提醒一次,并列出这个模型有哪些动画(例如改了 .bbmodel 里的动画名称却没有 /cm reload)。
抛射物(projectile missile orbital totem)用模型当子弹:bulletType=MEG 原样可用,见 抛射物模型子弹(1.0.8 起)。
state 的 loop
| 写法 | 效果 |
|---|---|
| 不写 | 使用动画在 Blockbench 里设定的循环模式 |
loop / true | 强制循环 |
once / play_once / false | 播放一次 |
hold / hold_on_last_frame | 停在最后一帧(技能结尾姿势不会跳回待机) |
li / lo 是淡入 / 淡出的 tick 数,lo 默认 0,与 ModelEngine 相同。
动画播完时执行技能(onend)
onend(缩写 oe)填一个 MythicMobs 技能名称,动画播完时执行一次(1.3.0 起):
Skills:
- state{mid=boss;s=attack;loop=once;oe=Boss_AttackEnd} @self
- state{mid=sk132;s=start;loop=hold;oe=SK132_Explode} @self
# MythicMobs/skills/xxx.yml
Boss_AttackEnd:
Skills:
- state{mid=boss;s=idle;loop=loop} @self
- damage{a=20} @PlayersInRadius{r=4}
| 情况 | 会不会执行 |
|---|---|
loop=once / hold(或动画本身是播放一次 / 停在最后一帧)播到最后 | 执行一次 |
loop=loop 循环动画 | 不执行(循环动画不会自己结束) |
还没播完就被 state{...;r=true} 停掉、被同名动画重新播放取代、模型被移除 | 不执行 |
- 技能的施法者与
state{}相同;技能里不写目标选择器的机制,目标就是播动画的实体。 - 技能名称可以用变量(例如
oe=<caster.var.next>),在state{}执行当下决定。找不到技能时后台提醒一次。 speed会影响播完的时间(speed=2就提早一半)。- 无缝衔接:技能默认在播完前 2 tick 执行(
oeoffset=2,1.3.2 起)——技能排到下一 tick 执行、新生成的模型送到玩家画面各要 1 tick,提早 2 tick 刚好让下一段(例如oe发射的子弹模型、播放的下一个动画)在这段结束的同一刻出现,中间没有空窗。要播完才执行就写oeo=0,想更早就填更大的数字。
自动动画
模型里有下列名称的动画时会自动播放,名称可以在 config.yml 的 default-states 修改:
| 状态 | 默认动画 | 时机 |
|---|---|---|
| 待机 | idle | 静止时循环 |
| 行走 | walk | 移动时循环 |
| 出生 | spawn | 套上模型时播放一次 |
| 死亡 | death | 实体死亡时播放 |
用 state{} 明确播放的动画会优先,自动动画不会叠在上面。model{usestatemachine=false} 可以关闭自动动画。
骨骼命名
与 ModelEngine 相同,骨骼名称前面的标签决定特殊行为;骨骼 ID = 去掉标签的名称。
技能里的 p / pid 写 ID 或完整名称都可以,例如骨骼 h_head 写 p=head、p_seat 写 pbone=seat(1.1.0 起)。
| 标签 / 名称 | 效果 |
|---|---|
h_ / hi_(含 h[...]_) | 跟随实体头部转向(例如龙头、炮塔) |
p_ | 乘客座位,mountmodel{driver=false} 用 |
mount | 驾驶座位(名称就是 mount);mountmodel 坐上去只会跟着模型走,经由 ModelEngine 兼容层(例如 MCPets)骑乘时可以操控 |
g_ | 幽灵骨骼:方块平时不显示,用 changepart / remapmodel 换上后才看得到 |
tag_ | 名牌骨骼,setmodeltag 用;tag_name 同时是生物名称的位置 |
b_ / ob_ | 碰撞箱骨骼:方块只用来表示碰撞箱大小,不渲染;bindhitbox 用 |
hitbox | 不渲染(ModelEngine 的实体碰撞箱骨骼) |
phead_ prarm_ plarm_ pbody_ prleg_ plleg_ | ModelEngine 的旧版玩家肢体,方块不渲染 |
limb[type=种类]_ | 玩家肢体:用 modelplayerskin 套上玩家皮肤,方块只是预览、不渲染。种类见 第一人称与玩家模型(1.5.0 起) |
armor[type=部位]_ | ModelEngine 的盔甲骨骼,目前不显示 |
换零件(changepart / remapmodel)
换装、换武器、Boss 进入第二阶段时,不必移除再套上模型,直接换掉骨骼的外观,动画进度不中断:
# 左手换成另一个模型的左手
- changepart{m=knight;p=left_arm;nm=knight_gold;np=left_arm} @self
# 血量低于一半:整个模型换成狂暴版的外观(同名骨骼逐一替换,找不到的保持原样)
- remapmodel{m=boss;n=boss_enraged} @self ~onDamaged =50%
# 只换上半身:用 boss_upper_body 模型里的骨骼决定要换哪些
- remapmodel{m=boss;n=boss_equipment;map=boss_upper_body} @self
# 换回原本的样子
- remapmodel{m=boss;n=boss} @self
- 只换骨骼自己的方块,子骨骼不受影响;换上来的方块跟着原骨骼的动画、旋转与缩放。
- 两个模型同一根骨骼的结构相同时(例如同一个模型的不同配色),只换物品、不重新生成,画面不会闪。
- 染色(
tint{})在换零件、/cm reload后会保留。
座位(mountmodel)
# 施法者的模型:附近的玩家坐上 p_seat 骨骼
- mountmodel{mid=swing;driver=false;pbone=seat} @PlayersInRadius{r=3}
# Boss 抓住目标:坐在 p_grab 骨骼上,跟着动画移动;乘客不能打 Boss
- mountmodel{mid=lady;driver=false;pbone=grab;dmg=false} @target
# 放下 grab 座位上的所有乘客
- dismountallmodel{mid=lady;p=grab} @self
| 参数 | 默 认 | 说明 |
|---|---|---|
mid | 全部模型 | 施法者身上的模型(注意 m 在这个技能是 mode) |
pbone / p / seat | 所有 p_ 座位 | 座位骨骼,可填多个(seat1,seat2),坐第一个空位 |
driver | true | false = 乘客座位;true = mount 骨骼 |
force | false | 座位都满了时换掉第一个座位的乘客 |
autodismount | false | 目标已经骑着别的东西时,先下来再坐上去 |
dmg / int | false | 乘客能不能打 / 右键自己坐的模型 |
- 乘客按潜行键可以下来(与原版骑乘相同)。模型消失、乘客死亡或离线时座位自动收掉。
- 与 ModelEngine 相同,服务器上乘客直接骑在模型的实体身上,玩家看到的座位跟着骨骼走;不会每 tick 传送乘客(1.2.0 起)。
dismountmodel放下目标自己;dismountallmodel(dismountall)放下模型座位上的所有乘客。
名牌与碰撞箱
# tag_name 骨骼显示文字(& 色码、MythicMobs 变量都可以)
- setmodeltag{m=totem;p=name;tag="&a已启动"} @self
- setmodeltag{m=totem;p=name;v=false} @self
# ob_shield 骨骼生成 Orc_Shield 怪物,跟着盾牌骨骼移动,模型消失时一起移除
- bindhitbox{m=orc;p=shield;t=Orc_Shield} @self
setmodeltag参数同 ModelEngine:v显示、billboard、scale、seethrough、shadow、linewidth、textopacity、backgroundcolor、usedefaultbackground、alignment。bindhitbox生成的怪物以施法者为上层(parent),可以填多根骨骼(p=shield,helmet)。
生物名称
生物套上模型后,原版会把名称藏起来(实体隐形、身上有乘客都不显示),所以由云模型照原版规则代为显示:
AlwaysShowName: true 时一直显示,否则准心对准时才显示(1.1.2 起)。
名称高度与原版、ModelEngine 相同(1.1.3 起):
| 模型里有 | 名称显示在 |
|---|---|
tag_name 骨骼 | 那根骨骼的位置 |
hitbox 骨骼 | 它顶端上方 0.5 格 |
| 都没有 | 实体碰撞箱顶端上方 0.5 格 |
光环、特效之类很高的方块不会影响名称高度;想调高调低用 nameoffset,不想显示用 shownames=false:
- model{mid=boss;nameoffset=1.5} @self ~onSpawn # 名称再往上 1.5 格(负数往下)
- model{mid=npc_portal;shownames=false} @self ~onSpawn # 这只生物的名称不显示
- 全部关掉:config 的
render.show-names: false;整体调高:render.name-offset。 - 同一只生物套了好几个模型时只显示一个名称(
shownames=true的优先,否则最先套上的那个)。
目标选择器与条件
| 名称 | 说明 |
|---|---|
@ModelPart{m=;p=} | 施法者模型某根骨骼的位置(em=false 时名称包含即可,会选到多根) |
@ModelPassengers{m=;p=} | 施法者模型座位上的乘客 |
@MountedModel | 施法者正坐在哪个模型上 |
ModelHasPassengers{m=;p=;mode=AND} | 条件:模型座位上有乘客(mode=OR = 任何一个座位有人就成立) |
@ModelPart 的偏移:offset=LOCAL(默认,跟着骨骼转:z 往前、x 往左、y 往上)、MODEL(跟着模型朝向)、GLOBAL(世界座标);
x y z 或 l=x,y,z 为偏移量,scale=true(默认)时偏移乘上模型大小。
# 在剑尖放粒子
- particle{p=flame;a=5} @ModelPart{m=sword_demon;p=blade_tip}
# 以剑尖的位置为目标执行技能
- skill{s=BladeHit} @ModelPart{m=sword_demon;p=blade_tip}
# 炮口往前 1 格的位置
- particle{p=smoke;a=10} @ModelPart{m=tank;p=barrel;offset=LOCAL;z=1}
套在展示实体上
技能特效常用 block_display / item_display / text_display 当底座,再用 MythicMobs 去改展示实体的缩放、旋转、位移来做动态效果。
加上 inherit=true,模型就会继承展示实体的参数,像是展示实体的内容一样跟着变(1.0.3 起):
- model{mid=slash_fx;inherit=true} @self ~onSpawn
| 展示实体的参数 | inherit=true 时模型会 |
|---|---|
| 变换:平移、左旋转、缩放、右旋转 | 整个模型跟着变 |
interpolation_duration、start_interpolation | 照原版的方式平滑过去,和展示实体同步 |
| 朝向(偏航、俯仰) | 整个模型跟着转(不继承时只跟偏航,俯仰只转 h_ 头部骨骼) |
teleport_duration | 转向也照这个时间平滑 |
亮度 brightness | 改用展示实体的亮度;技能的 brightness{} 仍然优先 |
billboard、发光、阴影 | 不继承:模型由很多零件组成,各自转向玩家会散开 |
- 不写
inherit时看 config 的render.inherit-display(默认false),所以旧技能的行为不变。 - 底座不是展示实体时,这个参数没有作用。
- 继承设定会随模型一起存档,区块重新加载、重启服务端后照样生效。