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

This commit is contained in:
GaLi 2026-04-07 17:24:55 +08:00
parent 06bd7a5682
commit 854f026623
7 changed files with 123 additions and 4 deletions

View File

@ -0,0 +1,12 @@
package com.extendedae_plus.mixin.advancedae.accessor;
import appeng.api.stacks.GenericStack;
import net.pedroksl.advanced_ae.common.cluster.AdvCraftingCPU;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Invoker;
@Mixin(value = AdvCraftingCPU.class, remap = false)
public interface AdvCraftingCPUAccessor {
@Invoker("updateOutput")
void eap$invokeUpdateOutput(GenericStack stack);
}

View File

@ -4,10 +4,14 @@ import net.pedroksl.advanced_ae.common.logic.AdvCraftingCPULogic;
import net.pedroksl.advanced_ae.common.logic.ExecutingCraftingJob; import net.pedroksl.advanced_ae.common.logic.ExecutingCraftingJob;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor; import org.spongepowered.asm.mixin.gen.Accessor;
import org.spongepowered.asm.mixin.gen.Invoker;
@Mixin(value = AdvCraftingCPULogic.class, remap = false) @Mixin(value = AdvCraftingCPULogic.class, remap = false)
public interface AdvCraftingCPULogicAccessor { public interface AdvCraftingCPULogicAccessor {
@Accessor("job") @Accessor("job")
ExecutingCraftingJob eap$getAdvJob(); ExecutingCraftingJob eap$getAdvJob();
@Invoker("finishJob")
void eap$invokeAdvFinishJob(boolean success);
} }

View File

