注:

  • 本法术仅为个人实现方法,不代表最好实现方式。

  • 由于当前模组版本一个疑似为bug的向量浮点运算问题,此法术目前只能在xyz的负半轴方向使用,后续模组版本可能会修复。作者已在github修复问题,下一个版本(0.8.4?)将不再存在此问题

  • 由于使用递归的实现方式,在模组默认递归深度配置下无法实现较大范围挖掘;可以通过改配置或把前面部分改成硬编码来解决。

以下讲解使用3x3挖掘,玩家看向方块的上面为例:

基本思路

  1. 通过递归的方式生成一个[0, 1, ... , 7, 8]的列表(如果递归深度有限制可以把这一步改成一个硬编码的列表)

  2. 获取玩家所看方块的坐标

  3. 获取玩家所看方块的面的法向量

  4. 将上一步的法向量分别与xyz三个轴的基准向量( 如:x轴基准向量为(1, 0, 0) )做叉乘(如果两向量在同一条直线上,则叉乘结果为(0, 0, 0) )

  5. 将上一步的三个叉乘结果放在一个列表中,并将其与[(0, 0, 0)]这个列表做异或操作(去除两列表中重复的元素),这一步的结果就是需要进行偏移的两个轴

  6. 对于第一步中生成的列表的每一个元素(以下称为i),执行:

    1. 将i分别进行地板除和取余来获得在两个轴上的偏移量

    2. 把需要偏移的两个轴的向量分别乘上上一步得到的偏移量

    3. 把玩家所看方块的坐标加上上一步的两个结果

    4. 破坏上一步结果处的方块


效果图

单法术范围挖掘(3x3,5x3,5x5...)法术教程-第1张图片

伪代码

注:此代码为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)