表达式
WorldEdit 的表达式格式与 Java 等一类语言的差不多,但有一些不同:
- 可以省略末尾的分号;
- 语句中的最后一个值即使不设置 return,也会返回;
- 二元中缀符
^
是用于指数运算而非通常的异或运算符号,且其优先级有相应的标注; - 可以使用阶乘(
!
); - 可以使用约等于符号(
~=
); - 没有对象:)
运算符
表达式判断使用 Java 的 优先级规则,它可以简要概括为以下几点:
- 二元指数运算符(
^
)的优先级介于 2 和 3; - 阶乘后缀运算符(
!
)的优先级为 2; - 约等于运算符(
~=
)的优先级为 7。
二元中缀符
这些运算符需要被放在两个被运算数之间。
基本运算
运算符 | 描述 |
---|---|
+ | 加法 |
- | 减法 |
* | 乘法 |
/ | 除法 |
% | 余除 |
^ | 指数运算 |
数位运算
这些符号会将被运算数表示为 32 位整数并在这些位上进行操作。
运算符 | 描述 |
---|---|
<< | 左移 |
>> | 右移 |
逻辑运算
这些运算符会将任意大于 0 的数字当做 true,而将其他的当做 false。在表示 true 时返回 1,而在表示 false 时返回 0。
运算符 | 描述 |
---|---|
&& | 逻辑“和” |
|| | 逻辑“或” |
比较运算
这些运算符号会将被运算数进行比较,并在结果为 true 时返回 1,在结果为 false 时返回 0。
运算符 | 描述 |
---|---|
< | 小于 |
> | 大于 |
<= | 小等于 |
>= | 大等于 |
== | 等于 |
!= | 不等于 |
~= | 约等于 |
赋值
这些运算符左侧需要提供一个值。使用简单赋值符号将值赋给一个不存在的变量可创建临时变量。
运算符 | 描述 |
---|---|
= | 简单赋值 |
+= | 相加赋值 |
-= | 相减赋值 |
*= | 相乘赋值 |
/= | 相除赋值 |
%= | 余除赋值 |
^= | 指数运算赋值 |
前缀运算
这些运算符应当处于对应表达式之前。
前缀运算符
运算符 | 描述 |
---|---|
-x | (将值置负) |
~x | 按位补码(见上文“按位二元运算符”) |
!x | 逻辑补全(见上文“逻辑二元运算符”) |
++x | 前缀增量运算符 |
--x | 前缀减量运算符 |
后缀运算
后缀运算符
这些运算符应当处于对应表达式的末尾。
x! | 阶乘运算 |
---|---|
x++ | 后缀增量运算符 |
x-- | 后缀减量运算符 |
三元中缀
三元中缀符用于三元表达式:
<条件> ? <满足时分支> : <不满足时分支>
与 if/else 工作原理相同,但这里的分支只能为单句表达式。
函数
数学函数
表达式提供了来自 Java 的 Math 库的下列函数:
函数 | 描述 |
---|---|
abs | 返回指定数的绝对值。 |
acos | 返回指定数的反余弦值;返回值介于 [font=Vijaya]0 到 [font=Vijaya]π 之间。 |
asin | 返回指定数的反正弦值;返回值介于 [font=Vijaya]-π/2 到 [font=Vijaya]π/2 之间。 |
atan2 | 返回由直角坐标系 [font=Vijaya](x, y) 转化为极坐标 [font=Vijaya](r, θ) 后的角度。 |
atan | 返回指定数的反正弦值;返回值介于 [font=Vijaya]-π/2 到 [font=Vijaya]π/2 。 |
cbrt | 返回指定数的平方根。 |
ceil | 返回(差值最接近于负无穷)大等于指定数的整数。即向上取整。 |
cos | 返回指定数的三角函数余弦值。 |
cosh | 返回指定数的双曲余弦值。 |
exp | 返回欧拉数e的指定幂[1][/sup]。 |
floor | 返回(差值最接近负无穷)小等于指定数的整数。即向下取整。 |
ln | 返回指定数(以 [font=Vijaya]e` 为底)的自然对数。 |
log | 返回指定数的对数。 |
log10 | 返回指定数(以 10 为底)的对数。 |
max | 返回数组中的最大数(需包含两到三个数)。 |
min | 返回数组中的最小数(需包含两到三个数)。 |
rint | 返回最接近给定数的数学整数。 |
round | 返回最贴近给定数的整数[2][/sup]。 |
sin | 返回指定数的三角函数正弦值。 |
sinh | 返回指定数的双曲正弦值。 |
sqrt | 返回指定数的平方根约值。 |
tan | 返回指定数的三角函数正切值。 |
tanh | 返回指定数的双曲正切值。 |
额外函数
额外地,本插件提供了一些特殊函数:
函数 | 描述 |
---|---|
rotate(x, y, 角度) | 以弧度为单位将指定坐标对旋转。 |
swap(x, y) | 交换给定的两个值。 |
random() | 生成小于 1.0 的随机正数。 |
randint(最大值) | 生成小于给定最大值的随机整数。 |
perlin(种子, x, y, z, 频率, 倍频, 幅度) | 按给定参数生成 berlin 噪声。 |
voronoi(种子, x, y, z, 频率) | 按给定参数生成 voronoi 噪声。 |
ridgedmulti(种子, x, y, z, 频率, 倍频) | 按给定参数生成脊状多重分形噪声。 |
方块查询函数
下列函数可以用于在指定世界的编辑内容中找到特定的方块。需要注意的是这些函数仍然使用旧版本的 ID 和数据,所以对高版本(1.13+)的方块可能有难以预测的问题。
函数 | 描述 |
---|---|
query(x, y, z, 类型, 数据) | 如果指定坐标上的方块匹配给定的数据值或种类, 则该函数会返回 true。若类型或数据为变量,则会赋值给该位置的方块。 |
queryRel(dx, dy, dz, 类型, 数据) | 与查询相似,但会与当前查询的方块产生偏移。 |
quesyAbs(xp, yp, zp, 类型, 数据) | 与查询相似,但使用的是世界坐标。 |
缓存函数
这些函数允许你访问数据缓存(基本上就是数组)。插件提供了两个缓存,一个是全局共用的缓存,而另外一个对表达式执行时开放。以 g 开头的表达式表示使用全局缓存,而不带 g 则表示使用本地缓冲。
(g)megabf(索引) | 返回指定索引的缓存内容。 |
(g)megabf(索引, 值) | 将指定索引位置的缓存填入给定的数据。 |
(g)closest(x, y, z, 索引, 计数, 步长) | 找到最符合 x, y, z 的值的索引(如三个连续缓存值),函数将会从给定缩索引值,按步长在遍历中查找内容。 |
常量
常量
下列常量总是可用,且不能被赋值。
e | 2.7182818284590452354 | 自然对数的底数,即自然常数 |
pi | 3.14159265358979323846 | 圆的周长与直径之比,即圆周率 |
true | 1 | 用于布尔值运算 |
false | 0 | 用于布尔值运算 |
方块状态
方块状态是以如下方式显示的数据:
{ x=5; y=6; }
大部分情况下这些参数会与控制结构一同使用。
控制结构
is/else
if (<条件>) <满足时分支>
if (<条件>) <满足时分支> else <不满足时分支>
<条件>
用于决定是否继续执行代码块内容;- 大于零的任何值都被视作 true,其他均为 false;
<满足时分支>
可以为以分号分隔的单句,也可以为方块状态;
注意:
关键词 else 总是会和上一个 if 相关。这意味着你可以这样写多个条件判断式:
**if (<条件1>) <满足时分支1> else if (<条件2>) <满足时分支2> else <不满足时分支>**
循环
循环最多可进行 256 次。
while
while (<条件>) <代码块>
do <代码块> while (<条件>);
<条件>
用于决定是否继续循环;<代码块>
可以为以分号分隔的单句,也可以为方块状态;- do-while 会在一次循环结束之后检查条件。
Java/C 语言风格的 for
for (<初值>; <条件>; <步长>) <代码块>
<初值>
、<条件>
和<步长>
均为单句表达式;<代码块>
可以为以分号分隔的单句,也可以为方块状态。
执行步骤
首先,<初值>
先进行测算,然后,每次遍历都会遵守这些步骤:
- 如果
<条件>
的值小于等于 0(例如,false),则退出循环; <代码块>
被执行;<步长>
被执行。
简单 for
for (<计数> = <初值>, <终值>) <代码块>
<计数>
为变量,可用于循环计次;<初值>
和<终值>
均为单句表达式;<代码块>
可以为以分号分隔的单句,也可以为方块状态。
执行步骤
首先,初始计数会被赋值给 <计数>
。之后,每次遍历都会遵守这些步骤:
- 若当前内部循环数值大于
<终值>
,则退出循环; <计数>
的值会与内部循环数值相同;<代码块>
被执行;<计数>
的值 +1。
<初值>
和 <终值>
只会测量一次。
另见
- Microsoft Learn, 2023.04.03, 前缀增量和减量运算符 章节, https://learn.microsoft.com/zh-cn/cpp/c-language/prefix-increment-and-decrement-operators
- 迈克老狼, 2009.11.22,《perlin噪声函数》, https://www.cnblogs.com/mikewolf2009/articles/1608087.html
- MHols_, 2023.03.15,《【Minecraft】worldedit|generate 探索神奇的噪声——从原理到应用》, https://www.bilibili.com/read/cv22408344/
- LocusAzzurro, 2021.06.10, 《WorldEdit 对Perlin噪声函数功能的研究》, https://www.mcbbs.net/thread-491788-1-1.html