@@ -118,11 +118,21 @@ public Iterable<ProcessingComponent<?>> getComponentsFor(ComponentRequirement<?,
118118 }
119119
120120 public CraftingCheckResult ioTick (int currentTick ) {
121+ ResultChance chance = new ResultChance (RAND .nextLong ());
122+ CraftingCheckResult checkResult = new CraftingCheckResult ();
121123 float durMultiplier = this .getDurationMultiplier ();
122124
123125 //Input / Output tick
124126 for (ComponentRequirement <?, ?> requirement : requirements ) {
125- if (!(requirement instanceof ComponentRequirement .PerTick )) continue ;
127+ if (!(requirement instanceof ComponentRequirement .PerTick )) {
128+ if (requirement .getTriggerTime () >= 1 ) {
129+ checkAndTriggerRequirement (checkResult , currentTick , chance , requirement );
130+ if (checkResult .isFailure ()) return checkResult ;
131+ continue ;
132+ }
133+ continue ;
134+ }
135+
126136 ComponentRequirement .PerTick <?, ?> perTickRequirement = (ComponentRequirement .PerTick <?, ?>) requirement ;
127137
128138 perTickRequirement .resetIOTick (this );
@@ -142,9 +152,8 @@ public CraftingCheckResult ioTick(int currentTick) {
142152
143153 CraftCheck result = perTickRequirement .resetIOTick (this );
144154 if (!result .isSuccess ()) {
145- CraftingCheckResult res = new CraftingCheckResult ();
146- res .addError (result .getUnlocalizedMessage ());
147- return res ;
155+ checkResult .addError (result .getUnlocalizedMessage ());
156+ return checkResult ;
148157 }
149158 }
150159
@@ -153,6 +162,19 @@ public CraftingCheckResult ioTick(int currentTick) {
153162 return CraftingCheckResult .SUCCESS ;
154163 }
155164
165+ private void checkAndTriggerRequirement (final CraftingCheckResult res , final int currentTick , final ResultChance chance , final ComponentRequirement <?, ?> req ) {
166+ int triggerTime = req .getTriggerTime () * Math .round (RecipeModifier .applyModifiers (
167+ this , RequirementTypesMM .REQUIREMENT_DURATION , null , 1 , false ));
168+ if (triggerTime <= 0 || triggerTime != currentTick || (req .isTriggered () && !req .isTriggerRepeatable ())) {
169+ return ;
170+ }
171+
172+ if (canStartCrafting (res , req )) {
173+ startCrafting (chance , req );
174+ req .setTriggered (true );
175+ }
176+ }
177+
156178 public void startCrafting () {
157179 startCrafting (RAND .nextLong ());
158180 }
@@ -164,26 +186,30 @@ public void startCrafting(long seed) {
164186 ResultChance chance = event .getResultChance ();
165187
166188 for (ComponentRequirement <?, ?> requirement : requirements ) {
167- requirement .startRequirementCheck (chance , this );
168-
169- for (ProcessingComponent <?> component : requirementComponents .getOrDefault (requirement , Collections .emptyList ())) {
170- AtomicBoolean success = new AtomicBoolean (false );
171- if (requirement instanceof Asyncable ) {
172- success .set (requirement .startCrafting (component , this , chance ));
173- } else {
174- Sync .doSyncAction (() -> success .set (requirement .startCrafting (component , this , chance )));
175- }
176- if (success .get ()) {
177- requirement .endRequirementCheck ();
178- break ;
179- }
180- }
181- requirement .endRequirementCheck ();
189+ startCrafting (chance , requirement );
182190 }
183191
184192 this .getParentRecipe ().getCommandContainer ().runStartCommands (this .commandSender );
185193 }
186194
195+ private void startCrafting (final ResultChance chance , final ComponentRequirement <?, ?> requirement ) {
196+ requirement .startRequirementCheck (chance , this );
197+
198+ for (ProcessingComponent <?> component : requirementComponents .getOrDefault (requirement , Collections .emptyList ())) {
199+ AtomicBoolean success = new AtomicBoolean (false );
200+ if (requirement instanceof Asyncable ) {
201+ success .set (requirement .startCrafting (component , this , chance ));
202+ } else {
203+ Sync .doSyncAction (() -> success .set (requirement .startCrafting (component , this , chance )));
204+ }
205+ if (success .get ()) {
206+ requirement .endRequirementCheck ();
207+ break ;
208+ }
209+ }
210+ requirement .endRequirementCheck ();
211+ }
212+
187213 public void finishCrafting () {
188214 finishCrafting (RAND .nextLong ());
189215 }
@@ -275,37 +301,44 @@ public CraftingCheckResult canStartCrafting(Predicate<ComponentRequirement<?, ?>
275301
276302 lblRequirements :
277303 for (ComponentRequirement <?, ?> requirement : requirements ) {
278- requirement .startRequirementCheck (ResultChance .GUARANTEED , this );
304+ if (canStartCrafting (result , requirement )) {
305+ successfulRequirements ++;
306+ continue lblRequirements ;
307+ }
308+ }
309+ result .setValidity (successfulRequirements / requirements .size ());
279310
280- Iterable <ProcessingComponent <?>> components = requirementComponents .getOrDefault (requirement , Collections .emptyList ());
281- if (!Iterables .isEmpty (components )) {
311+ currentRestrictions .clear ();
312+ return result ;
313+ }
282314
283- List <String > errorMessages = new ArrayList <>();
284- for (ProcessingComponent <?> component : components ) {
285- CraftCheck check = requirement .canStartCrafting (component , this , this .currentRestrictions );
315+ private boolean canStartCrafting (final CraftingCheckResult result , final ComponentRequirement <?, ?> requirement ) {
316+ requirement .startRequirementCheck (ResultChance .GUARANTEED , this );
286317
287- if (check .isSuccess ()) {
288- requirement .endRequirementCheck ();
289- successfulRequirements += 1 ;
290- continue lblRequirements ;
291- }
318+ Iterable <ProcessingComponent <?>> components = requirementComponents .getOrDefault (requirement , Collections .emptyList ());
319+ if (!Iterables .isEmpty (components )) {
292320
293- if (!check .isInvalid () && !check .getUnlocalizedMessage ().isEmpty ()) {
294- errorMessages .add (check .getUnlocalizedMessage ());
295- }
321+ List <String > errorMessages = new ArrayList <>();
322+ for (ProcessingComponent <?> component : components ) {
323+ CraftCheck check = requirement .canStartCrafting (component , this , this .currentRestrictions );
324+
325+ if (check .isSuccess ()) {
326+ requirement .endRequirementCheck ();
327+ return true ;
296328 }
297- errorMessages .forEach (result ::addError );
298- } else {
299- // No component found that would apply for the given requirement
300- result .addError (requirement .getMissingComponentErrorMessage (requirement .actionType ));
301- }
302329
303- requirement .endRequirementCheck ();
330+ if (!check .isInvalid () && !check .getUnlocalizedMessage ().isEmpty ()) {
331+ errorMessages .add (check .getUnlocalizedMessage ());
332+ }
333+ }
334+ errorMessages .forEach (result ::addError );
335+ } else {
336+ // No component found that would apply for the given requirement
337+ result .addError (requirement .getMissingComponentErrorMessage (requirement .actionType ));
304338 }
305- result .setValidity (successfulRequirements / requirements .size ());
306339
307- currentRestrictions . clear ();
308- return result ;
340+ requirement . endRequirementCheck ();
341+ return false ;
309342 }
310343
311344 public <T > void addComponent (MachineComponent <T > component , @ Nullable ComponentSelectorTag tag ) {
0 commit comments