test network 1
[carveJwlIkooP6JGAAIwe30JlM.git] / player_remote.c
1 #include "player_remote.h"
2
3 static void player_remote_unwatch( struct network_player *player ){
4 addon_cache_unwatch( k_addon_type_player, player->playermodel_view_slot );
5 addon_cache_unwatch( k_addon_type_board, player->board_view_slot );
6 }
7
8 static void player_remote_clear( struct network_player *player ){
9 player_remote_unwatch( player );
10 memset( player, 0, sizeof(*player) );
11 strcpy( player->username, "unknown" );
12 player->subsystem = k_player_subsystem_invalid;
13 }
14
15 static void player_remote_packet( SteamNetworkingMessage_t *msg ){
16 netmsg_blank *tmp = msg->m_pData;
17
18 if( tmp->inetmsg_id == k_inetmsg_playerjoin ){
19 netmsg_playerjoin *playerjoin = msg->m_pData;
20
21 if( playerjoin->index < vg_list_size(netplayers.list) ){
22 struct network_player *player = &netplayers.list[ playerjoin->index ];
23 player_remote_clear( player );
24 player->active = 1;
25
26 /* TODO: interpret the uids */
27 player->board_view_slot = 0;
28 player->playermodel_view_slot = 0;
29 }
30 else {
31 vg_error( "inetmsg_playerjoin: player index out of range\n" );
32 }
33 }
34 else if( tmp->inetmsg_id == k_inetmsg_playerleave ){
35 netmsg_playerleave *playerleave = msg->m_pData;
36
37 if( playerleave->index < vg_list_size(netplayers.list) ){
38 struct network_player *player = &netplayers.list[ playerleave->index ];
39 player_remote_unwatch( player );
40 player->active = 0;
41 }
42 else {
43 vg_error( "inetmsg_playerleave: player index out of range\n" );
44 }
45 }
46 }
47
48 static void remote_player_network_imgui(void){
49 if( !network_client.network_info )
50 return;
51
52 ui_rect panel = { (vg.window_x / 2) - 200, 0, 400, 600 };
53 ui_fill( panel, (ui_colour(k_ui_bg)&0x00ffffff)|0x50000000 );
54
55 char buf[512];
56 const char *netstatus = "PROGRAMMING ERROR";
57
58 struct { enum ESteamNetworkingConnectionState state; const char *str; }
59 states[] = {
60 { k_ESteamNetworkingConnectionState_None, "None" },
61 { k_ESteamNetworkingConnectionState_Connecting, "Connecting" },
62 { k_ESteamNetworkingConnectionState_FindingRoute, "Finding Route" },
63 { k_ESteamNetworkingConnectionState_Connected, "Connected" },
64 { k_ESteamNetworkingConnectionState_ClosedByPeer, "Closed by peer" },
65 { k_ESteamNetworkingConnectionState_ProblemDetectedLocally,
66 "Problem Detected Locally" },
67 { k_ESteamNetworkingConnectionState_FinWait, "Fin Wait" },
68 { k_ESteamNetworkingConnectionState_Linger, "Linger" },
69 { k_ESteamNetworkingConnectionState_Dead, "Dead" }
70 };
71 for( u32 i=0; i<vg_list_size(states); i ++ ){
72 if( states[i].state == network_client.state ){
73 netstatus = states[i].str;
74 break;
75 }
76 }
77 snprintf( buf, 512, "Network: %s", netstatus );
78 ui_info( panel, buf );
79 ui_info( panel, "---------------------" );
80
81 for( u32 i=0; i<vg_list_size(netplayers.list); i++ ){
82 struct network_player *player = &netplayers.list[i];
83 if( player->active ){
84 const char *sysname = "invalid";
85
86 if( (player->subsystem >= 0) &&
87 (player->subsystem < k_player_subsystem_max) ){
88 sysname = player_subsystems[ player->subsystem ]->name;
89 }
90 snprintf( buf, 512, "#%u: %s [%s]", i, player->username, sysname );
91 ui_info( panel, buf );
92 }
93 }
94 }