Skip to content

Commit 10d9690

Browse files
committed
feat: upgrade to Bevy 0.17 and migrate to Messages/Observers API
1 parent b6af3af commit 10d9690

File tree

15 files changed

+104
-84
lines changed

15 files changed

+104
-84
lines changed

Cargo.toml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ inspect = ["bevy-inspector-egui"]
2323

2424
[dependencies]
2525
async-std = { version = "1.12.0" }
26-
bevy = { version = "0.16.0", default-features = false, features = ["bevy_log"] }
26+
bevy = { version = "0.17.0", default-features = false, features = ["bevy_log"] }
2727
bytes = "1.6.0"
2828
kanal = "0.1.0-pre8"
2929
futures = "0.3.30"
@@ -32,12 +32,12 @@ thiserror = { version = "1.0.59" }
3232

3333
bincode = { version = "1.3.3", optional = true }
3434
serde_json = { version = "1.0.68", optional = true }
35-
bevy-inspector-egui = { version = "0.25.0", optional = true }
35+
bevy-inspector-egui = { version = "0.26.0", optional = true }
3636

3737

3838

3939
[dev-dependencies]
40-
bevy = { version = "0.16.0", default-features = false, features = [
40+
bevy = { version = "0.17.0", default-features = false, features = [
4141
"bevy_asset",
4242
"bevy_audio",
4343
"vorbis",

bevy_octopus_websocket/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ documentation = "https://docs.rs/bevy_octopus_websocket"
1818

1919
[dependencies]
2020
bevy_octopus = { version = "*", path = ".." }
21-
bevy = { version = "0.16.0", default-features = false, features = [] }
21+
bevy = { version = "0.17.0", default-features = false, features = [] }
2222
async-std = "1.12.0"
2323
async-tungstenite = { version = "0.27.0", features = ["async-std-runtime", "async-tls"] }
2424
tungstenite = "0.23.0"

bevy_octopus_websocket/examples/common/lib.rs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,13 @@ pub struct PlayerInformation {
4141
pub position: (u32, u32, u32),
4242
}
4343

44-
pub fn on_node_event(trigger: Trigger<NetworkEvent>) {
45-
info!("{:?} trigger {:?}", trigger.target(), trigger.event());
44+
pub fn on_node_event(on: On<NodeEvent>) {
45+
let e = on.event();
46+
info!("{:?} trigger {:?}", e.entity, e.event);
4647
}
4748

4849
pub fn handle_message_events(
49-
mut ev_channels: EventReader<ReceiveChannelMessage<PlayerInformation>>,
50+
mut ev_channels: MessageReader<ReceiveChannelMessage<PlayerInformation>>,
5051
) {
5152
for event in ev_channels.read() {
5253
info!("{} Received: {:?}", event.channel_id, &event.message);
@@ -61,7 +62,9 @@ pub fn handle_raw_packet(q_server: Query<(&ChannelId, &NetworkNode)>) {
6162
}
6263
}
6364

64-
pub fn send_json_message(mut channel_messages: EventWriter<SendChannelMessage<PlayerInformation>>) {
65+
pub fn send_json_message(
66+
mut channel_messages: MessageWriter<SendChannelMessage<PlayerInformation>>,
67+
) {
6568
channel_messages.write(SendChannelMessage {
6669
channel_id: JSON_CHANNEL,
6770
message: PlayerInformation {
@@ -73,7 +76,7 @@ pub fn send_json_message(mut channel_messages: EventWriter<SendChannelMessage<Pl
7376

7477
/// send bincode message
7578
pub fn send_bincode_message(
76-
mut channel_messages: EventWriter<SendChannelMessage<PlayerInformation>>,
79+
mut channel_messages: MessageWriter<SendChannelMessage<PlayerInformation>>,
7780
) {
7881
channel_messages.write(SendChannelMessage {
7982
channel_id: BINCODE_CHANNEL,

bevy_octopus_websocket/examples/server.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ fn setup_server(mut commands: Commands) {
4242
}
4343

4444
/// broadcast message to all connected clients in channel
45-
fn send_channel_packet(mut channel_events: EventWriter<ChannelPacket>) {
45+
fn send_channel_packet(mut channel_events: MessageWriter<ChannelPacket>) {
4646
channel_events.write(ChannelPacket::new(RAW_CHANNEL, b"channel 1 message\r\n"));
4747
}
4848

bevy_octopus_websocket/src/lib.rs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -85,10 +85,11 @@ impl WebsocketAddress {
8585
}
8686

8787
fn on_start_server(
88-
trigger: Trigger<StartServer>,
88+
on: On<StartServer>,
8989
q_ws_server: Query<(&NetworkNode, &ServerNode<WebsocketAddress>)>,
9090
) {
91-
if let Ok((net_node, server_node)) = q_ws_server.get(trigger.target()) {
91+
let ev = on.event();
92+
if let Ok((net_node, server_node)) = q_ws_server.get(ev.entity) {
9293
let local_addr = server_node.url.parse().expect("Invalid address");
9394
let event_tx = net_node.event_channel.sender.clone_async();
9495
let shutdown_clone = net_node.shutdown_channel.receiver.clone_async();
@@ -116,10 +117,11 @@ fn on_start_server(
116117

117118
#[allow(clippy::type_complexity)]
118119
fn on_start_client(
119-
trigger: Trigger<StartClient>,
120+
on: On<StartClient>,
120121
q_ws_client: Query<(&NetworkNode, &ClientNode<WebsocketAddress>), Without<NetworkPeer>>,
121122
) {
122-
if let Ok((net_node, remote_addr)) = q_ws_client.get(trigger.target()) {
123+
let ev = on.event();
124+
if let Ok((net_node, remote_addr)) = q_ws_client.get(ev.entity) {
123125
let url = remote_addr.url.clone();
124126
debug!("try connect to {}", url);
125127
let recv_tx = net_node.recv_message_channel.sender.clone_async();
@@ -319,7 +321,7 @@ fn handle_endpoint(
319321

320322
// Add the client to the server's children
321323
commands.entity(entity).add_child(child_ws_client);
322-
commands.trigger_targets(NetworkEvent::Connected, vec![child_ws_client]);
324+
commands.trigger(NodeEvent { entity: child_ws_client, event: NetworkEvent::Connected });
323325
}
324326
}
325327
}

examples/common/lib.rs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -52,12 +52,13 @@ pub struct PlayerInformation {
5252
pub position: (u32, u32, u32),
5353
}
5454

55-
pub fn on_node_event(trigger: Trigger<NetworkEvent>) {
56-
info!("{:?} trigger {:?}", trigger.target(), trigger.event());
55+
pub fn on_node_event(on: On<NodeEvent>) {
56+
let e = on.event();
57+
info!("{:?} trigger {:?}", e.entity, e.event);
5758
}
5859

5960
pub fn handle_message_events(
60-
mut ev_channels: EventReader<ReceiveChannelMessage<PlayerInformation>>,
61+
mut ev_channels: MessageReader<ReceiveChannelMessage<PlayerInformation>>,
6162
) {
6263
for event in ev_channels.read() {
6364
info!("{} Received: {:?}", event.channel_id, &event.message);
@@ -75,7 +76,9 @@ pub fn handle_raw_packet(q_server: Query<(Entity, &ChannelId, &NetworkNode)>) {
7576
}
7677
}
7778

78-
pub fn send_json_message(mut channel_messages: EventWriter<SendChannelMessage<PlayerInformation>>) {
79+
pub fn send_json_message(
80+
mut channel_messages: MessageWriter<SendChannelMessage<PlayerInformation>>,
81+
) {
7982
channel_messages.write(SendChannelMessage {
8083
channel_id: JSON_CHANNEL,
8184
message: PlayerInformation {
@@ -87,7 +90,7 @@ pub fn send_json_message(mut channel_messages: EventWriter<SendChannelMessage<Pl
8790

8891
/// send bincode message
8992
pub fn send_bincode_message(
90-
mut channel_messages: EventWriter<SendChannelMessage<PlayerInformation>>,
93+
mut channel_messages: MessageWriter<SendChannelMessage<PlayerInformation>>,
9194
) {
9295
channel_messages.write(SendChannelMessage {
9396
channel_id: BINCODE_CHANNEL,

examples/tcp/server.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ fn setup_server(mut commands: Commands) {
4343
}
4444

4545
/// broadcast message to all connected clients in channel
46-
fn send_channel_packet(mut channel_events: EventWriter<ChannelPacket>) {
46+
fn send_channel_packet(mut channel_events: MessageWriter<ChannelPacket>) {
4747
channel_events.write(ChannelPacket::new(RAW_CHANNEL, b"channel 1 message\r\n"));
4848
}
4949

src/channels.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use std::fmt::Display;
22

33
use bevy::{
44
ecs::reflect::ReflectComponent,
5-
prelude::{Component, Event, EventReader, Query, Reflect},
5+
prelude::{Component, Message, MessageReader, Query, Reflect},
66
};
77
use bytes::Bytes;
88

@@ -19,7 +19,7 @@ impl Display for ChannelId {
1919
}
2020
}
2121

22-
#[derive(Event)]
22+
#[derive(Message)]
2323
pub struct ChannelPacket {
2424
pub channel_id: ChannelId,
2525
pub bytes: Bytes,
@@ -36,7 +36,7 @@ impl ChannelPacket {
3636
}
3737
}
3838

39-
#[derive(Event, Debug)]
39+
#[derive(Message, Debug)]
4040
pub struct SendChannelMessage<M> {
4141
pub channel_id: ChannelId,
4242
pub message: M,
@@ -51,7 +51,7 @@ impl<M> SendChannelMessage<M> {
5151
}
5252
}
5353

54-
#[derive(Event, Debug)]
54+
#[derive(Message, Debug)]
5555
pub struct ReceiveChannelMessage<M> {
5656
pub channel_id: ChannelId,
5757
pub message: M,
@@ -68,7 +68,7 @@ impl<M> ReceiveChannelMessage<M> {
6868

6969
pub(crate) fn send_channel_message_system(
7070
q_net: Query<(&ChannelId, &NetworkNode)>,
71-
mut channel_events: EventReader<ChannelPacket>,
71+
mut channel_events: MessageReader<ChannelPacket>,
7272
) {
7373
for channel_ev in channel_events.read() {
7474
q_net.par_iter().for_each(|(channel_id, net_node)| {

src/client.rs

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,11 @@
11
use crate::{
22
error::NetworkError,
3-
network_node::{NetworkAddress, NetworkEvent, NetworkPeer},
4-
};
5-
use bevy::{
6-
ecs::component::{ComponentHooks, HookContext, Immutable, StorageType},
7-
prelude::*,
3+
network_node::{NetworkAddress, NetworkEvent, NetworkPeer, NodeEvent},
84
};
5+
use bevy::{ecs::component::{Immutable, StorageType}, prelude::*};
96

107
pub(super) fn plugin(app: &mut App) {
118
app.register_type::<ReconnectSetting>()
12-
.add_event::<StartClient>()
139
.add_systems(Update, handle_reconnect_timer)
1410
.add_observer(cleanup_client_session)
1511
.add_observer(client_reconnect);
@@ -25,15 +21,18 @@ impl<T: NetworkAddress + 'static> Component for ClientNode<T> {
2521
const STORAGE_TYPE: StorageType = StorageType::Table;
2622
type Mutability = Immutable;
2723

28-
fn register_component_hooks(hooks: &mut ComponentHooks) {
29-
hooks.on_insert(|mut world, HookContext { entity, .. }| {
24+
fn on_insert() -> Option<bevy::ecs::lifecycle::ComponentHook> {
25+
Some(|mut world, ctx| {
26+
let entity = ctx.entity;
3027
world.commands().entity(entity).insert(ClientTag);
31-
world.trigger_targets(StartClient, entity);
32-
});
28+
world.trigger(StartClient { entity });
29+
})
3330
}
3431
}
35-
#[derive(Event, Clone)]
36-
pub struct StartClient;
32+
#[derive(EntityEvent, Clone)]
33+
pub struct StartClient {
34+
pub entity: Entity,
35+
}
3736

3837
#[derive(Debug, Component, Reflect)]
3938
#[reflect(Component)]
@@ -55,12 +54,13 @@ impl Default for ReconnectSetting {
5554
}
5655

5756
pub(crate) fn client_reconnect(
58-
trigger: Trigger<NetworkEvent>,
57+
on: On<NodeEvent>,
5958
mut commands: Commands,
6059
mut q_net: Query<&mut ReconnectSetting, Without<NetworkPeer>>,
6160
) {
62-
if let Ok(mut reconnect) = q_net.get_mut(trigger.target()) {
63-
let event = trigger.event();
61+
let ev = on.event();
62+
if let Ok(mut reconnect) = q_net.get_mut(ev.entity) {
63+
let event = &ev.event;
6464
if reconnect.retries < reconnect.max_retries {
6565
reconnect.retries += 1;
6666
} else {
@@ -70,7 +70,7 @@ pub(crate) fn client_reconnect(
7070
NetworkEvent::Listen | NetworkEvent::Connected => reconnect.retries = 0,
7171
NetworkEvent::Disconnected | NetworkEvent::Error(NetworkError::Connection(_)) => {
7272
commands
73-
.entity(trigger.target())
73+
.entity(ev.entity)
7474
.insert(ReconnectTimer(Timer::from_seconds(
7575
reconnect.delay,
7676
TimerMode::Once,
@@ -92,18 +92,19 @@ pub(crate) fn handle_reconnect_timer(
9292
for (entity, mut timer) in q_reconnect.iter_mut() {
9393
if timer.tick(time.delta()).just_finished() {
9494
commands.entity(entity).remove::<ReconnectTimer>();
95-
commands.trigger_targets(StartClient, entity);
95+
commands.trigger(StartClient { entity });
9696
}
9797
}
9898
}
9999

100100
pub(crate) fn cleanup_client_session(
101-
trigger: Trigger<NetworkEvent>,
101+
on: On<NodeEvent>,
102102
mut commands: Commands,
103103
q_net: Query<Entity, With<NetworkPeer>>,
104104
) {
105-
if let Ok(entity) = q_net.get(trigger.target()) {
106-
let event = trigger.event();
105+
let ev = on.event();
106+
if let Ok(entity) = q_net.get(ev.entity) {
107+
let event = &ev.event;
107108

108109
match event {
109110
NetworkEvent::Disconnected | NetworkEvent::Error(NetworkError::Connection(_)) => {

src/network_node.rs

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
11
use crate::{client::ReconnectSetting, error::NetworkError, prelude::ChannelId};
2-
use bevy::{
3-
ecs::component::{ComponentHooks, HookContext, Mutable, StorageType},
4-
prelude::*,
5-
};
2+
use bevy::{ecs::component::{Mutable, StorageType}, prelude::*};
63
use bytes::Bytes;
74
use kanal::{Receiver, Sender, unbounded};
85
use std::{
@@ -73,12 +70,13 @@ impl Component for NetworkNode {
7370
const STORAGE_TYPE: StorageType = StorageType::Table;
7471

7572
type Mutability = Mutable;
76-
fn register_component_hooks(hooks: &mut ComponentHooks) {
77-
hooks.on_remove(|world, HookContext { entity, .. }| {
78-
if let Some(node) = world.get::<NetworkNode>(entity) {
73+
74+
fn on_remove() -> Option<bevy::ecs::lifecycle::ComponentHook> {
75+
Some(|world, ctx| {
76+
if let Some(node) = world.get::<NetworkNode>(ctx.entity) {
7977
node.shutdown_channel.sender.try_send(()).unwrap();
8078
}
81-
});
79+
})
8280
}
8381
}
8482

@@ -142,15 +140,22 @@ impl<T> AsyncChannel<T> {
142140
}
143141
}
144142

145-
#[derive(Debug, Event)]
146-
/// A network event originating from a network node
143+
#[derive(Debug)]
144+
/// 来自网络节点后台的原始事件(线程通道)
147145
pub enum NetworkEvent {
148146
Listen,
149147
Connected,
150148
Disconnected,
151149
Error(NetworkError),
152150
}
153151

152+
#[derive(EntityEvent, Debug)]
153+
/// ECS 观察者用的实体事件,携带目标实体
154+
pub struct NodeEvent {
155+
pub entity: Entity,
156+
pub event: NetworkEvent,
157+
}
158+
154159
/// send network node error channel to events
155160
#[allow(clippy::type_complexity)]
156161
pub(crate) fn network_node_event(
@@ -167,7 +172,7 @@ pub(crate) fn network_node_event(
167172
net_node.stop();
168173
}
169174
}
170-
commands.trigger_targets(event, vec![entity]);
175+
commands.trigger(NodeEvent { entity, event });
171176
}
172177
}
173178
}

0 commit comments

Comments
 (0)