@ -6,15 +6,19 @@ import appeng.api.networking.crafting.ICraftingService;
import appeng.api.stacks.KeyCounter; import appeng.api.stacks.KeyCounter;
import appeng.helpers.patternprovider.PatternProviderLogic; import appeng.helpers.patternprovider.PatternProviderLogic;
import com.extendedae_plus.compat.PatternProviderLogicVirtualCompatBridge; import com.extendedae_plus.compat.PatternProviderLogicVirtualCompatBridge;
import com.extendedae_plus.mixin.advancedae.accessor.AdvCraftingCPUAccessor;
import com.extendedae_plus.mixin.advancedae.accessor.AdvCraftingCPULogicAccessor; import com.extendedae_plus.mixin.advancedae.accessor.AdvCraftingCPULogicAccessor;
import com.extendedae_plus.mixin.advancedae.accessor.AdvExecutingCraftingJobAccessor; import com.extendedae_plus.mixin.advancedae.accessor.AdvExecutingCraftingJobAccessor;
import com.extendedae_plus.mixin.advancedae.accessor.AdvExecutingCraftingJobTaskProgressAccessor; import com.extendedae_plus.mixin.advancedae.accessor.AdvExecutingCraftingJobTaskProgressAccessor;
import net.pedroksl.advanced_ae.common.cluster.AdvCraftingCPU; import net.pedroksl.advanced_ae.common.cluster.AdvCraftingCPU;
import org.spongepowered.asm.mixin.Mixin; 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.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import java.util.Map;
/** /**
* AdvancedAE 版本的虚拟完成兼容逻辑 * AdvancedAE 版本的虚拟完成兼容逻辑
*/ */
@ -85,8 +89,20 @@ public abstract class PatternProviderLogicVirtualCompletionMixin {
} }
if (progress instanceof AdvExecutingCraftingJobTaskProgressAccessor advProgressAccessor) { if (progress instanceof AdvExecutingCraftingJobTaskProgressAccessor advProgressAccessor) {
if (advProgressAccessor.eap$getAdvValue() <= 1) { if (this.eap$advancedaeShouldCancelWholeJob(tasks, advProgressAccessor)) {
advCpu.cancelJob(); boolean finished = false;
try {
((AdvCraftingCPUAccessor) (Object) advCpu).eap$invokeUpdateOutput(null);
} catch (Throwable ignored) {
}
try {
advLogicAccessor.eap$invokeAdvFinishJob(true);
finished = true;
} catch (Throwable ignored) {
}
if (!finished) {
advCpu.cancelJob();
}
break; break;
} }
} }
@ -95,4 +111,31 @@ public abstract class PatternProviderLogicVirtualCompletionMixin {
} }
} }
} }
@Unique
private boolean eap$advancedaeShouldCancelWholeJob(
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

@ -0,0 +1,12 @@
package com.extendedae_plus.mixin.ae2.accessor;
import appeng.api.stacks.GenericStack;
import appeng.me.cluster.implementations.CraftingCPUCluster;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Invoker;
@Mixin(value = CraftingCPUCluster.class, remap = false)
public interface CraftingCPUClusterAccessor {
@Invoker("updateOutput")
void eap$invokeUpdateOutput(GenericStack finalOutput);
}

View File

@ -4,9 +4,13 @@ import appeng.crafting.execution.CraftingCpuLogic;
import appeng.crafting.execution.ExecutingCraftingJob; import appeng.crafting.execution.ExecutingCraftingJob;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor; import org.spongepowered.asm.mixin.gen.Accessor;
import org.spongepowered.asm.mixin.gen.Invoker;
@Mixin(value = CraftingCpuLogic.class, remap = false) @Mixin(value = CraftingCpuLogic.class, remap = false)
public interface CraftingCpuLogicAccessor { public interface CraftingCpuLogicAccessor {
@Accessor("job") @Accessor("job")
ExecutingCraftingJob eap$getJob(); ExecutingCraftingJob eap$getJob();
@Invoker("finishJob")
void eap$invokeFinishJob(boolean success);
} }

View File

@ -21,6 +21,7 @@ import com.extendedae_plus.api.bridge.PatternProviderLogicUpgradeCompatBridge;
import com.extendedae_plus.compat.PatternProviderLogicVirtualCompatBridge; import com.extendedae_plus.compat.PatternProviderLogicVirtualCompatBridge;
import com.extendedae_plus.compat.UpgradeSlotCompat; import com.extendedae_plus.compat.UpgradeSlotCompat;
import com.extendedae_plus.init.ModItems; import com.extendedae_plus.init.ModItems;
import com.extendedae_plus.mixin.ae2.accessor.CraftingCPUClusterAccessor;
import com.extendedae_plus.mixin.ae2.accessor.CraftingCpuLogicAccessor; import com.extendedae_plus.mixin.ae2.accessor.CraftingCpuLogicAccessor;
import com.extendedae_plus.mixin.ae2.accessor.ExecutingCraftingJobAccessor; import com.extendedae_plus.mixin.ae2.accessor.ExecutingCraftingJobAccessor;
import com.extendedae_plus.mixin.appflux.accessor.PatternProviderLogicAppfluxAccessor; import com.extendedae_plus.mixin.appflux.accessor.PatternProviderLogicAppfluxAccessor;
@ -38,6 +39,8 @@ import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import java.util.Map;
import java.util.List; import java.util.List;
import java.util.UUID; import java.util.UUID;
@ -483,8 +486,20 @@ public abstract class PatternProviderLogicCompatMixin implements CompatUpgradePr
} }
} }
if (progress != null && progress.eap$getValue() <= 1) { if (this.eap$compatShouldCancelWholeJob(tasks, progress)) {
cluster.cancelJob(); boolean finished = false;
try {
((CraftingCPUClusterAccessor) (Object) cluster).eap$invokeUpdateOutput(null);
} catch (Throwable ignored) {
}
try {
logicAccessor.eap$invokeFinishJob(true);
finished = true;
} catch (Throwable ignored) {
}
if (!finished) {
cluster.cancelJob();
}
break; break;
} }
} }
@ -503,6 +518,33 @@ public abstract class PatternProviderLogicCompatMixin implements CompatUpgradePr
return this.mainNode; return this.mainNode;
} }
@Unique
private boolean eap$compatShouldCancelWholeJob(
Map<IPatternDetails, com.extendedae_plus.mixin.ae2.accessor.ExecutingCraftingJobTaskProgressAccessor> tasks,
com.extendedae_plus.mixin.ae2.accessor.ExecutingCraftingJobTaskProgressAccessor matchedProgress) {
if (matchedProgress == null || matchedProgress.eap$getValue() > 1) {
return false;
}
for (var entry : tasks.entrySet()) {
var taskProgress = entry.getValue();
if (taskProgress == null) {
continue;
}
long remaining = taskProgress.eap$getValue();
if (taskProgress == matchedProgress) {
remaining -= 1;
}
if (remaining > 0) {
return false;
}
}
return true;
}
@Unique @Unique
private void eap$compatSyncVirtualCraftingState() { private void eap$compatSyncVirtualCraftingState() {
try { try {

View File

@ -6,6 +6,7 @@
"mixins": [ "mixins": [
"advancedae.AdvPatternProviderLogicContainsRedirectMixin", "advancedae.AdvPatternProviderLogicContainsRedirectMixin",
"advancedae.AdvProcessingPatternMixin", "advancedae.AdvProcessingPatternMixin",
"advancedae.accessor.AdvCraftingCPUAccessor",
"advancedae.accessor.AdvCraftingCPULogicAccessor", "advancedae.accessor.AdvCraftingCPULogicAccessor",
"advancedae.accessor.AdvExecutingCraftingJobAccessor", "advancedae.accessor.AdvExecutingCraftingJobAccessor",
"advancedae.accessor.AdvExecutingCraftingJobTaskProgressAccessor", "advancedae.accessor.AdvExecutingCraftingJobTaskProgressAccessor",
@ -19,6 +20,7 @@
"ae2.AEProcessingPatternMixin", "ae2.AEProcessingPatternMixin",
"ae2.CraftingCalculationMixin", "ae2.CraftingCalculationMixin",
"ae2.CraftingCPUClusterMixin", "ae2.CraftingCPUClusterMixin",
"ae2.accessor.CraftingCPUClusterAccessor",
"ae2.EncodedPatternItemMixin", "ae2.EncodedPatternItemMixin",
"ae2.accessor.CraftingCpuLogicAccessor", "ae2.accessor.CraftingCpuLogicAccessor",
"ae2.accessor.ExecutingCraftingJobAccessor", "ae2.accessor.ExecutingCraftingJobAccessor",