Minecraft Wiki

除另有声明,转载时均必须注明出处若簡繁轉換出錯,請以遊戲內為準请勇于扩充与修正内容有兴趣逛逛我们的微博沟通交流,欢迎到社区专页需要协助,请在告示板留言

了解更多

Minecraft Wiki
Advertisement
Information icon
此特性为基岩版独有。
Ic translate
此条目的(部分)内容需要翻译。

你可以帮助我们来翻译此条目,但请勿使用机器翻译

该页面的翻译需要改进。

你可以在这里找到部分内容的原文,并帮助我们完善翻译。
注意:基岩版开发者文档中可能存在低质量翻译内容,在翻译基岩版开发者文档时请检查已翻译内容的翻译质量,并对照英文页面进行修正。

Template:Bedrock Edition Developer Documentation 这是基岩版1.12.0MoLang文档

版本:1.12.0.28

为什么要创造Molang?

MoLang是一种简单的基于表达式的语言,为实时且快速地计算数值而设计。它的设计重点是在JavaScript无法大规模执行的需要更高性能的系统中启用类似脚本的功能。我们需要这些底层系统中的脚本功能来支持用户修改模组,自定义实体,渲染和动画。

语法结构

MoLang的语法结构基于简单的C样式语法,专用于处理数学表达式。对于简要情况,脚本由一个表达式组成;而在需要中间值,或有助于减少计算时间的情况下,则可由多个表达式组成。

所有情况下,脚本中最后一个表达式的值会提供该脚本的值。在多表达式脚本中,除最后一个表达式外,所有表达式都必须为变量分配一个值。最后一个表达式也可分配,然而并不需要,因为它的值被默认用作返回值。

用途

  • 值类型是被具体指定的,如果没有指定,则默认为数值。
  • 所有的数值都是浮点数。
  • 对于布尔值false或true,将分别转换为浮点值0.0或1.0。
  • 对于布尔测试,等于0.0的浮点值为假,不等于0.0的值为真。
  • 对于数组索引,会将浮点数以C样式转换为整数,对于负值,转换为零;对于大值,则用数组大小包装。
  • 其他支持的类型是有意义的纹理、材质和几何图形(比如渲染控制器)。
  • 错误返回值为0.0。

变量

一个变量可能属于以下几个域

参数
范围 例子
temp 当前表达式 temp.foo = math.sin(query.anim_time); return temp.foo * temp.foo;
variable 只读值,通常指向当前实体 variable.my_saved_var = variable.my_saved_var + 1;
query 只读值,通常指向当前实体 query.is_baby
geometry 当前渲染控制器(控制使用的几何模型) "geometry": "array.geos[query.is_sheared]"
material 当前渲染控制器(与生物体自身发光等效果相关,选项固定,对应文件不开源) "materials": [ { "*": "material.default" }, { "leg*": "material.legs" } ]
texture 当前渲染控制器(控制生物使用的材质贴图) "textures": ["array.skins[query.is_saddled]"]

关键字

所有不在下面列出的范围内的标识符,将保留以供将来使用

参数
关键字 描述
"float" "数值常量值"
"( )" "圆括号用于控制运算表达式的先后顺序"
"[ ]" "方括号用于数组存取"
"query.function_name" "访问实体的属性"
"math.function_name" "各种数学方法(见下表)"
"temp.variable_name" "在当前表达式中存储一个临时变量"
"variable.variable_name" "在当前实体身上存储一个值供未来使用"
"geometry.geometry_name" "在实体定义中指向一个几何模型"
"material.material_name" "在实体定义中指向一个渲染器"
"texture.texture_name" "在实体定义中指向一个贴图"
"! && || < <= >= > == !=" "逻辑运算符"
"* / + -" "基本的数学运算符"
"test ? if true : if false" "条件运算符(三元表达式)"
"this" "在运行这个表达式前的值(上下文相关)"
"return" "在复杂的表达式中,这个关键字会在返回后面的表达式的值后停止运算"

数学函数

参数
函数 描述
"math.abs(value)" value的绝对值
"math.sin(value)" value的正弦值
"math.cos(value)" value的余弦值
"math.exp(value)" value以e为底数的指数函数
"math.ln(value)" value以e为底数的对数函数
"math.pow(base, exponent)" 返回base的exponent次幂
"math.sqrt(value)" value的平方根
"math.random(low, high)" 在最小值到最大值之间的随机数(注:low不会列为随机数中的数字,所以随机数字的范围为low后一位直至high,包括high)
"math.ceil(value)" 数字的向上取整
"math.round(value)" 数字四舍五入取整
"math.trunc(value)" 截短法取整,这种方式在处理负数时是向上取整
"math.floor(value)" 向下取整
"math.mod(value, denominator)" value 除以 denominator后的余数
"math.min(A, B)" 返回A和B中的最小值
"math.max(A, B)" 返回A和B中的最大值
"math.clamp(value, min, max)" 把value限定在最小值和最大值之间
"math.lerp(start, end, 0_to_1)" 在start和end之间根据0~1取中间值,即start+(end-start)*0_to_1
"math.lerprotate(start, end, 0_to_1)" 作为角度,在start和end之间根据0~1取中间值,360度时会有跨越

