Skip to content

Commit 5de215b

Browse files
committed
不允许强制合成通过shift点击开始直接启动合成计划
1 parent ff475dd commit 5de215b

File tree

6 files changed

+53
-98
lines changed

6 files changed

+53
-98
lines changed

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,8 @@ public interface RCCraftingJob {
1111
void setSpecialDeficiency(boolean b);
1212

1313
boolean canIgnoredInput();
14+
15+
boolean isMiss();
16+
17+
void setMiss(boolean miss);
1418
}
Lines changed: 11 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,25 @@
11
package com.circulation.random_complement.mixin.ae2;
22

3-
import appeng.api.util.AEPartLocation;
4-
import appeng.container.ContainerOpenContext;
53
import appeng.container.implementations.ContainerCraftAmount;
64
import appeng.container.implementations.ContainerCraftConfirm;
7-
import appeng.core.sync.AppEngPacket;
85
import appeng.core.sync.GuiBridge;
9-
import appeng.core.sync.network.INetworkInfo;
106
import appeng.core.sync.packets.PacketCraftRequest;
11-
import appeng.util.Platform;
127
import baubles.api.BaublesApi;
13-
import com.circulation.random_complement.RandomComplement;
148
import com.circulation.random_complement.common.interfaces.RCAEBaseContainer;
15-
import com.circulation.random_complement.common.network.ContainerRollBACK;
16-
import com.circulation.random_complement.common.util.MEHandler;
9+
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
10+
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
1711
import com.llamalad7.mixinextras.sugar.Local;
1812
import net.minecraft.entity.player.EntityPlayer;
1913
import net.minecraft.entity.player.EntityPlayerMP;
2014
import net.minecraft.inventory.Container;
21-
import net.minecraft.inventory.ContainerPlayer;
2215
import net.minecraft.item.ItemStack;
2316
import net.minecraftforge.fml.common.Optional;
2417
import org.spongepowered.asm.mixin.Final;
2518
import org.spongepowered.asm.mixin.Mixin;
2619
import org.spongepowered.asm.mixin.Shadow;
2720
import org.spongepowered.asm.mixin.Unique;
2821
import org.spongepowered.asm.mixin.injection.At;
29-
import org.spongepowered.asm.mixin.injection.Inject;
3022
import org.spongepowered.asm.mixin.injection.Redirect;
31-
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
3223

3324
import javax.annotation.Nonnull;
3425

@@ -45,46 +36,18 @@ public class MixinPacketCraftRequest {
4536
return BaublesApi.getBaublesHandler(player).getStackInSlot(slot);
4637
}
4738

