add sqlite and use it
[carveJwlIkooP6JGAAIwe30JlM.git] / gameserver.c
index b6ca2104a38324dcb1cce368e7e072801dd49be8..3b58b2360fda202c502d40a4c142849d200fdd8a 100644 (file)
@@ -9,15 +9,16 @@
 
 volatile sig_atomic_t sig_stop;
 
-static void inthandler( int signum ) {
-   sig_stop = 1;
-}
-
 #include "gameserver.h" 
 #include "highscores.c"
 #include "servermonitor_server.c"
 #include "vg/vg_opt.h"
 #include "network_common.h"
+#include "gameserver_db.h"
+
+static void inthandler( int signum ) {
+   sig_stop = 1;
+}
 
 static const u64 k_connection_unauthorized = 0xffffffffffffffff;
 
@@ -92,21 +93,16 @@ static void gameserver_player_join( int index ){
             username, size, k_nSteamNetworkingSend_Reliable, NULL );
 
       /* items */
-      chs = vg_strncpy( client->item_player, item->uid, ADDON_UID_MAX, 
-                        k_strncpy_always_add_null );
-      item->type = k_addon_type_player;
-      size = sizeof(netmsg_playeritem) + chs + 1;
-      SteamAPI_ISteamNetworkingSockets_SendMessageToConnection(
-            hSteamNetworkingSockets, joiner->connection,
-            item, size, k_nSteamNetworkingSend_Reliable, NULL );
-
-      chs = vg_strncpy( client->item_board, item->uid, ADDON_UID_MAX, 
-                        k_strncpy_always_add_null );
-      item->type = k_addon_type_board;
-      size = sizeof(netmsg_playeritem) + chs + 1;
-      SteamAPI_ISteamNetworkingSockets_SendMessageToConnection(
-            hSteamNetworkingSockets, joiner->connection,
-            item, size, k_nSteamNetworkingSend_Reliable, NULL );
+      for( int j=0; j<k_netmsg_playeritem_max; j++ ){
+         chs = vg_strncpy( client->items[j], item->uid, ADDON_UID_MAX, 
+                           k_strncpy_always_add_null );
+         item->type_index = j;
+         item->client = i;
+         size = sizeof(netmsg_playeritem) + chs + 1;
+         SteamAPI_ISteamNetworkingSockets_SendMessageToConnection(
+               hSteamNetworkingSockets, joiner->connection,
+               item, size, k_nSteamNetworkingSend_Reliable, NULL );
+      }
    }
 }
 
@@ -144,6 +140,7 @@ static void new_client_connecting( HSteamNetConnection client ){
             hSteamNetworkingSockets, client );
    if( accept_status == k_EResultOK ){
       vg_success( "Accepted client (id: %u, index: %d)\n", client, index );
+      memset( &gameserver.clients[index], 0, sizeof(struct gameserver_client) );
 
       gameserver.clients[index].active = 1;
       gameserver.clients[index].connection = client;
@@ -346,11 +343,10 @@ static void gameserver_rx_200_300( SteamNetworkingMessage_t *msg ){
                                            
       prop->inetmsg_id = k_inetmsg_playerusername;
       prop->index = client_id;
-      u32 chs = vg_strncpy( client->username, prop->name, name_len,
+      u32 chs = vg_strncpy( client->username, prop->name, NETWORK_USERNAME_MAX,
                             k_strncpy_always_add_null );
 
-      vg_info( "client #%d changed name to: %s [%s]\n", client_id, 
-               client->username, prop->name );
+      vg_info( "client #%d changed name to: %s\n", client_id, prop->name );
 
       u32 propsize = sizeof(netmsg_playerusername) + chs + 1;
       gameserver_send_to_all( client_id, prop, propsize,
@@ -365,14 +361,35 @@ static void gameserver_rx_200_300( SteamNetworkingMessage_t *msg ){
                               k_nSteamNetworkingSend_Unreliable );
    }
    else if( tmp->inetmsg_id == k_inetmsg_playeritem ){
-      netmsg_playeritem *item = alloca(msg->m_cbSize);
-      memcpy( item, msg->m_pData, msg->m_cbSize );
-      item->client = client_id;
+      netmsg_playeritem *item = msg->m_pData;
 
-      vg_info( "Client #%u equiped: [%u] %s\n", 
-               item->client, item->type, item->uid );
+      /* record */
+      struct gameserver_client *client = &gameserver.clients[ client_id ];
 
-      gameserver_send_to_all( client_id, item, msg->m_cbSize, 
+      if( item->type_index >= k_netmsg_playeritem_max ){
+         vg_warn( "Client #%d invalid equip type %u\n", 
+                  client_id, (u32)item->type_index );
+         return;
+      }
+      
+      char *dest = client->items[ item->type_index ];
+
+      network_msgstring( item->uid, msg->m_cbSize, sizeof(netmsg_playeritem),
+                         dest, ADDON_UID_MAX );
+
+      vg_info( "Client #%d equiped: [%s] %s\n", 
+               client_id, 
+               (const char *[]){[k_netmsg_playeritem_board]="board",
+                                [k_netmsg_playeritem_player]="player",
+                                [k_netmsg_playeritem_world0]="world0",
+                                [k_netmsg_playeritem_world1]="world1"
+               }[item->type_index], item->uid );
+                           
+      /* propogate */
+      netmsg_playeritem *prop = alloca(msg->m_cbSize);
+      memcpy( prop, msg->m_pData, msg->m_cbSize );
+      prop->client = client_id;
+      gameserver_send_to_all( client_id, prop, msg->m_cbSize, 
                               k_nSteamNetworkingSend_Reliable );
    }
 }
@@ -508,6 +525,19 @@ static void generate_boards(void){
 }
 
 int main( int argc, char *argv[] ){
+   db_init();
+   char table[DB_TABLE_UID_MAX];
+   if( db_get_highscore_table_name( "sr003-local-mp_mtzero", 
+                                    "megapark-yellow", 302, table ) ){
+      if( db_writeusertime( table, 76561198072130043, 232, 1 ) ){
+         vg_success( "Written time\n" );
+         i32 v = db_readusertime( table, 76561198072130043 );
+         vg_success( "Returned time: %u\n", v );
+      }
+   }
+   db_free();
+   return 0;
+
    signal( SIGINT, inthandler );
    signal( SIGQUIT, inthandler );
    signal( SIGPIPE, SIG_IGN );
@@ -525,7 +555,7 @@ int main( int argc, char *argv[] ){
 
    highscores_init( 250000, 10000 );
    
-   if( !highscores_read() )
+   if( !highscores_read(NULL) )
       highscores_create_db();
 
    steamworks_ensure_txt( "2103940" );
@@ -623,6 +653,7 @@ int main( int argc, char *argv[] ){
    
    vg_info( "Shutting down\n..." );
    SteamGameServer_Shutdown();
+   db_free();
 
    return 0;
 }