类型、值和变量

通常,所有表达式值都是浮点数。在渲染控制器中,一些表达式根据上下文生成纹理或材质。所有数组索引表达式都被处理为浮点数,并在对数组执行最终查找时强制转换为整数。正数的数组下标会被限制到数组的长度,负数的数组小标会被转换成0.

简单的表达式 vs 复杂的表达式

简单的表达式是单一的语句,返回给系统的就是这个语句的值,例如:

math.sin(query.anim_time * 1.23)

复杂的表达式具有多个语句,每个语句以“;”结束。语句按顺序求值。在目前的实现中,最后一个表达式需要使用 return 关键字并定义返回值。例如:

temp.my_temp_var = Math.sin(query.anim_time * 1.23);
temp.my_other_temp_var = Math.cos(query.life_time + 2.0);
return temp.my_temp_var * temp.my_temp_var + temp.my_other_temp_var;

注意:在简单的表达式中不需要“;”结尾,但在这里,每个表达式都要在最后加上一个“;”。

域的例子

实体定义脚本

在定义文件中有有一些预计算值。这些值会在处理动画控制器和渲染控制器之前执行。目的是预先计算您可能想在脚本中重新使用的任何较为复杂的值,通常长期使用的索引变量的更新及每个渲染滴答都会进行一次一次性的计算。 例如:

 "scripts": {
   "pre_animation": [
     "variable.my_constant = (Math.cos(query.modified_distance_moved * 38.17) * query.modified_move_speed;",
     "variable.my_constant2 = Math.exp(1.5);",
   ]
 },

动画和动画控制器文件

正在播放的动画以及为骨骼设置动画的控制方式都是数字操作。“variable.variable_name”和“query.query_name”是指当前正在渲染的实体的触发方式。它们可以访问MoLang语言中的所有内容。但材质,纹理和几何模型除外。

渲染控制器

这里有一系列代码,用来表明哪些文件是该实体使用的,和动画文件类似,一个渲染控制器针对一个实体,但是该文件中包含materials,textures和geometry(或geometries)三个识别项目。渲染控制器中主要有两个部分:

  • 数组(arrays)的定义 (选填项)
  • 资源的调用 (必填项)
  • 实体的可见度(选填项)

数组定义部分允许您根据需要按资源类型创建资源(例如textures、geometries、materials等)数组。 然后可以在资源项目中引用这些内容。

数组的表达式

针对这三种资源形式,你都可以定义一个数组,给数组冠用的名字可以自定义,所以贴近实际效果最佳。以材料(materials)为例:

 "arrays":
   {
     "materials": {
       "array.my_array_1": ["material.a", "material.b", "material.c"],
       "array.my_array_2" : ["material.d", "material.e"],
       "array.my_array_3" : ["array.my_array_1", "material.my_array_2"],
       "array.my_array_4" : ["array.my_array_2", "material.my_array_3"],
       "array.my_array_5" : ["array.my_array_1", "material.my_array_1", "material.my_array_4"],
       "array.my_array_6" : ["array.my_array_1", "material.f"]
     }
   }

注意:数组中所有的元素都必须是相同的类型。例如:”textures” 数组只能存储”textures”。

数组可以引用零个或多个数组(可以引用重复项)和零个或多个材料(同样,可以引用重复项)的任意组合,并且您可以根据需要使用任意数量的数组,每个数组可以包含多个元素,随你心意。 如果数组在其成员中包括数组,则它们的长度不必相同。 当在资源项目中索引数组时,您可以使用数字表达式。 如果结果数为负,则将零用作索引。 任何非负数的索引都将转换为整数,并将根据数组的大小进行换行,例如:

 index = max(0, expression_result) % array_size

资源表达式

资源表达式必须根据上下文返回特定类型的单个资源。例如,在“geometry”部分中,您必须生成单个几何的表达式。 一些例子:

始终使用一个特定的geometry:
 "geometry": "geometry.my_geo"
以每秒1个的速率循环使用一个数组内的所有geometry:
 "geometry": "array.my_geometries[query.anim_time]"
