31.07.2016, 20:51
(
Последний раз редактировалось Konstantinos; 31.07.2016 в 21:35.
Причина: Added cache_is_valid for the "Next" option.
)
Having a variable to determinate the page can make it possible without too many checks.
PHP код:
// global:
new Cache: gPlayer_ClanMembers[MAX_PLAYERS], gPlayer_ClanMembers@Page[MAX_PLAYERS];
// OnPlayerConnect:
gPlayer_ClanMembers[playerid] = Cache: 0;
gPlayer_ClanMembers@Page[playerid] = 0;
// wherever you execute the query
new Query[50];
mysql_format(g_SQL, Query, sizeof Query, "SELECT Name,Rank FROM Users WHERE Clan = %d", GetPlayerClan(playerid, g_SQL)); // better a variable that stores player's clan
mysql_tquery(g_SQL, Query, "OnClanMembersLoad", "i", playerid);
// the specified callback
forward OnClanMembersLoad(playerid);
public OnClanMembersLoad(playerid)
{
new rows = cache_get_row_count();
if (!rows) return ... // error that there are no members
else if (rows > 15)
{
gPlayer_ClanMembers[playerid] = cache_save();
rows = 15;
gPlayer_ClanMembers@Page[playerid] = 1; // viewing 1st page
// load the first 15 results and store the rest in memory
}
new name[25], rank[25], s[48], targetid;
members[0] = EOS; // reset
for (new i; i != rows; i++)
{
cache_get_row(i, 0, name);
cache_get_row(i, 1, rank);
sscanf(name, "r", targetid);
format(s, sizeof s, "%s\t%s\t%s\n", name, rank, targetid != INVALID_PLAYER_ID ? ("{00FF2F}Online") : ("{FF0000}Offline"));
strcat(members, s);
}
}
ShowPlayerDialog(playerid, 13, DIALOG_STYLE_TABLIST, "Clan Members", members, cache_is_valid(gPlayer_ClanMembers[playerid]) ? ("Next") : ("Close"), "Cancel");
// OnDialogResponse (dialogid 13):
if (!response)
{
cache_delete(gPlayer_ClanMembers[playerid]);
gPlayer_ClanMembers[playerid] = Cache: 0;
gPlayer_ClanMembers@Page[playerid] = 0;
}
else
{
if (cache_is_valid(gPlayer_ClanMembers[playerid]))
{
cache_set_active(gPlayer_ClanMembers[playerid]);
new rows = cache_get_row_count(), results = ++gPlayer_ClanMembers@Page[playerid] * 15;
if (rows > results) // if there are more rows, set the max rows for the current page (goes like 15, 30, 45, 60 etc.)
{
rows = results;
}
else gPlayer_ClanMembers@Page[playerid] = 0; // otherwise this is the last page, reset so we can delete the cache afterwards
new name[25], rank[25], s[48], targetid;
members[0] = EOS; // reset
for (new i = (results - 15); i != rows; i++) // 1 page = 15 results | page * 15 is the max rows
{
cache_get_row(i, 0, name);
cache_get_row(i, 1, rank);
sscanf(name, "r", targetid);
format(s, sizeof s, "%s\t%s\t%s\n", name, rank, targetid != INVALID_PLAYER_ID ? ("{00FF2F}Online") : ("{FF0000}Offline"));
strcat(members, s);
}
ShowPlayerDialog(playerid, 13, DIALOG_STYLE_TABLIST, "Clan Members", members, !gPlayer_ClanMembers@Page[playerid] ? ("Close") : ("Next"), "Cancel");
if (!gPlayer_ClanMembers@Page[playerid])
{
cache_set_active(Cache: 0);
cache_delete(gPlayer_ClanMembers[playerid]);
gPlayer_ClanMembers[playerid] = Cache: 0;
}
}
}

