Skip to content

Commit 29c9fcd

Browse files
author
Circulate233
committed
重置MM血之祭坛的配方系统,改为动态注册所有血之祭坛配方
1 parent c89313a commit 29c9fcd

File tree

3 files changed

+146
-13
lines changed

3 files changed

+146
-13
lines changed

build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,7 @@ dependencies {
294294
implementation(rfg.deobf("curse.maven:betterer-p2p-943734:4928154"))
295295
implementation(rfg.deobf("curse.maven:nuclearcraft-overhauled-336895:6160826"))
296296
implementation(rfg.deobf("curse.maven:Loot-Overhaul-299389:2711740"))
297+
implementation(rfg.deobf("curse.maven:BloodMagic-224791:2822288"))
297298
implementation(kotlin("stdlib-jdk8"))
298299
}
299300

src/main/java/github/kasuminova/novaeng/common/machine/DreamEnergyCore.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@
3030
@ZenRegister
3131
@ZenClass("novaeng.DreamEnergyCore")
3232
public class DreamEnergyCore implements MachineSpecial{
33-
private static final String MachineID = "dream_energy_core";
34-
private static final ResourceLocation REGISTRY_NAME = new ResourceLocation(ModularMachinery.MODID, MachineID);
33+
public static final String MachineID = "dream_energy_core";
34+
public static final ResourceLocation REGISTRY_NAME = new ResourceLocation(ModularMachinery.MODID, MachineID);
3535
public static final DreamEnergyCore INSTANCE = new DreamEnergyCore();
3636
private static final Map<World,Map<BlockPos, FixedSizeDeque<String>>> map = new ConcurrentHashMap<>();
3737
private static final ThreadLocal<Map<String, BigInteger>> ENERGY_STORED_CACHE =
@@ -41,9 +41,9 @@ public class DreamEnergyCore implements MachineSpecial{
4141
//最小传输速度,按倍计。
4242
private static float minSpeed = 0.01f;
4343
//最大传输速度,按倍计。
44-
private static int maxSpeed = 40000;
44+
private static int maxSpeed = 100000;
4545
//基础输入输出速度。能量输入输出速度计算方法为:defaultTransferAmount * speed,其中 speed 可由玩家控制。
46-
private static long defaultTransferAmount = 10000000;
46+
private static long defaultTransferAmount = 100000000;
4747

4848
@ZenMethod
4949
public static long setDefaultTransferAmount(long varue){
@@ -248,8 +248,9 @@ private String change(TileMultiblockMachineController ctrl){
248248
if (newbig.equals(oldbig)) {
249249
return "0";
250250
} else {
251-
var changel = newbig.subtract(oldbig);
252-
return formatNumber(newbig.subtract(oldbig));
251+
var changel = newbig.subtract(oldbig).longValue();
252+
var denominator = 1200L / MinuteScale * energy.size();
253+
return formatNumber(changel / denominator);
253254
}
254255
}
255256

src/main/java/github/kasuminova/novaeng/common/machine/MMAltar.java

Lines changed: 138 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,15 @@
11
package github.kasuminova.novaeng.common.machine;
22

3+
import WayofTime.bloodmagic.api.impl.BloodMagicAPI;
4+
import WayofTime.bloodmagic.api.impl.recipe.RecipeBloodAltar;
5+
import crafttweaker.annotations.ZenRegister;
6+
import crafttweaker.api.item.IIngredient;
7+
import crafttweaker.api.item.IItemStack;
8+
import crafttweaker.api.minecraft.CraftTweakerMC;
9+
import crafttweaker.api.oredict.IOreDictEntry;
310
import github.kasuminova.mmce.common.event.machine.MachineStructureUpdateEvent;
411
import hellfirepvp.modularmachinery.ModularMachinery;
12+
import hellfirepvp.modularmachinery.common.integration.crafttweaker.RecipeBuilder;
513
import hellfirepvp.modularmachinery.common.machine.DynamicMachine;
614
import hellfirepvp.modularmachinery.common.modifier.MultiBlockModifierReplacement;
715
import hellfirepvp.modularmachinery.common.tiles.base.TileMultiblockMachineController;
@@ -12,13 +20,18 @@
1220
import net.minecraft.util.ResourceLocation;
1321
import net.minecraft.util.math.BlockPos;
1422
import net.minecraftforge.fml.common.registry.GameRegistry;
23+
import stanhebben.zenscript.annotations.ZenClass;
24+
import stanhebben.zenscript.annotations.ZenMethod;
1525

1626
import java.util.Arrays;
1727
import java.util.Collections;
1828
import java.util.List;
1929

30+
@ZenRegister
31+
@ZenClass("novaeng.MMAltar")
2032
public class MMAltar implements MachineSpecial {
21-
public static final ResourceLocation REGISTRY_NAME = new ResourceLocation(ModularMachinery.MODID, "mm_altar");
33+
public static final String MachineID = "mm_altar";
34+
public static final ResourceLocation REGISTRY_NAME = new ResourceLocation(ModularMachinery.MODID, MachineID);
2235
public static final MMAltar INSTANCE = new MMAltar();
2336

2437
public static final List<BlockPos> posSet1 = Arrays.asList(
@@ -42,8 +55,7 @@ public class MMAltar implements MachineSpecial {
4255
public static Block BLOCKSJ2 = getOtherModsBlock("contenttweaker","fallenstarforcefieldcontrolblock");
4356
public static Block BLOCKSJ3 = getOtherModsBlock("contenttweaker","universalforcefieldcontrolblock");
4457

45-
protected MMAltar() {
46-
}
58+
protected MMAltar() {}
4759

4860
protected static Block getOtherModsBlock(String modId, String blockName) {
4961
return GameRegistry.findRegistry(Block.class).getValue(new ResourceLocation(modId, blockName));
@@ -63,7 +75,8 @@ public void init(final DynamicMachine machine) {
6375
"§6将3级祭坛的柱子方块全部替换为" + BLOCKSJ1.getLocalizedName(),
6476
"§6即可激活升级数1"
6577
),
66-
StackUtils.getStackFromBlockState(BLOCKSJ1.getDefaultState())));
78+
StackUtils.getStackFromBlockState(BLOCKSJ1.getDefaultState()))
79+
);
6780
machine.getMultiBlockModifiers().add(new MultiBlockModifierReplacement("xzjtsj2",
6881
buildModifierReplacementBlockArray(BLOCKSJ2, posSet2),
6982
Collections.emptyList(),
@@ -72,7 +85,8 @@ public void init(final DynamicMachine machine) {
7285
"§6将4级祭坛的所有的大血石下方的1个柱子方块全部替换为" + BLOCKSJ2.getLocalizedName(),
7386
"§6即可激活升级数1"
7487
),
75-
StackUtils.getStackFromBlockState(BLOCKSJ2.getDefaultState())));
88+
StackUtils.getStackFromBlockState(BLOCKSJ2.getDefaultState()))
89+
);
7690
machine.getMultiBlockModifiers().add(new MultiBlockModifierReplacement("xzjtsj3",
7791
buildModifierReplacementBlockArray(BLOCKSJ3, posSet3),
7892
Collections.emptyList(),
@@ -82,9 +96,19 @@ public void init(final DynamicMachine machine) {
8296
"§6即可激活升级数2",
8397
"§6并且额外提升1级祭坛位阶"
8498
),
85-
StackUtils.getStackFromBlockState(BLOCKSJ3.getDefaultState())));
86-
}
99+
StackUtils.getStackFromBlockState(BLOCKSJ3.getDefaultState()))
100+
);
87101

