Skip to content

Commit 9172157

Browse files
committed
PlayerInteractBlockC2SPacket item NBT implementation
1 parent c24f775 commit 9172157

3 files changed

Lines changed: 79 additions & 0 deletions

File tree

station-items-v0/src/main/java/net/modificationstation/stationapi/impl/network/packet/StationItemsNetworkingImpl.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import net.fabricmc.api.ModInitializer;
44
import net.modificationstation.stationapi.api.network.packet.IdentifiablePacket;
55
import net.modificationstation.stationapi.impl.network.packet.c2s.play.StationClickSlotC2SPacket;
6+
import net.modificationstation.stationapi.impl.network.packet.c2s.play.StationPlayerInteractBlockC2SPacket;
67
import net.modificationstation.stationapi.impl.network.packet.s2c.play.StationEntityEquipmentUpdateS2CPacket;
78
import net.modificationstation.stationapi.impl.network.packet.s2c.play.StationInventoryS2CPacket;
89
import net.modificationstation.stationapi.impl.network.packet.s2c.play.StationItemEntitySpawnS2CPacket;
@@ -15,6 +16,7 @@ public void onInitialize() {
1516
IdentifiablePacket.register(StationEntityEquipmentUpdateS2CPacket.PACKET_ID, true, false, StationEntityEquipmentUpdateS2CPacket::new);
1617
IdentifiablePacket.register(StationInventoryS2CPacket.PACKET_ID, true, false, StationInventoryS2CPacket::new);
1718
IdentifiablePacket.register(StationItemEntitySpawnS2CPacket.PACKET_ID, true, false, StationItemEntitySpawnS2CPacket::new);
19+
IdentifiablePacket.register(StationPlayerInteractBlockC2SPacket.PACKET_ID, false, true, StationPlayerInteractBlockC2SPacket::new);
1820
IdentifiablePacket.register(StationScreenHandlerSlotUpdateS2CPacket.PACKET_ID, true, false, StationScreenHandlerSlotUpdateS2CPacket::new);
1921
}
2022
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package net.modificationstation.stationapi.impl.network.packet.c2s.play;
2+
3+
import net.minecraft.item.ItemStack;
4+
import net.minecraft.nbt.NbtCompound;
5+
import net.minecraft.nbt.NbtElement;
6+
import net.minecraft.network.NetworkHandler;
7+
import net.minecraft.network.packet.c2s.play.PlayerInteractBlockC2SPacket;
8+
import net.modificationstation.stationapi.api.network.packet.IdentifiablePacket;
9+
import net.modificationstation.stationapi.api.util.Identifier;
10+
import net.modificationstation.stationapi.impl.item.StationNBTSetter;
11+
import org.jetbrains.annotations.ApiStatus;
12+
13+
import java.io.DataInputStream;
14+
import java.io.DataOutputStream;
15+
import java.io.IOException;
16+
17+
import static net.modificationstation.stationapi.api.StationAPI.NAMESPACE;
18+
19+
public class StationPlayerInteractBlockC2SPacket extends PlayerInteractBlockC2SPacket implements IdentifiablePacket {
20+
public static final Identifier PACKET_ID = NAMESPACE.id("items/interact");
21+
22+
@ApiStatus.Internal
23+
public StationPlayerInteractBlockC2SPacket() {}
24+
25+
public StationPlayerInteractBlockC2SPacket(int x, int y, int z, int side, ItemStack stack) {
26+
super(x, y, z, side, stack);
27+
}
28+
29+
@Override
30+
public void read(DataInputStream stream) {
31+
super.read(stream);
32+
if (stack == null) return;
33+
try {
34+
if (stream.readBoolean()) return;
35+
StationNBTSetter.cast(stack).setStationNbt((NbtCompound) NbtElement.readTag(stream));
36+
} catch (IOException e) {
37+
throw new RuntimeException(e);
38+
}
39+
}
40+
41+
@Override
42+
public void write(DataOutputStream stream) {
43+
super.write(stream);
44+
if (stack == null) return;
45+
boolean empty = stack.getStationNbt().values().isEmpty();
46+
try {
47+
stream.writeBoolean(empty);
48+
if (empty) return;
49+
NbtElement.writeTag(stack.getStationNbt(), stream);
50+
} catch (IOException e) {
51+
throw new RuntimeException(e);
52+
}
53+
}
54+
55+
@Override
56+
public Identifier getId() {
57+
return PACKET_ID;
58+
}
59+
}

station-items-v0/src/main/java/net/modificationstation/stationapi/mixin/item/client/network/itemnbt/MultiplayerInteractionManagerMixin.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,10 @@
66
import net.minecraft.client.network.ClientNetworkHandler;
77
import net.minecraft.item.ItemStack;
88
import net.minecraft.network.packet.c2s.play.ClickSlotC2SPacket;
9+
import net.minecraft.network.packet.c2s.play.PlayerInteractBlockC2SPacket;
910
import net.modificationstation.stationapi.api.network.ModdedPacketHandler;
1011
import net.modificationstation.stationapi.impl.network.packet.c2s.play.StationClickSlotC2SPacket;
12+
import net.modificationstation.stationapi.impl.network.packet.c2s.play.StationPlayerInteractBlockC2SPacket;
1113
import org.spongepowered.asm.mixin.Mixin;
1214
import org.spongepowered.asm.mixin.Shadow;
1315
import org.spongepowered.asm.mixin.injection.At;
@@ -16,6 +18,22 @@
1618
class MultiplayerInteractionManagerMixin {
1719
@Shadow private ClientNetworkHandler networkHandler;
1820

21+
@WrapOperation(
22+
method = {
23+
"method_1713",
24+
"method_1712"
25+
},
26+
at = @At(
27+
value = "NEW",
28+
target = "(IIIILnet/minecraft/item/ItemStack;)Lnet/minecraft/network/packet/c2s/play/PlayerInteractBlockC2SPacket;"
29+
)
30+
)
31+
private PlayerInteractBlockC2SPacket stationapi_redirectPlayerInteractBlockPacket(int x, int y, int z, int side, ItemStack stack, Operation<PlayerInteractBlockC2SPacket> original) {
32+
return ((ModdedPacketHandler) networkHandler).isModded() ?
33+
new StationPlayerInteractBlockC2SPacket(x, y, z, side, stack) :
34+
original.call(x, y, z, side, stack);
35+
}
36+
1937
@WrapOperation(
2038
method = "clickSlot",
2139
at = @At(

0 commit comments

Comments
 (0)