В общем, в данном мануале, мы узнаем как начислять EXP по чисто-отыгранному времени игрока на сервере.
Нам потребуется:
- Любой мод с сохранением данных игрока
Если вы не знаете как сохранять данные игрока и с помощью чего это сделать, воспользуйтесь одним из мануалов:
mxINI
SqLite
MySQL
Создаем переменную в начале мода. Она нам понадобится для записи UNIX_TIME_STAMP при коннекте игрока.
PHP код:
new p_unixtime[MAX_PLAYERS];
Также в массиве игрока, создаем переменную для хранения EXP очков игрока и уровня, а также ранее отыгранного времени.
PHP код:
enum pvar {
pExp,
pLevel,
pPlayed
};
new PlayerInfo[MAX_PLAYERS][pvar];
В момент загрузки аккаунта, или после регистрации (не знаю как у вас там устроено), в общем когда игрок уже точно авторизировался на сервере, записываем TIMESTAMP
PHP код:
p_unixtime[playerid] = gettime();
Далее, ежесекундный таймер (общий / персональный - разницы нет), вставляем проверку на достижение отыгранного лимита времени:
PHP код:
if(gettime() - p_unixtime[playerid] + PlayerInfo[playerid][pPlayed] > 3600) {
PlayerInfo[playerid][pPlayed] = 0;
p_unixtime[playerid] = gettime();
PlayerInfo[playerid][pExp] += 1;
if(PlayerInfo[playerid][pExp] > (PlayerInfo[playerid][pLevel] + 1) * 4) {
PlayerInfo[playerid][pExp] = 0;
PlayerInfo[playerid][pLevel] += 1;
}
/* MYSQL*/
new query[200];
format(query,sizeof(query),"UPDATE `test` SET `exp` = '%d', `level` = '%d', `played` = '0' WHERE `id` = '%d'",PlayerInfo[playerid][pExp], PlayerInfo[playerid][pLevel], PlayerInfo[playerid][pPlayed], переменная_с_mysql_id_игрока);
mysql_query(testbase, query, false);
/* SQLITE */
new query[200], name[24];
GetPlayerName(playerid, name, 24);
format(query,sizeof(query),"UPDATE test SET exp = %d, level = %d, played = %d WHERE name = '%s'", PlayerInfo[playerid][pExp], PlayerInfo[playerid][pLevel], PlayerInfo[playerid][pPlayed], name);
db_query(db, query);
/* mxINI*/
new string[200], File, name[24];
GetPlayerName(playerid, name, 24);
format(string, 24, "%s", name);
File = ini_openFile(string);
if(!File) return print("Error");
ini_setInteger(File,"Level",PlayerInfo[playerid][pLevel]);
ini_setInteger(File,"Exp",PlayerInfo[playerid][pExp]);
ini_setInteger(File,"Played",PlayerInfo[playerid][pPlayed]);
}
И в OnPlayerDisconnect, записываем время отыгранное с последнего начисления EXP.
PHP код:
/* MySQL*/
new query[150];
PlayerInfo[playerid][pPlayed] = gettime() - p_unixtime[playerid];
format(query,sizeof(query),"UPDATE `test` SET `played` = '%d' WHERE `id` = '%d'", PlayerInfo[playerid][pPlayed], переменная_с_mysql_id игрока);
mysq_query(db, query, false);
/* SqLite*/
new query[150],name[24];
GetPlayerName(playerid, name, 24);
PlayerInfo[playerid][pPlayed] = gettime() - p_unixtime[playerid];
format(query,sizeof(query), "UPDATE test SET played = '%d' WHERE name = '%s'", PlayerInfo[playerid][pPlayed], name);
/*mxINI*/
new string[200], File, name[24];
GetPlayerName(playerid, name, 24);
format(string, 24, "%s", name);
File = ini_openFile(string);
if(!File) return print("Error");
PlayerInfo[playerid][pPlayed] = gettime() - p_unixtime[playerid];
ini_setInteger(File,"Played",PlayerInfo[playerid][pPlayed]);
Ну и при загрузке аккаунта получаем данные из этих столбцов. Не знаете как? Выше я разместил ссылки с мануалами различных систем записи данных, почитай!
На этом все.