我的世界血魔法祭坛原理分析附dj2个人祭坛符文搭配

Update

每tick更新一次,但是是用世界时间(internalCounter)进行检查。

  • 如果lockdownDuration>0 lockdownDuration-1(这个是给牺牲匕首什么的用的)。

  • 如果internalCounter是二十的倍数进行一次常规PP更新。

  • 如果internalCounter为20-促进符文数量的倍数(最低为1)进行一次流体转移的判断。

    • LP转移速度最大值(syphonMax)为20*1.2^转位符文数量,

    • 血祭坛剩余容量和LP转移速度最大值中较小的一个值为一次能输入的最大值,

    • 输入的流体数量缓存(fluidInput.amount nbt中可以读到)和一次能输入的最大值中较小的一个值为实际输入流体数量,

    • 然后给血祭坛的流体数量+实际输入的流体数量,输入的流体数量缓存-实际输入的流体数量,

    • 一次能输出的最大值为LP转移速度最大值和临时容量(bufferCapacity)-流体输出数量缓存(this.fluidOutput.amount nbt中可以读到)中的较小值,

    • 实际输出流体数量为祭坛流体数量和一次能输出的最大值,

    • 然后给血祭坛的流体数量-实际输出的流体数量,流体输出数量缓存+实际输出的流体数量,

    • 最后进行一次方块实体的同步。

  • 如果internalCounter为充能频率(chargingFrequency)的倍数且血祭坛不在工作就进行一次充能计算:

    • 充能速率(chargeingRate)和血祭坛流体数量中的较小一个值为一次能充能的最大值,

    • 最大充能点数-总充能点数和一次能充能的最大值中的较小一个值为实际充能点数,

    • 然后给总充能点数+实际充能点数,

    • 血祭坛流体数量-实际充能点数,最后进行一次方块实体的同步。

  • 如果internalCounter为100的倍数且(血祭坛在工作或者不处于合成后的冷却状态)即isActive为1或cooldownAfterCrafting <= 0,

    • 如果血祭坛在充能状态就设置血祭坛方块状态不充能并在血祭坛处发出NC更新和PP更新。

    • 最后调用startCycle。

StartCycle

会进行如下操作:

  • 如果方块实体位置不为空就进行一次方块实体的同步。

  • 进行一次血魔法祭坛等级的检查:

    • 获取血祭坛等级为tier,

    • 然后获取血魔法祭坛的升级(如速度符文),

    • 如果血祭坛等级为指示之书显示的等级就把指示之书显示的等级设置为1,

    • 如果血魔法祭坛等级为1就把所有属性设为默认值,具体nbt中可以读取到,

    • 如果不是就更新血祭坛的具体属性:

      • isUpgraded=true

      • 促进升级(accelerationUpgrades)= 促进符文个数

      • 消耗倍率(consumptionMultiplier)= 0.2 * 速度符文数量

      • 效率倍率(efficiencyMultiplier)= 0.85^效率符文数量

      • 献祭效率倍率(sacrificeEfficiencyMultiplier)= 0.1 * 献祭符文数量

      • 牺牲效率倍率(selfSacrificeEfficiencyMultiplier)= 0.1 * 牺牲符文数量

      • 容量倍率(capacityMultiplier)= 1*1.1^超容符文数量 + 0.2 * 增容符文数量

      • 转移倍率(dislocationMultiplier)= 1.2^转位符文数量

      • 宝珠容量倍率(orbCapacityMultiplier )= 1 + 0.02 * 宝珠符文数量

      • 充能频率(chargingFrequency)= 20 – 促进符文数量(最小为1)

      • 充能速率(chargingFrequency)=(10 * 充能符文数量)*(1 + 消耗倍率/2)

      • 最大充能点数(maxCharge)=1000*(0.5 * 容量倍率和 1 中的较大值)* 充能符文数量(其实和物品资料中的一样)。

      • 然后血祭坛容量 (capacity)= 1000 * 10 * 容量倍率

      • 临时容量(bufferCapacity)= 1000 * 容量倍率

    • 如果血祭坛流体数量>血祭坛容量,就将血祭坛流体数量设置为血祭坛容量。

    • 如果血祭坛输出的流体数量缓存>临时容量,就将血祭坛输出流体数量设置为临时容量。

    • 如果血祭坛输人的流体数量缓存>临时容量,就将血祭坛输人流体数量设置为临时容量。

    • 如果血祭坛总充能点数>最大充能点数,就将总充能点数设置为最大充能点数。

    • 最后进行一次方块实体的同步。

  • 如果流体为空或流体数量<=0且总充能点数<=0,就跳过接下来的判断。

  • 如果祭坛工作状态(isActive)=0,就将进度(progress)归0

  • 如果输入物品非空就判断是否有合成表

    • 如果有合成表就

      • 将祭坛工作状态 = 1

      • 合成流体需求数量(liquidRequired nbt中可以读到) = 合成物品需求数量(jei可以看到)

      • 消耗速率(consumptionRate) = 消耗速率(jei可以看到)

      • 排空速率(drainRate)=排空速率(jei可以看到)(不知道为什么这俩翻译成一个,但我也随便翻译的)

      • 能否被填充(canBeFilled)=false

    • 如果没有合成表判断是否为宝珠,如果是宝珠,工作状态 = 能否被填充 = 祭坛等级是否大于宝珠等级。

  • 如果不是,就将工作状态 = false。

  • 最后调用updateAltar。

updatealtar

会进行如下操作:

  • 如果血魔法祭坛不在工作,就把合成后冷却-1并跳过之后的操作。

  • 如果血魔法祭坛不能被填充(即已经放入一个物品)并且没有合成表,就调用StartCycle并跳过之后的操作。

  • 如果血魔法祭坛输入物品是空的,就跳过之后的操作。

  • 如果血魔法祭坛不能被填充,就进行如下操作:

    • 执行了操作(hasOperated)= 0

    • 如果总充能点数>0就进行如下判断:

      • 消耗充能点数(chargeDrained)= 剩余进度(一个物品所需流体数量*物品数量-进度(progress))和总充能点数中较小的一个

      • 总充能点数 – 消耗充能点数

      • 进度 + 消耗充能点数

      • 执行了操作 = 1

      如果有流体就进行如下判断:
              消耗流体数量(liquidDrained)= 消耗速率*(1+消耗倍率)取整和血魔法祭坛流体数量中的较小值
              如果消耗流体数量>剩余进度,就将消耗流体数量=剩余进度。
              血魔法祭坛流体数量 – 消耗流体数量
              进度 + 消耗流体数量
              执行了操作 = 1
              如果世界时间为4的倍数,就产生粒子效果。
      如果没有流体就判断执行了操作是否为1且进度是否>0如果是
              进度倒退效率倍率*排空速率(drainRate)(最低倒退到0)
              如果世界时间为2的倍数产生粒子效果。
      如果执行了操作=1就进行如下判断:
              如果进度>=一个物品所需流体数量*物品数量就进行如下操作:
              产生成品并将进度归0(这里的eventbus也看不懂aa)
              产生粒子效果
              如果祭坛下面为红石灯将祭坛变为充能方块并发出NC更新和PP更新

              祭坛合成后冷却(cooldownAfterCrafting)=30
              祭坛工作状态(isActive)=0。
      如果执行了操作不为1就进行如下操作:
              如果物品是空或者不是宝珠或者宝珠没有绑定的网络就不执行如下操作
              如果血祭坛流体数量>=1就进行如下操作:
                      消耗流体数量(liquidDrained)=宝珠消耗速率*(1+消耗倍率)取整和血魔法祭坛流体数量中的较小值
                      宝珠消耗速率:

                              weak 2
                              apprentice 5
                              magician 15
                              master 25
                              archmage 50
                  排出(drain)=0(如果宝珠容量*宝珠容量倍率<=现在生命源质数量(currEss)) 或 ((最大容量和现在生命源质数量+消耗流体数量的较小值)-现在生命源质数量)

                   (这个排出的eventbus没看明白什么(但是猜一手是多个宝珠的网络计算))

                  祭坛流体数量-排出

                  如果排出>0且世界时间是4的倍数产生粒子效果

      最后进行一次方块实体的同步。

总结

祭坛流体转移

首先从外部管道输入祭坛的血量会进输入的流体数量缓存(fluidInput.amount nbt中可以读到),

然后每20-促进符文数量的倍数(最低为1)进行一次流体转移进真正的血祭坛,

每次流体转移速度最大为LP转移速度最大值和临时容量(bufferCapacity)中较小的一个,

LP转移速度最大值(syphonMax)为20*转移倍率(dislocationMultiplier)(1.2^转位符文数量),

临时容量为血祭坛容量(capacity)/10即1000*容量倍率,输出同理,而且因为先判断输入再判断输出所以前面输入的流体会先进输出缓存。

充能

其实和百科一样,就是每充能频率(chargingFrequency)且血祭坛不在工作就进行一次充能,充能速率=10*充能符文*(1+消耗倍率/2)。

制作物品

每tick判断的

如果不再合成且cooldownAfterCrafting>0就cooldownAfterCrafting-1,

如果有合成表就先使用充能点数如果不够就消耗一次血量(消耗流体数量(liquidDrained)=消耗速率*(1+消耗倍率)取整和血魔法祭坛流体数量中的较小值)

(太怪了只有速度符文能加速,效率是减少扣除的)

如果以上俩个都没执行就进度倒退效率倍率*排空速率(最低倒退到0),

如果进度够,就把所有物品转换成成品就转换成成品同时判断是否祭坛下面为红石灯将祭坛变为充能方块,

在世界时间为100的倍数且在合成或合成冷却结束时会关闭祭坛的充能。

宝珠充能

每tick判断的

宝珠充能速率=宝珠消耗速率*(1+消耗倍率)取整

宝珠消耗速率:

            weak 2

            apprentice 5

            magician 15

            master 25

            archmage 50

贴一下源码

里面可能有点问题。(因为我的猪鼻代码水平都是云出来的)

呃啊然后不会用matlab,研究一晚上最后手算的,整合包为dj2,采用俩个祭坛的方式。

默认19个促进符文(因为不默认苯比不会算力)

合成祭坛为28个转位符文 带来3296lp/t的转移速率,以及39个超容符文带来41144的临时缓存(可恶的石板),然后是49个充能+49个速度带来2891/t的充能点数和100w的充能点上线,以及540p/t的灵魂网络输入速度(dj2中六级宝珠和五级宝珠都是50)(很坏然后献血的供应不过来了)

(写这篇教程的原因是猪鼻队友整俩答辩祭坛,俩祭坛转移速率就50,灵魂网络输入速度也50,合成全塞效率符文,慢的要死,真的蠢,害我后期卡一晚上血魔法)

坏了设置为社区教程没法加入不确定的词汇,只能作为个人教程了。  

Copyright © 2018-2023 PHP源码网 版权所有
PHP源码网 » 我的世界血魔法祭坛原理分析附dj2个人祭坛符文搭配

提供最优质的资源集合

立即查看 了解详情