add recieving code
[carveJwlIkooP6JGAAIwe30JlM.git] / network.c
index da0be1e392e07fc65f7df722041a4c913e2af1a9..2219a1ce8cedd8b3b8e9999ad1f3c2fcee1ca7cd 100644 (file)
--- a/network.c
+++ b/network.c
@@ -137,7 +137,7 @@ static void network_scoreboard_callback( netmsg_request *res, vg_msg *body,
 static void network_request_scoreboard( const char *mod_uid, 
                                         const char *route_uid,
                                         u32 week, u64 userdata ){
-   if( !network_client.remote )
+   if( !network_connected() ) 
       return;
 
    netmsg_request *req = alloca( sizeof(netmsg_request) + 512 );
@@ -161,7 +161,7 @@ static void network_publish_callback( netmsg_request *res, vg_msg *body,
 
 static void network_publish_laptime( const char *mod_uid, 
                                      const char *route_uid, f64 lap_time ){
-   if( !network_client.remote )
+   if( !network_connected() )
       return;
 
    i32 time_centiseconds = lap_time * 100.0;
@@ -210,7 +210,7 @@ static void network_request_rx_300_400( SteamNetworkingMessage_t *msg ){
 }
 
 static void network_send_item( enum netmsg_playeritem_type type ){
-   if( !network_client.remote )
+   if( !network_connected() )
       return;
 
    netmsg_playeritem *item = 
@@ -326,27 +326,44 @@ static void on_server_connect_status( CallbackMsg_t *msg ){
 }
 
 static void on_persona_state_change( CallbackMsg_t *msg ){
-   if( network_client.remote ){
-      PersonaStateChange_t *info = (void *)msg->m_pubParam;
+   if( !network_connected() )
+      return;
 
-      ISteamUser *hSteamUser = SteamAPI_SteamUser();
-   
-      vg_info( "User: %llu, change: %u\n", info->m_ulSteamID, 
-                                           info->m_nChangeFlags );
+   PersonaStateChange_t *info = (void *)msg->m_pubParam;
+   ISteamUser *hSteamUser = SteamAPI_SteamUser();
+
+   vg_info( "User: %llu, change: %u\n", info->m_ulSteamID, 
+                                        info->m_nChangeFlags );
+
+   if( info->m_ulSteamID == SteamAPI_ISteamUser_GetSteamID(hSteamUser) ){
+      if( info->m_nChangeFlags & k_EPersonaChangeName ){
+         network_send_username();
+      }
+   }
 
-      if( info->m_ulSteamID == SteamAPI_ISteamUser_GetSteamID(hSteamUser) ){
-         if( info->m_nChangeFlags & k_EPersonaChangeName ){
-            network_send_username();
+   if( info->m_nChangeFlags & k_EPersonaChangeRelationshipChanged ){
+      for( u32 i=0; i<NETWORK_MAX_PLAYERS; i ++ ){
+         struct network_player *rp = &netplayers.list[i];
+         if( rp->steamid == info->m_ulSteamID ){
+            player_remote_update_friendflags( rp );
          }
       }
    }
 }
 
 static void network_connect(void){
+   char ip_buf[128];
+   vg_str str;
+   vg_strnull( &str, ip_buf, sizeof(ip_buf) );
+   vg_strcat( &str, network_client.server_adress );
+   vg_strcat( &str, ":" );
+   vg_strcati32( &str, NETWORK_PORT );
+
+   if( !vg_strgood(&str) ) return;
+
    /* Connect to server if not connected */
    SteamNetworkingIPAddr remoteAddr;
-   SteamAPI_SteamNetworkingIPAddr_ParseString( &remoteAddr, 
-                                               network_client.server_adress );
+   SteamAPI_SteamNetworkingIPAddr_ParseString( &remoteAddr, str.buffer );
 
    char buf[256];
    SteamAPI_SteamNetworkingIPAddr_ToString( &remoteAddr, buf, 256, 1 );
@@ -430,6 +447,40 @@ static void network_update(void){
    }
 }
 
+static void chat_send_message( const char *message ){
+   if( !network_connected() ){
+      return;
+   }
+
+   netmsg_chat *chat = alloca( sizeof(netmsg_chat) + NETWORK_MAX_CHAT );
+   chat->inetmsg_id = k_inetmsg_chat;
+   chat->client = 0;
+
+   u32 l = vg_strncpy( message, chat->msg, NETWORK_MAX_CHAT, 
+                       k_strncpy_always_add_null );
+
+   SteamAPI_ISteamNetworkingSockets_SendMessageToConnection(
+         hSteamNetworkingSockets, network_client.remote, 
+         chat, sizeof(netmsg_chat)+l+1,
+         k_nSteamNetworkingSend_Reliable, NULL );
+}
+
+static int cmd_network_send_message( int argc, const char *argv[] ){
+   char buf[ NETWORK_MAX_CHAT ];
+   vg_str str;
+   vg_strnull( &str, buf, NETWORK_MAX_CHAT );
+
+   for( int i=0; i<argc; i ++ ){
+      vg_strcat( &str, argv[i] );
+
+      if( i < argc-1 )
+         vg_strcatch( &str, ' ' );
+   }
+
+   chat_send_message( buf );
+   return 0;
+}
+
 static void network_init(void){
    vg_console_reg_var( "network_info", &network_client.network_info,
                        k_var_dtype_i32, VG_VAR_PERSISTENT );
@@ -451,6 +502,8 @@ static void network_init(void){
       steam_register_callback( k_iPersonaStateChange, 
                                on_persona_state_change );
       request_auth_ticket();
+
+      vg_console_reg_cmd( "say", cmd_network_send_message, NULL );
    }
 }