1
1
use crate :: game_state:: { GameSingleton , GameState } ;
2
2
use godot:: classes:: {
3
- AcceptDialog , Button , Control , IControl , ItemList , Label , LineEdit , Os , Panel ,
3
+ AcceptDialog , Button , Control , IControl , ItemList , Label , LineEdit , MultiplayerApi , Os , Panel ,
4
4
} ;
5
5
use godot:: prelude:: * ;
6
6
@@ -27,12 +27,16 @@ pub struct Lobby {
27
27
start_button : OnReady < Gd < Button > > ,
28
28
#[ init( node = "ErrorDialog" ) ]
29
29
error_dialog : OnReady < Gd < AcceptDialog > > ,
30
+ #[ init( val = OnReady :: manual( ) ) ]
31
+ multiplayer : OnReady < Gd < MultiplayerApi > > ,
30
32
base : Base < Control > ,
31
33
}
32
34
33
35
#[ godot_api]
34
36
impl IControl for Lobby {
35
37
fn ready ( & mut self ) {
38
+ self . multiplayer
39
+ . init ( self . base ( ) . get_multiplayer ( ) . unwrap ( ) ) ;
36
40
let on_connection_failed = self . base ( ) . callable ( "on_connection_failed" ) ;
37
41
GameState :: singleton ( ) . connect ( "connection_failed" . into ( ) , on_connection_failed) ;
38
42
let on_connection_success = self . base ( ) . callable ( "on_connection_success" ) ;
@@ -117,14 +121,21 @@ impl Lobby {
117
121
118
122
#[ func]
119
123
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
122
125
self . players_list . clear ( ) ;
123
126
self . players_list . add_item ( GString :: from (
124
127
format ! { "{} (You)" , GameState :: singleton( ) . bind( ) . player_name} ,
125
128
) ) ;
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 ( ) ) ;
128
139
}
129
140
let is_server = self . base ( ) . get_multiplayer ( ) . unwrap ( ) . is_server ( ) ;
130
141
self . start_button . set_disabled ( !is_server) ;
0 commit comments