Long-
Мастер
Всем привет.
Был на "конкурсе", делал систему рейтинга копию Гранда, в итог оказалось не нужно
, но уже сделал, выложу, может кому пригодится.
Особенности:
- MySQL R39-x
- Процессор DC_CMD
- Почти независимая
Суть системы:
Ну, система заключается в том , в TAB уровень а-ля SCORE это рейтинг, а не уровень, и за каждое использования команды /me, /do, /try дается 1 очко рейтинга, и в каждый PayDay(юзается каждый час дается) если игрок отсидел прибавляется одно очко, если не просидел 1 час, то анулируеться и очки исчезают.
Приступим,
Ко всем глобальным переменным:
PHP:
new
gRatingPlayerTop[10],
gNamePlayerTop[10][MAX_PLAYER_NAME],
gTempRating[MAX_PLAYERS];
В OnGameModeInit:
PHP:
SetTimer("@__PayDay",1000 * 60,1);
Сами коллбэки и функции:
PHP:
@__PayDay();
@__PayDay()
{
new
minute;
gettime(_, minute, _);
if(minute == 0)
PayDay();
}
PHP:
stock PayDay()
{
new
str_fmt[160];
#if defined foreach
foreach(new i : Player)
#else
for(new i = GetPlayerPoolSize(); i != -1; --i)
{
if(IsPlayerConnected(i))
#endif
{
SetPlayerScore(i, gTempRating[i]);
GetPlayerName(playerid, str_fmt, MAX_PLAYER_NAME);
format(str_fmt, sizeof str_fmt, "UPDATE `accounts` SET `rating` = '%d' WHERE `name` = '%s'", gTempRating[i], str_fmt);
mysql_function_query(connect, str_fmt ,false, "");
gTempRating[i] = 0;
}
#if !defined foreach
}
#endif
}
В любые команды которые хотите чтобы зачислялось +1 очко:
PHP:
gTempRating[playerid]++;
В OnPlayerDisconnect:
PHP:
gTempRating[playerid] = 0;
Сама команда открытия, и коллбэк сортировки:
PHP:
CMD:topplayer(playerid)
return mysql_function_query(connect,"SELECT `name`, `rating` FROM `accounts` ORDER BY `rating` DESC LIMIT 10",true, "OnTopAccountsResponse","d", playerid);
forward OnTopAccountsResponse(playerid);
public OnTopAccountsResponse(playerid)
{
new
rows = cache_get_row_count(connect);
if(rows)
{
for(new i, str_fmt[250]; i < rows; i++)
{
gRatingPlayerTop[i] = cache_get_field_content_int(i, "rating", connect);
cache_get_field_content(i, "name", gNamePlayerTop[i], connect, 30);
format(str_fmt, sizeof str_fmt, "%s%s - %d\n",str_fmt, gNamePlayerTop[i], gRatingPlayerTop[i]);
}
ShowPlayerDialog(playerid, 0, DIALOG_STYLE_MSGBOX, "Рейтинг", str_fmt, "Ок", "Выход");
}
return 1;
}
Ну вот и все, если есть более оптимизированный вариант, или нашли ошибку/недоработку напишите в комменты.
Последнее редактирование:
