Описание
Этот модуль решает проблему сохранения нескольких значений в nVault, позволяя хранить массивы напрямую. Поддерживаются типы int, bool, string, float. Массивы сохраняются в бинарном формате с кодированием для предотвращения null-байтов, поэтому их нельзя редактировать через стандартные nVault viewer.Функции
nvault_set_array(vault, key, array[], size)— сохранить массив.nvault_get_array(vault, key, array[], size)— получить массив.nvault_arraysize(vault, key)— получить размер массива.nvault_isarray(vault, key)— проверить, является ли запись массивом.
Пример API
Код:
#include <amxmodx>
#include <nvault_array>
#define MAX_PLAYERS 32
new g_Vault;
enum PlayerData
{
pdName[ 32 ],
pdSteamID[ 35 ],
pdKills,
pdDeaths,
pdHeadShots,
pdMoney,
Float:pdLastOrigin[ 3 ]
}
//Player data array id=5 is used to store, data loaded into id=6
new pdData[ MAX_PLAYERS + 1 ][ PlayerData ];
//Arrays where data is being saved from
new iRegularArray[ 5 ];
new Float:fFloatArray[ 5 ];
//Arrays where data is being loaded in to
new iRegularArray2[ 5 ];
new Float:fFloatArray2[ 5 ];
public plugin_init()
{
g_Vault = nvault_open( "nvault_array_demo" );
register_concmd( "TestSet" , "TestSetFunc" );
register_concmd( "TestGet" , "TestGetFunc" );
}
public plugin_end()
{
nvault_close( g_Vault );
}
public TestSetFunc()
{
new id = 5;
//Fill array index with dummy player data
copy( pdData[ id ][ pdName ] , charsmax( pdData[][ pdName ] ) , "bugsy" );
copy( pdData[ id ][ pdSteamID ] , charsmax( pdData[][ pdSteamID ] ) , "STEAM_0:1:12345" );
pdData[ id ][ pdKills ] = 524;
pdData[ id ][ pdDeaths ] = 13;
pdData[ id ][ pdHeadShots ] = 0;
pdData[ id ][ pdMoney ] = 16000;
pdData[ id ][ pdLastOrigin ][ 0 ] = _:12.34;
pdData[ id ][ pdLastOrigin ][ 1 ] = _:56.78;
pdData[ id ][ pdLastOrigin ][ 2 ] = _:90.12;
//Display what was stored
server_print( "SET %s" , pdData[ id ][ pdName ] );
server_print( "SET %s" , pdData[ id ][ pdSteamID ] );
server_print( "SET %d" , pdData[ id ][ pdKills ] );
server_print( "SET %d" , pdData[ id ][ pdDeaths ] );
server_print( "SET %d" , pdData[ id ][ pdHeadShots ] );
server_print( "SET %d" , pdData[ id ][ pdMoney ] );
server_print( "SET %f %f %f" , pdData[ id ][ pdLastOrigin ][ 0 ] , pdData[ id ][ pdLastOrigin ][ 1 ] , pdData[ id ][ pdLastOrigin ][ 2 ] );
//Save array to nvault
nvault_set_array( g_Vault , "TestSet" , pdData[ id ][ PlayerData:0 ] , sizeof( pdData[] ) );
//Fill number arrays with dummy data and display
for ( new i = 0 ; i < sizeof( iRegularArray ) ; i++ )
{
iRegularArray[ i ] = random( 545545 );
fFloatArray[ i ] = random_float( -5000.0 , 20000.0 );
server_print( "%d - SET Regular=%d Float=%f" , i , iRegularArray[ i ] , fFloatArray[ i ] );
}
//Save arrays to nvault
nvault_set_array( g_Vault , "RegularArray" , iRegularArray , sizeof( iRegularArray ) );
nvault_set_array( g_Vault , "FloatArray" , fFloatArray , sizeof( fFloatArray ) );
}
public TestGetFunc()
{
//id=5 is holding the data that we manually loaded into it and we do not want to that that since it
//will not tell us for sure that data successfully read into it from nvault.
//id=6 will be used since it is empty.
new id = 6;
//Read array into array
nvault_get_array( g_Vault , "TestSet" , pdData[ id ][ PlayerData:0 ] , sizeof( pdData[] ) );
//Display data that was read
server_print( "GET %s" , pdData[ id ][ pdName ] );
server_print( "GET %s" , pdData[ id ][ pdSteamID ] );
server_print( "GET %d" , pdData[ id ][ pdKills ] );
server_print( "GET %d" , pdData[ id ][ pdDeaths ] );
server_print( "GET %d" , pdData[ id ][ pdHeadShots ] );
server_print( "GET %d" , pdData[ id ][ pdMoney ] );
server_print( "GET %f %f %f" , pdData[ id ][ pdLastOrigin ][ 0 ] , pdData[ id ][ pdLastOrigin ][ 1 ] , pdData[ id ][ pdLastOrigin ][ 2 ] );
//Read number arrays
nvault_get_array( g_Vault , "RegularArray" , iRegularArray2 , sizeof( iRegularArray2 ) );
nvault_get_array( g_Vault , "FloatArray" , fFloatArray2 , sizeof( fFloatArray2 ) );
//Display number arrays read from vault
for ( new i = 0 ; i < sizeof( iRegularArray ) ; i++ )
{
server_print( "%d - GET Regular=%d Float=%f" , i , iRegularArray2[ i ] , fFloatArray2[ i ] );
}
}