@@ -51,6 +51,37 @@ impl Plugin for ClientMessagePlugin {
5151 . build_state ( app. world_mut ( ) )
5252 . build_system ( send) ;
5353
54+ let broadcast_send_fn = (
55+ FilteredResourcesMutParamBuilder :: new ( |builder| {
56+ for message in registry. iter_all_broadcast ( ) {
57+ builder. add_write_by_id ( message. messages_id ( ) ) ;
58+ }
59+ } ) ,
60+ FilteredResourcesMutParamBuilder :: new ( |builder| {
61+ for message in registry. iter_all_broadcast ( ) {
62+ builder. add_write_by_id ( message. broadcast_id ( ) ) ;
63+ }
64+ } ) ,
65+ ParamBuilder ,
66+ ParamBuilder ,
67+ ParamBuilder ,
68+ ParamBuilder ,
69+ )
70+ . build_state ( app. world_mut ( ) )
71+ . build_system ( broadcast_send) ;
72+
73+ let broadcast_trigger_fn = (
74+ FilteredResourcesMutParamBuilder :: new ( |builder| {
75+ for event in registry. iter_broadcast_events ( ) {
76+ builder. add_write_by_id ( event. message ( ) . broadcast_id ( ) ) ;
77+ }
78+ } ) ,
79+ ParamBuilder ,
80+ ParamBuilder ,
81+ )
82+ . build_state ( app. world_mut ( ) )
83+ . build_system ( broadcast_trigger) ;
84+
5485 let receive_builder = (
5586 FilteredResourcesMutParamBuilder :: new ( |builder| {
5687 for message in registry. iter_all_server ( ) {
@@ -113,6 +144,22 @@ impl Plugin for ClientMessagePlugin {
113144 . build_state ( app. world_mut ( ) )
114145 . build_system ( send_locally) ;
115146
147+ let broadcast_send_locally_fn = (
148+ FilteredResourcesMutParamBuilder :: new ( |builder| {
149+ for message in registry. iter_all_broadcast ( ) {
150+ builder. add_write_by_id ( message. broadcast_id ( ) ) ;
151+ }
152+ } ) ,
153+ FilteredResourcesMutParamBuilder :: new ( |builder| {
154+ for message in registry. iter_all_broadcast ( ) {
155+ builder. add_write_by_id ( message. messages_id ( ) ) ;
156+ }
157+ } ) ,
158+ ParamBuilder ,
159+ )
160+ . build_state ( app. world_mut ( ) )
161+ . build_system ( broadcast_send_locally) ;
162+
116163 let reset_fn = (
117164 FilteredResourcesMutParamBuilder :: new ( |builder| {
118165 for message in registry. iter_all_client ( ) {
@@ -124,6 +171,11 @@ impl Plugin for ClientMessagePlugin {
124171 builder. add_write_by_id ( message. queue_id ( ) ) ;
125172 }
126173 } ) ,
174+ FilteredResourcesMutParamBuilder :: new ( |builder| {
175+ for message in registry. iter_all_broadcast ( ) {
176+ builder. add_write_by_id ( message. messages_id ( ) ) ;
177+ }
178+ } ) ,
127179 ParamBuilder ,
128180 )
129181 . build_state ( app. world_mut ( ) )
@@ -154,8 +206,10 @@ impl Plugin for ClientMessagePlugin {
154206 . add_systems (
155207 PostUpdate ,
156208 (
157- send_fn. run_if ( in_state ( ClientState :: Connected ) ) ,
158- send_locally_fn. run_if ( in_state ( ClientState :: Disconnected ) ) ,
209+ ( send_fn, broadcast_send_fn) . run_if ( in_state ( ClientState :: Connected ) ) ,
210+ ( send_locally_fn, broadcast_send_locally_fn)
211+ . run_if ( in_state ( ClientState :: Disconnected ) ) ,
212+ broadcast_trigger_fn,
159213 )
160214 . chain ( )
161215 . in_set ( ClientSystems :: Send ) ,
@@ -197,6 +251,40 @@ fn send(
197251 }
198252}
199253
254+ fn broadcast_send (
255+ mut messages : FilteredResourcesMut ,
256+ mut broadcasts : FilteredResourcesMut ,
257+ mut client_messages : ResMut < ClientMessages > ,
258+ type_registry : Res < AppTypeRegistry > ,
259+ entity_map : Res < ServerEntityMap > ,
260+ registry : Res < RemoteMessageRegistry > ,
261+ ) {
262+ let mut ctx = ClientSendCtx {
263+ entity_map : & entity_map,
264+ type_registry : & type_registry,
265+ invalid_entities : Vec :: new ( ) ,
266+ } ;
267+
268+ for message in registry. iter_all_broadcast ( ) {
269+ let messages = messages
270+ . get_mut_by_id ( message. messages_id ( ) )
271+ . expect ( "messages resource should be accessible" ) ;
272+ let broadcasts = broadcasts
273+ . get_mut_by_id ( message. broadcast_id ( ) )
274+ . expect ( "broadcast messages resource should be accessible" ) ;
275+
276+ // SAFETY: passed pointers were obtained using this message data.
277+ unsafe {
278+ message. send (
279+ & mut ctx,
280+ messages. into_inner ( ) ,
281+ broadcasts. into_inner ( ) ,
282+ & mut client_messages,
283+ ) ;
284+ }
285+ }
286+ }
287+
200288fn receive (
201289 mut messages : FilteredResourcesMut ,
202290 mut queues : FilteredResourcesMut ,
@@ -246,6 +334,20 @@ fn trigger(
246334 }
247335}
248336
337+ fn broadcast_trigger (
338+ mut broadcasts : FilteredResourcesMut ,
339+ mut commands : Commands ,
340+ registry : Res < RemoteMessageRegistry > ,
341+ ) {
342+ for event in registry. iter_broadcast_events ( ) {
343+ let broadcasts = broadcasts
344+ . get_mut_by_id ( event. message ( ) . broadcast_id ( ) )
345+ . expect ( "broadcast messages resource should be accessible" ) ;
346+ // SAFETY: passed pointer was obtained using this event data.
347+ unsafe { event. trigger ( & mut commands, broadcasts. into_inner ( ) ) } ;
348+ }
349+ }
350+
249351fn send_locally (
250352 mut from_messages : FilteredResourcesMut ,
251353 mut messages : FilteredResourcesMut ,
@@ -264,9 +366,28 @@ fn send_locally(
264366 }
265367}
266368
369+ fn broadcast_send_locally (
370+ mut broadcasts : FilteredResourcesMut ,
371+ mut messages : FilteredResourcesMut ,
372+ registry : Res < RemoteMessageRegistry > ,
373+ ) {
374+ for message in registry. iter_all_broadcast ( ) {
375+ let broadcasts = broadcasts
376+ . get_mut_by_id ( message. broadcast_id ( ) )
377+ . expect ( "broadcast messages resource should be accessible" ) ;
378+ let messages = messages
379+ . get_mut_by_id ( message. messages_id ( ) )
380+ . expect ( "messages resource should be accessible" ) ;
381+
382+ // SAFETY: passed pointers were obtained using this message data.
383+ unsafe { message. send_locally ( broadcasts. into_inner ( ) , messages. into_inner ( ) ) } ;
384+ }
385+ }
386+
267387fn reset (
268388 mut messages : FilteredResourcesMut ,
269389 mut queues : FilteredResourcesMut ,
390+ mut broadcast_messages : FilteredResourcesMut ,
270391 registry : Res < RemoteMessageRegistry > ,
271392) {
272393 for message in registry. iter_all_client ( ) {
@@ -286,4 +407,13 @@ fn reset(
286407 // SAFETY: passed pointer was obtained using this message data.
287408 unsafe { messages. reset ( queue. into_inner ( ) ) } ;
288409 }
410+
411+ for message in registry. iter_all_broadcast ( ) {
412+ let messages = broadcast_messages
413+ . get_mut_by_id ( message. messages_id ( ) )
414+ . expect ( "broadcast messages resource should be accessible" ) ;
415+
416+ // SAFETY: passed pointer was obtained using this message data.
417+ unsafe { message. reset ( messages. into_inner ( ) ) } ;
418+ }
289419}
0 commit comments