Skip to content

Commit 9a49d9c

Browse files
AAE Compatible fix #17 (#18)
1 parent d0af1dd commit 9a49d9c

5 files changed

Lines changed: 171 additions & 3 deletions

File tree

src/main/java/com/ref/aea/mixin/AEAMixinConfigPlugin.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,16 +44,18 @@ public boolean shouldApplyMixin(String targetClassName, String mixinClassName) {
4444
return enableBuildingGadgets2;
4545
}
4646

47-
// AE2 相关的细分配置
48-
if (mixinClassName.startsWith("com.ref.aea.mixin.ae.crafting.blocked")) {
47+
// AE2 / AdvancedAE 相关的细分配置
48+
if (mixinClassName.startsWith("com.ref.aea.mixin.ae.crafting.blocked")
49+
|| mixinClassName.startsWith("com.ref.aea.mixin.aae.crafting.blocked")) {
4950
return enableAeCraftingBlocked;
5051
}
5152

5253
if (mixinClassName.startsWith("com.ref.aea.mixin.ae.crafting.patterntimes")) {
5354
return enableAeCraftingPatternTimes;
5455
}
5556

56-
if (mixinClassName.startsWith("com.ref.aea.mixin.ae.crafting.color")) {
57+
if (mixinClassName.startsWith("com.ref.aea.mixin.ae.crafting.color")
58+
|| mixinClassName.startsWith("com.ref.aea.mixin.aae.crafting.color")) {
5759
return enableAeCraftingColor;
5860
}
5961

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
package com.ref.aea.mixin.aae.crafting.blocked;
2+
3+
import appeng.api.crafting.IPatternDetails;
4+
import appeng.api.networking.crafting.ICraftingProvider;
5+
import appeng.api.networking.energy.IEnergyService;
6+
import appeng.api.stacks.AEKey;
7+
import appeng.api.stacks.KeyCounter;
8+
import appeng.me.service.CraftingService;
9+
import com.ref.aea.api.mixin.ae.crafting.blocked.IMixinCraftingCpuLogicBlocked;
10+
import net.minecraft.world.level.Level;
11+
import net.pedroksl.advanced_ae.common.logic.AdvCraftingCPULogic;
12+
import org.spongepowered.asm.mixin.Mixin;
13+
import org.spongepowered.asm.mixin.Shadow;
14+
import org.spongepowered.asm.mixin.Unique;
15+
import org.spongepowered.asm.mixin.injection.At;
16+
import org.spongepowered.asm.mixin.injection.Inject;
17+
import org.spongepowered.asm.mixin.injection.ModifyVariable;
18+
import org.spongepowered.asm.mixin.injection.Redirect;
19+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
20+
21+
@Mixin(value = AdvCraftingCPULogic.class, remap = false)
22+
public abstract class AdvCraftingCPULogicMixin implements IMixinCraftingCpuLogicBlocked {
23+
24+
@Shadow
25+
protected abstract void postChange(AEKey key);
26+
27+
@Unique private final KeyCounter AEA$blockedTasks = new KeyCounter();
28+
@Unique private IPatternDetails AEA$currentDetails;
29+
@Unique private boolean AEA$pushedSuccessThisPattern;
30+
31+
@Override
32+
public long AEA$getBlocked(AEKey key) {
33+
return AEA$blockedTasks.get(key);
34+
}
35+
36+
@Inject(method = "executeCrafting", at = @At("HEAD"))
37+
private void AEA$clearBlockedAtStart(
38+
int maxPatterns,
39+
CraftingService craftingService,
40+
IEnergyService energyService,
41+
Level level,
42+
CallbackInfoReturnable<Integer> cir) {
43+
AEA$blockedTasks.reset();
44+
AEA$currentDetails = null;
45+
}
46+
47+
@ModifyVariable(method = "executeCrafting", at = @At(value = "STORE"), name = "details")
48+
private IPatternDetails AEA$capturePatternAndResetFlag(IPatternDetails details) {
49+
this.AEA$currentDetails = details;
50+
this.AEA$pushedSuccessThisPattern = false;
51+
return details;
52+
}
53+
54+
@Redirect(
55+
method = "executeCrafting",
56+
at =
57+
@At(
58+
value = "INVOKE",
59+
target =
60+
"Lappeng/api/networking/crafting/ICraftingProvider;pushPattern(Lappeng/api/crafting/IPatternDetails;[Lappeng/api/stacks/KeyCounter;)Z"))
61+
private boolean AEA$detectPushSuccess(
62+
ICraftingProvider instance, IPatternDetails iPatternDetails, KeyCounter[] keyCounters) {
63+
boolean success = instance.pushPattern(iPatternDetails, keyCounters);
64+
if (success) {
65+
this.AEA$pushedSuccessThisPattern = true;
66+
}
67+
return success;
68+
}
69+
70+
@Inject(
71+
method = "executeCrafting",
72+
at =
73+
@At(
74+
value = "INVOKE",
75+
target =
76+
"Lappeng/crafting/execution/CraftingCpuHelper;reinjectPatternInputs(Lappeng/crafting/inv/ICraftingInventory;[Lappeng/api/stacks/KeyCounter;)V"))
77+
private void AEA$handleReinjectAndBlock(
78+
int maxPatterns,
79+
CraftingService craftingService,
80+
IEnergyService energyService,
81+
Level level,
82+
CallbackInfoReturnable<Integer> cir) {
83+
if (!this.AEA$pushedSuccessThisPattern && this.AEA$currentDetails != null) {
84+
for (var output : this.AEA$currentDetails.getOutputs()) {
85+
this.AEA$blockedTasks.add(output.what(), output.amount());
86+
this.postChange(output.what());
87+
}
88+
}
89+
}
90+
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package com.ref.aea.mixin.aae.crafting.color;
2+
3+
import appeng.api.config.Actionable;
4+
import appeng.api.stacks.AEKey;
5+
import appeng.crafting.CraftingLink;
6+
import appeng.crafting.inv.ListCraftingInventory;
7+
import com.ref.aea.config.AEAServerConfig;
8+
import net.pedroksl.advanced_ae.common.logic.AdvCraftingCPULogic;
9+
import net.pedroksl.advanced_ae.common.logic.ExecutingCraftingJob;
10+
import org.spongepowered.asm.mixin.Final;
11+
import org.spongepowered.asm.mixin.Mixin;
12+
import org.spongepowered.asm.mixin.Shadow;
13+
import org.spongepowered.asm.mixin.injection.At;
14+
import org.spongepowered.asm.mixin.injection.Inject;
15+
import org.spongepowered.asm.mixin.injection.Redirect;
16+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
17+
18+
@Mixin(value = AdvCraftingCPULogic.class, remap = false)
19+
public abstract class AdvCraftingCPULogicMixin {
20+
21+
@Shadow private ExecutingCraftingJob job;
22+
23+
@Shadow @Final private ListCraftingInventory inventory;
24+
25+
@Redirect(
26+
method = "insert",
27+
at =
28+
@At(
29+
value = "INVOKE",
30+
target =
31+
"Lappeng/crafting/CraftingLink;insert(Lappeng/api/stacks/AEKey;JLappeng/api/config/Actionable;)J"))
32+
private long redirectLinkInsertToInternalInventory(
33+
CraftingLink instance, AEKey what, long amount, Actionable type) {
34+
if (AEAServerConfig.cpu) {
35+
this.inventory.insert(what, amount, type);
36+
return amount;
37+
} else {
38+
return ((AdvExecutingCraftingJobAccessor) this.job).getLink().insert(what, amount, type);
39+
}
40+
}
41+
42+
@Inject(method = "finishJob", at = @At("HEAD"))
43+
private void pushFinalOutputOnFinish(boolean success, CallbackInfo ci) {
44+
if (AEAServerConfig.cpu) {
45+
AEKey finalKey = ((AdvExecutingCraftingJobAccessor) this.job).getFinalOutput().what();
46+
long available = this.inventory.extract(finalKey, Long.MAX_VALUE, Actionable.SIMULATE);
47+
if (available <= 0) return;
48+
long accepted =
49+
((AdvExecutingCraftingJobAccessor) this.job)
50+
.getLink()
51+
.insert(finalKey, available, Actionable.MODULATE);
52+
if (accepted > 0) {
53+
this.inventory.extract(finalKey, accepted, Actionable.MODULATE);
54+
}
55+
}
56+
}
57+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.ref.aea.mixin.aae.crafting.color;
2+
3+
import appeng.api.stacks.GenericStack;
4+
import appeng.crafting.CraftingLink;
5+
import net.pedroksl.advanced_ae.common.logic.ExecutingCraftingJob;
6+
import org.spongepowered.asm.mixin.Mixin;
7+
import org.spongepowered.asm.mixin.gen.Accessor;
8+
9+
@Mixin(value = ExecutingCraftingJob.class, remap = false)
10+
public interface AdvExecutingCraftingJobAccessor {
11+
@Accessor("finalOutput")
12+
GenericStack getFinalOutput();
13+
14+
@Accessor("link")
15+
CraftingLink getLink();
16+
}

src/main/resources/aea.mixins.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@
77
"plugin": "com.ref.aea.mixin.AEAMixinConfigPlugin",
88
"mixins": [
99
"aae.AdvPatternProviderLogicMixin",
10+
"aae.crafting.blocked.AdvCraftingCPULogicMixin",
11+
"aae.crafting.color.AdvCraftingCPULogicMixin",
12+
"aae.crafting.color.AdvExecutingCraftingJobAccessor",
1013
"ae.crafting.blocked.CraftingCpuLogicMixin",
1114
"ae.crafting.blocked.CraftingStatusEntryMixin",
1215
"ae.crafting.blocked.CraftingStatusMixin",

0 commit comments

Comments
 (0)