remote items test
authorhgn <hgodden00@gmail.com>
Sun, 1 Oct 2023 05:38:36 +0000 (06:38 +0100)
committerhgn <hgodden00@gmail.com>
Sun, 1 Oct 2023 05:38:36 +0000 (06:38 +0100)
13 files changed:
addon.c
addon.h
addon_types.h
ent_skateshop.c
gameserver.c
gameserver.h
network.c
network.h
network_common.h
network_msg.h
player.c
player_remote.c
skaterift.c

diff --git a/addon.c b/addon.c
index c387edd6379a7f29cb893e15045e2a0e06bd5fb9..4ac9f91bc1443fc096b0e2d59329fe133051c3df 100644 (file)
--- a/addon.c
+++ b/addon.c
@@ -718,7 +718,7 @@ static u16 addon_cache_create_viewer( enum addon_type type, u16 reg_id ){
 static u16 addon_cache_create_viewer_from_uid( enum addon_type type,
                                                char uid[ADDON_UID_MAX] ){
    addon_alias q;
-   addon_uid_to_alias( uid, &q );
+   if( !addon_uid_to_alias( uid, &q ) ) return 0;
    if( q.type != type ) return 0;
 
    u32 reg_id = addon_match( &q );
diff --git a/addon.h b/addon.h
index 2b9d9ac4f7906e9af0ce3142b0ba12a5fe95fb14..384c9d7d10b2cf778f8a1b8c7392a8f39cfffa07 100644 (file)
--- a/addon.h
+++ b/addon.h
@@ -1,14 +1,6 @@
 #ifndef ADDON_H
 #define ADDON_H
 
-#define ADDON_FOLDERNAME_MAX 64
-
-/* total count that we have knowledge of */
-#define ADDON_MOUNTED_MAX 128
-#define ADDON_UID_MAX 76
-
-#ifndef ADDON_DEFINE_ONLY
-
 #include "skaterift.h"
 #include "vg/vg_steam_ugc.h"
 #include "addon_types.h"
@@ -104,5 +96,4 @@ static void addon_cache_unwatch( enum addon_type type, u16 cache_id );
 static u16 addon_cache_create_viewer_from_uid( enum addon_type type,
                                                char uid[ADDON_UID_MAX] );
 
-#endif
 #endif /* ADDON_H */
index fa8ab96a7cf286bf45a8420fc0974d0cd2706c08..b916dd0af0aeeb83096d17eb11163285a8cd52ff 100644 (file)
@@ -9,6 +9,12 @@ enum addon_type{
    k_addon_type_max
 };
 
+#define ADDON_FOLDERNAME_MAX 64
+
+/* total count that we have knowledge of */
+#define ADDON_MOUNTED_MAX 128
+#define ADDON_UID_MAX 76
+
 #ifdef VG_GAME
 
 #include "vg/vg_stdint.h"
@@ -25,12 +31,12 @@ static addon_type_infos[] = {
    [k_addon_type_board] = { 
       .local_content_folder = "boards/",
       .cache_stride = sizeof(struct player_board),
-      .cache_count  = 10
+      .cache_count  = 20
    },
    [k_addon_type_player] = {
       .local_content_folder = "playermodels/",
       .cache_stride = sizeof(struct player_model),
-      .cache_count  = 10
+      .cache_count  = 20
    },
    [k_addon_type_world] = {
       .local_content_folder = "maps/"
index a4cfe22d526afb8cf1a20e9bd9c07468b6085fc6..957c250f20f89159c27e957127448fe58c5354c2 100644 (file)
@@ -15,6 +15,7 @@
 #include "steam.h"
 #include "addon.h"
 #include "save.h"
+#include "network.h"
 
 /*
  * Checks string equality but does a hash check first
@@ -74,11 +75,30 @@ static void board_scan_thread( void *_args ){
    board_processview_thread(NULL);
 }
 
+/* TODO: migrate to addon.c */
 static void skateshop_op_board_scan(void){
    vg_loader_start( board_scan_thread, NULL );
 }
 
-static void skateshop_op_processview(void){
+/* TODO: migrate to addon.c */
+static void skateshop_autostart_loading(void){
+   if( !vg_loader_availible() ) return;
+
+   SDL_AtomicLock( &addon_system.sl_cache_using_resources );
+   for( u32 type=0; type<k_addon_type_max; type++ ){
+      struct addon_cache *cache = &addon_system.cache[type];
+
+      for( u32 id=1; id<=cache->pool.count; id++ ){
+         addon_cache_entry *entry = vg_pool_item( &cache->pool, id );
+         if( entry->state == k_addon_cache_state_load_request ){
+            SDL_AtomicUnlock( &addon_system.sl_cache_using_resources );
+            goto launch;
+         }
+      }
+   }
+   SDL_AtomicUnlock( &addon_system.sl_cache_using_resources );
+   return;
+launch:
    vg_loader_start( board_processview_thread, NULL );
 }
 
@@ -232,7 +252,7 @@ static void ent_skateshop_preupdate( ent_skateshop *shop, int active ){
 
       if( opage != npage ){
          skateshop_update_viewpage();
-         skateshop_op_processview();
+         //skateshop_op_processview();
       }
       else if( cache_id && button_down( k_srbind_maccept )){
          vg_info( "chose board from skateshop (%u)\n", 
@@ -241,6 +261,7 @@ static void ent_skateshop_preupdate( ent_skateshop *shop, int active ){
          addon_cache_unwatch( k_addon_type_board, localplayer.board_view_slot );
          addon_cache_watch( k_addon_type_board, cache_id );
          localplayer.board_view_slot = cache_id;
+         network_send_item( k_addon_type_board );
 
          world_entity_unfocus();
          skaterift_autosave(1);
@@ -282,10 +303,11 @@ static void ent_skateshop_preupdate( ent_skateshop *shop, int active ){
 
       if( changed ){
          player__use_model( global_skateshop.selected_player_id );
-         skateshop_op_processview();
+         //skateshop_op_processview();
       }
 
       if( button_down( k_srbind_maccept ) ){
+         network_send_item( k_addon_type_player );
          world_entity_unfocus();
       }
    }
@@ -308,8 +330,7 @@ static void ent_skateshop_preupdate( ent_skateshop *shop, int active ){
 
       if( browseable ){
          if( button_down( k_srbind_mleft ) ){
-            if( global_skateshop.selected_world_id > 0 )
-            {
+            if( global_skateshop.selected_world_id > 0 ){
                global_skateshop.selected_world_id --;
                change = 1;
             }
@@ -368,6 +389,9 @@ static void ent_skateshop_preupdate( ent_skateshop *shop, int active ){
    }
 
    if( button_down( k_srbind_mback ) ){
+      if( shop->type == k_skateshop_type_charshop )
+         network_send_item( k_addon_type_player );
+
       world_entity_unfocus();
       return;
    }
index 5ed561249c707d3e132440a50ea9927788345379..abd5aaa13666a129d07fb54eab0f670b337a0ed7 100644 (file)
@@ -60,10 +60,14 @@ static void gameserver_player_join( int index ){
 
    /* update the joining user about current connections */
 
-   netmsg_playerusername *username = alloca( sizeof(netmsg_playerusername) + 
-                                             NETWORK_USERNAME_MAX );
+   netmsg_playerusername *username = 
+      alloca( sizeof(netmsg_playerusername) + NETWORK_USERNAME_MAX );
    username->inetmsg_id = k_inetmsg_playerusername;
 
+   netmsg_playeritem *item = 
+      alloca( sizeof(netmsg_playeritem) + ADDON_UID_MAX );
+   item->inetmsg_id = k_inetmsg_playeritem;
+
    for( int i=0; i<vg_list_size(gameserver.clients); i++ ){
       struct gameserver_client *client = &gameserver.clients[i];
 
@@ -86,6 +90,23 @@ static void gameserver_player_join( int index ){
       SteamAPI_ISteamNetworkingSockets_SendMessageToConnection(
             hSteamNetworkingSockets, joiner->connection,
             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 );
    }
 }
 
@@ -337,13 +358,23 @@ static void gameserver_rx_200_300( SteamNetworkingMessage_t *msg ){
    }
    else if( tmp->inetmsg_id == k_inetmsg_playerframe ){
       /* propogate */
-
       netmsg_playerframe *frame = alloca(msg->m_cbSize);
       memcpy( frame, msg->m_pData, msg->m_cbSize );
       frame->client = client_id;
       gameserver_send_to_all( client_id, frame, msg->m_cbSize, 
                               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;
+
+      vg_info( "Client #%u equiped: [%u] %s\n", 
+               item->client, item->type, item->uid );
+
+      gameserver_send_to_all( client_id, item, msg->m_cbSize, 
+                              k_nSteamNetworkingSend_Reliable );
+   }
 }
 
 #if 0
index a3aa574b8114f539cd0b2424ebbbfe4f19d8ab2b..26099a612dfd74b046f530d96573b438ce3a133e 100644 (file)
@@ -21,6 +21,8 @@ struct {
       int authenticated;
       HSteamNetConnection connection;
       char username[ NETWORK_USERNAME_MAX ];
+
+      char item_board[ ADDON_UID_MAX ], item_player[ ADDON_UID_MAX ];
    }
    clients[ 32 ];
 
index 53ebd4bc0bf63ed0e17dfae9e21f806db0e3f411..4768ece1a14ebcd32129b6e2f49e672f95313582 100644 (file)
--- a/network.c
+++ b/network.c
@@ -147,6 +147,40 @@ static void network_send_username(void){
          k_nSteamNetworkingSend_Reliable, NULL );
 }
 
+static void network_send_item( enum addon_type type ){
+   if( network_client.remote ){
+      u16 id = 0;
+      if( type == k_addon_type_board )
+         id = localplayer.board_view_slot;
+      else if( type == k_addon_type_player )
+         id = localplayer.playermodel_view_slot;
+
+      struct addon_cache *cache = &addon_system.cache[type];
+      vg_pool *pool = &cache->pool;
+
+      netmsg_playeritem *item = 
+         alloca( sizeof(netmsg_playeritem) + ADDON_UID_MAX );
+      item->inetmsg_id = k_inetmsg_playeritem;
+      item->type = type;
+      item->client = 0;
+
+      SDL_AtomicLock( &addon_system.sl_cache_using_resources );
+      addon_cache_entry *entry = vg_pool_item( pool, id );
+      addon_alias_uid( &entry->reg_ptr->alias, item->uid );
+      SDL_AtomicUnlock( &addon_system.sl_cache_using_resources );
+
+      vg_info( "send equip: [%u] %s\n", 
+               item->type, item->uid );
+
+      u32 chs = strlen(item->uid);
+
+      SteamAPI_ISteamNetworkingSockets_SendMessageToConnection(
+            hSteamNetworkingSockets, network_client.remote, 
+            item, sizeof(netmsg_playeritem)+chs+1,
+            k_nSteamNetworkingSend_Reliable, NULL );
+   }
+}
+
 static void network_disconnect(void){
    SteamAPI_ISteamNetworkingSockets_CloseConnection( 
          hSteamNetworkingSockets, network_client.remote, 0, NULL, 0 );
@@ -185,6 +219,8 @@ static void on_server_connect_status( CallbackMsg_t *msg ){
                k_nSteamNetworkingSend_Reliable, NULL );
 
          network_send_username();
+         network_send_item( k_addon_type_board );
+         network_send_item( k_addon_type_player );
       }
       else if( info->m_info.m_eState == 
             k_ESteamNetworkingConnectionState_ClosedByPeer ){
index bb019fb7b9e39bb3ec0683d9bcaa3b191e58ae0e..de64d44e60a115f2db9d4bf7e997deecf0233c35 100644 (file)
--- a/network.h
+++ b/network.h
@@ -10,6 +10,7 @@
 #include "steam.h"
 #include "network_msg.h"
 #include "highscores.h"
+#include "addon_types.h"
 
 static int network_scores_updated = 0;
 
@@ -57,5 +58,6 @@ static network_client = {
 };
 
 static int packet_minsize( SteamNetworkingMessage_t *msg, u32 size );
+static void network_send_item( enum addon_type type );
 
 #endif /* NETWORK_H */
index 404c0007b307735d31a87a883e925f85875d4a07..59d08bdf348025f054e46f6db9b9c2e7d7266f32 100644 (file)
@@ -6,9 +6,7 @@
 
 #define NETWORK_USERNAME_MAX 32
 
-#define ADDON_DEFINE_ONLY
- #include "addon.h"
-#undef ADDON_DEFINE_ONLY
+#include "addon_types.h"
 
 static u32 network_msgstring( const char *src, 
                               u32 m_cbSize, u32 base_size,
index 440facd8c13c6198ba7f31ad1fa517ff7f53e7ec..4490502d0be9192234abe21991bd871452f31398 100644 (file)
@@ -122,7 +122,7 @@ typedef struct netmsg_playeritem netmsg_playeritem;
 enum{ k_inetmsg_playeritem = 204 };
 struct netmsg_playeritem{
    u32 inetmsg_id;
-   u32 index;
+   u32 client;
    u8 type;
    char uid[];
 };
index 1cd1bec67a2b323303cf9c798c2a45265a1a5ad4..c478305a4d27a4ee974f467b583aff871e893623 100644 (file)
--- a/player.c
+++ b/player.c
@@ -8,6 +8,7 @@
 #include "world.h"
 #include "audio.h"
 #include "player_replay.h"
+#include "network.h"
 
 static int localplayer_cmd_respawn( int argc, const char *argv[] ){
    ent_spawn *rp = NULL, *r;
@@ -163,23 +164,6 @@ static void player_apply_transport_to_cam( m4x3f transport ){
    m4x4_mul( world_gates.cam.mtx.v,  transport_4, world_gates.cam.mtx.v );
 }
 
-#if 0
-__attribute__ ((deprecated))
-static void gate_rotate_angles( ent_gate *gate, v3f angles, v3f d )
-{
-   v3_copy( angles, d );
-   return;
-
-   v3f fwd_dir = { cosf(angles[0]),
-                   0.0f,
-                   sinf(angles[0])};
-   m3x3_mulv( gate->transport, fwd_dir, fwd_dir );
-
-   v3_copy( angles, d );
-   d[0] = atan2f( fwd_dir[2], fwd_dir[0] );
-}
-#endif
-
 static void player__im_gui(void){
    if( !k_player_debug_info ) return;
 
index b51c857e61ba16122f08af53dd23d71ef1af6d88..3d674bcda2257d37a645b802818b39ee3006000b 100644 (file)
@@ -2,6 +2,7 @@
 #include "skeleton.h"
 #include "player_render.h"
 #include "network_common.h"
+#include "addon.h"
 
 static void player_remote_unwatch( struct network_player *player ){
    addon_cache_unwatch( k_addon_type_player, player->playermodel_view_slot );
@@ -126,6 +127,31 @@ static void player_remote_rx_200_300( SteamNetworkingMessage_t *msg ){
       player->subsystem = frame->subsystem;
       player->down_bytes += msg->m_cbSize;
    }
+   else if( tmp->inetmsg_id == k_inetmsg_playeritem ){
+      netmsg_playeritem *item = msg->m_pData;
+      if( !packet_minsize( msg, sizeof(*item)+1 )) return;
+
+      vg_info( "Client #%u equiped: [%u] %s\n", 
+               item->client, item->type, item->uid );
+
+      struct network_player *player = &netplayers.list[ item->client ];
+
+      char uid[ ADDON_UID_MAX ];
+      network_msgstring( item->uid, msg->m_cbSize, sizeof(*item),
+                         uid, ADDON_UID_MAX );
+
+      if( item->type == k_addon_type_board ){
+         addon_cache_unwatch( k_addon_type_board, player->board_view_slot );
+         player->board_view_slot = 
+            addon_cache_create_viewer_from_uid( k_addon_type_board, uid );
+      }
+      else if( item->type == k_addon_type_player ){
+         addon_cache_unwatch( k_addon_type_player, 
+                              player->playermodel_view_slot );
+         player->playermodel_view_slot =
+            addon_cache_create_viewer_from_uid( k_addon_type_player, uid );
+      }
+   }
 }
 
 /*
@@ -366,14 +392,35 @@ static void animate_remote_players(void){
  * Draw remote players
  */
 static void render_remote_players( world_instance *world, camera *cam ){
+
+   SDL_AtomicLock( &addon_system.sl_cache_using_resources );
+
    for( u32 i=0; i<vg_list_size(netplayers.list); i ++ ){
       struct network_player *player = &netplayers.list[i];
       if( !player->active ) continue;
       
       struct player_avatar *av = localplayer.playeravatar;
+      m4x3f *final_mtx = &netplayers.final_mtx[ av->sk.bone_count*i ];
+
+      struct player_model *model = 
+         addon_cache_item_if_loaded( k_addon_type_player, 
+                                     player->playermodel_view_slot );
+
+      if( !model ) model = &localplayer.fallback_model;
+      render_playermodel( cam, world, 0, model, &av->sk, final_mtx );
+
+      struct player_board *board = 
+         addon_cache_item_if_loaded( k_addon_type_board,
+                                     player->board_view_slot );
 
-      struct player_model *model = &localplayer.fallback_model;
-      render_playermodel( cam, world, 0, model, &av->sk,
-                          &netplayers.final_mtx[ av->sk.bone_count*i ] );
+      /* TODO: Board pose */
+#if 0
+      render_board( cam, world, board, 
+                     final_mtx[localplayer.playeravatar->id_board],
+                     &localplayer.pose.board,
+                     k_board_shader_player );
+#endif
    }
+
+   SDL_AtomicUnlock( &addon_system.sl_cache_using_resources );
 }
index fc537ce4c12f283a51bb2eb10b3491e1a4d0058e..f089f79be657241387e807c4e5e1f2f884081615 100644 (file)
@@ -282,7 +282,7 @@ static void vg_load(void){
    skaterift_restore_state();
    vg_loader_step( NULL, skaterift_autosave_synchronous );
 
-   board_processview_thread(NULL);
+   //board_processview_thread(NULL);
    vg_async_call( async_call_ready, NULL, 0 );
 }
 
@@ -307,6 +307,7 @@ static void vg_pre_update(void){
       skaterift_change_client_world_preupdate();
 
    draw_origin_axis();
+   skateshop_autostart_loading();
    network_update();
 
    /* time rate */