server version check
[carveJwlIkooP6JGAAIwe30JlM.git] / world_routes.c
index 36d70d79f9246194cf0227b87680ea74dc40eb2e..75ebae8af66a92afdc58d81eb1f6971d3ba89cb1 100644 (file)
 #include "world_gate.h"
 #include "world_load.h"
 #include "highscores.h"
+#include "network.h"
 
 #include "font.h"
 #include "pointcloud.h"
 #include "gui.h"
 #include "steam.h"
+#include "network_msg.h"
+#include "network_common.h"
 
 #include "shaders/scene_route.h"
 #include "shaders/routeui.h"
 
-
-static 
-void world_routes_local_set_record( world_instance *world, ent_route *route,
-                                    f64 lap_time )
-{
-   vg_success( "  NEW LAP TIME: %f\n", lap_time );
-
-   if( route->anon.official_track_id != 0xffffffff ){
-      double time_centiseconds = lap_time * 100.0;
-      if( time_centiseconds > (float)0xfffe )   /* skill issue */
-         return;
-
-      struct track_info *ti = &track_infos[ route->anon.official_track_id ];
-      highscore_record *record = &ti->record;
-      record->trackid  = route->anon.official_track_id;
-      record->datetime = time(NULL);
-      record->playerid = 0;
-      record->points   = 0;
-      record->time     = time_centiseconds;
-      ti->push = 1;
-      
-      if( ti->achievement_id ){
-         steam_set_achievement( ti->achievement_id );
-         steam_store_achievements();
-      }
-   }
-   else{
-      vg_warn( "There is no associated track for this record...\n" );
-   }
-}
-
-
 static void world_routes_clear( world_instance *world )
 {
    for( u32 i=0; i<mdl_arrcount( &world->ent_route ); i++ ){
@@ -114,8 +85,25 @@ static void world_routes_time_lap( world_instance *world, ent_route *route )
    vg_info( "%u %f\n", world_static.current_run_version, world_static.time );
 
    if( valid_count==route->checkpoints_count ){
-      double lap_time = world_static.time - start_time;
-      world_routes_local_set_record( world, route, lap_time );
+      f64 lap_time = world_static.time - start_time;
+      //world_routes_local_set_record( world, route, lap_time );
+
+      if( route->anon.official_track_id != 0xffffffff ){
+         struct track_info *ti = &track_infos[ route->anon.official_track_id ];
+         if( ti->achievement_id ){
+            steam_set_achievement( ti->achievement_id );
+            steam_store_achievements();
+         }
+      }
+
+      addon_alias *alias = 
+         &world_static.instance_addons[ world_static.active_instance ]->alias;
+
+      char mod_uid[ ADDON_UID_MAX ];
+      addon_alias_uid( alias, mod_uid );
+      network_publish_laptime( mod_uid, 
+                               mdl_pstr( &world->meta, route->pstr_name ),
+                               lap_time );
    }
 
    route->valid_checkpoints = valid_count+1;
@@ -850,7 +838,6 @@ static void world_gen_routes_generate( u32 instance_id ){
    if( instance_id <= 1 /*world_loader.generate_point_cloud*/ ){
       f64 area = 0.0;
 
-#if VG_RELEASE
       area = world_routes_scatter_surface_points( world, pcbuf, 16.0f );
       world_routes_surface_grid( world, pcbuf );
 
@@ -861,14 +848,11 @@ static void world_gen_routes_generate( u32 instance_id ){
                                         2.0f, 50.0f, 128, 
                                         (v4f){0.2f,0.2f,0.2f,1.0f} );
       }
-#endif
 
       vg_info( "Distributed %u points over %fkm^2!\n", 
                 pcbuf->count, area/1e6f );
 
-      world_write_preview( instance_id? world_static.addon_client:
-                                        world_static.addon_hub, 
-                                        pcbuf );
+      world_write_preview( world_static.instance_addons[ instance_id ], pcbuf );
       vg_async_dispatch( call_pointcloud, async_pointcloud_sub );
    }
 
@@ -937,14 +921,37 @@ static void world_gen_routes_ent_init( world_instance *world ){
    world_routes_clear( world );
 }
 
+static void world_routes_recv_scoreboard( world_instance *world, 
+                                          vg_msg *body, u32 route_id,
+                                          enum request_status status ){
+   if( route_id >= mdl_arrcount( &world->ent_route ) ){
+      vg_error( "Scoreboard route_id out of range (%u)\n", route_id );
+      return;
+   }
+
+   struct leaderboard_cache *board = &world->leaderboard_cache[ route_id ];
+   board->status = status;
+
+   if( body == NULL )
+      board->data_len = 0;
+
+   if( body->max > NETWORK_LEADERBOARD_MAX_SIZE ){
+      vg_error( "Scoreboard leaderboard too big (%u>%u)\n", body->max,
+                NETWORK_LEADERBOARD_MAX_SIZE );
+      return;
+   }
+
+   memcpy( board->data, body->buf, body->max );
+   board->data_len = body->max;
+}
+
 /* 
  * -----------------------------------------------------------------------------
  *                                    Events
  * -----------------------------------------------------------------------------
  */
 
-static void world_routes_init(void)
-{
+static void world_routes_init(void){
    world_static.current_run_version = 200;
    world_static.time = 300.0;
    world_static.last_use = 0.0;
@@ -953,8 +960,7 @@ static void world_routes_init(void)
    shader_routeui_register();
 }
 
-static void world_routes_update( world_instance *world )
-{
+static void world_routes_update( world_instance *world ){
    world_static.time += vg.time_delta;
 
    for( u32 i=0; i<mdl_arrcount(&world->ent_route); i++ ){