+static void gameserver_send_to_all( int ignore,
+ const void *pData, u32 cbData,
+ int nSendFlags ){
+ for( int i=0; i<vg_list_size(gameserver.clients); i++ ){
+ struct gameserver_client *client = &gameserver.clients[i];
+
+ if( (i==ignore) || !client->active )
+ continue;
+
+ SteamAPI_ISteamNetworkingSockets_SendMessageToConnection(
+ hSteamNetworkingSockets, client->connection,
+ pData, cbData, nSendFlags, NULL );
+ }
+}
+
+static void gameserver_populate_join_msg( int index, netmsg_playerjoin *msg ){
+ memset( msg, 0, sizeof(*msg) );
+ msg->inetmsg_id = k_inetmsg_playerjoin;
+ msg->index = index;
+ vg_strncpy( gameserver.clients[index].username, msg->username,
+ sizeof(msg->username), k_strncpy_always_add_null );
+}
+
+static void gameserver_player_join( int index ){
+ struct gameserver_client *joiner = &gameserver.clients[index];
+
+ netmsg_playerjoin join;
+ gameserver_populate_join_msg( index, &join );
+ gameserver_send_to_all( index, &join, sizeof(join),
+ k_nSteamNetworkingSend_Reliable );
+
+ /* update the joining user about current connections */
+ for( int i=0; i<vg_list_size(gameserver.clients); i++ ){
+ struct gameserver_client *client = &gameserver.clients[i];
+
+ if( (i==index) || !client->active )
+ continue;
+
+ netmsg_playerjoin init;
+ gameserver_populate_join_msg( i, &init );
+
+ SteamAPI_ISteamNetworkingSockets_SendMessageToConnection(
+ hSteamNetworkingSockets, joiner->connection,
+ &join, sizeof(join), k_nSteamNetworkingSend_Reliable, NULL );
+ }
+}
+
+static void gameserver_player_leave( int index ){
+ netmsg_playerjoin leave;
+ leave.inetmsg_id = k_inetmsg_playerleave;
+ leave.index = index;
+
+ vg_info( "Player leave (%d)\n", index );
+ gameserver_send_to_all( index, &leave, sizeof(leave),
+ k_nSteamNetworkingSend_Reliable );
+}
+