X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=network.h;h=b6cb5660e497e36d28e161794a06d2601b04c2de;hb=89032d64e2867adb66e4598a0c66d3e853a22bb0;hp=ee0f334d5cb04156dda91cac833cdcbd8cd04b9c;hpb=5ee174baa9b2c30e01dc0ca0dfa38f916f805636;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/network.h b/network.h index ee0f334..b6cb566 100644 --- a/network.h +++ b/network.h @@ -4,10 +4,12 @@ #include "vg/vg_stdint.h" #include "steam.h" #include "network_msg.h" +#include "highscores.h" /* * Interface */ +#define SR_USE_LOCALHOST /* Call it at start; Connects us to the gameserver */ static void network_init(void); @@ -35,6 +37,7 @@ static void network_submit_highscore( u32 trackid, u16 points, u16 time ); */ static u8 steam_app_ticket[ 1024 ]; static u32 steam_app_ticket_length; +static int network_name_update = 1; static HSteamNetConnection cremote; static ESteamNetworkingConnectionState cremote_state = @@ -89,14 +92,107 @@ static void request_auth_ticket(void) NULL, 0 ); } -static void server_connect(void) +static void send_auth_ticket(void) { - /* Connect to server if not connected */ + u32 size = sizeof(netmsg_auth) + steam_app_ticket_length; + netmsg_auth *auth = alloca(size); + + auth->inetmsg_id = k_inetmsg_auth; + auth->ticket_length = steam_app_ticket_length; + for( int i=0; iticket[i] = steam_app_ticket[i]; + + SteamAPI_ISteamNetworkingSockets_SendMessageToConnection( + hSteamNetworkingSockets, cremote, auth, size, + k_nSteamNetworkingSend_Reliable, NULL ); +} + +static void send_score_request(void) +{ + vg_info( "Requesting scores\n" ); + netmsg_scores_request req; + req.inetmsg_id = k_inetmsg_scores_request; + + SteamAPI_ISteamNetworkingSockets_SendMessageToConnection( + hSteamNetworkingSockets, cremote, &req, sizeof(netmsg_scores_request), + k_nSteamNetworkingSend_Reliable, NULL ); +} + +static void send_score_update(void) +{ + vg_info( "Sending scores\n" ); + u32 size = sizeof(netmsg_set_score) + + 1 * sizeof(struct netmsg_score_record); + + netmsg_set_score *setscore = alloca( size ); + setscore->inetmsg_id = k_inetmsg_set_score; + setscore->record_count = 1; + setscore->records[0].trackid = 0; + setscore->records[0].playerid = 0; + setscore->records[0].points = 1386; + setscore->records[0].time = 19432; + + SteamAPI_ISteamNetworkingSockets_SendMessageToConnection( + hSteamNetworkingSockets, cremote, setscore, size, + k_nSteamNetworkingSend_Reliable, NULL ); +} + +static void send_nickname(void) +{ + netmsg_set_nickname nick; + nick.inetmsg_id = k_inetmsg_set_nickname; + + memset( nick.nickname, 0, 10 ); + strcpy( nick.nickname, "real H" ); + SteamAPI_ISteamNetworkingSockets_SendMessageToConnection( + hSteamNetworkingSockets, cremote, &nick, sizeof(netmsg_set_nickname), + k_nSteamNetworkingSend_Reliable, NULL ); + + network_name_update = 0; +} + +static void server_routine_update(void) +{ + send_auth_ticket(); + + if( network_name_update ) + send_nickname(); + + send_score_update(); + send_score_request(); +} + +static void on_server_connect_status( CallbackMsg_t *msg ) +{ + SteamNetConnectionStatusChangedCallback_t *info = (void *)msg->m_pubParam; + vg_info( " Connection status changed for %lu\n", info->m_hConn ); + vg_info( " %s -> %s\n", + string_ESteamNetworkingConnectionState(info->m_eOldState), + string_ESteamNetworkingConnectionState(info->m_info.m_eState) ); + + if( info->m_hConn == cremote ) + { + cremote_state = info->m_info.m_eState; + if( info->m_info.m_eState == + k_ESteamNetworkingConnectionState_Connected ) + { + vg_success(" Connected to remote server.. running updates\n"); + server_routine_update(); + } + } + else + { + vg_warn( " Recieved signal from unknown connection\n" ); + } +} + +static void network_connect_gc(void) +{ + /* Connect to server if not connected */ SteamNetworkingIPAddr remoteAddr; -#define USE_LOCALHOST -#ifdef USE_LOCALHOST +#ifdef SR_USE_LOCALHOST SteamAPI_SteamNetworkingIPAddr_SetIPv6LocalHost( &remoteAddr, 27402 ); #else const char *server_lon1 = "46.101.34.155:27402"; @@ -111,55 +207,38 @@ static void server_connect(void) hSteamNetworkingSockets, &remoteAddr, 0, NULL ); } -static void send_auth_ticket(void) +static void on_inet_scoreboard( SteamNetworkingMessage_t *msg ) { - u32 size = sizeof(netmsg_auth) + steam_app_ticket_length; - netmsg_auth *auth = malloc(size); - - auth.inetmsg_id = k_inetmsg_auth; - auth.ticket_length = steam_app_ticket_length; - for( int i=0; im_pData; -static void scores_update(void) -{ - vg_log( "scores_update()\n" ); + u32 base_size = sizeof(netmsg_scoreboard)- + sizeof(struct netmsg_board)*vg_list_size(track_infos), + expected = base_size+sizeof(struct netmsg_board)*sb->board_count; - if( cremote_state == k_ESteamNetworkingConnectionState_Connected ) + if( msg->m_cbSize != expected ) { - /* - * request updated scores, this does not require any authentication. - */ - netmsg_scores_request req; - req.inetmsg_id = k_inetmsg_scores_request; - - SteamAPI_ISteamNetworkingSockets_SendMessageToConnection( - hSteamNetworkingSockets, cremote, &req, - sizeof(netmsg_scores_request), - k_nSteamNetworkingSend_Reliable, NULL ); - - /* - * Send record update, it requires authentication - */ - if( steam_app_ticket_length ) - { - } + vg_error( "Server scoreboard was corrupted. Size: %u != %u\n", + msg->m_cbSize, expected ); } else { - /* - * if we are not connected, make a connection to the server and then in - * the future this function will be called again when it is connected - */ - server_connect(); + if( vg_list_size(track_infos) > sb->board_count ) + vg_warn( "Server is out of date, not enough boards recieved\n"); + else if( vg_list_size(track_infos) < sb->board_count ) + vg_warn( "Client out of date, server sent more boards than we have\n"); + else + vg_success( "Recieved new scoreboards from server\n" ); + + for( int i=0; i < vg_min(sb->board_count,vg_list_size(track_infos)); i++) + { + scoreboard_client_data.boards[i] = sb->boards[i]; + highscores_board_printf( stdout, sb->boards[i].data, 10 ); + } } + + /* We dont need to stay on the server currently */ + SteamAPI_ISteamNetworkingSockets_CloseConnection( + hSteamNetworkingSockets, cremote, 0, NULL, 1 ); } static void poll_connection(void) @@ -181,54 +260,52 @@ static void poll_connection(void) if( msg->m_cbSize < sizeof(netmsg_blank) ) { - vg_warn( "Discarding message (too small: %d)\n", - msg->m_cbSize ); + vg_warn( "Discarding message (too small: %d)\n", msg->m_cbSize ); continue; } netmsg_blank *tmp = msg->m_pData; - if( tmp->inetmsg_id == k_inetmsg_scores_info ) - { - netmsg_scores_info *info = msg->m_pData; - vg_log( "Recieved %u score records\n", info->record_count ); - SteamAPI_ISteamNetworkingSockets_CloseConnection( - hSteamNetworkingSockets, cremote, 0, NULL, 1 ); - cremote_state = k_ESteamNetworkingConnectionState_None; - } + if( tmp->inetmsg_id == k_inetmsg_scoreboard ) + on_inet_scoreboard( msg ); SteamAPI_SteamNetworkingMessage_t_Release( msg ); } } } -static u64 in_server_ticks( double seconds ) +/* + * Subroutine to be connected to main game loop, runs all routines on timers + */ +static void network_update(void) { - return (u64)(seconds / 0.1); -} + if( steam_ready ) + { + static double last_update = 0.0; + poll_connection(); + + if( vg_time > (last_update + 60.0) ) + { + last_update = vg_time; -static void on_server_connect_status( CallbackMsg_t *msg ) -{ - SteamNetConnectionStatusChangedCallback_t *info = (void *)msg->m_pubParam; - vg_info( " Connection status changed for %lu\n", info->m_hConn ); - vg_info( " %s -> %s\n", - string_ESteamNetworkingConnectionState(info->m_info.m_eState), - string_ESteamNetworkingConnectionState(info->m_eOldState) ); + if( steam_app_ticket_length ) + { + network_connect_gc(); + } + else + { + vg_log( "Not making remote connection; app ticket not gotten\n" ); + } + } - if( info->m_hConn == cremote ) - { - cremote_state = info->m_info.m_eState; - if( info->m_info.m_eState == - k_ESteamNetworkingConnectionState_Connected ) + if( vg_time > (last_update + 10.0) && + (cremote_state == k_ESteamNetworkingConnectionState_Connected )) { - vg_success(" Connected to remote server\n"); - scores_update(); + vg_warn( "Connected to server but no return... disconnecting\n" ); + SteamAPI_ISteamNetworkingSockets_CloseConnection( + hSteamNetworkingSockets, cremote, 0, NULL, 1 ); } } - else - { - vg_warn( " Recieved signal from unknown connection\n" ); - } } static void network_init(void) @@ -241,24 +318,15 @@ static void network_init(void) } } -static void network_update(void) -{ - if( steam_ready ) - { - static double last_update = -9000.0; - poll_connection(); - - if( vg_time > (last_update + 60.0) ) - { - last_update = vg_time; - scores_update(); - } - } -} - static void network_end(void) { /* TODO: Fire off any buffered highscores that need to be setn */ + if( cremote_state == k_ESteamNetworkingConnectionState_Connected || + cremote_state == k_ESteamNetworkingConnectionState_Connecting ) + { + SteamAPI_ISteamNetworkingSockets_CloseConnection( + hSteamNetworkingSockets, cremote, 0, NULL, 1 ); + } } #endif