PDA

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



L0ndl3m
01.12.2013, 15:41
Здравствуйте, уважаемые пользователи Pro-Pawn.Ru (http://Pro-Pawn.Ru).

Вкратце расскажу, что здесь есть:


При достижении определённого количества фрагов вы переходите на новый уровень. [Всего уровней: 28 (в дальнейшнем можете добавить новые уровни)];
Новый уровень = новый ранг [Рангов столько же, сколько и уровней];
Ваша статистика видна в текстдраве [Текстдрав один]


Создадим массивы:


Для подсчёта количества фрагов игрока;
Количества фрагов нужное для перехода на новый уровень;
Для создания текстдрава с информацией;
Названия рангов


Ко всем new:



const
MAX_LEVELS = 28;

new
player_kills[MAX_PLAYERS],
Text: stats_TD[MAX_PLAYERS];

static const
level_kills[MAX_LEVELS] =
{
50, 120, 170, 245, 350, 480, 720, 1050, 1450, 2600, 4400, 5200, 6100, 7350, 8100, 9350,
10000, 11300, 12100, 13450, 14150, 14900, 15250, 16200, 16900, 17300, 18100, 18900, 25000
},
rank_names[MAX_LEVELS + 1][14] =
{
"Newcomer", "Advanced", "Killer", "Master", "Professional", "Elite", "Commander",
"Warmonger", "Perfectionist", "Invincible", "Hero", "Almighty", "Bonecrusher", "Cruel",
"Sergeant", "Colonel", "Proof", "Supernatural", "Bloodsucker", "Predator", "Chastener",
"Tamer", "Incredible", "Fiend", "Dominator", "Perpetrator", "Ruthless", "Destroyer", "-/-"
};


Теперь создадим функцию, которая будет выводить на текстдрав статистику игрока.

В конец мода:



stock UpdateStats(const playerid)
{
new
level = 28;

switch(player_kills[playerid])
{
case 0..49:
level = 0;
case 50..119:
level = 1;
case 120..169:
level = 2;
case 170..244:
level = 3;
case 245..349:
level = 4;
case 350..479:
level = 5;
case 480..719:
level = 6;
case 720..1049:
level = 7;
case 1050..1449:
level = 8;
case 1450..2599:
level = 9;
case 2600..4399:
level = 10;
case 4400..5199:
level = 11;
case 5200..6099:
level = 12;
case 6100..7349:
level = 13;
case 7350..8099:
level = 14;
case 8100..9349:
level = 15;
case 9350..9999:
level = 16;
case 10000..11299:
level = 17;
case 11300..12099:
level = 18;
case 12100..13449:
level = 19;
case 13450..14149:
level = 20;
case 14150..14899:
level = 21;
case 14900..15249:
level = 22;
case 15250..16199:
level = 23;
case 16200..16899:
level = 24;
case 16900..17299:
level = 25;
case 17300..18099:
level = 26;
case 18100..18899:
level = 27;
}
SetPVarInt(playerid, "Level", level);

new
str[65];

format(str, 65, "Kills: %i / %i~n~Level: %i / %i~n~Rank: %s", player_kills[playerid], level_kills[level], level, MAX_LEVELS, rank_names[level]);
TextDrawSetString(stats_TD[playerid], str);
}


Создадим текстдрав, где будет показана информация о статистики игрока:

В public OnPlayerConnect:



stats_TD[playerid] = TextDrawCreate(497.000000, 99.000000, "_");
TextDrawBackgroundColor(stats_TD[playerid], 255);
TextDrawFont(stats_TD[playerid], 2);
TextDrawLetterSize(stats_TD[playerid], 0.270000, 1.100000);
TextDrawColor(stats_TD[playerid], 0xAAAADDFF);
TextDrawSetOutline(stats_TD[playerid], 1);
TextDrawSetProportional(stats_TD[playerid], 1);

TextDrawShowForPlayer(playerid, stats_TD[playerid]);


Для дальнейшей работы с файлами создайте папку с названием stats_TD в папке scriptfiles.

Создадим аккаунт статистики игрока, где будет храниться количество фрагов игрока:

В public OnPlayerDisconnect:



static const
prefix[] = "stats_TD/",
postfix[] = ".ini";

new
str[(sizeof(prefix) - 1) + MAX_PLAYER_NAME + (sizeof(postfix) - 1) + 1];

GetPlayerName(playerid, str, sizeof(str));
strins(str, prefix, 0), strcat(str, postfix);

new
File: file = fopen(str, io_write);

if(file != File: 0)
{
valstr(str, player_kills[playerid]);
fwrite(file, str);
fclose(file);
}

TextDrawDestroy(stats_TD[playerid]);


Сохранение количества фрагов игрока готово. Добавим загрузку количества фрагов игрока:

Добавляем после того, как игрок зашёл в аккаунт:


static const
prefix[] = "stats_TD/",
postfix[] = ".ini";

new
str[(sizeof(prefix) - 1) + MAX_PLAYER_NAME + (sizeof(postfix) - 1) + 1];

GetPlayerName(playerid, str, sizeof(str));
strins(str, prefix, 0), strcat(str, postfix);

new
File: file = fopen(str, io_read);

if(file != File: 0)
{
fread(file, str);
player_kills[playerid] = strval(str);
SetPlayerScore(playerid, player_kills[playerid]);
fclose(file);
}


Загрузка количества фрагов игрока из файла готова.

Теперь покажем игроку статистику, добавляем после того, как игрок зарегистрировался / вошёл в аккаунт:


UpdateStats(playerid);

Добавляем в public OnPlayerDeath:


SetPlayerScore(killerid, ++player_kills[killerid]);
UpdateStats(killerid);


Добавляем в public OnPlayerClickPlayer, чтобы узнать статистику другого игрока, кликнув его в TAB:



static const
fmt_str1[] = "Статистика игрока %s (%i)",
fmt_str2[] = "\
{00CC00}[Уровень: {FF0000}%i / %i{00CC00}]\n\
{00CC00}[Убийства: {FF0000}%i / %i{00CC00}]\n\
{00CC00}[Ранг: {FF0000}%s{00CC00}]";

new
str[sizeof(fmt_str1) - 2 + MAX_PLAYER_NAME - 2 + 4],
str2[sizeof(fmt_str2) - 2 + 2 - 2 + 2 - 2 + 11 - 2 + 11 - 2 + sizeof(RankNames[])],
level = GetPVarInt(clickedplayerid, "Level");

GetPlayerName(clickedplayerid, str, sizeof(str));
format(str, sizeof(str), fmt_str1, str, clickedplayerid);
format(str2, sizeof(str2), fmt_str2, level, MAX_LEVELS, player_kills[clickedplayerid], level_kills[level], rank_names[level]);
ShowPlayerDialog(playerid, 2048, DIALOG_STYLE_MSGBOX, str, str2, "Закрыть", "");


Это будет выглядить вот так:
http://ihost.pro-pawn.ru/image.php?dm=8KH2


http://ihost.pro-pawn.ru/image.php?dm=YNMZ
http://ihost.pro-pawn.ru/image.php?dm=AE4W


Автор: Londlem (http://pro-pawn.ru/member.php?2057-Londlem)

Специально для: Pro-Pawn.Ru (http://pro-pawn.ru)

Копирование данной статьи без разрешения автора запрещено!

Salvacore
01.12.2013, 19:29
Супер!

CLARK
10.06.2014, 01:26
\gamemodes\PDM.pwn(1002) : error 029: invalid expression, assumed zero
gamemodes\PDM.pwn(1002) : error 029: invalid expression, assumed zero
\gamemodes\PDM.pwn(1002) : error 017: undefined symbol "level"
\gamemodes\PDM.pwn(1002) : fatal error 107: too many error messages on one line


public OnPlayerClickPlayer(playerid, clickedplayerid, source)
{
static const
fmt_str1[] = "?????????? ?????? %s (%d)",
fmt_str2[] ="{00CC00}[???????: {FF0000}%d / 28{00CC00}]\n"\
"{00CC00}[????????: {FF0000}%d / %d{00CC00}]\n"\
"{00CC00}[????: {FF0000}%s{00CC00}]";
new
str[sizeof(fmt_str1)-2+MAX_PLAYER_NAME-2+4],
str2[sizeof(fmt_str2)-2+2-2+11-2+], level = GetPVarInt(clickedplayerid, "Level");
GetPlayerName(clickedplayerid, str, sizeof(str)); // ??????? ??????? ??????, ?? ???????? ????????
format(str, sizeof(str), fmt_str1, str, clickedplayerid);
format( str2, sizeof(str2), fmt_str2,
level,
kills[clickedplayerid], LevelKills[level],
RankNames[level]);
ShowPlayerDialog(playerid, 0, DIALOG_STYLE_MSGBOX, str, str2, "Закрыть", "");
return 1;
}

Ошибочная строка:

str2[sizeof(fmt_str2)-2+2-2+11-2+], level = GetPVarInt(clickedplayerid, "Level");

Daniel_Cortez
10.06.2014, 07:49
Исправил 1-й пост, посмотрите на тот отрывок ещё раз.

CLARK
10.06.2014, 12:42
Исправил 1-й пост, посмотрите на тот отрывок ещё раз.
Те же ошибки почему то))))