48-
@Redirect(method = "serverPacketData", at = @At(value = "INVOKE", target = "Lappeng/util/Platform;openGUI(Lnet/minecraft/entity/player/EntityPlayer;ILappeng/core/sync/GuiBridge;Z)V"))
49-
public void serverPacketData(@Nonnull EntityPlayer p, int slot, @Nonnull GuiBridge type, boolean isBauble) {
50-
if (heldShift) {
51-
if (p instanceof EntityPlayerMP entityPlayerMP) {
52-
Container old = null;
53-
if (p.openContainer instanceof RCAEBaseContainer c) {
54-
old = c.rc$getOldContainer();
55-
}
56-
57-
entityPlayerMP.getNextWindowId();
58-
entityPlayerMP.closeContainer();
59-
int windowId = entityPlayerMP.currentWindowId;
60-
var newContainer = new ContainerCraftConfirm(p.inventory,
61-
MEHandler.getTerminalGuiObject(
62-
isBauble ? r$readBaubles(p, slot) : p.inventory.getStackInSlot(slot),
63-
p, slot, isBauble ? 1 : 0
64-
));
65-
var context = new ContainerOpenContext(null);
66-
context.setSide(AEPartLocation.INTERNAL);
67-
newContainer.setOpenContext(context);
68-
69-
entityPlayerMP.openContainer = newContainer;
70-
entityPlayerMP.openContainer.windowId = windowId;
71-
72-
if (newContainer instanceof RCAEBaseContainer c && old != null) {
73-
c.rc$setOldContainer(old);
74-
}
39+
@WrapOperation(method = "serverPacketData", at = @At(value = "INVOKE", target = "Lappeng/util/Platform;openGUI(Lnet/minecraft/entity/player/EntityPlayer;ILappeng/core/sync/GuiBridge;Z)V"))
40+
public void serverPacketData(@Nonnull EntityPlayer p, int slot, @Nonnull GuiBridge type, boolean isBauble, Operation<Void> original) {
41+
if (p instanceof EntityPlayerMP entityPlayerMP) {
42+
Container old = null;
43+
if (p.openContainer instanceof RCAEBaseContainer c) {
44+
old = c.rc$getOldContainer();
7545
}
76-
} else {
77-
if (p instanceof EntityPlayerMP entityPlayerMP) {
78-
Container old = null;
79-
if (p.openContainer instanceof RCAEBaseContainer c) {
80-
old = c.rc$getOldContainer();
81-
}
8246

83-
Platform.openGUI(p, slot, type, isBauble);
47+
original.call(p, slot, type, isBauble);
8448

85-
if (p.openContainer instanceof RCAEBaseContainer c && old != null) {
86-
c.rc$setOldContainer(old);
87-
}
49+
if (p.openContainer instanceof RCAEBaseContainer c && old != null) {
50+
c.rc$setOldContainer(old);
8851
}
8952
}
9053
}
@@ -93,26 +56,4 @@ public void serverPacketData(@Nonnull EntityPlayer p, int slot, @Nonnull GuiBrid
9356
public void detectAndSendChanges(ContainerCraftAmount instance, @Local(name = "ccc") ContainerCraftConfirm ccc) {
9457
ccc.detectAndSendChanges();
9558
}
96-
97-
@Inject(method = "serverPacketData", at = @At("TAIL"))
98-
public void ContainerRollBACK(INetworkInfo manager, AppEngPacket packet, EntityPlayer player, CallbackInfo ci) {
99-
if (!heldShift) return;
100-
if (player.openContainer instanceof RCAEBaseContainer rac) {
101-
if (player instanceof EntityPlayerMP entityPlayerMP) {
102-
var oldContainer = rac.rc$getOldContainer();
103-
if (oldContainer != null) {
104-
if (oldContainer instanceof ContainerPlayer) {
105-
entityPlayerMP.closeContainer();
106-
} else {
107-
entityPlayerMP.getNextWindowId();
108-
entityPlayerMP.closeContainer();
109-
int windowId = entityPlayerMP.currentWindowId;
110-
entityPlayerMP.openContainer = oldContainer;
111-
entityPlayerMP.openContainer.windowId = windowId;
112-
}
113-
}
114-
RandomComplement.NET_CHANNEL.sendTo(new ContainerRollBACK(), entityPlayerMP);
115-
}
116-
}
117-
}
11859
}
Lines changed: 17 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,40 @@
11
package com.circulation.random_complement.mixin.ae2.container;
22

33
import appeng.container.implementations.ContainerCraftConfirm;
4+
import appeng.core.sync.GuiBridge;
45
import com.circulation.random_complement.RandomComplement;
56
import com.circulation.random_complement.common.interfaces.RCAEBaseContainer;
67
import com.circulation.random_complement.common.network.ContainerRollBACK;
8+
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
9+
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
10+
import net.minecraft.entity.player.EntityPlayer;
711
import net.minecraft.entity.player.EntityPlayerMP;
812
import net.minecraft.inventory.ContainerPlayer;
913
import org.spongepowered.asm.mixin.Mixin;
10-
import org.spongepowered.asm.mixin.Shadow;
1114
import org.spongepowered.asm.mixin.injection.At;
12-
import org.spongepowered.asm.mixin.injection.Inject;
13-
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
1415

15-
@Mixin(value = ContainerCraftConfirm.class, remap = false)
16+
@Mixin(value = ContainerCraftConfirm.class, remap = false, priority = 998)
1617
public abstract class MixinContainerCraftConfirm extends MixinAEBaseContainer implements RCAEBaseContainer {
1718

18-
@Shadow
19-
public abstract void setAutoStart(boolean autoStart);
20-
21-
@Inject(
22-
method = "startJob",
23-
at = @At(
24-
value = "INVOKE",
25-
target = "Lappeng/api/networking/crafting/ICraftingGrid;submitJob(Lappeng/api/networking/crafting/ICraftingJob;Lappeng/api/networking/crafting/ICraftingRequester;Lappeng/api/networking/crafting/ICraftingCPU;ZLappeng/api/networking/security/IActionSource;)Lappeng/api/networking/crafting/ICraftingLink;",
26-
shift = At.Shift.AFTER
27-
),
28-
cancellable = true)
29-
public void startJob0(CallbackInfo ci) {
19+
@WrapOperation(method = "startJob", at = @At(value = "INVOKE", target = "Lappeng/util/Platform;openGUI(Lnet/minecraft/entity/player/EntityPlayer;ILappeng/core/sync/GuiBridge;Z)V"))
20+
public void backGui(EntityPlayer extra, int obj, GuiBridge opener, boolean p, Operation<Void> original) {
3021
if (this.rc$getOldContainer() != null) {
31-
this.setAutoStart(false);
3222
if (this.getPlayerInv().player instanceof EntityPlayerMP entityPlayerMP) {
3323
var oldContainer = this.rc$getOldContainer();
34-
if (oldContainer != null) {
35-
if (oldContainer instanceof ContainerPlayer) {
36-
entityPlayerMP.closeContainer();
37-
} else {
38-
entityPlayerMP.getNextWindowId();
39-
entityPlayerMP.closeContainer();
40-
int windowId = entityPlayerMP.currentWindowId;
41-
entityPlayerMP.openContainer = oldContainer;
42-
entityPlayerMP.openContainer.windowId = windowId;
43-
}
24+
if (oldContainer instanceof ContainerPlayer) {
25+
entityPlayerMP.closeContainer();
26+
} else {
27+
entityPlayerMP.getNextWindowId();
28+
entityPlayerMP.closeContainer();
29+
int windowId = entityPlayerMP.currentWindowId;
30+
entityPlayerMP.openContainer = oldContainer;
31+
entityPlayerMP.openContainer.windowId = windowId;
4432
}
4533
RandomComplement.NET_CHANNEL.sendTo(new ContainerRollBACK(), entityPlayerMP);
34+
return;
4635
}
47-
ci.cancel();
4836
}
37+
original.call(extra, obj, opener, p);
4938
}
5039

5140
}

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
88
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
99
import org.spongepowered.asm.mixin.Mixin;
10+
import org.spongepowered.asm.mixin.Shadow;
1011
import org.spongepowered.asm.mixin.Unique;
1112
import org.spongepowered.asm.mixin.injection.At;
1213
import org.spongepowered.asm.mixin.injection.Inject;
@@ -18,6 +19,8 @@
1819
@Mixin(ContainerCraftConfirm.class)
1920
public abstract class MixinContainerCraftConfirm implements RCAEBaseContainer {
2021

22+
@Shadow(remap = false)
23+
public boolean autoStart;
2124
@Unique
2225
private boolean r$canIgnoredInput = false;
2326

@@ -39,6 +42,9 @@ public void setJob(Future<ICraftingJob> job, CallbackInfo ci) {
3942
try {
4043
if (job.get() instanceof RCCraftingJob j) {
4144
this.r$canIgnoredInput = j.canIgnoredInput();
45+
if (j.isMiss()) {
46+
this.autoStart = false;
47+
}
4248
}
4349
} catch (InterruptedException | ExecutionException ignored) {
4450
}

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,9 @@ public boolean canIgnoredInput() {
7171
else return this.actionSrc.player().isPresent();
7272
}
7373

74+
@Unique
75+
private boolean rc$miss = false;
76+
7477
@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))
7578
public void supplementaryOutput(CallbackInfo ci, @Share("rcOutput") LocalLongRef stackLocalRef) {
7679
if (!canIgnoredInput()) return;
@@ -131,10 +134,21 @@ public void supplementaryOutput(CallbackInfo ci, @Share("rcOutput") LocalLongRef
131134
tree.setHowManyEmitted(repeatInput.getStackSize());
132135
r$wait = repeatInput.setStackSize(repeatInput.getStackSize() * ++outputQuantity);
133136
setSpecialDeficiency(true);
137+
rc$miss = true;
134138
}
135139
}
136140
}
137141

142+
@Intrinsic
143+
public boolean isMiss() {
144+
return rc$miss;
145+
}
146+
147+
@Intrinsic
148+
public void setMiss(boolean miss) {
149+
this.rc$miss = miss;
150+
}
151+
138152
@Intrinsic
139153
public boolean isSpecialDeficiency() {
140154
return r$specialDeficiency;

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ public void request(MECraftingInventory inv, long l, IActionSource src, Callback
6565
}
6666
}
6767
this.howManyEmitted += l;
68+
((RCCraftingJob) job).setMiss(true);
6869
IAEItemStack rv = this.what.copy();
6970
rv.setStackSize(l);
7071
cir.setReturnValue(rv);

0 commit comments

Comments
 (0)