@@ -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 ( ) )
@@ -155,7 +207,10 @@ impl Plugin for ClientMessagePlugin {
155207 PostUpdate ,
156208 (
157209 send_fn. run_if ( in_state ( ClientState :: Connected ) ) ,
210+ broadcast_send_fn. run_if ( in_state ( ClientState :: Connected ) ) ,
158211 send_locally_fn. run_if ( in_state ( ClientState :: Disconnected ) ) ,
212+ broadcast_send_locally_fn. run_if ( in_state ( ClientState :: Disconnected ) ) ,
213+ broadcast_trigger_fn,
159214 )
160215 . chain ( )
161216 . in_set ( ClientSystems :: Send ) ,
@@ -197,6 +252,40 @@ fn send(
197252 }
198253}
199254
255+ fn broadcast_send (
256+ mut messages : FilteredResourcesMut ,
257+ mut broadcasts : FilteredResourcesMut ,
258+ mut client_messages : ResMut < ClientMessages > ,
259+ type_registry : Res < AppTypeRegistry > ,
260+ entity_map : Res < ServerEntityMap > ,
261+ registry : Res < RemoteMessageRegistry > ,
262+ ) {
263+ let mut ctx = ClientSendCtx {
264+ entity_map : & entity_map,
265+ type_registry : & type_registry,
266+ invalid_entities : Vec :: new ( ) ,
267+ } ;
268+
269+ for message in registry. iter_all_broadcast ( ) {
270+ let messages = messages
271+ . get_mut_by_id ( message. messages_id ( ) )
272+ . expect ( "messages resource should be accessible" ) ;
273+ let broadcasts = broadcasts
274+ . get_mut_by_id ( message. broadcast_id ( ) )
275+ . expect ( "broadcast messages resource should be accessible" ) ;
276+
277+ // SAFETY: passed pointers were obtained using this message data.
278+ unsafe {
279+ message. send (
280+ & mut ctx,
281+ messages. into_inner ( ) ,
282+ broadcasts. into_inner ( ) ,
283+ & mut client_messages,
284+ ) ;
285+ }
286+ }
287+ }
288+
200289fn receive (
201290 mut messages : FilteredResourcesMut ,
202291 mut queues : FilteredResourcesMut ,
@@ -246,6 +335,20 @@ fn trigger(
246335 }
247336}
248337
338+ fn broadcast_trigger (
339+ mut broadcasts : FilteredResourcesMut ,
340+ mut commands : Commands ,
341+ registry : Res < RemoteMessageRegistry > ,
342+ ) {
343+ for event in registry. iter_broadcast_events ( ) {
344+ let broadcasts = broadcasts
345+ . get_mut_by_id ( event. message ( ) . broadcast_id ( ) )
346+ . expect ( "broadcast messages resource should be accessible" ) ;
347+ // SAFETY: passed pointer was obtained using this event data.
348+ unsafe { event. trigger ( & mut commands, broadcasts. into_inner ( ) ) } ;
349+ }
350+ }
351+
249352fn send_locally (
250353 mut from_messages : FilteredResourcesMut ,
251354 mut messages : FilteredResourcesMut ,
@@ -264,9 +367,28 @@ fn send_locally(
264367 }
265368}
266369
370+ fn broadcast_send_locally (
371+ mut broadcasts : FilteredResourcesMut ,
372+ mut messages : FilteredResourcesMut ,
373+ registry : Res < RemoteMessageRegistry > ,
374+ ) {
375+ for message in registry. iter_all_broadcast ( ) {
376+ let broadcasts = broadcasts
377+ . get_mut_by_id ( message. broadcast_id ( ) )
378+ . expect ( "broadcast messages resource should be accessible" ) ;
379+ let messages = messages
380+ . get_mut_by_id ( message. messages_id ( ) )
381+ . expect ( "messages resource should be accessible" ) ;
382+
383+ // SAFETY: passed pointers were obtained using this message data.
384+ unsafe { message. send_locally ( broadcasts. into_inner ( ) , messages. into_inner ( ) ) } ;
385+ }
386+ }
387+
267388fn reset (
268389 mut messages : FilteredResourcesMut ,
269390 mut queues : FilteredResourcesMut ,
391+ mut broadcast_messages : FilteredResourcesMut ,
270392 registry : Res < RemoteMessageRegistry > ,
271393) {
272394 for message in registry. iter_all_client ( ) {
@@ -286,4 +408,13 @@ fn reset(
286408 // SAFETY: passed pointer was obtained using this message data.
287409 unsafe { messages. reset ( queue. into_inner ( ) ) } ;
288410 }
411+
412+ for message in registry. iter_all_broadcast ( ) {
413+ let messages = broadcast_messages
414+ . get_mut_by_id ( message. messages_id ( ) )
415+ . expect ( "broadcast messages resource should be accessible" ) ;
416+
417+ // SAFETY: passed pointer was obtained using this message data.
418+ unsafe { message. reset ( messages. into_inner ( ) ) } ;
419+ }
289420}
0 commit comments