fix(plugin): apply WASM sent packet payloads (#2892)

This commit is contained in:
Bluezly
2026-08-12 11:18:21 +03:00
committed by GitHub
parent e59af5cb21
commit 1529e811e5
4 changed files with 54 additions and 40 deletions

View File

@@ -2385,18 +2385,26 @@ impl Player {
false
}
pub async fn fire_packet_sent_no_obj(self: &Arc<Self>, 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<Self>,
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<Self>, 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 {

View File

@@ -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

View File

@@ -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;
}
}

View File

@@ -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(_) => {