DeimoS
10.06.2014, 13:10
dell

CLARK
10.06.2014, 13:33
static const
fmt_str1[] = "Статистика игрока %s (%d)",
fmt_str2[] ="{00CC00}[Уровень: {FF0000}%d / 28{00CC00}]\n\
{00CC00}[Убийства: {FF0000}%d / %d{00CC00}]\n\
{00CC00}[Ранг: {FF0000}%s{00CC00}]";
не?

Ещё больше ошибок =(((


D:\Архив от 15.10.12\Games\123\gamemodes\PDM.pwn(247) : warning 219: local variable "str" shadows a variable at a preceding level
D:\Архив от 15.10.12\Games\123\gamemodes\PDM.pwn(994) : error 003: declaration of a local variable must appear in a compound block
D:\Архив от 15.10.12\Games\123\gamemodes\PDM.pwn(995) : error 001: expected token: "=", but found "["
D:\Архив от 15.10.12\Games\123\gamemodes\PDM.pwn(1000) : error 039: constant symbol has no size
D:\Архив от 15.10.12\Games\123\gamemodes\PDM.pwn(1001) : error 017: undefined symbol "fmt_str2"
D:\Архив от 15.10.12\Games\123\gamemodes\PDM.pwn(1093) : warning 219: local variable "str" shadows a variable at a preceding level
D:\Архив от 15.10.12\Games\123\gamemodes\PDM.pwn(1234) : warning 219: local variable "str" shadows a variable at a preceding level
D:\Архив от 15.10.12\Games\123\gamemodes\PDM.pwn(1238) : warning 203: symbol is never used: "str"
D:\Архив от 15.10.12\Games\123\gamemodes\PDM.pwn(1238) : warning 203: symbol is never used: "str2"

Проблема с str на весь код

Ошибочный паблик:

public OnPlayerClickPlayer(playerid, clickedplayerid, source)
static const
fmt_str1[] = "Статистика игрока %s (%d)",
fmt_str2[] ="{00CC00}[Уровень: {FF0000}%d / 28{00CC00}]\n\
{00CC00}[Убийства: {FF0000}%d / %d{00CC00}]\n\
{00CC00}[Ранг: {FF0000}%s{00CC00}]";
new
str[sizeof(fmt_str1)-2+MAX_PLAYER_NAME-2+4],
str2[sizeof(fmt_str2)-2+2-2+11-2+11-2+sizeof(RankNames[])], level = GetPVarInt(clickedplayerid, "Level");
GetPlayerName(clickedplayerid, str, sizeof(str)); // ??????? ??????? ??????, ?? ???????? ????????
format(str, sizeof(str), fmt_str1, str, clickedplayerid);
format( str2, sizeof(str2), fmt_str2,
level,
kills[clickedplayerid], LevelKills[level],
RankNames[level]);
ShowPlayerDialog(playerid, 0, DIALOG_STYLE_MSGBOX, str, str2, "???????", "");

DeimoS
10.06.2014, 13:44
Так, стоп. Код в уроке полностью рабочий. Разве что может выскочить варнинг

indeterminate array size in "sizeof" expression (symbol "")
Но он исправляется банальной правкой вот этого массива

new const RankNames[][14] = {
"Newcomer", "Advanced", "Killer", "Master", "Professional", "Elite", "Commander",
"Warmonger", "Perfectionist", "Invincible", "Hero", "Almighty", "Bonecrusher", "Cruel",
"Sergeant", "Colonel", "Proof", "Supernatural", "Bloodsucker", "Predator", "Chastener",
"Tamer", "Incredible", "Fiend", "Dominator", "Perpetrator", "Ruthless", "Destroyer", "-/-"
};

В остальном же ошибок нет. Только что проверил.

P.S. Разве что использовать стоит не TextDrawCreate, а CreatePlayerTextDraw

- - - Добавлено - - -


Ещё больше ошибок =(((


D:\Архив от 15.10.12\Games\123\gamemodes\PDM.pwn(247) : warning 219: local variable "str" shadows a variable at a preceding level
D:\Архив от 15.10.12\Games\123\gamemodes\PDM.pwn(994) : error 003: declaration of a local variable must appear in a compound block
D:\Архив от 15.10.12\Games\123\gamemodes\PDM.pwn(995) : error 001: expected token: "=", but found "["
D:\Архив от 15.10.12\Games\123\gamemodes\PDM.pwn(1000) : error 039: constant symbol has no size
D:\Архив от 15.10.12\Games\123\gamemodes\PDM.pwn(1001) : error 017: undefined symbol "fmt_str2"
D:\Архив от 15.10.12\Games\123\gamemodes\PDM.pwn(1093) : warning 219: local variable "str" shadows a variable at a preceding level
D:\Архив от 15.10.12\Games\123\gamemodes\PDM.pwn(1234) : warning 219: local variable "str" shadows a variable at a preceding level
D:\Архив от 15.10.12\Games\123\gamemodes\PDM.pwn(1238) : warning 203: symbol is never used: "str"
D:\Архив от 15.10.12\Games\123\gamemodes\PDM.pwn(1238) : warning 203: symbol is never used: "str2"

Проблема с str на весь код

Ошибочный паблик:

public OnPlayerClickPlayer(playerid, clickedplayerid, source)
static const
fmt_str1[] = "Статистика игрока %s (%d)",
fmt_str2[] ="{00CC00}[Уровень: {FF0000}%d / 28{00CC00}]\n\
{00CC00}[Убийства: {FF0000}%d / %d{00CC00}]\n\
{00CC00}[Ранг: {FF0000}%s{00CC00}]";
new
str[sizeof(fmt_str1)-2+MAX_PLAYER_NAME-2+4],
str2[sizeof(fmt_str2)-2+2-2+11-2+11-2+sizeof(RankNames[])], level = GetPVarInt(clickedplayerid, "Level");
GetPlayerName(clickedplayerid, str, sizeof(str)); // ??????? ??????? ??????, ?? ???????? ????????
format(str, sizeof(str), fmt_str1, str, clickedplayerid);
format( str2, sizeof(str2), fmt_str2,
level,
kills[clickedplayerid], LevelKills[level],
RankNames[level]);
ShowPlayerDialog(playerid, 0, DIALOG_STYLE_MSGBOX, str, str2, "???????", "");

Эмм, а скобка в начале паблика у вас где?

CLARK
10.06.2014, 13:49
Сорри))) Вставил скобку осталась одна ошибка:

D:\Àðõèâ îò 15.10.12\Games\123\gamemodes\PDM.pwn(1002) : warning 224: indeterminate array size in "sizeof" expression (symbol "")
В этой строке

str2[sizeof(fmt_str2)-2+2-2+11-2+11-2+sizeof(RankNames[])], level = GetPVarInt(clickedplayerid, "Level");

DeimoS
10.06.2014, 13:50
public OnPlayerClickPlayer(playerid, clickedplayerid, source)
{
static const
fmt_str1[] = "Статистика игрока %s (%d)",
fmt_str2[] ="{00CC00}[Уровень: {FF0000}%d / 28{00CC00}]\n"\
"{00CC00}[Убийства: {FF0000}%d / %d{00CC00}]\n"\
"{00CC00}[Ранг: {FF0000}%s{00CC00}]";
new
str[sizeof(fmt_str1)-2+MAX_PLAYER_NAME-2+4],
str2[sizeof(fmt_str2)-2+2-2+11-2+11-2+sizeof(RankNames[])], level = GetPVarInt(clickedplayerid, "Level");
GetPlayerName(clickedplayerid, str, sizeof(str)); // Получим никнейм игрока, на которого кликнули
format(str, sizeof(str), fmt_str1, str, clickedplayerid);
format( str2, sizeof(str2), fmt_str2,
level,
kills[clickedplayerid], LevelKills[level],
RankNames[level]);
ShowPlayerDialog(playerid, 0, DIALOG_STYLE_MSGBOX, str, str2, "Закрыть", "");
return 1;
}

CLARK
10.06.2014, 13:54
Всё тотже варнинг в тойже строчке (str2)



warning 224: indeterminate array size in "sizeof" expression (symbol "")

В этой строке

str2[sizeof(fmt_str2)-2+2-2+11-2+11-2+sizeof(RankNames[])], level = GetPVarInt(clickedplayerid, "Level");

DeimoS
10.06.2014, 14:16
Всё тотже варнинг в тойже строчке (str2)



warning 224: indeterminate array size in "sizeof" expression (symbol "")

В этой строке

str2[sizeof(fmt_str2)-2+2-2+11-2+11-2+sizeof(RankNames[])], level = GetPVarInt(clickedplayerid, "Level");

Я же выше писал решение -_-

CLARK
10.06.2014, 14:21
DeimoS, Всё! Спасибо огромное за помощь! Ты вернул жизнь моему нубо-проекту :)

Daniel_Cortez
10.06.2014, 22:20
Разве что может выскочить варнинг

indeterminate array size in "sizeof" expression (symbol "")


thx, fixed

Exclusive
15.11.2014, 16:07
Londlem, сделай по цветам а не рангам) :blush:

AndreyKa
25.11.2014, 01:08
Да для DM вообще тащит.Лойс

ALIT13
30.11.2014, 11:55
а сохранения нету ?

Daniel_Cortez
30.11.2014, 13:11
а сохранения нету ?
Встречный вопрос: разве трудно сделать его самому?
Тем более, что у каждого мода сохранение происходит по-своему - было бы просто глупо делать в теме сохранение для какого-то одного мода.

ALIT13
30.11.2014, 13:39
ну вот я не знаю как сохранять и что подскажешь делать ?

underwoker
30.11.2014, 13:47
ну вот я не знаю как сохранять и что подскажешь делать ?
Учиться. Что за тупой вопрос?

ALIT13
02.01.2015, 17:27
Подскажите как сделать чтоб в /mm было место pLevel , lvl убийтсв