Skip to content

Commit 95a3b22

Browse files
authored
Backport of the Pick Block and Stow features from 1.21.1 to 1.20.1 (#354)
1 parent 1ec0f5c commit 95a3b22

28 files changed

Lines changed: 592 additions & 140 deletions

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
- Mexican Spanish Translation (#331)
22
- Spanish Translation and updates to the Mexican Spanish Translation (#352)
3+
- Pick Block Support and Stow Hotkey for 1.20.1

src/main/java/de/mari_023/ae2wtlib/AE2wtlib.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,11 @@
55
import de.mari_023.ae2wtlib.curio.CurioHelper;
66
import de.mari_023.ae2wtlib.hotkeys.MagnetHotkeyAction;
77
import de.mari_023.ae2wtlib.hotkeys.RestockHotkeyAction;
8+
import de.mari_023.ae2wtlib.hotkeys.StowHotkeyAction;
89
import de.mari_023.ae2wtlib.networking.ServerNetworkManager;
910
import de.mari_023.ae2wtlib.networking.c2s.CycleTerminalPacket;
11+
import de.mari_023.ae2wtlib.networking.c2s.PickBlockPacket;
12+
import de.mari_023.ae2wtlib.networking.c2s.TerminalSettingsPacket;
1013
import de.mari_023.ae2wtlib.terminal.IUniversalWirelessTerminalItem;
1114
import de.mari_023.ae2wtlib.wat.ItemWAT;
1215
import de.mari_023.ae2wtlib.wat.WATMenu;
@@ -60,8 +63,11 @@ public static void onAe2Initialized() {
6063
Platform.registerRecipe(CombineSerializer.NAME, Combine.serializer = new CombineSerializer());
6164

6265
ServerNetworkManager.registerServerBoundPacket(CycleTerminalPacket.NAME, CycleTerminalPacket::new);
66+
ServerNetworkManager.registerServerBoundPacket(PickBlockPacket.NAME, PickBlockPacket::new);
67+
ServerNetworkManager.registerServerBoundPacket(TerminalSettingsPacket.NAME, TerminalSettingsPacket::new);
6368
HotkeyActions.register(new RestockHotkeyAction(), "ae2wtlib_restock");
6469
HotkeyActions.register(new MagnetHotkeyAction(), "ae2wtlib_magnet");
70+
HotkeyActions.register(new StowHotkeyAction(), "ae2wtlib_stow");
6571

6672
SearchInventoryEvent.EVENT.register(CurioHelper::addAllCurios);
6773
// we need something to call addon terminals here

src/main/java/de/mari_023/ae2wtlib/AE2wtlibEvents.java

Lines changed: 54 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,19 @@
22

33
import java.util.function.Consumer;
44

5+
import net.minecraft.network.protocol.game.ClientboundSetCarriedItemPacket;
56
import net.minecraft.server.level.ServerPlayer;
67
import net.minecraft.world.entity.player.Player;
78
import net.minecraft.world.item.ItemStack;
89

10+
import de.mari_023.ae2wtlib.networking.ClientNetworkManager;
911
import de.mari_023.ae2wtlib.networking.ServerNetworkManager;
12+
import de.mari_023.ae2wtlib.networking.c2s.PickBlockPacket;
1013
import de.mari_023.ae2wtlib.networking.s2c.UpdateRestockPacket;
1114
import de.mari_023.ae2wtlib.terminal.ItemWT;
1215
import de.mari_023.ae2wtlib.wct.CraftingTerminalHandler;
1316
import de.mari_023.ae2wtlib.wct.magnet_card.MagnetHandler;
1417
import de.mari_023.ae2wtlib.wct.magnet_card.MagnetHost;
15-
import de.mari_023.ae2wtlib.wct.magnet_card.MagnetMode;
1618

1719
import appeng.api.config.Actionable;
1820
import appeng.api.stacks.AEItemKey;
@@ -33,7 +35,7 @@ public static void restock(ServerPlayer player, ItemStack item, int count, Consu
3335
if (item.isEmpty())
3436
return;
3537
CraftingTerminalHandler cTHandler = CraftingTerminalHandler.getCraftingTerminalHandler(player);
36-
if (!cTHandler.inRange() || !ItemWT.getBoolean(cTHandler.getCraftingTerminal(), "restock")
38+
if (!cTHandler.inRange() || !ItemWT.getBoolean(cTHandler.getCraftingTerminal(), AE2wtlibTags.RESTOCK)
3739
|| cTHandler.getTargetGrid() == null || cTHandler.getTargetGrid().getStorageService() == null)
3840
return;
3941
int toAdd = Math.max(item.getMaxStackSize() / 2, 1) - count;
@@ -70,7 +72,7 @@ public static boolean insertStackInME(ItemStack stack, Player player) {
7072
CraftingTerminalHandler cTHandler = CraftingTerminalHandler.getCraftingTerminalHandler(player);
7173
ItemStack terminal = cTHandler.getCraftingTerminal();
7274

73-
if (!(MagnetHandler.getMagnetSettings(terminal).magnetMode == MagnetMode.PICKUP_ME))
75+
if (!(MagnetHandler.getMagnetMode(terminal).pickupToME()))
7476
return false;
7577
if (!cTHandler.inRange())
7678
return false;
@@ -93,4 +95,53 @@ public static boolean insertStackInME(ItemStack stack, Player player) {
9395
stack.setCount(leftover);
9496
return leftover == 0;
9597
}
98+
99+
public static void pickBlock(ItemStack stack) {
100+
ClientNetworkManager.sendToServer(new PickBlockPacket(stack));
101+
}
102+
103+
public static void pickBlock(ServerPlayer player, ItemStack stack) {
104+
var cTHandler = CraftingTerminalHandler.getCraftingTerminalHandler(player);
105+
ItemStack terminal = cTHandler.getCraftingTerminal();
106+
if (!ItemWT.getBoolean(terminal, AE2wtlibTags.PICK_BLOCK))
107+
return;
108+
109+
if (cTHandler.getTargetGrid() == null)
110+
return;
111+
if (cTHandler.getTargetGrid().getStorageService() == null)
112+
return;
113+
var networkInventory = cTHandler.getTargetGrid().getStorageService().getInventory();
114+
var playerSource = new PlayerSource(player, null);
115+
116+
var inventory = player.getInventory();
117+
int targetSlot = inventory.getSuitableHotbarSlot();
118+
var toReplace = inventory.getItem(targetSlot);
119+
120+
var insert = networkInventory.insert(AEItemKey.of(toReplace), toReplace.getCount(), Actionable.SIMULATE,
121+
playerSource);
122+
if (insert < toReplace.getCount())
123+
return;
124+
int targetAmount = Math.max(1, stack.getMaxStackSize() / 2);
125+
var extracted = networkInventory.extract(AEItemKey.of(stack), targetAmount, Actionable.SIMULATE, playerSource);
126+
if (extracted == 0)
127+
return;
128+
129+
insert = networkInventory.insert(AEItemKey.of(toReplace), toReplace.getCount(), Actionable.MODULATE,
130+
playerSource);
131+
if (insert < toReplace.getCount()) {
132+
toReplace.setCount(toReplace.getCount() - (int) insert);
133+
inventory.setItem(targetSlot, toReplace);
134+
return;
135+
}
136+
137+
extracted = networkInventory.extract(AEItemKey.of(stack), targetAmount, Actionable.MODULATE, playerSource);
138+
if (extracted == 0) {
139+
inventory.setItem(targetSlot, ItemStack.EMPTY);
140+
return;
141+
}
142+
stack.setCount((int) extracted);
143+
inventory.setItem(targetSlot, stack);
144+
inventory.selected = targetSlot;
145+
player.connection.send(new ClientboundSetCarriedItemPacket(player.getInventory().selected));
146+
}
96147
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package de.mari_023.ae2wtlib;
2+
3+
public class AE2wtlibTags {
4+
5+
public static final String MAGNET_MODE = "magnetMode";
6+
7+
public static final String PICK_BLOCK = "pick_block";
8+
public static final String RESTOCK = "restock";
9+
public static final String MAGNET_SETTINGS = "magnet_settings";
10+
}

src/main/java/de/mari_023/ae2wtlib/TextConstants.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ private TextConstants() {
3535
.append("\n").append(Component.translatable("gui.ae2wtlib.magnetcard.desc.inv"));
3636
public static final MutableComponent MAGNETCARD_ME = Component.translatable("gui.ae2wtlib.magnetcard").append("\n")
3737
.append(Component.translatable("gui.ae2wtlib.magnetcard.desc.me"));
38+
public static final MutableComponent PICKUP_ME_NO_MAGNET = Component.translatable("gui.ae2wtlib.magnetcard.hotkey",
39+
Component.translatable("gui.ae2wtlib.magnetcard.desc.me_no_magnet").setStyle(STYLE_GREEN));
3840

3941
public static final MutableComponent UNIVERSAL = Component
4042
.translatable("item.ae2wtlib.wireless_universal_terminal.desc").withStyle(STYLE_GRAY);
@@ -84,4 +86,9 @@ public static MutableComponent getInsertMode(IncludeExclude includeExclude) {
8486
public static final Component CREATIVE_TAB = Component.translatable("gui.ae2wtlib.creativetab");
8587

8688
public static final Component NETWORK_NOT_POWERED = Component.translatable("chat.ae2wtlib.NetworkNotPowered");
89+
90+
public static final Component PICK_BLOCK = Component.translatable("gui.ae2wtlib.pick_block.text");
91+
public static final Component RESTOCK = Component.translatable("gui.ae2wtlib.restock.text");
92+
public static final Component MAGNET = Component.translatable("gui.ae2wtlib.magnet.text");
93+
public static final Component PICKUP_TO_ME = Component.translatable("gui.ae2wtlib.pickup_to_me.text");
8794
}

src/main/java/de/mari_023/ae2wtlib/hotkeys/MagnetHotkeyAction.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
import de.mari_023.ae2wtlib.wct.CraftingTerminalHandler;
88
import de.mari_023.ae2wtlib.wct.magnet_card.MagnetHandler;
99
import de.mari_023.ae2wtlib.wct.magnet_card.MagnetMode;
10-
import de.mari_023.ae2wtlib.wct.magnet_card.MagnetSettings;
1110

1211
import appeng.api.features.HotkeyAction;
1312

@@ -18,8 +17,8 @@ public boolean run(Player player) {
1817
.getCraftingTerminal();
1918
if (terminal.isEmpty())
2019
return false;
21-
MagnetSettings settings = MagnetHandler.getMagnetSettings(terminal);
22-
settings.magnetMode = switch (settings.magnetMode) {
20+
MagnetMode settings = MagnetHandler.getMagnetMode(terminal);
21+
settings = switch (settings) {
2322
case OFF -> {
2423
player.displayClientMessage(TextConstants.HOTKEY_MAGNETCARD_INVENTORY, true);
2524
yield MagnetMode.PICKUP_INVENTORY;
@@ -29,12 +28,16 @@ public boolean run(Player player) {
2928
yield MagnetMode.PICKUP_ME;
3029
}
3130
case PICKUP_ME -> {
31+
player.displayClientMessage(TextConstants.PICKUP_ME_NO_MAGNET, true);
32+
yield MagnetMode.PICKUP_ME_NO_MAGNET;
33+
}
34+
case PICKUP_ME_NO_MAGNET -> {
3235
player.displayClientMessage(TextConstants.HOTKEY_MAGNETCARD_OFF, true);
3336
yield MagnetMode.OFF;
3437
}
35-
default -> settings.magnetMode;
38+
default -> settings;
3639
};
37-
MagnetHandler.saveMagnetSettings(terminal, settings);
40+
MagnetHandler.saveMagnetMode(terminal, settings);
3841
return true;
3942
}
4043
}

src/main/java/de/mari_023/ae2wtlib/hotkeys/RestockHotkeyAction.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import net.minecraft.world.entity.player.Player;
55
import net.minecraft.world.item.ItemStack;
66

7+
import de.mari_023.ae2wtlib.AE2wtlibTags;
78
import de.mari_023.ae2wtlib.TextConstants;
89
import de.mari_023.ae2wtlib.terminal.ItemWT;
910
import de.mari_023.ae2wtlib.wct.CraftingTerminalHandler;
@@ -20,12 +21,12 @@ public boolean run(Player player) {
2021
ItemStack terminal = craftingTerminalHandler.getCraftingTerminal();
2122
if (terminal.isEmpty())
2223
return false;
23-
ItemWT.setBoolean(terminal, !ItemWT.getBoolean(terminal, "restock"), "restock");
24+
ItemWT.setBoolean(terminal, !ItemWT.getBoolean(terminal, AE2wtlibTags.RESTOCK), AE2wtlibTags.RESTOCK);
2425
MenuLocator locator = craftingTerminalHandler.getLocator();
2526
if (locator != null)
2627
WUTHandler.updateClientTerminal((ServerPlayer) player, locator, terminal.getTag());
2728

28-
if (ItemWT.getBoolean(terminal, "restock"))
29+
if (ItemWT.getBoolean(terminal, AE2wtlibTags.RESTOCK))
2930
player.displayClientMessage(TextConstants.RESTOCK_ON, true);
3031
else
3132
player.displayClientMessage(TextConstants.RESTOCK_OFF, true);
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package de.mari_023.ae2wtlib.hotkeys;
2+
3+
import net.minecraft.world.InteractionHand;
4+
import net.minecraft.world.entity.player.Player;
5+
6+
import de.mari_023.ae2wtlib.wct.CraftingTerminalHandler;
7+
8+
import appeng.api.config.Actionable;
9+
import appeng.api.features.HotkeyAction;
10+
import appeng.api.stacks.AEItemKey;
11+
import appeng.me.helpers.PlayerSource;
12+
13+
public class StowHotkeyAction implements HotkeyAction {
14+
@Override
15+
public boolean run(Player player) {
16+
var handler = CraftingTerminalHandler.getCraftingTerminalHandler(player);
17+
if (!handler.inRange())
18+
return false;
19+
var stack = player.getItemInHand(InteractionHand.MAIN_HAND);
20+
if (stack.isEmpty())
21+
return false;
22+
if (handler.getTargetGrid() == null)
23+
return false;
24+
if (stack.isNotReplaceableByPickAction(player, player.getInventory().selected))
25+
return false;
26+
27+
stack.setCount(stack.getCount() - (int) handler.getTargetGrid().getStorageService().getInventory()
28+
.insert(AEItemKey.of(stack), stack.getCount(), Actionable.MODULATE, new PlayerSource(player)));
29+
return true;
30+
}
31+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package de.mari_023.ae2wtlib.mixin;
2+
3+
import org.spongepowered.asm.mixin.Mixin;
4+
import org.spongepowered.asm.mixin.Shadow;
5+
import org.spongepowered.asm.mixin.injection.At;
6+
import org.spongepowered.asm.mixin.injection.Inject;
7+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
8+
import org.spongepowered.asm.mixin.injection.callback.LocalCapture;
9+
10+
import net.minecraft.client.Minecraft;
11+
import net.minecraft.client.player.LocalPlayer;
12+
import net.minecraft.world.entity.player.Inventory;
13+
import net.minecraft.world.item.ItemStack;
14+
import net.minecraft.world.level.block.entity.BlockEntity;
15+
import net.minecraft.world.phys.HitResult;
16+
17+
import de.mari_023.ae2wtlib.AE2wtlibEvents;
18+
19+
@Mixin(Minecraft.class)
20+
public abstract class MinecraftMixin {
21+
@Shadow
22+
public LocalPlayer player;
23+
24+
@Inject(method = "pickBlock", at = {
25+
@At(value = "INVOKE_ASSIGN", target = "Lnet/minecraft/world/entity/player/Inventory;findSlotMatchingItem(Lnet/minecraft/world/item/ItemStack;)I") }, locals = LocalCapture.CAPTURE_FAILHARD)
26+
public void pickBlock(CallbackInfo ci,
27+
boolean flag,
28+
BlockEntity blockentity,
29+
HitResult.Type hitresult$type,
30+
ItemStack itemstack,
31+
Inventory inventory,
32+
int i) {
33+
if (player.getAbilities().instabuild)
34+
return;
35+
if (player.isSpectator())
36+
return;
37+
if (i != -1)
38+
return;
39+
AE2wtlibEvents.pickBlock(itemstack);
40+
}
41+
}

src/main/java/de/mari_023/ae2wtlib/mixin/RestockRender.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import net.minecraftforge.api.distmarker.Dist;
1313
import net.minecraftforge.api.distmarker.OnlyIn;
1414

15+
import de.mari_023.ae2wtlib.AE2wtlibTags;
1516
import de.mari_023.ae2wtlib.terminal.ItemWT;
1617
import de.mari_023.ae2wtlib.wct.CraftingTerminalHandler;
1718

@@ -27,7 +28,7 @@ public void renderGuiItemOverlay(Font font, ItemStack stack, int x, int y, Callb
2728
CraftingTerminalHandler handler = CraftingTerminalHandler
2829
.getCraftingTerminalHandler(Minecraft.getInstance().player);
2930
if (stack.getCount() == 1 || !handler.isRestockable(stack)
30-
|| !ItemWT.getBoolean(handler.getCraftingTerminal(), "restock") || !handler.inRange())
31+
|| !ItemWT.getBoolean(handler.getCraftingTerminal(), AE2wtlibTags.RESTOCK) || !handler.inRange())
3132
return;
3233
((GuiGraphics) (Object) this).renderItemDecorations(font, stack, x, y,
3334
ReadableNumberConverter.format(handler.getAccessibleAmount(stack), 3));

0 commit comments

Comments
 (0)