From 1529e811e52bd08e79e8365dffe0dd72fa3dda34 Mon Sep 17 00:00:00 2001 From: Bluezly <141844841+Bluezly@users.noreply.github.com> Date: Wed, 12 Aug 2026 11:18:21 +0300 Subject: [PATCH] fix(plugin): apply WASM sent packet payloads (#2892) --- crates/pumpkin/src/entity/player.rs | 28 +++++++++++------ crates/pumpkin/src/net/bedrock/mod.rs | 31 ++++++++++--------- crates/pumpkin/src/net/java/mod.rs | 29 +++++++++-------- .../wasm/wasm_host/wit/v0_1/events/server.rs | 6 ++++ 4 files changed, 54 insertions(+), 40 deletions(-) diff --git a/crates/pumpkin/src/entity/player.rs b/crates/pumpkin/src/entity/player.rs index 48dd54206..2ca8ab6b4 100644 --- a/crates/pumpkin/src/entity/player.rs +++ b/crates/pumpkin/src/entity/player.rs @@ -2385,18 +2385,26 @@ impl Player { false } - pub async fn fire_packet_sent_no_obj(self: &Arc, packet_id: i32, payload: Bytes) -> bool { - let server = self.world().server.upgrade(); - if let Some(server) = server { - // This is a dummy object to satisfy the non-optional requirement in WIT - // In the future we should make all packets 'static or have a way to represent raw packets in WIT - struct RawPacket; - let mut event = - PacketSentEvent::new(self.clone(), packet_id, payload, Arc::new(RawPacket)); + pub(crate) async fn fire_packet_sent_event_no_obj( + self: &Arc, + packet_id: i32, + payload: Bytes, + ) -> PacketSentEvent { + // This is a dummy object to satisfy the non-optional requirement in WIT + // In the future we should make all packets 'static or have a way to represent raw packets in WIT + struct RawPacket; + + let mut event = PacketSentEvent::new(self.clone(), packet_id, payload, Arc::new(RawPacket)); + if let Some(server) = self.world().server.upgrade() { server.plugin_manager.fire(&server, &mut event).await; - return event.cancelled; } - false + event + } + + pub async fn fire_packet_sent_no_obj(self: &Arc, packet_id: i32, payload: Bytes) -> bool { + self.fire_packet_sent_event_no_obj(packet_id, payload) + .await + .cancelled } pub const fn entity_id(&self) -> i32 { diff --git a/crates/pumpkin/src/net/bedrock/mod.rs b/crates/pumpkin/src/net/bedrock/mod.rs index 697fae5d0..584f6bbd8 100644 --- a/crates/pumpkin/src/net/bedrock/mod.rs +++ b/crates/pumpkin/src/net/bedrock/mod.rs @@ -368,14 +368,14 @@ impl BedrockClient { Ok(()) => { let payload = Bytes::from(packet_buf); let player = self.player.load_full(); - let cancelled = if let Some(player) = player.as_ref() { - player - .fire_packet_sent_no_obj(P::PACKET_ID, payload.clone()) - .await + if let Some(player) = player.as_ref() { + let event = player + .fire_packet_sent_event_no_obj(P::PACKET_ID, payload) + .await; + if !event.cancelled { + self.enqueue_packet_data(event.payload).await; + } } else { - false - }; - if !cancelled { self.enqueue_packet_data(payload).await; } } @@ -493,16 +493,17 @@ impl BedrockClient { Ok(()) => { let payload = Bytes::from(packet_buf); let player = self.player.load_full(); - let cancelled = if let Some(player) = player.as_ref() { - player - .fire_packet_sent_no_obj(P::PACKET_ID, payload.clone()) - .await + let payload = if let Some(player) = player.as_ref() { + let event = player + .fire_packet_sent_event_no_obj(P::PACKET_ID, payload) + .await; + if event.cancelled { + return; + } + event.payload } else { - false + payload }; - if cancelled { - return; - } let (tx, rx) = oneshot::channel(); if let Err(err) = self .outgoing_packet_priority_send diff --git a/crates/pumpkin/src/net/java/mod.rs b/crates/pumpkin/src/net/java/mod.rs index a7168fd11..33b9db20c 100644 --- a/crates/pumpkin/src/net/java/mod.rs +++ b/crates/pumpkin/src/net/java/mod.rs @@ -323,14 +323,14 @@ impl JavaClient { let payload = Bytes::from(buf); let player = self.player.load_full(); - let cancelled = if let Some(player) = player.as_ref() { - player - .fire_packet_sent_no_obj(P::to_id(self.version.load()), payload.clone()) - .await + if let Some(player) = player.as_ref() { + let event = player + .fire_packet_sent_event_no_obj(P::to_id(self.version.load()), payload) + .await; + if !event.cancelled { + self.enqueue_packet_data(event.payload).await; + } } else { - false - }; - if !cancelled { self.enqueue_packet_data(payload).await; } } @@ -450,15 +450,14 @@ impl JavaClient { let payload = Bytes::from(packet_buf); let player = self.player.load_full(); - let cancelled = if let Some(player) = player.as_ref() { - player - .fire_packet_sent_no_obj(P::to_id(self.version.load()), payload.clone()) - .await + if let Some(player) = player.as_ref() { + let event = player + .fire_packet_sent_event_no_obj(P::to_id(self.version.load()), payload) + .await; + if !event.cancelled { + self.send_packet_now_data(event.payload).await; + } } else { - false - }; - - if !cancelled { self.send_packet_now_data(payload).await; } } diff --git a/crates/pumpkin/src/plugin/loader/wasm/wasm_host/wit/v0_1/events/server.rs b/crates/pumpkin/src/plugin/loader/wasm/wasm_host/wit/v0_1/events/server.rs index 1b30584e7..ef22ba460 100644 --- a/crates/pumpkin/src/plugin/loader/wasm/wasm_host/wit/v0_1/events/server.rs +++ b/crates/pumpkin/src/plugin/loader/wasm/wasm_host/wit/v0_1/events/server.rs @@ -98,6 +98,12 @@ impl ToFromWasmEvent for PacketSentEvent { }) } + fn apply_wasm_event(&mut self, event: Event, _state: &mut PluginHostState) { + if let Event::PacketSentEvent(data) = event { + self.payload = data.raw_payload.into(); + self.cancelled = data.cancelled; + } + } fn from_wasm_event(event: Event, _state: &mut PluginHostState) -> Self { match event { Event::PacketSentEvent(_) => {