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 .item .IItemStack ;
8+ import crafttweaker .api .minecraft .CraftTweakerMC ;
9+ import crafttweaker .api .oredict .IOreDictEntry ;
310import github .kasuminova .mmce .common .event .machine .MachineStructureUpdateEvent ;
411import hellfirepvp .modularmachinery .ModularMachinery ;
12+ import hellfirepvp .modularmachinery .common .integration .crafttweaker .RecipeBuilder ;
513import hellfirepvp .modularmachinery .common .machine .DynamicMachine ;
614import hellfirepvp .modularmachinery .common .modifier .MultiBlockModifierReplacement ;
715import hellfirepvp .modularmachinery .common .tiles .base .TileMultiblockMachineController ;
1220import net .minecraft .util .ResourceLocation ;
1321import net .minecraft .util .math .BlockPos ;
1422import net .minecraftforge .fml .common .registry .GameRegistry ;
23+ import stanhebben .zenscript .annotations .ZenClass ;
24+ import stanhebben .zenscript .annotations .ZenMethod ;
1525
1626import java .util .Arrays ;
1727import java .util .Collections ;
1828import java .util .List ;
1929
30+ @ ZenRegister
31+ @ ZenClass ("novaeng.MMAltar" )
2032public 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