虚拟合成卡完成任务逻辑修正

This commit is contained in:
GaLi 2026-04-07 17:24:59 +08:00
parent 98c74d588a
commit 5d50f975aa
2 changed files with 60 additions and 2 deletions

View File

@ -11,10 +11,13 @@ import com.extendedae_plus.mixin.advancedae.accessor.AdvExecutingCraftingJobAcce
import com.extendedae_plus.mixin.advancedae.accessor.AdvExecutingCraftingJobTaskProgressAccessor;
import net.pedroksl.advanced_ae.common.cluster.AdvCraftingCPU;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import java.util.Map;
@Mixin(value = PatternProviderLogic.class, priority = 450, remap = false)
public abstract class PatternProviderLogicVirtualCompletionMixin {
@ -54,7 +57,7 @@ public abstract class PatternProviderLogicVirtualCompletionMixin {
var tasks = advJobAccessor.eap$getAdvTasks();
var progress = tasks.get(patternDetails);
if (progress instanceof AdvExecutingCraftingJobTaskProgressAccessor advProgressAccessor) {
if (advProgressAccessor.eap$getAdvValue() <= 1) {
if (eap$advancedaeShouldFinishWholeJob(tasks, advProgressAccessor)) {
boolean finished = false;
try {
advCpu.updateOutput(null);
@ -79,4 +82,31 @@ public abstract class PatternProviderLogicVirtualCompletionMixin {
}
}
}
@Unique
private boolean eap$advancedaeShouldFinishWholeJob(
Map<IPatternDetails, Object> tasks,
AdvExecutingCraftingJobTaskProgressAccessor matchedProgress) {
if (matchedProgress.eap$getAdvValue() > 1) {
return false;
}
for (var entry : tasks.entrySet()) {
var taskProgress = entry.getValue();
if (!(taskProgress instanceof AdvExecutingCraftingJobTaskProgressAccessor advTaskProgress)) {
continue;
}
long remaining = advTaskProgress.eap$getAdvValue();
if (taskProgress == matchedProgress) {
remaining -= 1;
}
if (remaining > 0) {
return false;
}
}
return true;
}
}

View File

@ -34,6 +34,7 @@ import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import java.util.Map;
import java.util.List;
import java.util.UUID;
@ -146,7 +147,7 @@ public abstract class PatternProviderLogicCompatMixin implements IUpgradeableObj
if (job instanceof ExecutingCraftingJobAccessor accessor) {
var tasks = accessor.extendedae_plus$getTasks();
var progress = tasks.get(patternDetails);
if (progress != null && progress.extendedae_plus$getValue() <= 1) {
if (eap$compatShouldFinishWholeJob(tasks, progress)) {
cluster.updateOutput(null);
try {
logicAccessor.extendedae_plus$invokeFinishJob(true);
@ -293,6 +294,33 @@ public abstract class PatternProviderLogicCompatMixin implements IUpgradeableObj
return this.mainNode;
}
@Unique
private boolean eap$compatShouldFinishWholeJob(
Map<IPatternDetails, com.extendedae_plus.mixin.ae2.accessor.ExecutingCraftingJobTaskProgressAccessor> tasks,
com.extendedae_plus.mixin.ae2.accessor.ExecutingCraftingJobTaskProgressAccessor matchedProgress) {
if (matchedProgress == null || matchedProgress.extendedae_plus$getValue() > 1) {
return false;
}
for (var entry : tasks.entrySet()) {
var taskProgress = entry.getValue();
if (taskProgress == null) {
continue;
}
long remaining = taskProgress.extendedae_plus$getValue();
if (taskProgress == matchedProgress) {
remaining -= 1;
}
if (remaining > 0) {
return false;
}
}
return true;
}
@Inject(method = "pushPattern", at = @At("HEAD"))
private void eap$compatOnPushPattern(IPatternDetails patternDetails, KeyCounter[] inputHolder, CallbackInfoReturnable<Boolean> cir) {
eap$compatTryVirtualCompletion(patternDetails);