Skip to content

Commit c89cd47

Browse files
committed
Rework the last of the destructive "cancellable" Mixins
1 parent 9b22ae0 commit c89cd47

File tree

7 files changed

+87
-140
lines changed

7 files changed

+87
-140
lines changed

src/main/java/gripe/_90/appliede/me/reporting/MEInventoryUpdatePacketBuilder.java

-79
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package gripe._90.appliede.me.reporting;
2+
3+
import java.util.Set;
4+
5+
import appeng.api.stacks.AEItemKey;
6+
7+
public interface TransmutablePacketBuilder {
8+
void appliede$addTransmutables(Set<AEItemKey> transmutables);
9+
}
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
11
package gripe._90.appliede.mixin.crafting;
22

3-
import java.util.ArrayList;
4-
3+
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
4+
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
55
import com.llamalad7.mixinextras.sugar.Local;
66

7-
import org.spongepowered.asm.mixin.Final;
87
import org.spongepowered.asm.mixin.Mixin;
9-
import org.spongepowered.asm.mixin.Shadow;
108
import org.spongepowered.asm.mixin.Unique;
119
import org.spongepowered.asm.mixin.injection.At;
1210
import org.spongepowered.asm.mixin.injection.Inject;
@@ -27,13 +25,6 @@
2725

2826
@Mixin(CraftingTreeNode.class)
2927
public abstract class CraftingTreeNodeMixin {
30-
@Shadow
31-
private ArrayList<CraftingTreeProcess> nodes;
32-
33-
@Shadow
34-
@Final
35-
private CraftingCalculation job;
36-
3728
@Unique
3829
private long appliede$requestedAmount;
3930

@@ -44,26 +35,27 @@ private void trackRequested(
4435
}
4536

4637
// spotless:off
47-
@Inject(
38+
@WrapOperation(
4839
method = "buildChildPatterns",
4940
at = @At(
50-
value = "INVOKE",
51-
target = "Ljava/util/ArrayList;add(Ljava/lang/Object;)Z"),
52-
cancellable = true)
41+
value = "NEW",
42+
target = "(Lappeng/api/networking/crafting/ICraftingService;Lappeng/crafting/CraftingCalculation;Lappeng/api/crafting/IPatternDetails;Lappeng/crafting/CraftingTreeNode;)Lappeng/crafting/CraftingTreeProcess;"))
5343
// spotless:on
54-
private void recalculatePattern(
55-
CallbackInfo ci,
56-
@Local IPatternDetails details,
57-
@Local IGridNode gridNode,
58-
@Local ICraftingService craftingService) {
44+
private CraftingTreeProcess recalculatePattern(
45+
ICraftingService craftingService,
46+
CraftingCalculation job,
47+
IPatternDetails details,
48+
CraftingTreeNode node,
49+
Operation<CraftingTreeProcess> original,
50+
@Local IGridNode gridNode) {
5951
if (details instanceof TransmutationPattern) {
6052
if (details.getOutputs().getFirst().what() instanceof AEItemKey item) {
61-
ci.cancel();
6253
details = new TransmutationPattern(item, appliede$requestedAmount);
63-
nodes.add(new CraftingTreeProcess(craftingService, job, details, (CraftingTreeNode) (Object) this));
6454
}
6555

6656
gridNode.getGrid().getService(KnowledgeService.class).addTemporaryPattern(details);
6757
}
58+
59+
return original.call(craftingService, job, details, node);
6860
}
6961
}

src/main/java/gripe/_90/appliede/mixin/tooltip/MEInventoryUpdatePacketMixin.java

+34
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,27 @@
11
package gripe._90.appliede.mixin.tooltip;
22

3+
import java.util.HashSet;
4+
import java.util.Set;
5+
6+
import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
37
import com.llamalad7.mixinextras.injector.ModifyReturnValue;
48
import com.llamalad7.mixinextras.sugar.Local;
59

610
import org.spongepowered.asm.mixin.Mixin;
11+
import org.spongepowered.asm.mixin.Unique;
712
import org.spongepowered.asm.mixin.injection.At;
813
import org.spongepowered.asm.mixin.injection.Inject;
914
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
1015

1116
import net.minecraft.network.RegistryFriendlyByteBuf;
1217

