PHP Code:
enum _:PlayerData
{
Player_Name[32],
Player_Key[64],
Player_Level,
Player_Stars,
Player_Points
};
// ----
new Trie:tPlayerDataIndex = TrieCreate();
new Array:aPlayerData = ArrayCreate(PlayerData);
new iArraySize;
new Array:aVaultData;
new iVaultKeys = sqlv_read_all_ex(hVault, aVaultData);
new eVaultData[SQLVaultEntryEx];
new ePlayerData[PlayerData];
new iArrayIndex;
for(new i = 0; i < iVaultKeys; i++)
{
ArrayGetArray(aVaultData, i, eVaultData);
if(TrieGetCell(tPlayerDataIndex, eVaultData[SQLVEx_Key1], iArrayIndex))
{
ArrayGetArray(aPlayerData, iArrayIndex, ePlayerData);
}
else
{
copy(ePlayerData[Player_Key], charsmax(ePlayerData[Player_Key]), eVaultData[SQLVEx_Key1]);
iArrayIndex = -1;
}
if(equal(eVaultData[SQLVEx_Key2], "name"))
{
copy(ePlayerData[Player_Name], charsmax(ePlayerData[Player_Name]), eVaultData[SQLVEx_Data]);
}
else if(equal(eVaultData[SQLVEx_Key2], "level"))
{
ePlayerData[Player_Level] = str_to_num(eVaultData[SQLVEx_Data]);
}
else if(equal(eVaultData[SQLVEx_Key2], "stars"))
{
ePlayerData[Player_Stars] = str_to_num(eVaultData[SQLVEx_Data]);
}
else
{
continue;
}
if(iArrayIndex >= 0)
{
ArraySetArray(aPlayerData, iArrayIndex, ePlayerData);
}
else
{
ArrayPushArray(aPlayerData, ePlayerData);
iArrayIndex = iArraySize++;
TrieSetCell(tPlayerDataIndex, ePlayerData[Player_Key], iArrayIndex);
}
}
TrieDestroy(tPlayerDataIndex);
ArrayDestroy(aVaultData);
for(new i = 0; i < iArraySize; i++)
{
ArrayGetArray(aPlayerData, i, ePlayerData);
ePlayerData[Player_Points] = (ePlayerData[Player_Stars] * 15) + ePlayerData[Player_Level];
ArraySetArray(aPlayerData, i, ePlayerData);
}
ArraySort(aPlayerData, "SortTopPlayers");
new iTopSize = min(iArraySize, 15);
for(new i = 0; i < iTopSize; i++)
{
ArrayGetArray(aPlayerData, i, ePlayerData);
// i + 1 = top position (eg. 0 + 1 = #1)
// ePlayerData[Player_Name] = name of player
// ePlayerData[Player_Key] = save key for player
// ePlayerData[Player_Stars] = stars for player
// ePlayerData[Player_Level] = level of player
// ePlayerData[Player_Points] = points used to rank players with equation you provided
}
ArrayDestroy(aPlayerData);
// ----
public SortTopPlayers(Array:aData, iItem1, iItem2, iData[], iDataSize)
{
new ePlayerData1[PlayerData], ePlayerData2[PlayerData];
ArrayGetArray(aPlayerData, iItem1, ePlayerData1);
ArrayGetArray(aPlayerData, iItem2, ePlayerData2);
return clamp((ePlayerData2[Player_Points] - ePlayerData1[Player_Points]), -1, 1);
}
__________________