YSM可用变量
query.actor_count 实体数量
query.anim_time 当前动画播放时间(秒),如果动画未播放则为 0
query.body_x_rotation 玩家⾝体 X 旋转⻆度,默认为 0
query.body_y_rotation 玩家⾝体 Y 旋转⻆度,默认为 0
query.cardinal_facing_2d 玩家朝向(忽略上下朝向,北=2.0,南=3.0,西=4.0,东=5.0)
query.distance_from_camera 玩家和镜头之间的距离
query.equipment_count 玩家装备的护甲数量(0-4),不考虑⼿持物品
query.eye_target_x_rotation 玩家视⻆ X 旋转⻆度,默认为 0
query.eye_target_y_rotation 玩家视⻆ Y 旋转⻆度,默认为 0
query.ground_speed 玩家速度(⽶/秒)
query.has_cape 玩家有披⻛时为 true,否则为 false
query.has_rider 玩家被骑乘时为 true,否则为 false
query.head_x_rotation 玩家头部 X 旋转⻆度,默认为 0
query.head_y_rotation 玩家头部 Y 旋转⻆度,默认为 0
query.health 玩家⾎量
query.hurt_time 玩家受伤计时,默认为 0
query.is_eating 玩家正在进⻝时为 true,否则为 false
query.is_first_person 玩家处于第⼀⼈称视⻆时为 true,否则为 false
query.is_in_water 玩家在⽔中时为 true,否则为 false
query.is_in_water_or_rain 玩家在⽔中或⾬中时为 true,否则为 false
query.is_jumping 玩家跳跃时为 true,否则为 false
query.is_on_fire 玩家着⽕时为 true,否则为 false
query.is_on_ground 玩家在地⾯时为 true,否则为 false
query.is_playing_dead 玩家濒死状态时为 true,否则为 false
query.is_riding 玩家骑乘时为 true,否则为 falsequery.is_sleeping 玩家睡觉时为 true,否则为 false
query.is_sneaking 玩家潜⾏时为 true,否则为 false
query.is_spectator 玩家是观察者模式时为 true,否则为 false
query.is_sprinting 玩家疾跑时为 true,否则为 false
query.is_swimming 玩家游泳时为 true,否则为 false
query.is_using_item 玩家正在使⽤物品时为 true,否则为 false
query.item_in_use_duration 从 0 开始持续计数,直到该物品的最⼤可使⽤时⻓(秒),默认为 0
query.item_max_use_duration 所使⽤的物品的最⼤可使⽤时⻓(秒),默认为 0
query.item_remaining_use_duration 所使⽤的物品的剩余可使⽤时⻓(秒),默认为 0
query.life_time 当前动画播放了多久(秒),如果动画未播放则为 0
query.max_health 玩家的最⼤⾎量
query.modified_distance_moved 玩家⽔平移动距离的总数(⽶)
query.moon_phase 当前⽉相(0-7)
query.player_level 玩家的经验等级,默认为 0
query.time_of_day ⼀天中的时间(午夜=0,⽇出=0.25,正午=0.5,⽇落=0.75)
query.time_stamp 当前所处世界的时间戳
query.vertical_speed 玩家移动中垂直分量的速度(⽶/秒),朝上移动为正数
query.walk_distance 玩家步⾏移动距离的总数(⽶)
query.yaw_speed 实体 Y ⻆度旋转时的速度
ysm.armor_value 护甲值(0-20)
ysm.has_helmet 玩家穿戴头盔时为 true,否则为 false
ysm.has_chest_plate 玩家穿戴胸甲时为 true,否则为 false
ysm.has_leggings 玩家穿戴护腿时为 true,否则为 false
ysm.has_boots 玩家穿戴靴⼦时为 true,否则为 false
ysm.has_mainhand 玩家主⼿持有物品时为 true,否则为 false
ysm.has_offhand 玩家副⼿持有物品时为 true,否则为 false
ysm.is_close_eyes 默认为 false,当玩家需要眨眼返回 true
ysm.is_riptide 玩家处于激流状态时为 true,否则为 false
ysm.has_elytra 玩家穿戴鞘翅时返回 true,否则为 false
ysm.elytra_rot_x 玩家鞘翅的 X 旋转⻆度
ysm.elytra_rot_y 玩家鞘翅的 Y 旋转⻆度
ysm.elytra_rot_z 玩家鞘翅的 Z 旋转⻆度
ysm.food_level 返回玩家饥饿值
ysm.first_person_mod_hide 当玩家安装更真实的第⼀⼈称模型模组,且需要隐藏玩家头部时为 true,否者为 false
ysm.weather 获取当前天⽓,0:晴天,1:⾬或雪,2:雷⾬或暴雪
ysm.is_open_air 玩家处于露天区域时为 true,否则为 false
ysm.effect_level(potion ID) 获取玩家或箭⽮上附加的药⽔效果等级。potion ID 为字符串类型的药⽔ ID。返回数值类型的药⽔效果等级。如果不存在,则返回 0 。
例(获取⽬标附加的⽣命恢复效果的等级):
ysm.effect_level('minecraft:regeneration')
ysm.relative_block_name(x, y, z) 获取玩家附近某个⽅块的 ID。x,y,z为以玩家为中⼼的⽬标⽅块的相对位置坐标,返回字符串类型的⽅块 ID
例(玩家脚下的⽅块):
ysm.relative_block_name(0, -1, 0)
返回(此例中为沙子):
'minecraft:sand'
ysm.equipped_enchantment_level(Equipment Slot, Enchantment ID) 获取玩家已装备物品的指定附魔等级。其中,Equipment Slot 为字符串类型的玩家装备槽,参考 基岩版文档,注意区分大小写;Enchantment ID 为附魔 ID,参考 Wiki
例(获取主⼿物品经验修补等级):
ysm.equipped_enchantment_level('Mainhand', 'minecraft:mending')
返回:
1
YSM常用的Molang整理与总结
可脱部分:检测护甲栏是否有护甲,通过穿脱护甲来实现脱衣/卸甲。
用于:parallel 动画
部位:衣服/盔甲
关键帧:缩放
头盔 ysm.has_helmet
胸甲 ysm.has_chest_plate
护腿 ysm.has_leggings
鞋子 ysm.has_boots
眼部追踪:让瞳孔跟随玩家视线进行移动,模拟眼部追踪效果。
用于:parallel 动画
部位:瞳孔/眼球
关键帧:位置
X=ysm.head_yaw/180
Y=ysm.head_pitch/360
Z=0
头部锁定:锁定头部,让其不跟随视角进行旋转。
用于:部分动画
部位:头部
关键帧:旋转
X=ysm.head_pitch
Y=math.clamp(ysm.head_yaw,-60,60)
Z=0
自动眨眼:自动根据是否需要闭眼而闭眼(通常为 4 秒一次),懒得做闭眼动画可以直接用这个。
用于:pre_parallel 动画
部位:眼睛
关键帧:缩放
全部:ysm.is_close_eyes ? 0 : 1
部位:眉毛
关键帧:位置
X=0
Y=ysm.is_close_eyes ? -1 : 0
Z=0
上身追踪:让玩家上半身跟随视角进行旋转,模拟更真实的弯腰,同时头部需要调整反方向的旋转角度来使其契合(不推荐)。
用于 pre_parallel 动画
部位:上半身(每段)(建议套个新组,例如在 upbody 上分组元素到新组 Mupbody,这样在如果不需要此 molang 的时候可以通过 pre_parallel 被覆盖关键帧来取消该 molang)
关键帧:旋转
X=-ysm.head_pitch/3
Y=-ysm.head_yaw/3
Z=0
注释:ysm.head_pitch 玩家上下视角角度,ysm.head_yaw 玩家左右视角角度。
解释:当玩家移动视角时,将以三分之一的倍率旋转上半身,根据需求添加+-号和倍率。
鞘翅飞行跟随旋转_旧:检测玩家视角,在鞘翅飞行时根据玩家视角进行人物旋转,AllBody 的轴枢点应该在人物中心。
用于:elytra_fly/swim 动画
部位:全身
关键帧:旋转
X=-ysm.head_pitch*任意倍率+任意值
Y=0
Z=-ysm.head_yaw*任意倍率
注释:ysm.head_pitch 玩家上下视角角度,ysm.head_yaw 玩家左右视角角度。
解释:当玩家移动视角时,将以一定倍率旋转全身,根据需求添加+-号和更改倍率。
饥饿检测:在角色饱食度小于某个值时对某个部位进行旋转或者移动缩放等操作,来做出对应的效果
ysm.food_level<6?25:0
同理还有基于经验等级的 molang
query.player_level
部位闪烁:在角色残血时对某个部位进行闪烁缩放
用于:attacked/parallel 动画
部位:光环/护盾/任意
关键帧:缩放
全部/根据需求:(math.random(0,query.max_health*0.5)<query.health)?1:0
注释:math.random(最小值,最大值),每tick抽取两个值之间的随机数。
解释:每 tick 抽取 0~50%(可更改)最大生命值 的随机数,如果小于当前生命值则缩放 1,否
则缩放 0
(玩家的部位/光环会在生命值小于 50%时随机闪烁,生命值越低则出现概率越低直至不可见)
部位抽搐抖动:
用于:attacked/parallel 动画
部位:光环/护盾/任意
关键帧:位置
根据需求:(math.random(0,query.max_health*0.5)<query.health)?0:math.random(-1,1)注释:math.random(最小值,最大值),每帧抽取两个值之间的随机数。
解释:每 tick 抽取 0~50%(可更改)最大生命值 的随机数,如果小于当前生命值则移动-1~1之间的随机数,否则不动
(玩家的部位/光环会在生命值小于 50%时随机抖动,生命值越低则抖动频率越高)
长发防穿模:通过检测玩家视角,让长发旋转,实现抬头不会长发穿胸,低头不会反重力长发
用于:parallel 动画
部位:长发
关键帧:旋转
X=(ysm.head_pitch > 0) ? (1.2*ysm.head_pitch) : (0.35*ysm.head_pitch)
Y=0
Z=0
注释:ysm.head_pitch 玩家上下视角角度,ysm.head_yaw 玩家左右视角角度。
解释:如果玩家垂直视角大于 0,则旋转 1.2 倍的视角角度,如果小于 0,则旋转 0.35 倍的视角角度。根据需求还可以更改倍率或者使用 math.clamp(值,最小值,最大值)限制旋转角度。
摄像机距离检测:检测玩家与摄像机视角的距离,如果距离过近,则进行例如表情之类的缩放或移动
用于:parallel 动画
部位:表情/任意
关键帧:位置/缩放
query.is_first_person?0:(query.distance_from_camera<1.5?-1:0)
注释:query.is_first_person 是否处于第一人称,query.distance_from_camera 玩家距离摄像机的距离。
解释:当玩家处于第一人称时则无事发生,当玩家不处于第一人称时,检测玩家(root 位置)与摄像机的距离,如果小于 1.5m 则移动表情。
战损爆甲:检测玩家当前生命值,如果小于一定血量,则输出 0,否则输出 1。
用于:parallel 动画
部位:护甲/衣服
关键帧:缩放
(query.health/query.max_health)<0.5?0:1
解释:如果玩家当前百分比生命值小于 50%(可更改,建议不同部位使用不同数值),则使其消失。
跑步倾斜:通过检测玩家视角,让其在奔跑时跟随视角左右倾斜身体(现在 default 自带)
用于:run 动画
部位:root
关键帧:旋转
X=0
Y=0
Z=ysm.head_yaw/3
注释:ysm.head_pitch 玩家上下视角角度,ysm.head_yaw 玩家左右视角角度。
解释:检测玩家左右视角,根据视角向左右倾斜。
跑步头发随速度飘动:通过检测玩家地面速度,让其在奔跑时头发跟随速度飘动
用于:run 动画
部位:longhair/任意
关键帧 第一帧:旋转
X=math.sin(query.life_time*波长)*query.ground_speed*波峰
Y=0
Z=0
头发/披风的物理模拟:是之前下落物理的升级版,可以模拟头发上升下落和水平移动速度产生的旋转,通过一系列函数进行平滑模拟,感谢雨倩先生的数学支持:
用于:pre_parallel 动画
部位:头发/披风/裙摆
关键帧:旋转
X=((1-math.exp(-0.1*query.ground_speed))*60)-(query.vertical_speed/math.abs(query.vertical_speed)*(1-math.exp(-0.1*math.abs(query.vertical_speed)))*30)
Y=0
Z=0
游泳/鞘翅物理模拟
用于:swim/elytra_fly 动画
部位:全身(AllBody)
关键帧:旋转
X=0
Y=ysm.head_yaw*1.5
Z=ysm.head_yaw*0.6
部位:全身的父级组(例如给 AllBody 分组元素到 MAllBody)
X=-ysm.head_pitch
Y=0
Z=0
部位:下半身(DownBody)
关键帧:旋转
X=math.abs(ysm.head_yaw)
Y=0
Z=0