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 );
+ }
}
}
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;
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\n", client_id,
- client->username );
+ 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,
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",
+ item->client,
+ (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 );
}
}