Skip to content

Commit 1730f92

Browse files
committed
只允许玩家在缺失材料的情况下开始合成
1 parent c455a42 commit 1730f92

File tree

6 files changed

+61
-8
lines changed

6 files changed

+61
-8
lines changed

src/main/java/com/circulation/random_complement/common/interfaces/RCCraftingJob.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,6 @@ public interface RCCraftingJob {
99
boolean isSpecialDeficiency();
1010

1111
void setSpecialDeficiency(boolean b);
12+
13+
boolean isPlayer();
1214
}

src/main/java/com/circulation/random_complement/mixin/ae2/miss_craft/MixinContainerCraftConfirm.java

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,43 @@
33
import appeng.api.networking.crafting.ICraftingJob;
44
import appeng.container.implementations.ContainerCraftConfirm;
55
import com.circulation.random_complement.common.interfaces.RCAEBaseContainer;
6+
import com.circulation.random_complement.common.interfaces.RCCraftingJob;
7+
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
8+
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
69
import org.spongepowered.asm.mixin.Mixin;
10+
import org.spongepowered.asm.mixin.Unique;
711
import org.spongepowered.asm.mixin.injection.At;
8-
import org.spongepowered.asm.mixin.injection.Redirect;
12+
import org.spongepowered.asm.mixin.injection.Inject;
13+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
14+
15+
import java.util.concurrent.ExecutionException;
16+
import java.util.concurrent.Future;
917

