Skip to content

Commit b51a356

Browse files
committed
✨ Added suite of inventory packets - open, close, content etc.
1 parent 602b935 commit b51a356

5 files changed

Lines changed: 174 additions & 0 deletions

File tree

src/client/java/xyz/bitsquidd/ninja/format/FormatHelper.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package xyz.bitsquidd.ninja.format;
22

33
import net.minecraft.core.BlockPos;
4+
import net.minecraft.world.item.ItemStack;
45
import org.jspecify.annotations.NullMarked;
6+
import org.jspecify.annotations.Nullable;
57

68
import java.util.Collection;
79
import java.util.List;
@@ -48,4 +50,14 @@ public static String formatList(Collection<?> entries, int maxEntries) {
4850

4951
return sb.toString();
5052
}
53+
54+
public static String formatItemStack(@Nullable ItemStack itemStack) {
55+
if (itemStack == null || itemStack.isEmpty()) {
56+
return "Empty";
57+
}
58+
String itemName = itemStack.getItem().toString();
59+
int count = itemStack.getCount();
60+
return String.format("%s x%d", itemName, count);
61+
}
62+
5163
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package xyz.bitsquidd.ninja.handler.impl.clientbound;
2+
3+
import net.kyori.adventure.text.Component;
4+
import net.minecraft.network.protocol.game.ClientboundContainerClosePacket;
5+
import org.jetbrains.annotations.NotNull;
6+
7+
import xyz.bitsquidd.ninja.format.PacketInfoBundle;
8+
import xyz.bitsquidd.ninja.format.PacketInfoSegment;
9+
import xyz.bitsquidd.ninja.handler.PacketHandler;
10+
import xyz.bitsquidd.ninja.handler.PacketType;
11+
12+
import java.util.List;
13+
14+
public class ContainerCloseHandler extends PacketHandler<@NotNull ClientboundContainerClosePacket> {
15+
16+
public ContainerCloseHandler() {
17+
super(
18+
ClientboundContainerClosePacket.class,
19+
"ContainerClose",
20+
"Handles closing a container.",
21+
PacketType.CLIENTBOUND
22+
);
23+
}
24+
25+
@Override
26+
protected @NotNull PacketInfoBundle getPacketInfoInternal(ClientboundContainerClosePacket packet) {
27+
return PacketInfoBundle.of(
28+
packetType,
29+
Component.text(friendlyName),
30+
List.of(
31+
PacketInfoSegment.of(Component.text("ContainerID"), Component.text(packet.getContainerId()))
32+
)
33+
);
34+
}
35+
36+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package xyz.bitsquidd.ninja.handler.impl.clientbound;
2+
3+
import net.kyori.adventure.text.Component;
4+
import net.minecraft.network.protocol.game.ClientboundContainerSetContentPacket;
5+
import org.jetbrains.annotations.NotNull;
6+
7+
import xyz.bitsquidd.ninja.format.FormatHelper;
8+
import xyz.bitsquidd.ninja.format.PacketInfoBundle;
9+
import xyz.bitsquidd.ninja.format.PacketInfoSegment;
10+
import xyz.bitsquidd.ninja.handler.PacketHandler;
11+
import xyz.bitsquidd.ninja.handler.PacketType;
12+
13+
import java.util.List;
14+
15+
public class ContainerSetContentHandler extends PacketHandler<@NotNull ClientboundContainerSetContentPacket> {
16+
17+
public ContainerSetContentHandler() {
18+
super(
19+
ClientboundContainerSetContentPacket.class,
20+
"ContainerSetContent",
21+
"Handles setting the contents of a container.",
22+
PacketType.CLIENTBOUND
23+
);
24+
}
25+
26+
@Override
27+
protected @NotNull PacketInfoBundle getPacketInfoInternal(ClientboundContainerSetContentPacket packet) {
28+
List<String> itemsString = packet.items().stream()
29+
.map(FormatHelper::formatItemStack)
30+
.toList();
31+
32+
return PacketInfoBundle.of(
33+
packetType,
34+
Component.text(friendlyName),
35+
List.of(
36+
PacketInfoSegment.of(Component.text("ContainerID"), Component.text(packet.containerId())),
37+
PacketInfoSegment.of(Component.text("StateID"), Component.text(packet.stateId())),
38+
PacketInfoSegment.of(Component.text("Items"), Component.text(itemsString.toString())),
39+
PacketInfoSegment.of(Component.text("CarriedItem"), Component.text(FormatHelper.formatItemStack(packet.carriedItem())))
40+
)
41+
);
42+
}
43+
44+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package xyz.bitsquidd.ninja.handler.impl.clientbound;
2+
3+
import net.kyori.adventure.text.Component;
4+
import net.minecraft.network.protocol.game.ClientboundContainerSetSlotPacket;
5+
import org.jetbrains.annotations.NotNull;
6+
7+
import xyz.bitsquidd.ninja.format.FormatHelper;
8+
import xyz.bitsquidd.ninja.format.PacketInfoBundle;
9+
import xyz.bitsquidd.ninja.format.PacketInfoSegment;
10+
import xyz.bitsquidd.ninja.handler.PacketHandler;
11+
import xyz.bitsquidd.ninja.handler.PacketType;
12+
13+
import java.util.List;
14+
15+
public class ContainerSetSlotHandler extends PacketHandler<@NotNull ClientboundContainerSetSlotPacket> {
16+
17+
public ContainerSetSlotHandler() {
18+
super(
19+
ClientboundContainerSetSlotPacket.class,
20+
"ContainerSetSlot",
21+
"Handles setting a slot in a container.",
22+
PacketType.CLIENTBOUND
23+
);
24+
}
25+
26+
@Override
27+
protected @NotNull PacketInfoBundle getPacketInfoInternal(ClientboundContainerSetSlotPacket packet) {
28+
return PacketInfoBundle.of(
29+
packetType,
30+
Component.text(friendlyName),
31+
List.of(
32+
PacketInfoSegment.of(Component.text("ContainerID"), Component.text(packet.getContainerId())),
33+
PacketInfoSegment.of(Component.text("StateID"), Component.text(packet.getStateId())),
34+
PacketInfoSegment.of(Component.text("Slot"), Component.text(packet.getSlot())),
35+
PacketInfoSegment.of(Component.text("Item"), Component.text(FormatHelper.formatItemStack(packet.getItem())))
36+
)
37+
);
38+
}
39+
40+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package xyz.bitsquidd.ninja.handler.impl.clientbound;
2+
3+
import net.kyori.adventure.text.Component;
4+
import net.minecraft.network.protocol.game.ClientboundOpenScreenPacket;
5+
import net.minecraft.world.inventory.MenuType;
6+
import org.jetbrains.annotations.NotNull;
7+
8+
import xyz.bitsquidd.ninja.format.PacketInfoBundle;
9+
import xyz.bitsquidd.ninja.format.PacketInfoSegment;
10+
import xyz.bitsquidd.ninja.handler.PacketHandler;
11+
import xyz.bitsquidd.ninja.handler.PacketType;
12+
13+
import java.util.List;
14+
15+
public class OpenScreenHandler extends PacketHandler<@NotNull ClientboundOpenScreenPacket> {
16+
17+
public OpenScreenHandler() {
18+
super(
19+
ClientboundOpenScreenPacket.class,
20+
"OpenScreen",
21+
"Handles opening of container screens.",
22+
PacketType.CLIENTBOUND
23+
);
24+
}
25+
26+
@Override
27+
protected @NotNull PacketInfoBundle getPacketInfoInternal(ClientboundOpenScreenPacket packet) {
28+
MenuType<?> type = packet.getType();
29+
String typeDesc = type.toString();
30+
String titleDesc = packet.getTitle().toString();
31+
return PacketInfoBundle.of(
32+
packetType,
33+
Component.text(friendlyName),
34+
List.of(
35+
PacketInfoSegment.of(Component.text("ContainerID"), Component.text(packet.getContainerId())),
36+
PacketInfoSegment.of(Component.text("MenuType"), Component.text(typeDesc)),
37+
PacketInfoSegment.of(Component.text("Title"), Component.text(titleDesc))
38+
)
39+
);
40+
}
41+
42+
}

0 commit comments

Comments
 (0)