StBruce
本帖最后由 StBruce 于 2022-12-9 20:15 编辑

0.前言
叠甲:首次发教程贴,基于个人理解,适合有一定Psi基础的玩家阅读,但新手玩家应该也没有阅读困难。
前置:中学数学(向量和坐标运算);以及能独立完成PSI官方教程的能力。
模组版本:1.16.5/1.12.2(Psi随想)。
个人毕业标准:以下内容术式的编写以主世界材料毕业(强度250,效率80,8x8)为标准。
转载要求:附上来源和ID即可,能评论区说一声更好(0x0)。
本教程以我个人常用的术式为例讲解,可能有数值与游戏不符,以游戏为准,注意思路。

1.术式编写思路
Psi的术式编写可以分成三步:
第一步:通过选择符,选择合适的初始目标,可以是施法者,也可以是一定范围内的某一类实体等。
第二步,通过运算符,把初始目标改为你想要的目标,最终目标可以是某一实体,也可以是坐标(该坐标对应的方块)等。
第三步,通过启动式,执行相应的效果,可以是药水效果,施加力或闪现,破坏或构筑方块等。


这里我以附加药水效果为例。
最简单的术式,例如施术者+夜视+45,就能得到一个45s的夜视效果:
但这里只能给施术者本人使用,如果想给队友呢?
变式1:施术者+位置+附近玩家+离点最近+夜视+45,用施术者的位置引到离点最近,半径可以设为16格:
这样就可以给最近的其他玩家加上夜视效果了。
缺点:不能给自己夜视效果。
变式2:施术者+位置+附近玩家+加入列表+离线最近+夜视+45:
不足:没有压缩带宽和复杂度,1.12.2可能还需要视线矢量x16或者x32,这部分我不太确定,但其他术式从1.16.5移植到1.12.2后,方向矢量的模好像同时起了常量封装的作用。
优化结果如下(这是我现在用的夜视术式)
变式3:
这里的选择符一直都是施术者,如果你打算做一把凋零剑,可以使用被攻击的实体+凋零+等级/持续时间,但是凋零1持续45s,凋零2持续6s,火焰附加、缓慢、虚弱等负面buff同上,所以不推荐上负面buff,仅防火、夜视、水肺等推荐。

2.术式功能优化
这里我以熔炼(圈阵施法)为例。

变式4:这里是基础的循环熔炼术式,每秒熔炼1个物品。
优化结果如下(这是我现在用的熔炼术式)
变式5:

这里我添加了三个功能,分别是延时熔炼、终止循环和倒计时,接下来我分别讲一下思路:
变式6:延时熔炼
每秒执行4次即5tick执行一次,20次耗时100tick,那么就可以利用循环次数和延时,每次减少5tick的延时,得到一个一次性执行20次的效果,这个术式在1.16.5的官方教程里面有提到,这里在使用的时候记得注意下休眠符的位置,可以利用术式整体对称和旋转来改变方位。

变式7:倒计时
变式8:潜行终止循环
或者利用循环次数和调试信息,完成一个圈阵施法的倒计时;或者加一个潜行+终止循环,可以增加术式的灵活度。


3.复合功能
对我来说,弹夹只给12个远远不够,但1.16.5没有1.12.2(随想)那么方便,所以可以利用潜行来提高术式的复杂度,把术式融合。
首先以锄和骨粉催生为例。
变式9和变式10:锄和骨粉催生
二者都是作用于某一坐标(的方块)且功能相近,所以我们可以利用潜行输入的0和1改变坐标,比如在正常的施术者视线位置(从施术者的位置使用施术者视线作为方向向量指向的方块)使用骨粉,利用潜行构建y轴(mc里指向上)的单位矢量,矢量和得到目标上的空气方块,这样只有一个坐标是存在非空气方块的,就可以得到骨粉和锄的复合术式,记得添加错误消除符,除非你喜欢看到红色的提示。
变式11:骨粉和锄的复合术式
然后我们以索敌举例,可以使用施术者视线位置定义为一号坐标,二号坐标为距离施术者最近的敌对生物,两个坐标分别乘以0或1(通过潜行和减一取反构建两个相反的常量)就可以通过潜行切换索敌,除了自动锁敌外还可以精准打击指定位置。
变式12:雷击
但以上通过坐标计算切换的方式,好像1.12.2在计算过程中有一坐标不存在时不能使用,以变式12为例,必须在附近存在敌对生物的时候,才能通过潜行切换到在视线所指方块位置打雷,但1.16.5好像可以,存疑。