选择基于实体返回的值的geometry:
 "geometry": "query.is_sheared ? geometry.sheared : geometry.woolly"
实体睡觉时使用特定的geometry,否则基于math.cos翻过一个数组,在math.cos为负数时使用索引零将近一半的时间:
 "geometry": "query.is_sleeping ? geometry.my_sleeping_geo : array.my_geos[math.cos(query.anim_time * 12.3 + 41.9) * 10 + 0.6]"

资源部分

geometry:实体模型控件

The geometry section specifies which geometry to use when rendering. As you can specify as many render controllers as you like in the definition file, a single render controller is only concerned with how to render a single geometry. Note that geometry can be arbitrarily complex using any number of bones and polygons.

materials 实体渲染控件

The materials section specifies how to map what material to what bone of the geometry. A single material is mapped to a whole bone. Material expressions are evaluated in the order listed. The first part of each statement is the name of the model part to apply the material to, and the second part is the material to use. The model part name can use * for wild - card matching of characters. For example:

  "materials": [
      { "*": "Material.default" },
      { "TailA": "array.hair_colors[variable.hair_color]" },
      { "Mane": "array.hair_colors[variable.hair_color]" },
      { "*Saddle*": "variable.is_leather_saddle ? material.leather_saddle : material.iron_saddle" }
    ],
  • This will start by applying Material.default to all model parts.
  • Next, it will set the material on a model part named "TailA" to the result of the expression "Array.hairColors[variable.hair_color]". This will look up some previously created variable on the entity named hair_color and use that to index into a material array called "array.hair_colors" defined in this render controller. This will overwrite the Material.default material set in the line above.
  • Third, it will look up the same material as the expression is identical, and apply it to the "Mane" model part.
  • Lastly, it will find any model part starting with, ending with, or containing "Saddle" (case sensitive) and change its material to either material.leather_saddle or material.iron_saddle depending on the previously set entity variable variable.is_leather_saddle.

查询功能

查询函数是布尔表达式,允许您查询引擎在不同情况下拥有的值。它们可以用在MoLang的表达中。对于控制位置,材质,动画等。

例如:

"position": [ 0.0, "query.is_baby ? -8.0 : 0.0", "query.is_baby ? 4.0 : 0.0" ]

实体查询清单