1018
@Mixin(value = ContainerCraftConfirm.class, remap = false)
1119
public abstract class MixinContainerCraftConfirm implements RCAEBaseContainer {
1220

13-
@Redirect(method = "detectAndSendChanges", at = @At(value = "INVOKE", target = "Lappeng/api/networking/crafting/ICraftingJob;isSimulation()Z", ordinal = 1))
14-
public boolean isSimulation1(ICraftingJob instance) {
21+
@Unique
22+
private boolean r$isPlayer = false;
23+
24+
@WrapOperation(method = "detectAndSendChanges", at = @At(value = "INVOKE", target = "Lappeng/api/networking/crafting/ICraftingJob;isSimulation()Z", ordinal = 1))
25+
public boolean isSimulation1(ICraftingJob instance, Operation<Boolean> original) {
26+
if (!r$isPlayer) return original.call(instance);
1527
return true;
1628
}
1729

18-
@Redirect(method = "detectAndSendChanges", at = @At(value = "INVOKE", target = "Lappeng/api/networking/crafting/ICraftingJob;isSimulation()Z", ordinal = 2))
19-
public boolean isSimulation2(ICraftingJob instance) {
30+
@WrapOperation(method = "detectAndSendChanges", at = @At(value = "INVOKE", target = "Lappeng/api/networking/crafting/ICraftingJob;isSimulation()Z", ordinal = 2))
31+
public boolean isSimulation2(ICraftingJob instance, Operation<Boolean> original) {
32+
if (!r$isPlayer) return original.call(instance);
2033
return true;
2134
}
35+
36+
@Inject(method = "setJob",at = @At("HEAD"))
37+
public void setJob(Future<ICraftingJob> job, CallbackInfo ci) {
38+
try {
39+
if (job.get() instanceof RCCraftingJob j) {
40+
this.r$isPlayer = j.isPlayer();
41+
}
42+
} catch (InterruptedException | ExecutionException ignored) {
43+
}
44+
}
2245
}

src/main/java/com/circulation/random_complement/mixin/ae2/miss_craft/MixinCraftingCPUCluster.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,15 +53,17 @@ public boolean injectItems(Object instance, Object o, Operation<Boolean> origina
5353

5454
@Inject(method = "injectItems", at = @At("RETURN"))
5555
public void onStop(IAEItemStack input, Actionable type, IActionSource src, CallbackInfoReturnable<IAEItemStack> cir) {
56-
if (this.finalOutput != null && this.finalOutput.getStackSize() <= 0) {
56+
if (r$waitInput != null && this.finalOutput != null && this.finalOutput.getStackSize() <= 0) {
5757
this.completeJob();
5858
this.updateCPU();
5959
}
6060
}
6161

6262
@Inject(method = "submitJob", at = @At(value = "INVOKE", target = "Lappeng/crafting/CraftingTreeNode;setJob(Lappeng/crafting/MECraftingInventory;Lappeng/me/cluster/implementations/CraftingCPUCluster;Lappeng/api/networking/security/IActionSource;)V"))
6363
public void submitJob(IGrid g, ICraftingJob job, IActionSource src, ICraftingRequester requestingMachine, CallbackInfoReturnable<ICraftingLink> cir) {
64-
var s = ((RCCraftingJob) job).getWaitingItem();
64+
var j = (RCCraftingJob) job;
65+
if (!j.isPlayer()) return;
66+
var s = j.getWaitingItem();
6567
if (s != null && s.getStackSize() > 0) {
6668
r$waitInput = s.copy();
6769
s.reset();

src/main/java/com/circulation/random_complement/mixin/ae2/miss_craft/MixinCraftingJob.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.circulation.random_complement.mixin.ae2.miss_craft;
22

33
import appeng.api.networking.crafting.ICraftingGrid;
4+
import appeng.api.networking.security.IActionSource;
45
import appeng.api.storage.data.IAEItemStack;
56
import appeng.crafting.CraftingJob;
67
import appeng.crafting.CraftingTreeNode;
@@ -39,11 +40,15 @@ public abstract class MixinCraftingJob implements RCCraftingJob {
3940
@Final
4041
private World world;
4142

43+
@Shadow
44+
@Final
45+
private IActionSource actionSrc;
4246
@Unique
4347
private IAEItemStack r$wait;
4448

4549
@WrapOperation(method = "run", at = @At(value = "INVOKE", target = "Lappeng/crafting/MECraftingInventory;ignore(Lappeng/api/storage/data/IAEItemStack;)V", ordinal = 0))
4650
public void record(MECraftingInventory instance, IAEItemStack what, Operation<Void> original, @Share("rcOutput") LocalLongRef stackLocalRef) {
51+
if (!isPlayer()) return;
4752
var stack = instance.getItemList().findPrecise(what);
4853
if (stack != null) {
4954
var size = stack.getStackSize();
@@ -60,8 +65,14 @@ public IAEItemStack getWaitingItem() {
6065
return r$wait;
6166
}
6267

68+
@Intrinsic
69+
public boolean isPlayer() {
70+
return this.actionSrc.player().isPresent();
71+
}
72+
6373
@Inject(method = "run", at = @At(value = "INVOKE", target = "Lappeng/crafting/CraftingTreeNode;request(Lappeng/crafting/MECraftingInventory;JLappeng/api/networking/security/IActionSource;)Lappeng/api/storage/data/IAEItemStack;", shift = At.Shift.AFTER, ordinal = 0))
6474
public void supplementaryOutput(CallbackInfo ci, @Share("rcOutput") LocalLongRef stackLocalRef) {
75+
if (!isPlayer()) return;
6576
var tree = (AccessorCraftingTreeNode) this.tree;
6677
if (tree.isCanEmit()) return;
6778
final long out = stackLocalRef.get();
@@ -132,4 +143,5 @@ public boolean isSpecialDeficiency() {
132143
public void setSpecialDeficiency(boolean b) {
133144
r$specialDeficiency = b;
134145
}
146+
135147
}

src/main/java/com/circulation/random_complement/mixin/ae2/miss_craft/MixinCraftingTreeNode.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import net.minecraft.item.ItemStack;
1616
import org.objectweb.asm.Opcodes;
1717
import org.spongepowered.asm.mixin.Final;
18+
import org.spongepowered.asm.mixin.Intrinsic;
1819
import org.spongepowered.asm.mixin.Mixin;
1920
import org.spongepowered.asm.mixin.Shadow;
2021
import org.spongepowered.asm.mixin.injection.At;
@@ -54,6 +55,7 @@ public class MixinCraftingTreeNode {
5455

5556
@Inject(method = "request", at = @At(value = "INVOKE", target = "Lappeng/crafting/CraftingJob;isSimulation()Z", shift = At.Shift.BEFORE), cancellable = true)
5657
public void request(MECraftingInventory inv, long l, IActionSource src, CallbackInfoReturnable<IAEItemStack> cir) {
58+
if (!isPlayer()) return;
5759
if (canEmit) return;
5860
this.bytes = (int) ((long) this.bytes + l);
5961
if (this.parent != null && this.what.getItem().hasContainerItem(this.what.getDefinition())) {
@@ -71,6 +73,7 @@ public void request(MECraftingInventory inv, long l, IActionSource src, Callback
7173

7274
@WrapOperation(method = "setJob", at = @At(value = "FIELD", opcode = Opcodes.GETFIELD, target = "Lappeng/crafting/CraftingTreeNode;howManyEmitted:J"))
7375
public long setJobHowManyEmitted(CraftingTreeNode instance, Operation<Long> original) {
76+
if (!isPlayer()) return original.call(instance);
7477
if (canEmit) return original.call(instance);
7578
if (this.parent == null && ((RCCraftingJob) job).isSpecialDeficiency())
7679
return original.call(instance);
@@ -81,6 +84,7 @@ public long setJobHowManyEmitted(CraftingTreeNode instance, Operation<Long> orig
8184

8285
@WrapOperation(method = "getPlan", at = @At(value = "FIELD", opcode = Opcodes.GETFIELD, target = "Lappeng/crafting/CraftingTreeNode;missing:J"))
8386
public long getPlanMissing(CraftingTreeNode instance, Operation<Long> original) {
87+
if (!isPlayer()) return original.call(instance);
8488
if (canEmit) return original.call(instance);
8589
if (this.parent == null && ((RCCraftingJob) job).isSpecialDeficiency()) return howManyEmitted;
8690
if (this.what.equals(this.job.getOutput())) return original.call(instance);
@@ -89,6 +93,7 @@ public long getPlanMissing(CraftingTreeNode instance, Operation<Long> original)
8993

9094
@WrapOperation(method = "getPlan", at = @At(value = "FIELD", opcode = Opcodes.GETFIELD, target = "Lappeng/crafting/CraftingTreeNode;howManyEmitted:J"))
9195
public long getPlanHowManyEmitted(CraftingTreeNode instance, Operation<Long> original) {
96+
if (!isPlayer()) return original.call(instance);
9297
if (canEmit) return original.call(instance);
9398
if (this.parent == null && ((RCCraftingJob) job).isSpecialDeficiency())
9499
return original.call(instance);
@@ -99,6 +104,7 @@ public long getPlanHowManyEmitted(CraftingTreeNode instance, Operation<Long> ori
99104

100105
@Inject(method = "notRecursive", at = @At("RETURN"), cancellable = true)
101106
public void notRecursive(ICraftingPatternDetails details, CallbackInfoReturnable<Boolean> cir) {
107+
if (!isPlayer()) return;
102108
if (canEmit) return;
103109
if (cir.getReturnValueZ()) {
104110
for (var input : details.getCondensedInputs()) {
@@ -109,4 +115,9 @@ public void notRecursive(ICraftingPatternDetails details, CallbackInfoReturnable
109115
}
110116
}
111117
}
118+
119+
@Intrinsic
120+
private boolean isPlayer() {
121+
return ((RCCraftingJob) job).isPlayer();
122+
}
112123
}

src/main/java/com/circulation/random_complement/mixin/ae2/miss_craft/MixinGuiCraftConfirm.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,12 @@ public abstract class MixinGuiCraftConfirm {
2929
@Final
3030
private ContainerCraftConfirm ccc;
3131

32+
@Shadow
33+
protected abstract boolean isSimulation();
34+
3235
@Inject(method = "postUpdate", at = @At("TAIL"))
3336
public void postUpdate(List<IAEItemStack> list, byte ref, CallbackInfo ci) {
34-
if (ref == 2 && !this.missing.isEmpty() && !this.ccc.noCPU) {
37+
if (ref == 2 && !this.isSimulation() && !this.missing.isEmpty() && !this.ccc.noCPU) {
3538
this.start.x -= 20;
3639
this.start.width += 20;
3740
this.start.displayString = I18n.format("gui.rc.miss_craft.text");

0 commit comments

Comments
 (0)