#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++ ){
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;
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 );
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 );
}
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;
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++ ){