Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 1 из 3 1 2 3 ПоследняяПоследняя
Показано с 1 по 10 из 21
  1. #1
    Аватар для L0ndl3m
    Пользователь

    Статус
    Оффлайн
    Регистрация
    19.10.2013
    Адрес
    Ярославль
    Сообщений
    1,366
    Репутация:
    773 ±

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

    Здравствуйте, уважаемые пользователи Pro-Pawn.Ru.

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

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


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

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


    Ко всем new:

    PHP код:
    const
        
    MAX_LEVELS 28;

    new
        
    player_kills[MAX_PLAYERS],
        
    Textstats_TD[MAX_PLAYERS];

    static const
        
    level_kills[MAX_LEVELS] =
        {
            
    50120170245350480720105014502600440052006100735081009350,
            
    10000113001210013450141501490015250162001690017300181001890025000
        
    },
        
    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""-/-"
        
    }; 
    Теперь создадим функцию, которая будет выводить на текстдрав статистику игрока.

    В конец мода:

    PHP код:
    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(str65"Kills: %i / %i~n~Level: %i / %i~n~Rank: %s"player_kills[playerid], level_kills[level], levelMAX_LEVELSrank_names[level]);
        
    TextDrawSetString(stats_TD[playerid], str);

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

    В public OnPlayerConnect:

    PHP код:
    stats_TD[playerid] = TextDrawCreate(497.00000099.000000"_");
    TextDrawBackgroundColor(stats_TD[playerid], 255);
    TextDrawFont(stats_TD[playerid], 2);
    TextDrawLetterSize(stats_TD[playerid], 0.2700001.100000);
    TextDrawColor(stats_TD[playerid], 0xAAAADDFF);
    TextDrawSetOutline(stats_TD[playerid], 1);
    TextDrawSetProportional(stats_TD[playerid], 1);

    TextDrawShowForPlayer(playeridstats_TD[playerid]); 
    Для дальнейшей работы с файлами создайте папку с названием stats_TD в папке scriptfiles.

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

    В public OnPlayerDisconnect:

    PHP код:
    static const
        
    prefix[] = "stats_TD/",
        
    postfix[] = ".ini";

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

    GetPlayerName(playeridstrsizeof(str));
    strins(strprefix0), strcat(strpostfix);

    new
        
    Filefile fopen(strio_write);

    if(
    file != File0)
    {
        
    valstr(strplayer_kills[playerid]);
        
    fwrite(filestr);
        
    fclose(file);
    }

    TextDrawDestroy(stats_TD[playerid]); 
    Сохранение количества фрагов игрока готово. Добавим загрузку количества фрагов игрока:

    Добавляем после того, как игрок зашёл в аккаунт:
    PHP код:
    static const
        
    prefix[] = "stats_TD/",
        
    postfix[] = ".ini";

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

    GetPlayerName(playeridstrsizeof(str));
    strins(strprefix0), strcat(strpostfix);

    new
        
    Filefile fopen(strio_read);

    if(
    file != File0)
    {
        
    fread(filestr);
        
    player_kills[playerid] = strval(str);
        
    SetPlayerScore(playeridplayer_kills[playerid]);
        
    fclose(file);

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

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

    PHP код:
    UpdateStats(playerid); 
    Добавляем в public OnPlayerDeath:
    PHP код:
    SetPlayerScore(killerid, ++player_kills[killerid]);
    UpdateStats(killerid); 
    Добавляем в public OnPlayerClickPlayer, чтобы узнать статистику другого игрока, кликнув его в TAB:

    PHP код:
    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) - MAX_PLAYER_NAME 4],
        
    str2[sizeof(fmt_str2) - 11 11 sizeof(RankNames[])],
        
    level GetPVarInt(clickedplayerid"Level");

    GetPlayerName(clickedplayeridstrsizeof(str));
    format(strsizeof(str), fmt_str1strclickedplayerid);
    format(str2sizeof(str2), fmt_str2levelMAX_LEVELSplayer_kills[clickedplayerid], level_kills[level], rank_names[level]);
    ShowPlayerDialog(playerid2048DIALOG_STYLE_MSGBOXstrstr2"Закрыть"""); 
    Это будет выглядить вот так:
     Скриншот


     Скриншоты текстдрава





    Автор: Londlem

    Специально для: Pro-Pawn.Ru


    Копирование данной статьи без разрешения автора запрещено!
    Последний раз редактировалось L0ndl3m; 02.12.2014 в 19:29.

  2. 3 пользователя(ей) сказали cпасибо:
    Accord (18.06.2014) AndreyKa (25.11.2014) Копюшон (06.05.2014)
  3. #2
    Аватар для Salvacore
    Инжунер-погромист

    Статус
    Оффлайн
    Регистрация
    10.05.2013
    Адрес
    Аҧсуа бызшәа
    Сообщений
    2,271
    Репутация:
    418 ±
    Супер!

  4. #3
    Аватар для CLARK
    Пользователь

    Статус
    Оффлайн
    Регистрация
    10.06.2014
    Сообщений
    6
    Репутация:
    0 ±
    \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
    PHP код:
    public OnPlayerClickPlayer(playeridclickedplayeridsource)
    {
        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(clickedplayeridstrsizeof(str)); // ??????? ??????? ??????, ?? ???????? ????????
        
    format(strsizeof(str), fmt_str1strclickedplayerid);
        
    formatstr2sizeof(str2), fmt_str2,
            
    level,
            
    kills[clickedplayerid], LevelKills[level],
            
    RankNames[level]);
        
    ShowPlayerDialog(playerid0DIALOG_STYLE_MSGBOXstrstr2"Закрыть""");
        return 
    1;

    Ошибочная строка:
    PHP код:
        str2[sizeof(fmt_str2)-2+2-2+11-2+], level GetPVarInt(clickedplayerid"Level"); 

  5. #4
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,144
    Репутация:
    2517 ±
    Исправил 1-й пост, посмотрите на тот отрывок ещё раз.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  6. Пользователь сказал cпасибо:
    CLARK (10.06.2014)
  7. #5
    Аватар для CLARK
    Пользователь

    Статус
    Оффлайн
    Регистрация
    10.06.2014
    Сообщений
    6
    Репутация:
    0 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Исправил 1-й пост, посмотрите на тот отрывок ещё раз.
    Те же ошибки почему то))))

  8. #6
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,439
    Репутация:
    1920 ±
    dell
    Последний раз редактировалось DeimoS; 11.06.2014 в 00:58.
    Связаться со мной в VK можно через личные сообщения этой группы

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  9. #7
    Аватар для CLARK
    Пользователь

    Статус
    Оффлайн
    Регистрация
    10.06.2014
    Сообщений
    6
    Репутация:
    0 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    PHP код:
    static const
        
    fmt_str1[] = "Статистика игрока %s (%d)",
        
    fmt_str2[] ="{00CC00}[Уровень: {FF0000}%d / 28{00CC00}]\n\
                     {00CC00}[Убийства: {FF0000}%d / %d{00CC00}]\n\
                     {00CC00}[Ранг: {FF0000}%s{00CC00}]"

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

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

    Ошибочный паблик:
    PHP код:
    public OnPlayerClickPlayer(playeridclickedplayeridsource)
        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(clickedplayeridstrsizeof(str)); // ??????? ??????? ??????, ?? ???????? ????????
    format(strsizeof(str), fmt_str1strclickedplayerid);
    formatstr2sizeof(str2), fmt_str2,
            
    level,
            
    kills[clickedplayerid], LevelKills[level],
            
    RankNames[level]);
    ShowPlayerDialog(playerid0DIALOG_STYLE_MSGBOXstrstr2"???????"""); 

  10. #8
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,439
    Репутация:
    1920 ±
    Так, стоп. Код в уроке полностью рабочий. Разве что может выскочить варнинг
    PHP код:
    indeterminate array size in "sizeof" expression (symbol ""
    Но он исправляется банальной правкой вот этого массива
    PHP код:
    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

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

    Цитата Сообщение от CLARK Посмотреть сообщение
    Ещё больше ошибок =(((

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

    Ошибочный паблик:
    PHP код:
    public OnPlayerClickPlayer(playeridclickedplayeridsource)
        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(clickedplayeridstrsizeof(str)); // ??????? ??????? ??????, ?? ???????? ????????
    format(strsizeof(str), fmt_str1strclickedplayerid);
    formatstr2sizeof(str2), fmt_str2,
            
    level,
            
    kills[clickedplayerid], LevelKills[level],
            
    RankNames[level]);
    ShowPlayerDialog(playerid0DIALOG_STYLE_MSGBOXstrstr2"???????"""); 
    Эмм, а скобка в начале паблика у вас где?
    Связаться со мной в VK можно через личные сообщения этой группы

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  11. Пользователь сказал cпасибо:
    Daniel_Cortez (10.06.2014)
  12. #9
    Аватар для CLARK
    Пользователь

    Статус
    Оффлайн
    Регистрация
    10.06.2014
    Сообщений
    6
    Репутация:
    0 ±
    Сорри))) Вставил скобку осталась одна ошибка:
    D:\Àðõèâ îò 15.10.12\Games\123\gamemodes\PDM.pwn(1002) : warning 224: indeterminate array size in "sizeof" expression (symbol "")
    В этой строке
    PHP код:
    str2[sizeof(fmt_str2)-2+2-2+11-2+11-2+sizeof(RankNames[])], level GetPVarInt(clickedplayerid"Level"); 
    Последний раз редактировалось CLARK; 10.06.2014 в 13:51.

  13. #10
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,439
    Репутация:
    1920 ±
    PHP код:
    public OnPlayerClickPlayer(playeridclickedplayeridsource)
    {
        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(clickedplayeridstrsizeof(str)); // Получим никнейм игрока, на которого кликнули
        
    format(strsizeof(str), fmt_str1strclickedplayerid);
        
    formatstr2sizeof(str2), fmt_str2,
                
    level,
                
    kills[clickedplayerid], LevelKills[level],
                
    RankNames[level]);
        
    ShowPlayerDialog(playerid0DIALOG_STYLE_MSGBOXstrstr2"Закрыть""");
        return 
    1;

    Связаться со мной в VK можно через личные сообщения этой группы

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

 

 
Страница 1 из 3 1 2 3 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •