教程/关于ET2龙堆
![]() |
教程
本条目是一个教程页面 |
龙之研究的龙堆根据目前的测试来看,是可以运行的,并且稳定输出最少能有330Mrf/t
由于config里的reactorOutputMultiplier被改成了800 000,所以龙堆的输出是原版的800 000倍,所以龙堆极不稳定,输入输出配置调整容错率为0,建议使用本教程所给出的数据运行,否则一旦爆炸,概不负责.
请先开一个创造存档测试龙堆是否可以运行,因为有群友反馈说他无论怎么弄,龙堆都是直接炸,所以不排除有部分玩家的电脑是无法使用龙堆的(玄学因素),请务必小心使用!
龙堆食用方法:
视频演示:Death__123的视频演示
使用龙堆请确保你的储电有3000M以上(不到的务必打开故障自动关闭),并且输出流量能达到100M/t.请务必不要使用通量网络直连输入输出!
首先,把基本框架摆好,建议与核心直接空3到4格,否则空间不够可能无法加入8块燃料的龙堆展开.建议是把龙堆直接放龙球上面,用墙围起来,ftbu圈个地防爆,用能量塔直接怼着通量阀门输入输出
然后准备两个de通量阀门,一个输入,一个输出,输入设置为100 000 000 , 输出设置为红石信号高430 000 000 , 红石信号低0 , 先放个拉杆但是不要打开,保证输出的流量是0.
打开龙堆gui,燃料槽放入8块觉醒龙块(少了就炸),然后启动充能,储电会消耗900M左右充能完毕,然后确保其他地方一切就绪,输入供得上并且连上的储电设备接入了龙堆的输出,输出没有打开但是连上了储电设备(推荐直接龙球).
然后点击启动,立刻关闭gui,去把输出的拉杆打开,此时你的储电越多,反应时间越多(每2000M对应一秒).如果你发现龙堆停了说明你反应慢了,需要重新启动,直接拉开输出,重新启动应该就行了.
不能直接开着输出,输出的开启必须要等龙堆的能量储量满了才能开启,否则就是炸.
然后你就可以看到龙堆的净输出有330Mrf/t了.
经测试,这个设定数值可以稳定运行.但请注意以下三点:
- 如果你是单人,请确保在退出世界之前将龙堆的输出关闭,否则再次进入就会炸.
- 如果你是服务器,如果关服的时候你的龙堆输出是开启状态,开服之后,炸.
- 如果你有幸将龙堆运行到燃料燃烧过半还没有炸,恭喜你,他炸了.(不过我想你此时大概已经毕业了)
龙堆持续运行之后,温度将会上升到4000左右,然后开始稳定下降,能量储量会一直上升,超过上限之后你会看见能量储量超过了100%,但是不会炸.
当龙堆的燃料燃烧进度增大,你可以适当增加龙堆的输出,但是一旦超出特定值(未知),炸.
如果,你的龙堆始终炸怎么也稳定运行不了:
开一个创造档,搭好龙堆的基础结构,输入用龙研的创造能量源直接贴着底部的反应堆能量注入器,中间别放能量阀门,输出放着不管,然后启动,看能否保持不炸.
如果还是炸了,那么你可以放弃龙堆了,如果没炸,请考虑你之前造的哪里出了问题.
如果你熟悉java代码或者有扎实的编程基础 |
---|
龙堆的工作状态逻辑如下 double coreSat = (double) saturation.value / (double) maxSaturation.value; //1 = Max Saturation double negCSat = (1D - coreSat) * 99D; //99 = Min Saturation. I believe this tops out at 99 because at 100 things would overflow and break. double temp50 = Math.min((temperature.value / MAX_TEMPERATURE) * 50, 99); //50 = Max Temp. Why? TBD double tFuel = convertedFuel.value + reactableFuel.value; //Total Fuel. double convLVL = ((convertedFuel.value / tFuel) * 1.3D) - 0.3D; //Conversion Level sets how much the current conversion level boosts power gen. Range: -0.3 to 1.0 //region ============= Temperature Calculation ============= double tempOffset = 444.7; //Adjusts where the temp falls to at 100% saturation //The exponential temperature rise which increases as the core saturation goes down double tempRiseExpo = (negCSat * negCSat * negCSat) / (100 - negCSat) + tempOffset; //This is just terrible... I cant believe i wrote this stuff... //作者稍纵即逝的良知 --CRMP //This is used to add resistance as the temp rises because the hotter something gets the more energy it takes to get it hotter double tempRiseResist = (temp50 * temp50 * temp50 * temp50) / (100 - temp50); //^ Mostly Correct... The hotter an object gets the faster it dissipates heat into its surroundings to the more energy it takes to compensate for that energy loss. //This puts all the numbers together and gets the value to raise or lower the temp by this tick. This is dealing with very big numbers so the result is divided by 10000 double riseAmount = (tempRiseExpo - (tempRiseResist * (1D - convLVL)) + convLVL * 1000) / 10000; //Apply energy calculations. if (reactorState.value == ReactorState.STOPPING && convLVL < 1) { if (temperature.value <= 2001) { reactorState.value = ReactorState.COOLING; startupInitialized.value = false; return; } if (saturation.value >= maxSaturation.value * 0.99D && reactableFuel.value > 0D) { temperature.value -= 1D - convLVL; } else { temperature.value += riseAmount * 10; } } else { temperature.value += riseAmount * 10; }
//endregion ================================================ //region ============= Energy Calculation ============= int baseMaxRFt = (int) ((maxSaturation.value / 1000D) * DEConfig.reactorOutputMultiplier * 1.5D); int maxRFt = (int) (baseMaxRFt * (1D + (convLVL * 2))); generationRate.value = (1D - coreSat) * maxRFt; saturation.value += generationRate.value; //endregion =========================================== //region ============= Shield Calculation ============= tempDrainFactor.value = temperature.value > 8000 ? 1 +((temperature.value - 8000) * (temperature.value - 8000) * 0.0000025) : temperature.value > 2000 ? 1 : temperature.value > 1000 ? (temperature.value - 1000) / 1000 :0; fieldDrain.value = (int) Math.min(tempDrainFactor.value * Math.max(0.01, (1D - coreSat)) * (baseMaxRFt / 10.923556), (double) Integer.MAX_VALUE); //<(baseMaxRFt/make smaller to increase field power drain) double fieldNegPercent = 1D - (shieldCharge.value / maxShieldCharge.value); fieldInputRate.value = fieldDrain.value / fieldNegPercent; shieldCharge.value -= Math.min(fieldDrain.value, shieldCharge.value); //endregion =========================================== //region ============== Fuel Calculation ============== fuelUseRate.value = tempDrainFactor.value * (1D - coreSat) * (0.001 * DEConfig.reactorFuelUsageMultiplier); //<Last number is base fuel usage rate if (reactableFuel.value > 0) { convertedFuel.value += fuelUseRate.value; reactableFuel.value -= fuelUseRate.value; } //endregion =========================================== //region Explosion if ((shieldCharge.value <= 0) && temperature.value > 2000 && reactorState.value != ReactorState.BEYOND_HOPE) { reactorState.value = ReactorState.BEYOND_HOPE; for (int i = 0; i < componentPositions.length; i++) { ManagedVec3I v = componentPositions[i]; if (v.vec.sum() > 0) { BlockPos p = getOffsetPos(v.vec).offset(EnumFacing.getFront(i).getOpposite()); world.newExplosion(null, p.getX() + 0.5, p.getY() + 0.5, p.getZ() + 0.5, 4, true, true); } } } //endregion ====== //Worst case it rolls back a second if (tick % 20 == 0) { markDirty(); } }
double coreSat = (double) saturation.value / (double) maxSaturation.value; double convLVL = ((convertedFuel.value / tFuel) * 1.3D) - 0.3D; DEConfig.reactorOutputMultiplier = 800 000 //已被改动的配置文件数据 int baseMaxRFt = (int) ((maxSaturation.value / 1000D) * DEConfig.reactorOutputMultiplier * 1.5D); int maxRFt = (int) (baseMaxRFt * (1D + (convLVL * 2))); generationRate.value = (1D - coreSat) * maxRFt; saturation.value += generationRate.value;
控制场: tempDrainFactor.value = temperature.value > 8000 ? 1 + ((temperature.value - 8000) *(temperature.value - 8000) * 0.0000025) : temperature.value > 2000 ? 1 :temperature.value > 1000 ? (temperature.value - 1000) / 1000 : 0; fieldDrain.value = (int) Math.min(tempDrainFactor.value * Math.max(0.01, (1D - coreSat)) * (baseMaxRFt / 10.923556), (double) Integer.MAX_VALUE); //<(baseMaxRFt/make smaller to increase field power drain) double fieldNegPercent = 1D - (shieldCharge.value / maxShieldCharge.value); fieldInputRate.value = fieldDrain.value / fieldNegPercent; shieldCharge.value -= Math.min(fieldDrain.value, shieldCharge.value);
大概逻辑如下: 基础rft = 最大能量储量/1000*反应堆输出参数*1.5 取整 反应水平 = ((已反应燃料/总燃料)*1.3)-0.3 最大rft = 基础rft*(1+反应水平*2) 取整 核心水平 = 能量储量/总能量储量 反应速率 = (1-核心水平)*最大rft 温度流失系数 = {温度>8000 : 1+(温度-8000)²*0.0000025 温度>2000 : 1 温度>1000 : (温度-1000)/1000 温度<1000 : 0 控制场流失 = 取最小(双精度最大值 , 温度流失系数*取最大(0.01,(1-核心水平))*(基础rft/10.923556)) 控制场惰性分数 = 1-(控制场能量/最大控制场能量) 控制场输入速率 = 控制场流失/控制场惰性分数
关于龙堆的逻辑,我总是计算出来的值和实际测试结果有相当大的偏差,如果有哪位大佬能为我解惑,感激不尽. --Death 123(讨论) 2020年2月16日 (日) 07:16 (UTC) |