PDA

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



wAx
14.05.2014, 22:29
В общем, в данном мануале, мы узнаем как начислять EXP по чисто-отыгранному времени игрока на сервере.

Нам потребуется:
- Любой мод с сохранением данных игрока

Если вы не знаете как сохранять данные игрока и с помощью чего это сделать, воспользуйтесь одним из мануалов:
mxINI (http://pro-pawn.ru/showthread.php?6571)
SqLite (http://pro-pawn.ru/showthread.php?5426)
MySQL (http://pro-pawn.ru/showthread.php?4725-%D0%9F%D0%B8%D1%88%D0%B5%D0%BC-%D0%BC%D0%BE%D0%B4-%D1%81-%D0%BD%D1%83%D0%BB%D1%8F-%28MySQL-R7-0-3x%29)

Создаем переменную в начале мода. Она нам понадобится для записи UNIX_TIME_STAMP при коннекте игрока.

new p_unixtime[MAX_PLAYERS];

Также в массиве игрока, создаем переменную для хранения EXP очков игрока и уровня, а также ранее отыгранного времени.


enum pvar {
pExp,
pLevel,
pPlayed
};
new PlayerInfo[MAX_PLAYERS][pvar];

В момент загрузки аккаунта, или после регистрации (не знаю как у вас там устроено), в общем когда игрок уже точно авторизировался на сервере, записываем TIMESTAMP


p_unixtime[playerid] = gettime();

Далее, ежесекундный таймер (общий / персональный - разницы нет), вставляем проверку на достижение отыгранного лимита времени:

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.


/* 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]);


Ну и при загрузке аккаунта получаем данные из этих столбцов. Не знаете как? Выше я разместил ссылки с мануалами различных систем записи данных, почитай!

На этом все.

Hidden
14.05.2014, 23:28
/* MYSQL*/
new query[200];
format(query,sizeof(query),"UPDATE `test` SET `exp` = '%d', `level` = '%d', `played` = '0' WHERE `id` = '%d'"...
mysql_query(testbase, query, false);
/* SQLITE */
new query[200];
format(query,sizeof(query),"UPDATE test SET exp = %d, level = %d, played = %d WHERE name = '%s'"...
db_query(db, query);

Что за точки в конце форматирования?

Salvacore
15.05.2014, 00:03
/* MYSQL*/
new query[200];
format(query,sizeof(query),"UPDATE `test` SET `exp` = '%d', `level` = '%d', `played` = '0' WHERE `id` = '%d'"...
mysql_query(testbase, query, false);
/* SQLITE */
new query[200];
format(query,sizeof(query),"UPDATE test SET exp = %d, level = %d, played = %d WHERE name = '%s'"...
db_query(db, query);

Что за точки в конце форматирования?

Ваши переменные.

Hidden
15.05.2014, 00:08
Ваши переменные.

Новички могут так и скопировать, а потом мучить всех "А что тут не так?"

Salvacore
15.05.2014, 00:19
Новички могут так и скопировать, а потом мучить всех "А что тут не так?"
Надеюсь наши посты увидит ТС.

DeimoS
15.05.2014, 06:05
И надеюсь, что он не скажет "Так пусть учатся". Всё же в мануалах должен быть готовый код, а не куски

wAx
15.05.2014, 06:46
Без проблем ребят! Щас исправим!

SmitSon
20.09.2014, 21:01
Откуда взять?)
pinfo
pctime

И еще интересует в какое место вставить ежесекундный таймер?

MR_BEN
20.09.2014, 21:24
Чтобы новички не мучились сделайте переменные макросами, пусть они изменяют переменные под себя.

SmitSon
20.09.2014, 23:45
Ну все же.. Помогите, интересная система )

Hidden
21.09.2014, 03:26
Откуда взять?)
pinfo
pctime

И еще интересует в какое место вставить ежесекундный таймер?

Действительно, не указано, откуда это.

wAx
21.09.2014, 08:46
Откуда взять?)
pinfo
pctime

И еще интересует в какое место вставить ежесекундный таймер?

pinfo, pctime - это мною не замеченные переменные, которые я забыл переименовать. Уже исправил.

Ежесекундный таймер, создается в виде public в любом месте мода, к примеру следующим образом:

в OnGameModeInit:

SetTimer("PlayerUpdateFunc", 1000, 0);

Теперь создаем само тело нашего таймера:

forward PlayerUpdateFunc();
public PlayerUpdateFunc()
{
// так же тут нужно сделать перебор игроков
foreach(Player, i) // опять - же как вариант foreach
SetTimer("PlayerUpdateFunc", 1000, 0);
return 1; // это и будет наш секундный таймер
}


Возможно, тебя заинтересуют другие способы создания таймеров и перебора игроков, я оставлю пару полезных ссылок в спойлере ниже.

[Вопрос] По таймеру (http://pro-pawn.ru/showthread.php?10166-%D0%9F%D0%BE-%D1%82%D0%B0%D0%B9%D0%BC%D0%B5%D1%80%D1%83&highlight=%D1%82%D0%B0%D0%B9%D0%BC%D0%B5%D1%80) - Полезная тема, где был поднят интересный вопрос, возможно тебе она пригодится и там ты найдешь ответы на вопросы.
[Урок] Индивидуальные таймеры. (http://pro-pawn.ru/showthread.php?8215-%D0%9E%D0%BF%D1%82%D0%B8%D0%BC%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F-%D0%98%D0%BD%D0%B4%D0%B8%D0%B2%D0%B8%D0%B4%D1%83%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5-%D1%82%D0%B0%D0%B9%D0%BC%D0%B5%D1%80%D1%8B&highlight=%D1%82%D0%B0%D0%B9%D0%BC%D0%B5%D1%80) - Неплохой урок от XemyL, который раскрывает способ оптимизации таймеров для игроков.

SmitSon
21.09.2014, 12:11
wAx, Спасибо , сейчас проверю )

Hidden
23.09.2014, 02:09
Одобрили бы уже этот мануал.
Да и, собственно, не только этот в этом разделе.

gangzone.ini
24.09.2014, 01:20
Возьму)

DeimoS
24.09.2014, 10:05
Одобрили бы уже этот мануал.
Да и, собственно, не только этот в этом разделе.

Хромает табуляция + хромает оптимизация массивов + оформить можно было бы красивее. Вряд ли такой одобрят