102+
for (RecipeBloodAltar recipe : BloodMagicAPI.INSTANCE.getRecipeRegistrar().getAltarRecipes()) {
103+
registerRecipe(
104+
recipe.getConsumeRate(),
105+
recipe.getSyphon(),
106+
recipe.getMinimumTier().toInt(),
107+
CraftTweakerMC.getIIngredient(recipe.getInput()),
108+
CraftTweakerMC.getIItemStack(recipe.getOutput())
109+
);
110+
}
111+
}
88112

89113
@Override
90114
public ResourceLocation getRegistryName() {
@@ -97,4 +121,111 @@ protected static BlockArray buildModifierReplacementBlockArray(final Block block
97121
posSet.forEach(pos -> blockArray.addBlock(pos, new BlockArray.BlockInformation(Collections.singletonList(descriptor))));
98122
return blockArray;
99123
}
124+
125+
/**
126+
* 合成配方
127+
* @param need 最低血液需求
128+
* @param Maxneed 总血液需求
129+
* @param AltarTier 祭坛等级需求
130+
* @param input 输入物品
131+
* @param output 输出物品
132+
*/
133+
@ZenMethod
134+
public static void registerRecipe(int need, int Maxneed, int AltarTier, IIngredient input,IItemStack output) {
135+
var time = Maxneed / need;
136+
String name;
137+
if (input instanceof IItemStack item){
138+
name = CraftTweakerMC.getItem(item.getDefinition()).getRegistryName().toString() + item.getMetadata();
139+
} else if (input instanceof IOreDictEntry od) {
140+
name = od.getName();
141+
} else {
142+
name = CraftTweakerMC.getItem(output.getDefinition()).getRegistryName().toString() + output.getMetadata();
143+
}
144+
RecipeBuilder.newBuilder(name, MachineID, time,1000)
145+
.addItemInputs(input)
146+
.addPreCheckHandler(event -> {
147+
var ctrl = event.getController();
148+
var data = ctrl.getCustomDataTag();
149+
var xycc = data.getLong("xycc");
150+
var jtdj = data.getInteger("jtdj");
151+
var sdfw = data.getInteger("sdfw");
152+
var cpdj = data.getInteger("cpdj");
153+
var ccjx = data.getInteger("ccjx");
154+
var yzfb = Math.pow(0.95, cpdj);
155+
var sjneed = (0.2 * sdfw + 1.00) * (need * 1.00);
156+
var bx = Math.min(Math.pow(4, cpdj), ((double) ccjx / need));
157+
158+
if (xycc < need) {
159+
event.setFailed("§4缓存的生命源质无法启动配方!");
160+
return;
161+
}
162+
if (jtdj < AltarTier) {
163+
event.setFailed("§4祭坛等级不足以运行配方!");
164+
return;
165+
}
166+
event.getActiveRecipe().setMaxParallelism((int) bx);
167+
})
168+
.addFactoryStartHandler(event -> {
169+
var ctrl = event.getController();
170+
var data = ctrl.getCustomDataTag();
171+
var bx = event.getFactoryRecipeThread().getActiveRecipe().getParallelism();
172+
173+
data.setLong("hcjd",0);
174+
data.setLong("hcjdmax", (long) bx * Maxneed);
175+
})
176+
.addFactoryPreTickHandler(event -> {
177+
var ctrl = event.getController();
178+
var data = ctrl.getCustomDataTag();
179+
var xycc = data.getLong("xycc");
180+
var jtdj = data.getInteger("jtdj");
181+
var hcjd = data.getInteger("hcjd");
182+
var hcjdmax = data.getInteger("hcjdmax");
183+
var sdfwxg = 0.2 * data.getInteger("sdfw");
184+
var cpdj = data.getInteger("cpdj");
185+
var yzfb = Math.pow(0.95, cpdj);
186+
var thread = event.getFactoryRecipeThread();
187+
var bx = thread.getActiveRecipe().getParallelism();
188+
var tick = thread.getActiveRecipe().getTick();
189+
var totalTick = thread.getActiveRecipe().getTotalTick();
190+
var sjneed = need * bx;
191+
192+
if (xycc > sjneed) {
193+
if (hcjd < hcjdmax) {
194+
thread.getActiveRecipe().setTick((totalTick / 2));
195+
event.preventProgressing("§6合成中,还差§a" + (hcjdmax - hcjd) + "生命源质§6完成合成");
196+
}
197+
if (xycc <= (1 + sdfwxg) * sjneed) {
198+
if (hcjd + xycc <= hcjdmax) {
199+
data.setLong("hcjd",hcjd + xycc);
200+
data.setLong("xycc",0);
201+
} else {
202+
data.setLong("hcjd",hcjdmax);
203+
data.setLong("xycc",xycc - (hcjdmax - hcjd));
204+
thread.getActiveRecipe().setTick(totalTick);
205+
}
206+
} else {
207+
if (hcjd + ((1 + sdfwxg) * sjneed) <= hcjdmax) {
208+
data.setLong("hcjd", (long) (hcjd + ((1 + sdfwxg) * sjneed)));
209+
data.setLong("xycc", (long) (xycc - ((1 + sdfwxg) * sjneed)));
210+
} else {
211+
data.setLong("hcjd",hcjdmax);
212+
data.setLong("xycc",xycc - (hcjdmax - hcjd));
213+
thread.getActiveRecipe().setTick(totalTick);
214+
}
215+
}
216+
} else {
217+
event.preventProgressing("§6剩余的生命源质不足最低值§a" + (sjneed));
218+
}
219+
})
220+
.addOutput(output)
221+
.setThreadName("血之合成")
222+
.addRecipeTooltip(
223+
"§4所需基础生命源质" + need,
224+
"§4所需生命源质总量" + Maxneed,
225+
"§4配方所要求最低层级:" + AltarTier,
226+
"§6实际速度与消耗将取决于速度符文",
227+
"§6并行状态每次需要消耗的血量会乘并行数"
228+
)
229+
.build();
230+
}
100231
}

0 commit comments

Comments
 (0)