connection semantics
[carveJwlIkooP6JGAAIwe30JlM.git] / world_routes.c
index b271faa7bffd8b142c3303d11e828d231e11883e..52c2c2aa76ad4afad3d10211fcca13afb1e99c5b 100644 (file)
@@ -17,6 +17,8 @@
 #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"
@@ -126,14 +128,11 @@ static void world_routes_time_lap( world_instance *world, ent_route *route )
          }
       }
 
-      addon_alias *alias = &world_static.addon_hub->alias;
-      if( world_static.active_instance )
-         alias = &world_static.addon_client->alias;
+      addon_alias *alias = 
+         &world_static.instance_addons[ world_static.active_instance ]->alias;
 
-      /* TODO: we should probably generate this once. and also ditch 
-       *       sub-worlds */
       char mod_uid[ ADDON_UID_MAX ];
-      addon_alias_uid( &world_static.addon_client->alias, mod_uid );
+      addon_alias_uid( alias, mod_uid );
       network_publish_laptime( mod_uid, 
                                mdl_pstr( &world->meta, route->pstr_name ),
                                lap_time );
@@ -887,9 +886,7 @@ static void world_gen_routes_generate( u32 instance_id ){
       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 );
    }
 
@@ -958,14 +955,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;
@@ -974,8 +994,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++ ){