Skip to content

Commit c24f775

Browse files
committed
ClickSlotC2SPacket item NBT implementation
1 parent 983439c commit c24f775

5 files changed

Lines changed: 97 additions & 3 deletions

File tree

station-items-v0/build.gradle.kts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
import net.modificationstation.stationapi.gradle.SubprojectHelpers.getSubprojectVersion
21
import net.modificationstation.stationapi.gradle.SubprojectHelpers.addModuleDependencies
2+
import net.modificationstation.stationapi.gradle.SubprojectHelpers.getSubprojectVersion
3+
34
base.archivesName.set("station-items-v0")
45
version = getSubprojectVersion(project, "1.0.0")
56

@@ -11,5 +12,6 @@ addModuleDependencies(project,
1112
"station-blocks-v0",
1213
"station-player-api-v0",
1314
"station-nbt-v0",
14-
"station-networking-v0"
15+
"station-networking-v0",
16+
"station-vanilla-checker-v0"
1517
)

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
@@ -2,6 +2,7 @@
22

33
import net.fabricmc.api.ModInitializer;
44
import net.modificationstation.stationapi.api.network.packet.IdentifiablePacket;
5+
import net.modificationstation.stationapi.impl.network.packet.c2s.play.StationClickSlotC2SPacket;
56
import net.modificationstation.stationapi.impl.network.packet.s2c.play.StationEntityEquipmentUpdateS2CPacket;
67
import net.modificationstation.stationapi.impl.network.packet.s2c.play.StationInventoryS2CPacket;
78
import net.modificationstation.stationapi.impl.network.packet.s2c.play.StationItemEntitySpawnS2CPacket;
@@ -10,6 +11,7 @@
1011
public class StationItemsNetworkingImpl implements ModInitializer {
1112
@Override
1213
public void onInitialize() {
14+
IdentifiablePacket.register(StationClickSlotC2SPacket.PACKET_ID, false, true, StationClickSlotC2SPacket::new);
1315
IdentifiablePacket.register(StationEntityEquipmentUpdateS2CPacket.PACKET_ID, true, false, StationEntityEquipmentUpdateS2CPacket::new);
1416
IdentifiablePacket.register(StationInventoryS2CPacket.PACKET_ID, true, false, StationInventoryS2CPacket::new);
1517
IdentifiablePacket.register(StationItemEntitySpawnS2CPacket.PACKET_ID, true, false, StationItemEntitySpawnS2CPacket::new);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
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.packet.c2s.play.ClickSlotC2SPacket;
7+
import net.modificationstation.stationapi.api.network.packet.IdentifiablePacket;
8+
import net.modificationstation.stationapi.api.util.Identifier;
9+
import net.modificationstation.stationapi.impl.item.StationNBTSetter;
10+
import org.jetbrains.annotations.ApiStatus;
11+
12+
import java.io.DataInputStream;
13+
import java.io.DataOutputStream;
14+
import java.io.IOException;
15+
16+
import static net.modificationstation.stationapi.api.StationAPI.NAMESPACE;
17+
18+
public class StationClickSlotC2SPacket extends ClickSlotC2SPacket implements IdentifiablePacket {
19+
public static final Identifier PACKET_ID = NAMESPACE.id("items/slot");
20+
21+
@ApiStatus.Internal
22+
public StationClickSlotC2SPacket() {}
23+
24+
public StationClickSlotC2SPacket(int syncId, int slot, int button, boolean holdingShift, ItemStack stack, short actionType) {
25+
super(syncId, slot, button, holdingShift, stack, actionType);
26+
}
27+
28+
@Override
29+
public void read(DataInputStream stream) {
30+
super.read(stream);
31+
if (stack == null) return;
32+
try {
33+
if (stream.readBoolean()) return;
34+
StationNBTSetter.cast(stack).setStationNbt((NbtCompound) NbtElement.readTag(stream));
35+
} catch (IOException e) {
36+
throw new RuntimeException(e);
37+
}
38+
}
39+
40+
@Override
41+
public void write(DataOutputStream stream) {
42+
super.write(stream);
43+
if (stack == null) return;
44+
boolean empty = stack.getStationNbt().values().isEmpty();
45+
try {
46+
stream.writeBoolean(empty);
47+
if (empty) return;
48+
NbtElement.writeTag(stack.getStationNbt(), stream);
49+
} catch (IOException e) {
50+
throw new RuntimeException(e);
51+
}
52+
}
53+
54+
@Override
55+
public Identifier getId() {
56+
return PACKET_ID;
57+
}
58+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package net.modificationstation.stationapi.mixin.item.client.network.itemnbt;
2+
3+
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
4+
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
5+
import net.minecraft.MultiplayerInteractionManager;
6+
import net.minecraft.client.network.ClientNetworkHandler;
7+
import net.minecraft.item.ItemStack;
8+
import net.minecraft.network.packet.c2s.play.ClickSlotC2SPacket;
9+
import net.modificationstation.stationapi.api.network.ModdedPacketHandler;
10+
import net.modificationstation.stationapi.impl.network.packet.c2s.play.StationClickSlotC2SPacket;
11+
import org.spongepowered.asm.mixin.Mixin;
12+
import org.spongepowered.asm.mixin.Shadow;
13+
import org.spongepowered.asm.mixin.injection.At;
14+
15+
@Mixin(MultiplayerInteractionManager.class)
16+
class MultiplayerInteractionManagerMixin {
17+
@Shadow private ClientNetworkHandler networkHandler;
18+
19+
@WrapOperation(
20+
method = "clickSlot",
21+
at = @At(
22+
value = "NEW",
23+
target = "(IIIZLnet/minecraft/item/ItemStack;S)Lnet/minecraft/network/packet/c2s/play/ClickSlotC2SPacket;"
24+
)
25+
)
26+
private ClickSlotC2SPacket stationapi_redirectClickSlotPacket(int syncId, int slot, int button, boolean holdingShift, ItemStack stack, short actionType, Operation<ClickSlotC2SPacket> original) {
27+
return ((ModdedPacketHandler) networkHandler).isModded() ?
28+
new StationClickSlotC2SPacket(syncId, slot, button, holdingShift, stack, actionType) :
29+
original.call(syncId, slot, button, holdingShift, stack, actionType);
30+
}
31+
}

station-items-v0/src/main/resources/station-items-v0.mixins.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@
3131
"client.ItemRendererMixin",
3232
"client.MultiplayerInteractionManagerMixin",
3333
"client.OtherPlayerEntityMixin",
34-
"client.SingleplayerInteractionManagerMixin"
34+
"client.SingleplayerInteractionManagerMixin",
35+
"client.network.itemnbt.MultiplayerInteractionManagerMixin"
3536
],
3637
"injectors": {
3738
"defaultRequire": 1

0 commit comments

Comments
 (0)