4.术式整合优化
首先是术式本身的优化。
我目前总结出了三个方向,首先是复用选择符和运算符,降低了术式可读性;其次是优化计算方式,调整术式角度和位置压缩带宽;前两者都可以降低复杂度,但还有一种情况,复杂度过高难以降低,可以牺牲一部分带宽,用已有的运算符和选择符指向所需使用的位置,带宽换取复杂度,只要带宽、复杂度、强度和映射数都在CAD的限制范围内即可。
然后我们开始整合术式,这里我以护腿上的术式为例;
不知道能不能贴原术式,而且我没有做出本质上的改动,所以这里只给出来源和我压缩的最终带宽:
引用术式1:(压缩至3x8)
拦截投射物,MC百科评论区142楼金红水晶,利用投掷物运动向量和坐标向量(以玩家为原点)内积的正负判断投掷物是否为玩家发出。
引用术式2:(压缩至5x6)
敌对生物探测,Lanzr的PSI教程,分享一些个人写的和搬运的生存向psi(无附属),距离视线方向最近的怪物,会有一道粒子轨迹指示
以及怪物信息的打印
引用术式3:(未压缩)
空中搭桥,酒石酸菌PSI教程最后1P,相比“魔毯”术式和其他类似术式,酒石酸菌的术式足够简洁。
变式13:摔落保护/跳跃提升(插空就行,记得运算符的服用)
持续给玩家一个向上的力就行,这里就不贴术式了,力度调整不低于0.15且不高于消耗,然后选择自己喜欢的程度就行。
这里直接给出结论,敌对生物探测+投射物探测(拦截的术式删掉构筑方块改成轮转,这样可以留出消耗给空中搭桥和摔落保护)可以压缩到8x8内还有一定空余,具体轮转术式之后会提到。
除此之外,百科教程里的“土遁术”和“安全闪现”可以合成,代价是闪现距离变短,也可以加入潜行+终止术式,配合触发引信,在特殊情况下可以通过潜行闪现触发引信,进而一次性触发头盔上的三个术式(具体原理其他教程已提到不再赘述)

