PDA

Просмотр полной версии : [Мануал] Система рейтинга



#Djuga
02.03.2018, 13:34
Всем привет.

Был на "конкурсе" с Артёмом (Long-), делал систему рп рейтинга, в итог оказалось не нужно , но уже сделал, выложу, может кому пригодится.




Особенности:



MySQL R41-2

DC_CMD

Не зависимая





Суть системы:

Ну, система заключается в том , в TAB уровень а-ля SCORE это рейтинг, а не уровень, и за каждое использования команды /me, /do, /try дается 1 очко рейтинга, и в каждый PayDay(юзается каждый час дается) если игрок отсидел прибавляется одно очко, если не просидел 1 час, то анулируеться и очки исчезают.



Приступим,

Ко всем переменным:


new
g_rp_score[MAX_PLAYERS], /*Очки которые засчитываются до PayDay*/
bool:g_me_time[MAX_PLAYERS char],/*Анти-Флуд команды /me*/
bool:g_do_time[MAX_PLAYERS char],/*Анти-Флуд команды /do*/
g_Score[10],/*очки игрока в топе*/
g_TopName[10][MAX_PLAYER_NAME];/*имя игрока в топе*/

В enum игрока:


pRPScore,

Ко всем командам:


CMD:me(playerid, params[])
{
if(me_time{playerid})

return SendClientMessage(playerid, -1/*Ваш желаемый цвет*/, "Подождите пару секунд...");

if(isnull(params))

return SendClientMessage(playerid, -1/*Ваш желаемый цвет*/, "Введите /me [Текст]");
new
me_text[145]; //144 + нулевая ячейка

strcat(me_text, PlayerInfo[playerid][pName]/*переменная ника*/);
strcat(me_text, " ");
strcat(me_text, params[0]);

/* ProxDetector(15, playerid, me_text, -1/*Ваш желаемый цвет*/, -1/*Ваш желаемый цвет*/, -1/*Ваш желаемый цвет*/, -1/*Ваш желаемый цвет*/, -1/*Ваш желаемый цвет*/); Ваш proxdetector ВНИМАНИЕ, отправляйте me_text, не params*/
SetPlayerChatBubble(playerid, params[0], -1/*Ваш желаемый цвет*/, 25.0, 7000); /*тут сделаем текст над головой только params[0]*/

rp_score[playerid] ++;
me_time{playerid} = true; /*анти флуд, чтобы не набивали очки*/
SetTimerEx("@__g_command", 15*1000, false, "ii", playerid, 0);
return true;
}
CMD:do(playerid, params[])
{
if(do_time{playerid})

return SendClientMessage(playerid, -1/*Ваш желаемый цвет*/, "Подождите пару секунд...");

if(isnull(params)))

return SendClientMessage(playerid, -1/*Ваш желаемый цвет*/, "Введите /me [Текст]");
new
do_text[144];

strcat(do_text, params[0]);
strcat(do_text, "|");
strcat(do_text, PlayerInfo[playerid][pName]/*переменная ника*/);

/* ProxDetector(15, playerid, do_text, -1/*Ваш желаемый цвет*/, -1/*Ваш желаемый цвет*/, -1/*Ваш желаемый цвет*/, -1/*Ваш желаемый цвет*/, -1/*Ваш желаемый цвет*/); Ваш proxdetector ВНИМАНИЕ, отправляйте me_text, не params*/

rp_score[playerid] ++;
do_time{playerid} = true; /*анти флуд, чтобы не набивали очки*/
SetTimerEx("@__g_command", 15*1000, false, "ii", playerid, 1);
return true;
}
CMD:test(playerid) return mysql_tquery(m_connect/*переменная подключения*/, "SELECT * FROM `accounts/*таблица с аккаунтами*/` `/*имя*/Name` WHERE `RPTop` != '0' ORDER BY `RPTop` DESC LIMIT 10", "TopPlayers", "i", playerid);

В OnPlayerConnect:


PlayerInfo/*enum игрока*/[playerid][pRPScore] =
rp_score[playerid] = 0;
do_time{playerid} =
me_time{playerid} = false;

Ко всем коллбэкам:


@__g_command(playerid, command);
@__g_command(playerid, command)
{
if(!command) me_time{playerid} = false;
else if(command) do_time{playerid} = false;
return true;
}

forward TopPlayers(playerid);
public TopPlayers(playerid)
{
new
rows,
top_string[300];

cache_get_row_count(rows);
if(rows)
{
for(new r; r < rows; r++)
{
cache_get_value_name_int(r, "RPTop", g_Score[r]);
cache_get_value_name(r, "Name", g_TopName[r], MAX_PLAYER_NAME);

format(top_string, sizeof top_string, "%s[%s]:\t[%d очков]\n", top_string, g_TopName[r], g_Score[r]);

}
ShowPlayerDialog(playerid, 9999, DIALOG_STYLE_MSGBOX, "Топ РП игроков", top_string, "Назад", "");
}
else SendClientMessage(playerid, -1, "Нит топов(9");
return 1;
}

В выдачу зарплаты:



new
query[90];

#if defined foreach
foreach(new i : Player)
#else
for(new i = 0, p = GetPlayerPoolSize(); i < p; i++)
#endif
{
PlayerInfo/*тут ваше*/[i][pRPScore] += rp_score;
format(query, sizeof(query), "UPDATE `accounts/*таблица с акками*/` SET `RPTop` = '%d' WHERE `Name` = '%s'", PlayerInfo/*тут ваше*/[i][pRPScore] , PlayerInfo[i][pName]);
mysql_query(m_connect, query);
rp_score = 0;
}


После авторизации игрока:


SetPlayerScore(playerid, PlayerInfo/*изменяем*/[playerid][pRPScore]);

В базе данных:


Создайте таблицу:
RPTop




При размещении на других порталах, указывайте автора - #Djuga

Web
02.03.2018, 14:41
Пережиток прошлого и самп рп. Это не говорит об уровне рп у игрока, вот совсем. Не нужно это в 2018

PlayerInfo/*тут ваше*/[i][pRPScore] += rp_score;
Так то и PlayerInfo не у всех, у кого то может быть и просто Player. Да и прибавлять через SetPlayerScore не вариант, так как может в моде быть еще и уровень игрока/а то и возраст. И значение будет спустя время довольно большим.

#Djuga
02.03.2018, 14:50
Пережиток прошлого и самп рп. Это не говорит об уровне рп у игрока, вот совсем. Не нужно это в 2018

PlayerInfo/*тут ваше*/[i][pRPScore] += rp_score;
Так то и PlayerInfo не у всех, у кого то может быть и просто Player. Да и прибавлять через SetPlayerScore не вариант, так как может в моде быть еще и уровень игрока/а то и возраст. И значение будет спустя время довольно большим.

Ну это уже их дело, добавлять или нет, они могут и в статистику впихнуть.


Так то и PlayerInfo не у всех
Я же написал, пусть изменят.

Chaprnks
16.09.2018, 19:53
отличная идея! но если кто-то узнает, все, что ему нужно сделать, это спам /me я и получить оценку 9999

Desulaid
19.09.2018, 20:42
Определись со стилем написания переменных: g_do_time, g_Score, g_TopName. Ну не эстетично ж.

Mopok
14.01.2019, 11:53
Был на "конкурсе"

Сорян за немношко оффтопа. А шо за "конукрс", где происходит такое?)