名称 注释
query.all_animations_finished 仅在动画控制器中有效。如果当前动画控制器状态下的所有动画至少播放了一次,则返回1.0,否则返回0.0。
query.anim_time 返回自当前动画开始以来的时间(以秒为单位),如果未在动画中调用则返回0.0
query.any_animation_finished 仅在动画控制器中有效。如果当前动画控制器状态中的任何动画至少播放了一次,则返回1.0,否则返回0.0。
query.armor_color_slot 将护甲栏编号作为参数,并返回请求的护甲栏中护甲的颜色
query.armor_material_slot 将护甲栏编号作为参数,并返回请求的护甲栏中护甲的类型
query.armor_texture_slot 将护甲栏编号作为参数,并返回请求的护甲栏中护甲的纹理类型
query.blocking 若实体正在搬运放置方块,则返回1.0,否则返回0.0(末影人)
query.body_y_rotation 改组仅动画且是 负值 时有特殊效果(不为负值用不用都一样),该项的负值会使该组(包括绑定在这个组)的旋转动画的y轴保持不变(生物无论如何旋转都不会影响它的方向)
query.can_climb 如果实体可以爬升,则返回1.0,否则返回0.0
query.can_fly 如果实体可以飞行,则返回1.0,否则返回0.0
query.can_power_jump 若实体可以高跳,则返回1.0,否则返回0.0(山羊)
query.can_swim 如果实体可以游泳,则返回1.0,否则返回0.0
query.can_walk 如果实体可以行走,则返回1.0,否则返回0.0
query.current_squish_value Returns the squish value for the current entity, or 0.0 if this doesn't make sense
query.delta_time 返回自上一帧以来的时间(以秒为单位)
query.frame_alpha Returns the ratio (from 0 to 1) of how much between AI ticks this frame is being rendered
query.ground_speed 返回实体的地面速度,以米/秒为单位
query.has_armor_slot 将护甲栏编号作为参数,如果实体在请求的护甲栏中有护甲,则返回1.0,否则返回0.0
query.has_collision 如果实体有碰撞检测,则返回1.0,否则返回0.0
query.has_gravity 如果实体受重力影响,则返回1.0,否则返回0.0
query.has_owner 如果实体有所有者ID,则返回true,否则返回false
query.has_rider Returns 1.0 if the entity has a rider, else it returns 0.0
query.has_target 如果实体有它的攻击目标,则返回1.0,否则返回0.0
query.head_roll_angle 返回狼头部的侧倾角
query.head_x_rotation 让实体(如凋灵)的第N个头跟随第1个头(动画列表第1个列出的头)关于x轴旋转。如果无意义,则返回0.0。
query.head_y_rotation 让实体(如凋灵)的第N个头跟随第1个头(动画列表第1个列出的头)关于y轴旋转。如果无意义,则返回0.0。
query.invulnerable_ticks 如果可行,则返回该实体剩余的无敌刻,否则返回0.0
query.is_angry 如果实体生气,则返回1.0,否则返回0.0(村民)
query.is_avoiding_mobs 如果实体正在逃离某实体,则返回1.0,否则返回0.0(村民)
query.is_baby 如果实体是幼年个体,则返回1.0,否则返回0.0
query.is_breathing 如果实体正在呼吸,则返回1.0,否则返回0.0
query.is_bribed 若猪灵拿到金锭并端详,则返回1.0,否则返回0.0
query.is_carrying_block 如果实体携带方块,则返回1.0,否则返回0.0
query.is_casting 如果实体正在转换,则返回1.0,否则返回0.0(僵尸,溺尸)
query.is_charged 如果实体变为闪电苦力怕,则返回1.0,否则返回0.0
query.is_charging 如果凋灵进入第二阶段血量状态(一半血量),返回1.0,否则返回0.0
query.is_chested 如果实体附有箱子,则返回1.0,否则返回0.0(羊驼,骡子)
query.is_critical Returns 1.0 if the entity is critical, else it returns 0.0
query.is_dancing 如果实体在跳舞,则返回1.0,否则返回0.0(猪灵)
query.is_delayed_attacking 如果守卫者正在准备发动魔法攻击,则返回1.0,否则返回0.0
query.is_eating 如果实体正在食用食物,则返回1.0,否则返回0.0
query.is_elder 如果实体是成年的,则返回1.0,否则返回0.0
query.is_enchanted 如果实体已附魔,则返回1.0,否则返回0.0
query.is_fire_immune 如果实体免疫火焰伤害,则返回1.0,否则返回0.0
query.is_first_person 如果实体呈现第一人称视角,则返回1.0,否则返回0.0(玩家)
query.is_gliding 如果实体滑动,则返回1.0,否则返回0.0
query.is_grazing 如果实体在放牧(流浪商人),则返回1.0;否则,则返回0.0
query.is_idling 如果实体闲置,则返回1.0,否则返回0.0
query.is_ignited 如果实体被点燃,则返回1.0,否则返回0.0
query.is_illager_captain 如果实体是袭击队长,则返回1.0,否则返回0.0
query.is_in_love 如果实体正在发情,则返回1.0,否则返回0.0
query.is_in_water 如果实体在水中,则返回1.0,否则返回0.0
query.is_in_water_or_rain 如果实体在水或雨中,则返回1.0,否则返回0.0
query.is_interested 如果实体感兴趣或有目标,则返回1.0,否则返回0.0
query.is_invisible 如果实体已隐身,则返回1.0,否则返回0.0
query.is_jumping 如果实体在跳跃,则返回1.0,否则返回0.0
query.is_laying_down 如果实体躺下,则返回1.0,否则返回0.0
query.is_laying_egg 如果实体正在下蛋,则返回1.0,否则返回0.0
query.is_leashed 如果实体被拴住,则返回1.0,否则返回0.0
query.is_lingering 如果实体持续存在,则返回1.0,否则返回0.0
query.is_moving 如果实体正在移动,则返回1.0,否则返回0.0
query.is_on_ground 如果实体在地面上,则返回1.0,否则返回0.0
query.is_onfire 如果实体着火,则返回1.0,否则返回0.0
query.is_orphaned 如果实体是孤儿,则返回1.0,否则返回0.0
query.is_powered 如果实体已充能,则返回1.0,否则返回0.0
query.is_pregnant 如果实体已怀孕,则返回1.0,否则返回0.0
query.is_resting 如果实体正在休息,则返回1.0,否则返回0.0(狐狸)
query.is_riding 如果实体被骑行,则返回1.0,否则返回0.0(蜘蛛,马,羊驼,猪)
query.is_roaring 如果实体当前正在咆哮,则返回1.0,否则返回0.0
query.is_rolling 如果实体正在滚动,则返回1.0,否则返回0.0(熊猫)
query.is_saddled 如果实体有鞍,则返回1.0,否则返回0.0
query.is_scared 如果该实体害怕,则返回1.0,否则返回0.0
query.is_shaking 如果实体正在发抖,则返回1.0,否则返回0.0
query.is_shaking_wetness 如果实体正在甩水,则返回true(狗)
query.is_sheared 如果实体(如羊或哞菇)能够被剪切并被剪切,则返回1.0,否则返回0.0
query.is_shield_powered 如果该实体有处于防御状态的盾,则返回1.0,否则返回0.0
query.is_silent 如果实体是静默的,返回1.0,否则返回0.0
query.is_sitting 如果实体坐着,则返回1.0,否则返回0.0(狗,猫)
query.is_sleeping 如果实体正在睡眠,则返回1.0,否则返回0.0
query.is_sneaking 如果实体正在潜行,则返回1.0,否则返回0.0
query.is_sneezing 如果实体在打喷嚏,则返回1.0,否则返回0.0(熊猫)
query.is_sprinting 如果实体正在冲刺,则返回1.0,否则返回0.0
query.is_stackable 如果实体是可堆叠的,则返回1.0,否则返回0.0
query.is_standing 如果实体站立则返回1.0,否则返回0.0
query.is_stunned 如果该实体当前处于眩晕状态,则返回1.0,否则返回0.0
query.is_swimming 如果实体正在游泳,则返回1.0,否则返回0.0
query.is_tamed 如果实体已被驯服,则返回1.0,否则返回0.0
query.is_transforming 如果实体(如僵尸村民)正在转化,则返回1.0,否则返回0.0
query.is_using_item 如果实体正在使用物品,则返回1.0,否则返回0.0
query.is_wall_climbing 如果实体正在爬墙,则返回1.0,否则返回0.0
query.item_in_use_duration Returns the amount of time an item has been in use in seconds up to the maximum duration, else 0.0 if it doesn't make sense
query.item_max_use_duration 返回该物品可以使用的最长时间,否则返回0.0。
query.item_remaining_use_duration 返回该物品可以使用的剩余时间(以秒为单位),否则返回0.0。
query.key_frame_lerp_time 返回上一个和下一个关键帧之间的比值
query.lie_amount 返回实体的躺下次数
query.life_span 返回实体的总存活时间,如果实体永久存在,则返回0.0
query.life_time 返回自当前动画开始以来的时间(以秒为单位),否则返回0.0(如果未在动画中调用)
query.log 向调试日志输出值
query.mark_variant Returns the entity's mark variant
query.max_trade_tier 如果有意义,则返回实体的最大交易阶段,否则返回0.0
query.model_scale 返回当前实体的比例
query.modified_distance_moved 返回实体在水平方向上移动的总米数(自从上次加载以来,不一定是最初创建实体以来)
 该状态由状态标记(例如is_baby或on_fire)修改
