注:
本法术仅为个人实现方法,不代表最好实现方式。
由于当前模组版本一个疑似为bug的向量浮点运算问题,此法术目前只能在xyz的负半轴方向使用,后续模组版本可能会修复。作者已在github修复问题,下一个版本(0.8.4?)将不再存在此问题
由于使用递归的实现方式,在模组默认递归深度配置下无法实现较大范围挖掘;可以通过改配置或把前面部分改成硬编码来解决。
以下讲解使用3x3挖掘,玩家看向方块的上面为例:
基本思路
通过递归的方式生成一个[0, 1, ... , 7, 8]的列表(如果递归深度有限制可以把这一步改成一个硬编码的列表)
获取玩家所看方块的坐标
获取玩家所看方块的面的法向量
将上一步的法向量分别与xyz三个轴的基准向量( 如:x轴基准向量为(1, 0, 0) )做叉乘(如果两向量在同一条直线上,则叉乘结果为(0, 0, 0) )
将上一步的三个叉乘结果放在一个列表中,并将其与[(0, 0, 0)]这个列表做异或操作(去除两列表中重复的元素),这一步的结果就是需要进行偏移的两个轴
对于第一步中生成的列表的每一个元素(以下称为i),执行:
将i分别进行地板除和取余来获得在两个轴上的偏移量
把需要偏移的两个轴的向量分别乘上上一步得到的偏移量
把玩家所看方块的坐标加上上一步的两个结果
破坏上一步结果处的方块
效果图
伪代码
注:此代码为5x5挖掘的代码,需要更改//EDITME部分来改成其它挖掘大小
递归列表生成部分:
{
swap
dupe
get_list_length
add_to_list
dupe
get_list_length
25 //EDITME
==
0_to_null (Identity Purification)
{
swap
dupe
eval (Hermes' Gambit)
}
either Null -> non-Null one (Exclusion Distillation)
{
pop:second (Bookkeeper's Gambits)
}
a not Null ? a : b (Disjunction Distillation)
eval
}
0
create_single_list (Single's Purification)
swap
dupe
eval
后面部分:
player
sight
raycast (normal)
dupe
(1,0,0)
cross
swap
dupe
(0,1,0)
cross
swap
(0,0,1)
cross
3
list_from_stack (Flock's Gambit)
(0,0,0)
create_single_list (Single's Purification)
XOR (Exclusionary Distillation)
{
swap
list -> many (Flock's Disintegration)
3
grab
dupe
5 //EDITME
/
floor (Floor Purification)
dupe
5 //EDITME
*
3
grab
swap
-
2 //EDITME
-
4
grab
*
swap
2 //EDITME
-
3
grab
*
3
grab
+
+
break_block
}
4
grab
list_eval (Thoth's Gambit)