11package 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 .minecraft .CraftTweakerMC ;
38import github .kasuminova .mmce .common .event .machine .MachineStructureUpdateEvent ;
49import hellfirepvp .modularmachinery .ModularMachinery ;
10+ import hellfirepvp .modularmachinery .common .integration .crafttweaker .RecipeBuilder ;
511import hellfirepvp .modularmachinery .common .machine .DynamicMachine ;
612import hellfirepvp .modularmachinery .common .modifier .MultiBlockModifierReplacement ;
713import hellfirepvp .modularmachinery .common .tiles .base .TileMultiblockMachineController ;
1218import net .minecraft .util .ResourceLocation ;
1319import net .minecraft .util .math .BlockPos ;
1420import net .minecraftforge .fml .common .registry .GameRegistry ;
21+ import stanhebben .zenscript .annotations .ZenClass ;
22+ import stanhebben .zenscript .annotations .ZenMethod ;
1523
1624import java .util .Arrays ;
1725import java .util .Collections ;
1826import java .util .List ;
1927
28+ @ ZenRegister
29+ @ ZenClass ("novaeng.MMAltar" )
2030public class MMAltar implements MachineSpecial {
21- public static final ResourceLocation REGISTRY_NAME = new ResourceLocation (ModularMachinery .MODID , "mm_altar" );
31+ public static final String MachineID = "mm_altar" ;
32+ public static final ResourceLocation REGISTRY_NAME = new ResourceLocation (ModularMachinery .MODID , MachineID );
2233 public static final MMAltar INSTANCE = new MMAltar ();
2334
2435 public static final List <BlockPos > posSet1 = Arrays .asList (
@@ -42,8 +53,7 @@ public class MMAltar implements MachineSpecial {
4253 public static Block BLOCKSJ2 = getOtherModsBlock ("contenttweaker" ,"fallenstarforcefieldcontrolblock" );
4354 public static Block BLOCKSJ3 = getOtherModsBlock ("contenttweaker" ,"universalforcefieldcontrolblock" );
4455
45- protected MMAltar () {
46- }
56+ protected MMAltar () {}
4757
4858 protected static Block getOtherModsBlock (String modId , String blockName ) {
4959 return GameRegistry .findRegistry (Block .class ).getValue (new ResourceLocation (modId , blockName ));
@@ -85,6 +95,18 @@ public void init(final DynamicMachine machine) {
8595 StackUtils .getStackFromBlockState (BLOCKSJ3 .getDefaultState ())));
8696 }
8797
98+ public void postInit (){
99+ for (RecipeBloodAltar recipe : BloodMagicAPI .INSTANCE .getRecipeRegistrar ().getAltarRecipes ()) {
100+ registerRecipe (
101+ recipe .getInput ().getMatchingStacks ()[0 ].getItem ().getRegistryName ().toString (),
102+ recipe .getConsumeRate (),
103+ recipe .getSyphon (),
104+ recipe .getMinimumTier ().toInt (),
105+ CraftTweakerMC .getIIngredient (recipe .getInput ()),
106+ CraftTweakerMC .getIIngredient (recipe .getOutput ())
107+ );
108+ }
109+ }
88110
89111 @ Override
90112 public ResourceLocation getRegistryName () {
@@ -97,4 +119,103 @@ protected static BlockArray buildModifierReplacementBlockArray(final Block block
97119 posSet .forEach (pos -> blockArray .addBlock (pos , new BlockArray .BlockInformation (Collections .singletonList (descriptor ))));
98120 return blockArray ;
99121 }
122+
123+ /**
124+ * 合成配方
125+ * @param need 最低血液需求
126+ * @param Maxneed 总血液需求
127+ * @param AltarTier 祭坛等级需求
128+ * @param Inputs 输入物品
129+ * @param Output 输出物品
130+ */
131+ @ ZenMethod
132+ public static void registerRecipe (String Name , int need , int Maxneed , int AltarTier , IIngredient Inputs ,IIngredient Output ) {
133+ var time = Maxneed / need ;
134+ RecipeBuilder .newBuilder (Name , MachineID , time )
135+ .addItemInputs (Inputs )
136+ .addPreCheckHandler (event -> {
137+ var ctrl = event .getController ();
138+ var data = ctrl .getCustomDataTag ();
139+ var xycc = data .getLong ("xycc" );
140+ var jtdj = data .getInteger ("jtdj" );
141+ var sdfw = data .getInteger ("sdfw" );
142+ var cpdj = data .getInteger ("cpdj" );
143+ var ccjx = data .getInteger ("ccjx" );
144+ var yzfb = Math .pow (0.95 , cpdj );
145+ var sjneed = (0.2 * sdfw + 1.00 ) * (need * 1.00 );
146+ var bx = Math .min (Math .pow (4 , cpdj ), ((double ) ccjx / need ));
147+
148+ if (xycc < need ) {
149+ event .setFailed ("§4缓存的生命源质无法启动配方!" );
150+ return ;
151+ }
152+ if (jtdj < AltarTier ) {
153+ event .setFailed ("§4祭坛等级不足以运行配方!" );
154+ return ;
155+ }
156+ event .getActiveRecipe ().setMaxParallelism ((int ) bx );
157+ })
158+ .addFactoryStartHandler (event -> {
159+ var ctrl = event .getController ();
160+ var data = ctrl .getCustomDataTag ();
161+ var bx = event .getFactoryRecipeThread ().getActiveRecipe ().getParallelism ();
162+
163+ data .setLong ("hcjd" ,0 );
164+ data .setLong ("hcjdmax" , (long ) bx * Maxneed );
165+ })
166+ .addFactoryPreTickHandler (event -> {
167+ var ctrl = event .getController ();
168+ var data = ctrl .getCustomDataTag ();
169+ var xycc = data .getLong ("xycc" );
170+ var jtdj = data .getInteger ("jtdj" );
171+ var hcjd = data .getInteger ("hcjd" );
172+ var hcjdmax = data .getInteger ("hcjdmax" );
173+ var sdfwxg = 0.2 * data .getInteger ("sdfw" );
174+ var cpdj = data .getInteger ("cpdj" );
175+ var yzfb = Math .pow (0.95 , cpdj );
176+ var thread = event .getFactoryRecipeThread ();
177+ var bx = thread .getActiveRecipe ().getParallelism ();
178+ var tick = thread .getActiveRecipe ().getTick ();
179+ var totalTick = thread .getActiveRecipe ().getTotalTick ();
180+ var sjneed = need * bx ;
181+
182+ if (xycc > sjneed ) {
183+ if (hcjd < hcjdmax ) {
184+ thread .getActiveRecipe ().setTick ((totalTick / 2 ));
185+ event .preventProgressing ("§6合成中,还差§a" + (hcjdmax - hcjd ) + "生命源质§6完成合成" );
186+ }
187+ if (xycc <= (1 + sdfwxg ) * sjneed ) {
188+ if (hcjd + xycc <= hcjdmax ) {
189+ data .setLong ("hcjd" ,hcjd + xycc );
190+ data .setLong ("xycc" ,0 );
191+ } else {
192+ data .setLong ("hcjd" ,hcjdmax );
193+ data .setLong ("xycc" ,xycc - (hcjdmax - hcjd ));
194+ thread .getActiveRecipe ().setTick (totalTick );
195+ }
196+ } else {
197+ if (hcjd + ((1 + sdfwxg ) * sjneed ) <= hcjdmax ) {
198+ data .setLong ("hcjd" , (long ) (hcjd + ((1 + sdfwxg ) * sjneed )));
199+ data .setLong ("xycc" , (long ) (xycc - ((1 + sdfwxg ) * sjneed )));
200+ } else {
201+ data .setLong ("hcjd" ,hcjdmax );
202+ data .setLong ("xycc" ,xycc - (hcjdmax - hcjd ));
203+ thread .getActiveRecipe ().setTick (totalTick );
204+ }
205+ }
206+ } else {
207+ event .preventProgressing ("§6剩余的生命源质不足最低值§a" + (sjneed ));
208+ }
209+ })
210+ .addOutput (Output )
211+ .setThreadName ("血之合成" )
212+ .addRecipeTooltip (
213+ "§4所需基础生命源质" + need ,
214+ "§4所需生命源质总量" + Maxneed ,
215+ "§4配方所要求最低层级:" + AltarTier ,
216+ "§6实际速度与消耗将取决于速度符文" ,
217+ "§6并行状态每次需要消耗的血量会乘并行数"
218+ )
219+ .build ();
220+ }
100221}
0 commit comments