controls overlay
[carveJwlIkooP6JGAAIwe30JlM.git] / network.c
index ecd85878a60c0b8cc8931abfa9428bfa898920b9..05af285462444c8b5a9dfbeeda028e97d941de84 100644 (file)
--- a/network.c
+++ b/network.c
@@ -1,3 +1,8 @@
+#include "skaterift.h"
+#include "vg/vg_steam.h"
+#include "vg/vg_steam_networking.h"
+#include "vg/vg_steam_auth.h"
+#include "vg/vg_steam_friends.h"
 #include "player.h"
 #include "network.h"
 #include "network_msg.h"
 #include "world_sfd.h"
 #include "world_routes.h"
 #include "vg/vg_imgui.h"
+#include "gui.h"
+#include "ent_region.h"
+
+struct network_client network_client =
+{
+   .auth_mode = eServerModeAuthentication,
+   .state = k_ESteamNetworkingConnectionState_None,
+   .server_adress = "46.101.34.155",
+   .last_intent_change = -99999.9
+};
 
 static void scores_update(void);
 
-static int packet_minsize( SteamNetworkingMessage_t *msg, u32 size ){
+int packet_minsize( SteamNetworkingMessage_t *msg, u32 size ){
    if( msg->m_cbSize < size ) {
       vg_error( "Invalid packet size (must be at least %u)\n", size );
       return 0;
@@ -77,6 +92,26 @@ static void network_send_username(void){
          k_nSteamNetworkingSend_Reliable, NULL );
 }
 
+void network_send_region(void)
+{
+   if( !network_connected() )
+      return;
+   
+   netmsg_region *region = alloca( sizeof(netmsg_region) + NETWORK_REGION_MAX );
+
+   region->inetmsg_id = k_inetmsg_region;
+   region->client = 0;
+   region->flags = global_ent_region.flags;
+
+   u32 l = vg_strncpy( global_ent_region.location, region->loc, 
+                       NETWORK_REGION_MAX, k_strncpy_always_add_null );
+
+   SteamAPI_ISteamNetworkingSockets_SendMessageToConnection(
+         hSteamNetworkingSockets, network_client.remote, 
+         region, sizeof(netmsg_region)+l+1,
+         k_nSteamNetworkingSend_Reliable, NULL );
+}
+
 static void network_send_request( netmsg_request *req, vg_msg *body,
                                   void (*callback)( 
                                      netmsg_request *res, vg_msg *body, 
@@ -138,9 +173,9 @@ static void network_scoreboard_callback( netmsg_request *res, vg_msg *body,
  *   .
  *   10+ specific week index
  */
-static void network_request_scoreboard( const char *mod_uid, 
-                                        const char *route_uid,
-                                        u32 week, u64 userdata ){
+void network_request_scoreboard( const char *mod_uid, 
+                                 const char *route_uid,
+                                 u32 week, u64 userdata ){
    if( !network_connected() ) 
       return;
 
@@ -152,7 +187,7 @@ static void network_request_scoreboard( const char *mod_uid,
    vg_msg_wkvstr( &data, "endpoint", "scoreboard" );
    vg_msg_wkvstr( &data, "mod", mod_uid );
    vg_msg_wkvstr( &data, "route", route_uid );
-   vg_msg_wkvu32( &data, "week", week );
+   vg_msg_wkvnum( &data, "week", k_vg_msg_u32, 1, &week );
    network_send_request( req, &data, network_scoreboard_callback, userdata );
 }
 
@@ -163,8 +198,8 @@ 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 ){
+void network_publish_laptime( const char *mod_uid, 
+                              const char *route_uid, f64 lap_time ){
    if( !network_connected() )
       return;
 
@@ -178,7 +213,7 @@ static void network_publish_laptime( const char *mod_uid,
    vg_msg_wkvstr( &data, "endpoint", "setlap" );
    vg_msg_wkvstr( &data, "mod", mod_uid );
    vg_msg_wkvstr( &data, "route", route_uid );
-   vg_msg_wkvi32( &data, "time", time_centiseconds );
+   vg_msg_wkvnum( &data, "time", k_vg_msg_i32, 1, &time_centiseconds );
    network_send_request( req, &data, network_publish_callback, 0 );
 }
 
@@ -213,7 +248,8 @@ static void network_request_rx_300_400( SteamNetworkingMessage_t *msg ){
    }
 }
 
-static void network_send_item( enum netmsg_playeritem_type type ){
+void network_send_item( enum netmsg_playeritem_type type )
+{
    if( !network_connected() )
       return;
 
@@ -245,8 +281,6 @@ static void network_send_item( enum netmsg_playeritem_type type ){
          view_id = localplayer.playermodel_view_slot;
          addon_type = k_addon_type_player;
       }
-      else 
-         assert(0);
 
       struct addon_cache *cache = &addon_system.cache[addon_type];
       vg_pool *pool = &cache->pool;
@@ -278,62 +312,72 @@ static void network_disconnect(void){
    }
 }
 
-static void render_server_status_gui(void){
-   render_fb_bind( gpipeline.fb_workshop_preview, 0 );
-
-   /* HACK */
-       vg_ui.cur_vert = 0;
-       vg_ui.cur_indice = 0;
-   vg_ui.vert_start = 0;
-   vg_ui.indice_start = 0;
-
-   ui_rect r = { 0, 0, 128, 48 };
-   
-   char buf[128];
-   vg_str str;
-   vg_strnull( &str, buf, sizeof(buf) );
-
-   u32 bg = 0xff000000;
+void network_status_string( vg_str *str, u32 *colour )
+{
+   if( skaterift.demo_mode ){
+      vg_strcat( str, "Offline" );
+      return;
+   }
 
    if( steam_ready ){
       if( network_client.user_intent == k_server_intent_offline ){
-         vg_strcat( &str, "Offline" );
+         vg_strcat( str, "Offline" );
       }
       else {
          ESteamNetworkingConnectionState state = network_client.state;
 
          if( state == k_ESteamNetworkingConnectionState_None )
-            vg_strcat( &str, "No Connection" );
+            vg_strcat( str, "No Connection" );
          else if( state == k_ESteamNetworkingConnectionState_Connecting ){
-            vg_strcat( &str, "Connecting to:\nskaterift.com" );
+            vg_strcat( str, "Connecting to:\nskaterift.com" );
 
             if( network_client.retries ){
-               vg_strcat( &str, "\n(" );
-               vg_strcati32( &str, network_client.retries );
-               vg_strcat( &str, " retries)" );
+               vg_strcat( str, "\n(" );
+               vg_strcati32( str, network_client.retries );
+               vg_strcat( str, " retries)" );
             }
          }
          else if( state == k_ESteamNetworkingConnectionState_Connected ){
-            vg_strcat( &str, "Connected to:\nskaterift.com" );
-            bg = 0xff00a020;
+            vg_strcat( str, "Connected to:\nskaterift.com" );
+            *colour = 0xff00a020;
          }
          else if( state == k_ESteamNetworkingConnectionState_ClosedByPeer )
-            vg_strcat( &str, "Connection Closed" );
+            vg_strcat( str, "Connection Closed" );
          else if( state == k_ESteamNetworkingConnectionState_FindingRoute )
-            vg_strcat( &str, "Finding Route" );
+            vg_strcat( str, "Finding Route" );
          else if( state ==
                k_ESteamNetworkingConnectionState_ProblemDetectedLocally){
-            vg_strcat( &str, "Problem Detected\nLocally" );
-            bg = 0xff0000a0;
+            vg_strcat( str, "Problem Detected\nLocally" );
+            *colour = 0xff0000a0;
          }
          else
-            vg_strcat( &str, "???" );
+            vg_strcat( str, "???" );
       }
    }
    else {
-      vg_strcat( &str, "No Steam Connection" );
-      bg = 0xff0000a0;
+      vg_strcat( str, "Steam Offline" );
+      *colour = 0xff0000a0;
    }
+}
+
+void render_server_status_gui(void)
+{
+   render_fb_bind( gpipeline.fb_workshop_preview, 0 );
+
+   /* HACK */
+       vg_ui.cur_vert = 0;
+       vg_ui.cur_indice = 0;
+   vg_ui.vert_start = 0;
+   vg_ui.indice_start = 0;
+
+   ui_rect r = { 0, 0, 128, 48 };
+   
+   char buf[128];
+   vg_str str;
+   vg_strnull( &str, buf, sizeof(buf) );
+
+   u32 bg = 0xff000000;
+   network_status_string( &str, &bg );
 
    ui_fill( r, bg );
    ui_text( r, buf, 1, k_ui_align_center, 0 );
@@ -455,6 +499,7 @@ static void network_sign_on_complete(void){
    for( u32 i=0; i<k_netmsg_playeritem_max; i ++ ){
       network_send_item(i);
    }
+   network_send_region();
 }
 
 static void poll_remote_connection(void){
@@ -507,7 +552,8 @@ static void poll_remote_connection(void){
    }
 }
 
-static void network_update(void){
+void network_update(void)
+{
    if( !steam_ready )
       return;
 
@@ -527,7 +573,7 @@ static void network_update(void){
       if( frame_delta > NETWORK_FRAMERATE ){
          network_client.last_frame = vg.time_real;
          remote_player_send_playerframe();
-         player__clear_sfx_buffer();
+         localplayer.sfx_buffer_count = 0;
       }
 
       remote_player_debug_update();
@@ -554,7 +600,8 @@ static void network_update(void){
    }
 }
 
-static void chat_send_message( const char *message ){
+void chat_send_message( const char *message )
+{
    if( !network_connected() ){
       return;
    }
@@ -588,9 +635,12 @@ static int cmd_network_send_message( int argc, const char *argv[] ){
    return 0;
 }
 
-static void network_init(void){
+void network_init(void)
+{
    vg_console_reg_var( "network_info", &network_client.network_info,
                        k_var_dtype_i32, VG_VAR_PERSISTENT );
+   vg_console_reg_var( "auto_connect", &network_client.auto_connect,
+                       k_var_dtype_i32, VG_VAR_PERSISTENT );
    if( steam_ready ){
       u32 alloc_size = sizeof(struct network_request)*NETWORK_MAX_REQUESTS;
       network_client.request_buffer = 
@@ -614,7 +664,8 @@ static void network_init(void){
    }
 }
 
-static void network_end(void){
+void network_end(void)
+{
    /* TODO: Send buffered highscores that were not already */
    if( (network_client.state == k_ESteamNetworkingConnectionState_Connected) ||
        (network_client.state == k_ESteamNetworkingConnectionState_Connecting) )