5.个人常用术式总结
头盔(引信):通过两个术式在玩家周围放置一圈4格高的方块用来拦截投掷物,第三个术式待定(后来也不穿了)
盔甲:抗性1+再生1+轮转,防火+轮转,引信(有点简陋,因为之后换别的mod的盔甲了)
护腿:投射物检测+敌对生物探测+空中搭桥/投射物拦截+敌对生物探测/投射物检测+地对生物探测+摔落保护
靴子:立体调谐+骨粉/锄(容易踩地)+水肺(也很久没穿了)
头盔术式是自己写的比较丑陋()就附在后面了,可以结合之前提到的安全闪现使用。
{modsRequired:[{modVersion:"1.16-96",modName:"psi"}],spellName:"四向方块构建",uuidMost:6785601823975033689L,validSpell:1b,spellList:[{data:{key:"psi:constant_number",constantValue:"1"},x:0,y:0},{data:{params:{_x:0,_y:1,_z:0},key:"psi:operator_vector_construct"},x:0,y:1},{data:{params:{_target:1},key:"psi:operator_vector_negate"},x:0,y:2},{data:{params:{_target:2},key:"psi:connector"},x:0,y:3},{data:{params:{_target:2},key:"psi:connector"},x:0,y:4},{data:{params:{_target:4},key:"psi:operator_entity_position"},x:0,y:5},{data:{key:"psi:constant_number",constantValue:"1200"},x:1,y:0},{data:{params:{_max:4,_time:1,_target:3,_position:2},key:"psi:trick_conjure_block_sequence"},x:1,y:1},{data:{params:{_vector3:0,_vector2:2,_vector1:3},key:"psi:operator_vector_sum"},x:1,y:2},{data:{params:{_vector3:0,_vector2:2,_vector1:3},key:"psi:operator_vector_sum"},x:1,y:3},{data:{params:{_target:4},key:"psi:connector"},x:1,y:4},{data:{key:"psi:selector_focal_point"},x:1,y:5},{data:{key:"psi:constant_number",constantValue:"4"},x:2,y:1},{data:{params:{_target:3},key:"psi:connector"},x:2,y:2},{data:{key:"psi:constant_number",constantValue:"2"},x:2,y:3},{data:{params:{_vector3:0,_vector2:2,_vector1:4},key:"psi:operator_vector_sum"},x:2,y:4},{data:{params:{_x:0,_y:2,_z:0},key:"psi:operator_vector_construct"},x:2,y:5},{data:{key:"psi:constant_number",constantValue:"-3"},x:2,y:6},{data:{key:"psi:constant_number",constantValue:"1200"},x:3,y:0},{data:{params:{_max:3,_time:1,_target:4,_position:2},key:"psi:trick_conjure_block_sequence"},x:3,y:1},{data:{params:{_vector3:0,_vector2:2,_vector1:3},key:"psi:operator_vector_sum"},x:3,y:2},{data:{params:{_x:3,_y:0,_z:0},key:"psi:operator_vector_construct"},x:3,y:3},{data:{params:{_x:2,_y:0,_z:0},key:"psi:operator_vector_construct"},x:3,y:4},{data:{key:"psi:constant_number",constantValue:"-1"},x:3,y:5},{data:{key:"psi:constant_number",constantValue:"4"},x:3,y:6},{data:{key:"psi:constant_number",constantValue:"1"},x:4,y:0},{data:{params:{_x:0,_y:1,_z:0},key:"psi:operator_vector_construct"},x:4,y:1},{data:{params:{_target:3},key:"psi:connector"},x:4,y:2},{data:{params:{_x:0,_y:0,_z:2},key:"psi:operator_vector_construct"},x:4,y:3},{data:{key:"psi:constant_number",constantValue:"1"},x:4,y:4},{data:{params:{_x:0,_y:1,_z:0},key:"psi:operator_vector_construct"},x:4,y:5},{data:{params:{_max:3,_time:2,_target:1,_position:4},key:"psi:trick_conjure_block_sequence"},x:4,y:6},{data:{key:"psi:constant_number",constantValue:"1200"},x:4,y:7},{data:{key:"psi:constant_number",constantValue:"1200"},x:5,y:0},{data:{params:{_max:4,_time:1,_target:3,_position:2},key:"psi:trick_conjure_block_sequence"},x:5,y:1},{data:{params:{_vector3:0,_vector2:2,_vector1:3},key:"psi:operator_vector_sum"},x:5,y:2},{data:{params:{_vector3:0,_vector2:2,_vector1:3},key:"psi:operator_vector_sum"},x:5,y:3},{data:{params:{_x:2,_y:0,_z:0},key:"psi:operator_vector_construct"},x:5,y:4},{data:{key:"psi:constant_number",constantValue:"-1"},x:5,y:5},{data:{params:{_target:4},key:"psi:connector"},x:5,y:6},{data:{key:"psi:constant_number",constantValue:"7"},x:5,y:7},{data:{key:"psi:constant_number",constantValue:"4"},x:6,y:1},{data:{params:{_vector3:0,_vector2:4,_vector1:3},key:"psi:operator_vector_sum"},x:6,y:2},{data:{params:{_target:1},key:"psi:connector"},x:6,y:3},{data:{params:{_target:1},key:"psi:connector"},x:6,y:4},{data:{params:{_target:1},key:"psi:connector"},x:6,y:5},{data:{params:{_target:1},key:"psi:connector"},x:6,y:6},{data:{params:{_time:3},key:"psi:trick_delay"},x:6,y:7},{data:{key:"psi:constant_number",constantValue:"-2"},x:7,y:1},{data:{params:{_x:0,_y:0,_z:1},key:"psi:operator_vector_construct"},x:7,y:2},{data:{params:{_number:2},key:"psi:trick_spin_chamber"},x:7,y:5},{data:{key:"psi:constant_number",constantValue:"1"},x:7,y:6},{data:{params:{_radius:1},key:"psi:trick_detonate"},x:7,y:7}],uuidLeast:-8758212564125331778L}
{modsRequired:[{modVersion:"1.16-96",modName:"psi"}],spellName:"四角方块构建",uuidMost:8745166007557178259L,validSpell:1b,spellList:[{data:{key:"psi:selector_focal_point"},x:0,y:1},{data:{params:{_target:1},key:"psi:operator_entity_position"},x:0,y:2},{data:{params:{_vector3:0,_vector2:1,_vector1:2},key:"psi:operator_vector_sum"},x:0,y:3},{data:{params:{_x:0,_y:2,_z:0},key:"psi:operator_vector_construct"},x:0,y:4},{data:{key:"psi:constant_number",constantValue:"-3"},x:0,y:5},{data:{key:"psi:constant_number",constantValue:"1"},x:1,y:1},{data:{params:{_x:0,_y:1,_z:0},key:"psi:operator_vector_construct"},x:1,y:2},{data:{params:{_target:3},key:"psi:connector"},x:1,y:3},{data:{params:{_x:2,_y:0,_z:0},key:"psi:operator_vector_construct"},x:1,y:4},{data:{key:"psi:constant_number",constantValue:"-1"},x:1,y:5},{data:{key:"psi:constant_number",constantValue:"1200"},x:2,y:1},{data:{params:{_max:4,_time:1,_target:3,_position:2},key:"psi:trick_conjure_block_sequence"},x:2,y:2},{data:{params:{_vector3:0,_vector2:3,_vector1:2},key:"psi:operator_vector_sum"},x:2,y:3},{data:{params:{_vector3:0,_vector2:3,_vector1:2},key:"psi:operator_vector_sum"},x:2,y:4},{data:{params:{_x:0,_y:0,_z:3},key:"psi:operator_vector_construct"},x:2,y:5},{data:{key:"psi:constant_number",constantValue:"4"},x:3,y:2},{data:{params:{_vector3:0,_vector2:3,_vector1:2},key:"psi:operator_vector_sum"},x:3,y:3},{data:{params:{_x:2,_y:0,_z:0},key:"psi:operator_vector_construct"},x:3,y:4},{data:{key:"psi:constant_number",constantValue:"2"},x:3,y:5},{data:{key:"psi:constant_number",constantValue:"1200"},x:4,y:1},{data:{params:{_max:3,_time:1,_target:4,_position:2},key:"psi:trick_conjure_block_sequence"},x:4,y:2},{data:{params:{_target:3},key:"psi:connector"},x:4,y:3},{data:{key:"psi:constant_number",constantValue:"2"},x:4,y:4},{data:{key:"psi:constant_number",constantValue:"1"},x:4,y:5},{data:{key:"psi:constant_number",constantValue:"-1"},x:4,y:6},{data:{key:"psi:constant_number",constantValue:"1"},x:5,y:1},{data:{params:{_x:0,_y:1,_z:0},key:"psi:operator_vector_construct"},x:5,y:2},{data:{params:{_vector3:0,_vector2:3,_vector1:2},key:"psi:operator_vector_sum"},x:5,y:3},{data:{params:{_x:0,_y:0,_z:3},key:"psi:operator_vector_construct"},x:5,y:4},{data:{params:{_x:0,_y:3,_z:0},key:"psi:operator_vector_construct"},x:5,y:5},{data:{params:{_number:3},key:"psi:trick_spin_chamber"},x:5,y:6},{data:{key:"psi:constant_number",constantValue:"1200"},x:6,y:1},{data:{params:{_max:4,_time:1,_target:3,_position:2},key:"psi:trick_conjure_block_sequence"},x:6,y:2},{data:{params:{_target:3},key:"psi:connector"},x:6,y:3},{data:{params:{_vector3:0,_vector2:1,_vector1:4},key:"psi:operator_vector_sum"},x:6,y:4},{data:{params:{_max:4,_time:2,_target:3,_position:1},key:"psi:trick_conjure_block_sequence"},x:6,y:5},{data:{key:"psi:constant_number",constantValue:"1200"},x:6,y:6},{data:{key:"psi:constant_number",constantValue:"4"},x:7,y:2},{data:{key:"psi:constant_number",constantValue:"-2"},x:7,y:3},{data:{params:{_x:1,_y:0,_z:0},key:"psi:operator_vector_construct"},x:7,y:4},{data:{key:"psi:constant_number",constantValue:"4"},x:7,y:5}],uuidLeast:-4651874323180192587L}
暂时先写到这里()看之后还有什么可以补充的再编辑吧()

苏子峰
虽然我看不懂,但我大为震撼