+#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;
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,
* .
* 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;
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 );
}
}
}
-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;
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 );
}
}
}
-static void network_send_item( enum netmsg_playeritem_type type ){
+void network_send_item( enum netmsg_playeritem_type type )
+{
if( !network_connected() )
return;
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;
}
}
-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 );
for( u32 i=0; i<k_netmsg_playeritem_max; i ++ ){
network_send_item(i);
}
+ network_send_region();
}
static void poll_remote_connection(void){
}
}
-static void network_update(void){
+void network_update(void)
+{
if( !steam_ready )
return;
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();
}
}
-static void chat_send_message( const char *message ){
+void chat_send_message( const char *message )
+{
if( !network_connected() ){
return;
}
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 );
if( steam_ready ){
}
}
-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) )