query.modified_move_speed 返回由状态标志(例如is_baby或on_fire)修改的实体的当前行走速度
query.overlay_alpha 请勿使用——此功能已弃用,将被删除
query.previous_squish_value 返回当前实体的前一个压缩值,如果没有意义,则返回0.0
query.roll_counter 返回实体的滚动计数
query.shake_angle 返回狼实体的摇动角度
query.sit_amount 返回实体的坐下计数
query.skin_id 返回实体的皮肤ID
query.sneeze_counter 返回实体的打喷嚏计数
query.spellcolor.r

query.spellcolor.g

query.spellcolor.b

如果可行,则返回当前实体拼写颜色的红/绿/蓝色通道,否则返回0.0
query.standing_scale Returns the scale of how standing up the entity is
query.swell_amount 返回实体(creeper)的膨胀程度(该项检测没有swell_dir更加多样)
query.swelling_dir 返回实体是否膨胀与膨胀程度,如果有意义的话返回程度,否则返回0.0(该项检测比swelling_amount增加快速)
query.tail_angle 返回狼尾巴的角度,否则返回0.0
query.target_x_rotation 如果有意义,则返回瞄准实体当前指向所需转动的x轴角度,否则返回0.0
query.target_y_rotation 如果有意义,则返回瞄准实体当前指向所需转动的y轴角度,否则返回0.0
query.time_stamp Returns the current time stamp of the level
query.trade_experience 如果有意义,则返回该实体的当前交易经验,否则返回0.0
query.trade_tier 如果有意义,则返回实体的贸易阶段,否则返回0.0
query.unhappy_counter 返回实体的不满意程度
query.variant Returns the entity's variant index
query.wing_flap_position 返回实体的鞘翅位置,如果没有意义,则返回0.0
query.wing_flap_speed 返回实体的鞘翅速度,如果没有意义,返回0.0
query.yaw_speed 返回实体转向的程度数字

参见

Advertisement