18+
import appeng.api.stacks.AEItemKey;
19+
import appeng.api.stacks.AEKey;
1320
import appeng.core.network.clientbound.MEInventoryUpdatePacket;
1421
import appeng.menu.me.common.GridInventoryEntry;
1522

1623
import gripe._90.appliede.me.reporting.GridInventoryEMCEntry;
24+
import gripe._90.appliede.me.reporting.TransmutablePacketBuilder;
1725

1826
@Mixin(value = MEInventoryUpdatePacket.class, priority = 500)
1927
public abstract class MEInventoryUpdatePacketMixin {
@@ -28,4 +36,30 @@ private static GridInventoryEntry readTransmutable(
2836
private static void writeTransmutable(RegistryFriendlyByteBuf buffer, GridInventoryEntry entry, CallbackInfo ci) {
2937
buffer.writeBoolean(((GridInventoryEMCEntry) entry).appliede$isTransmutable());
3038
}
39+
40+
@SuppressWarnings("unused")
41+
@Mixin(MEInventoryUpdatePacket.Builder.class)
42+
private abstract static class BuilderMixin implements TransmutablePacketBuilder {
43+
@Unique
44+
private Set<AEItemKey> appliede$transmutables = new HashSet<>();
45+
46+
@Override
47+
public void appliede$addTransmutables(Set<AEItemKey> transmutables) {
48+
appliede$transmutables = transmutables;
49+
}
50+
51+
// spotless:off
52+
@ModifyExpressionValue(
53+
method = "addChanges",
54+
at = @At(
55+
value = "NEW",
56+
target = "(JLappeng/api/stacks/AEKey;JJZ)Lappeng/menu/me/common/GridInventoryEntry;",
57+
ordinal = 1))
58+
// spotless:on
59+
private GridInventoryEntry includeTransmutables(GridInventoryEntry original, @Local(ordinal = 0) AEKey key) {
60+
((GridInventoryEMCEntry) original)
61+
.appliede$setTransmutable(key instanceof AEItemKey item && appliede$transmutables.contains(item));
62+
return original;
63+
}
64+
}
3165
}

src/main/java/gripe/_90/appliede/mixin/tooltip/MEStorageMenuMixin.java

+28-38
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
import com.google.common.collect.ImmutableSet;
88
import com.google.common.collect.Sets;
9-
import com.llamalad7.mixinextras.sugar.Local;
9+
import com.llamalad7.mixinextras.injector.ModifyReceiver;
1010

1111
import org.jetbrains.annotations.Nullable;
1212
import org.spongepowered.asm.mixin.Final;
@@ -22,28 +22,25 @@
2222

2323
import appeng.api.networking.IGridNode;
2424
import appeng.api.stacks.AEItemKey;
25-
import appeng.api.stacks.AEKey;
26-
import appeng.api.stacks.KeyCounter;
25+
import appeng.api.storage.AEKeyFilter;
2726
import appeng.api.storage.ITerminalHost;
27+
import appeng.core.network.clientbound.MEInventoryUpdatePacket;
2828
import appeng.menu.AEBaseMenu;
2929
import appeng.menu.me.common.IncrementalUpdateHelper;
3030
import appeng.menu.me.common.MEStorageMenu;
3131

32-
import gripe._90.appliede.me.reporting.MEInventoryUpdatePacketBuilder;
32+
import gripe._90.appliede.me.reporting.TransmutablePacketBuilder;
3333
import gripe._90.appliede.me.service.KnowledgeService;
3434

3535
@Mixin(MEStorageMenu.class)
3636
public abstract class MEStorageMenuMixin extends AEBaseMenu {
37-
@Shadow
38-
private Set<AEKey> previousCraftables;
39-
40-
@Shadow
41-
private KeyCounter previousAvailableStacks;
42-
4337
@Shadow
4438
@Final
4539
private IncrementalUpdateHelper updateHelper;
4640

41+
@Unique
42+
private Set<AEItemKey> appliede$transmutables = new HashSet<>();
43+
4744
@Unique
4845
private Set<AEItemKey> appliede$previousTransmutables = new HashSet<>();
4946

@@ -54,9 +51,6 @@ public MEStorageMenuMixin(MenuType<?> menuType, int id, Inventory playerInventor
5451
@Shadow
5552
protected abstract boolean showsCraftables();
5653

57-
@Shadow
58-
public abstract boolean isKeyVisible(AEKey key);
59-
6054
@Shadow
6155
public abstract @Nullable IGridNode getGridNode();
6256

@@ -71,36 +65,32 @@ public MEStorageMenuMixin(MenuType<?> menuType, int id, Inventory playerInventor
7165
: Collections.emptySet();
7266
}
7367

74-
// spotless:off
75-
@SuppressWarnings("Convert2MethodRef")
7668
@Inject(
69+
method = "broadcastChanges",
70+
at = @At(value = "INVOKE", target = "Lappeng/menu/me/common/IncrementalUpdateHelper;hasChanges()Z"))
71+
private void addTransmutables(CallbackInfo ci) {
72+
appliede$transmutables = appliede$getTransmutablesFromGrid();
73+
Sets.difference(appliede$previousTransmutables, appliede$transmutables).forEach(updateHelper::addChange);
74+
Sets.difference(appliede$transmutables, appliede$previousTransmutables).forEach(updateHelper::addChange);
75+
}
76+
77+
// spotless:off
78+
@ModifyReceiver(
7779
method = "broadcastChanges",
7880
at = @At(
7981
value = "INVOKE",
80-
target = "Lappeng/menu/me/common/IncrementalUpdateHelper;hasChanges()Z"),
81-
cancellable = true)
82+
target = "Lappeng/core/network/clientbound/MEInventoryUpdatePacket$Builder;setFilter(Lappeng/api/storage/AEKeyFilter;)V"))
8283
// spotless:on
83-
private void replacePacket(
84-
CallbackInfo ci, @Local Set<AEKey> craftable, @Local(name = "availableStacks") KeyCounter availableStacks) {
85-
ci.cancel();
86-
87-
var transmutable = appliede$getTransmutablesFromGrid();
88-
Sets.difference(appliede$previousTransmutables, transmutable).forEach(updateHelper::addChange);
89-
Sets.difference(transmutable, appliede$previousTransmutables).forEach(updateHelper::addChange);
90-
91-
if (updateHelper.hasChanges()) {
92-
var builder = new MEInventoryUpdatePacketBuilder(
93-
containerId, updateHelper.isFullUpdate(), getPlayer().registryAccess());
94-
builder.setFilter(key -> isKeyVisible(key));
95-
builder.addChanges(updateHelper, availableStacks, craftable, new KeyCounter(), transmutable);
96-
builder.buildAndSend(packet -> sendPacketToClient(packet));
97-
updateHelper.commitChanges();
98-
}
99-
100-
previousCraftables = ImmutableSet.copyOf(craftable);
101-
previousAvailableStacks = availableStacks;
102-
appliede$previousTransmutables = ImmutableSet.copyOf(transmutable);
84+
private MEInventoryUpdatePacket.Builder addTransmutables(
85+
MEInventoryUpdatePacket.Builder builder, AEKeyFilter filter) {
86+
((TransmutablePacketBuilder) builder).appliede$addTransmutables(appliede$transmutables);
87+
return builder;
88+
}
10389

104-
super.broadcastChanges();
90+
@Inject(
91+
method = "broadcastChanges",
92+
at = @At(value = "INVOKE", target = "Lappeng/menu/AEBaseMenu;broadcastChanges()V"))
93+
private void addPreviousTransmutables(CallbackInfo ci) {
94+
appliede$previousTransmutables = ImmutableSet.copyOf(appliede$transmutables);
10595
}
10696
}

src/main/java/gripe/_90/appliede/mixin/tooltip/RepoMixin.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ private <K, V> V setTransmutable(
3535
K serial,
3636
V entry,
3737
Operation<V> original,
38-
@Local(name = "serverEntry") GridInventoryEntry serverEntry) {
38+
@Local(argsOnly = true) GridInventoryEntry serverEntry) {
3939
if (entry instanceof GridInventoryEMCEntry transmutable) {
4040
transmutable.appliede$setTransmutable(((GridInventoryEMCEntry) serverEntry).appliede$isTransmutable());
4141
}

src/main/resources/appliede.mixins.json

+1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
"misc.P2PTunnelAttunementAccessor",
1111
"tooltip.GridInventoryEntryMixin",
1212
"tooltip.MEInventoryUpdatePacketMixin",
13+
"tooltip.MEInventoryUpdatePacketMixin$BuilderMixin",
1314
"tooltip.MEStorageMenuMixin"
1415
],
1516
"client": [

0 commit comments

Comments
 (0)