From c17e7124d8b1b07e3d9e99c9e36f76b17b36a972 Mon Sep 17 00:00:00 2001 From: Alexander Medvedev Date: Sat, 6 Jun 2026 10:13:53 +0200 Subject: [PATCH] feat: extend packet send and receive events --- pumpkin-codegen/src/wit/bedrock_packet.rs | 4 +++ pumpkin-codegen/src/wit/java_packet.rs | 4 +++ pumpkin-plugin-wit | 2 +- .../wasm/wasm_host/wit/v0_1/events/server.rs | 30 +++++++++---------- 4 files changed, 23 insertions(+), 17 deletions(-) diff --git a/pumpkin-codegen/src/wit/bedrock_packet.rs b/pumpkin-codegen/src/wit/bedrock_packet.rs index 466461f77..e4b569327 100644 --- a/pumpkin-codegen/src/wit/bedrock_packet.rs +++ b/pumpkin-codegen/src/wit/bedrock_packet.rs @@ -34,6 +34,10 @@ pub fn build() -> String { &mut clientbound_variant, ); + // Add an 'unknown' fallback variant (no payload) — raw payload is carried on the event record + serverbound_variant.case(VariantCase::empty("unknown")); + clientbound_variant.case(VariantCase::empty("unknown")); + interface.type_def(TypeDef::new( "serverbound-packet", TypeDefKind::Variant(serverbound_variant), diff --git a/pumpkin-codegen/src/wit/java_packet.rs b/pumpkin-codegen/src/wit/java_packet.rs index 13812ac9c..672874411 100644 --- a/pumpkin-codegen/src/wit/java_packet.rs +++ b/pumpkin-codegen/src/wit/java_packet.rs @@ -35,6 +35,10 @@ pub fn build() -> String { &mut clientbound_variant, ); + // Add an 'unknown' fallback variant (no payload) — raw payload is carried on the event record + serverbound_variant.case(VariantCase::empty("unknown")); + clientbound_variant.case(VariantCase::empty("unknown")); + interface.type_def(TypeDef::new( "serverbound-packet", TypeDefKind::Variant(serverbound_variant), diff --git a/pumpkin-plugin-wit b/pumpkin-plugin-wit index 6e8b554b3..40ae44228 160000 --- a/pumpkin-plugin-wit +++ b/pumpkin-plugin-wit @@ -1 +1 @@ -Subproject commit 6e8b554b38803b0b6f76f39a88fded7a49d72908 +Subproject commit 40ae442280098742f84dd5e2427729bb07057f1a diff --git a/pumpkin/src/plugin/loader/wasm/wasm_host/wit/v0_1/events/server.rs b/pumpkin/src/plugin/loader/wasm/wasm_host/wit/v0_1/events/server.rs index 9677e0922..fc956df4f 100644 --- a/pumpkin/src/plugin/loader/wasm/wasm_host/wit/v0_1/events/server.rs +++ b/pumpkin/src/plugin/loader/wasm/wasm_host/wit/v0_1/events/server.rs @@ -30,27 +30,27 @@ impl ToFromWasmEvent for PacketReceivedEvent { let packet = match &self.player.client { ClientPlatform::Java(client) => { let version = client.version.load(); - let wit_packet = generated_packets::deserialize_java_serverbound_packet( + generated_packets::deserialize_java_serverbound_packet( self.packet_id, &self.payload, version, - ); - wit_packet.map(ServerboundPacket::Java) + ) + .map_or(ServerboundPacket::Unknown, ServerboundPacket::Java) } ClientPlatform::Bedrock(_) => { - let wit_packet = generated_packets::deserialize_bedrock_serverbound_packet( + generated_packets::deserialize_bedrock_serverbound_packet( self.packet_id, &self.payload, - ); - wit_packet.map(ServerboundPacket::Bedrock) + ) + .map_or(ServerboundPacket::Unknown, ServerboundPacket::Bedrock) } }; - let packet = packet.expect("Failed to deserialize serverbound packet to WIT. Ensure the packet is supported in the WIT API."); - Event::PacketReceivedEvent(PacketReceivedEventData { player: player_res, packet, + packet_id: self.packet_id, + raw_payload: self.payload.to_vec(), cancelled: self.cancelled, }) } @@ -77,22 +77,20 @@ impl ToFromWasmEvent for PacketSentEvent { let packet = match &self.player.client { ClientPlatform::Java(_) => { - let wit_packet = - generated_packets::clientbound_java_any_to_wit(self.packet.as_ref()); - wit_packet.map(ClientboundPacket::Java) + generated_packets::clientbound_java_any_to_wit(self.packet.as_ref()) + .map_or(ClientboundPacket::Unknown, ClientboundPacket::Java) } ClientPlatform::Bedrock(_) => { - let wit_packet = - generated_packets::clientbound_bedrock_any_to_wit(self.packet.as_ref()); - wit_packet.map(ClientboundPacket::Bedrock) + generated_packets::clientbound_bedrock_any_to_wit(self.packet.as_ref()) + .map_or(ClientboundPacket::Unknown, ClientboundPacket::Bedrock) } }; - let packet = packet.expect("Failed to convert clientbound packet to WIT. Ensure the packet is supported in the WIT API and ToWit is generated."); - Event::PacketSentEvent(PacketSentEventData { player: player_res, packet, + packet_id: self.packet_id, + raw_payload: self.payload.iter().copied().collect(), cancelled: self.cancelled, }) }