Code:
#include <amxmodx>
#define MAX_PLAYERS 32
// Global array holding each player's level
new gLevel[MAX_PLAYERS + 1];
SomeFunction() {
// Get all players
new players[32], pnum;
get_players(players, pnum, "h");
// Sort all players with custom callback
SortCustom1D(players, pnum, "ComparePlayerLevels");
// Keep track of last level, default as no level found yet
new lastLevel = -1;
// Prepare level, name, and message variables for loop
new id, level, name[32], message[192], len;
// Loop through all players
for(new i = 0; i < pnum; i++) {
// Grab the player index
id = players[i];
// Grab this player's level
level = gLevel[id];
// Grab this player's name
get_user_name(id, name, charsmax(name));
// Check if this level is different from last
if(level > lastLevel) {
// Check if there was a level already put in the message
if(len) {
// Print the message
client_print(0, print_chat, "%s", message);
}
// Add the level name and first player to message
len = formatex(message, charsmax(message), "Level %d: %s", level, name);
} else {
// Add the player's name to the end of this level's message
len += formatex(message[len], charsmax(message) - len, ", %s", name);
}
}
// Check if there was message text left over
if(len) {
// Print the message
client_print(0, print_chat, "%s", message);
}
}
public ComparePlayerLevels(index1, index2, players[], data[], dataSize) {
// Grab levels for both players
new level1 = level[players[index1]];
new level2 = level[players[index2]];
// Give back proper return value from level comparisons
if(level1 < level2) return -1;
if(level1 > level2) return 1;
// Levels are the same
return 0;
}