11use crate :: game_state:: { GameSingleton , GameState } ;
22use godot:: classes:: {
3- AcceptDialog , Button , Control , IControl , ItemList , Label , LineEdit , Os , Panel ,
3+ AcceptDialog , Button , Control , IControl , ItemList , Label , LineEdit , MultiplayerApi , Os , Panel ,
44} ;
55use godot:: prelude:: * ;
66
@@ -27,12 +27,16 @@ pub struct Lobby {
2727 start_button : OnReady < Gd < Button > > ,
2828 #[ init( node = "ErrorDialog" ) ]
2929 error_dialog : OnReady < Gd < AcceptDialog > > ,
30+ #[ init( val = OnReady :: manual( ) ) ]
31+ multiplayer : OnReady < Gd < MultiplayerApi > > ,
3032 base : Base < Control > ,
3133}
3234
3335#[ godot_api]
3436impl IControl for Lobby {
3537 fn ready ( & mut self ) {
38+ self . multiplayer
39+ . init ( self . base ( ) . get_multiplayer ( ) . unwrap ( ) ) ;
3640 let on_connection_failed = self . base ( ) . callable ( "on_connection_failed" ) ;
3741 GameState :: singleton ( ) . connect ( "connection_failed" . into ( ) , on_connection_failed) ;
3842 let on_connection_success = self . base ( ) . callable ( "on_connection_success" ) ;
@@ -117,14 +121,21 @@ impl Lobby {
117121
118122 #[ func]
119123 fn refresh_lobby ( & mut self ) {
120- let mut players = GameState :: singleton ( ) . bind ( ) . get_player_list ( ) ;
121- players. sort_unstable ( ) ;
124+ // add current player at the top of the players list
122125 self . players_list . clear ( ) ;
123126 self . players_list . add_item ( GString :: from (
124127 format ! { "{} (You)" , GameState :: singleton( ) . bind( ) . player_name} ,
125128 ) ) ;
126- for player in players. iter_shared ( ) {
127- self . players_list . add_item ( player) ;
129+
130+ let game_state = GameState :: singleton ( ) ;
131+ let binding = game_state. bind ( ) ;
132+ let other_players = binding
133+ . get_players ( )
134+ . iter ( )
135+ . filter ( |( player_id, _) | * * player_id != self . multiplayer . get_unique_id ( ) ) ;
136+
137+ for ( _, player) in other_players {
138+ self . players_list . add_item ( player. clone ( ) ) ;
128139 }
129140 let is_server = self . base ( ) . get_multiplayer ( ) . unwrap ( ) . is_server ( ) ;
130141 self . start_button . set_disabled ( !is_server) ;
0 commit comments