Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 1 из 1
  1. #1
    Аватар для Bren
    Пользователь

    Статус
    Оффлайн
    Регистрация
    21.01.2020
    Адрес
    Россия
    Сообщений
    2
    Репутация:
    0 ±

    Система достижений с картинкой

    Решил выложить свою систему достижений из старого мода.
    Немного переделал, поправил моментами, так вот держите

    Скриншот
      Открыть/закрыть





    Нужен sscanf2

    Ну так приступим.

    Ко всем new
    PHP код:
    #define MAX_ADVANCE 2 //количество достижений

    new Achievements[MAX_PLAYERS][MAX_ADVANCE], AchievementsCheck[MAX_PLAYERS], Text:AchievementsT[MAX_PLAYERS][5]; 

    Теперь добавляем сам текст, тоже где-то сверху
    PHP код:
    new AchievementText[MAX_ADVANCE][7][] =
    {
    /*
    XX - 1 - отвечает за скрытность достижения (0 открыто | 1 скрыто) | 2 - сколько раз нужно выполнить задание для получение достижения

        название TD ENG                       название TD RUS                 картинка                   XX                текст                                 текст 2                                     подробный текст*/
        
    {"~n~transporter~n~flamingo",         "~n~transporter~n~flamingo",    "LD_TATT:5cross3",        "1,1",         "Перевозчик фламинго",      "Покрасить автомобиль в розовый цвет",       "{FFFFFF}Ну фламинго так фламинго"},
        {
    "~n~I love this car",                "~n~I love this car",           "LD_OTB2:Ric5",           "0,5",         "Любитель Buffalo",         "Сесть 5 раз в Buffalo",                     "{FFFFFF}Найди эту машину и испытай её!"}
    }; 

    В OnPlayerConnect добавляем сам TextDraw и обнуление переменной
    PHP код:
        AchievementsCheck[playerid] = 0;
        
        
    AchievementsT[playerid][0] = TextDrawCreate(535.0401.0"_");
        
    TextDrawLetterSize(AchievementsT[playerid][0], 0.251.0);
        
    TextDrawUseBox(AchievementsT[playerid][0], 1);
        
    TextDrawBoxColor(AchievementsT[playerid][0], 170);
        
    TextDrawTextSize(AchievementsT[playerid][0], 640.00.0);
        
    TextDrawSetSelectable(AchievementsT[playerid][0], 0);

        
    AchievementsT[playerid][1] = TextDrawCreate(535.0401.0"_");
        
    TextDrawLetterSize(AchievementsT[playerid][1], 0.254.65);
        
    TextDrawUseBox(AchievementsT[playerid][1], 1);
        
    TextDrawBoxColor(AchievementsT[playerid][1], 102);
        
    TextDrawTextSize(AchievementsT[playerid][1], 640.00.0);
        
    TextDrawSetSelectable(AchievementsT[playerid][1], 0);

        
    AchievementsT[playerid][2] = TextDrawCreate(587.0401.0"_");
        
    TextDrawAlignment(AchievementsT[playerid][2], 2);
        
    TextDrawBackgroundColor(AchievementsT[playerid][2], 255);
        
    TextDrawFont(AchievementsT[playerid][2], 2);
        
    TextDrawLetterSize(AchievementsT[playerid][2], 0.190.9);
        
    TextDrawColor(AchievementsT[playerid][2], -1);
        
    TextDrawSetOutline(AchievementsT[playerid][2], 1);
        
    TextDrawSetProportional(AchievementsT[playerid][2], 1);
        
    TextDrawSetSelectable(AchievementsT[playerid][2], 0);

        
    AchievementsT[playerid][3] = TextDrawCreate(570.0415.0"_");
        
    TextDrawBackgroundColor(AchievementsT[playerid][3], 255);
        
    TextDrawFont(AchievementsT[playerid][3], 2);
        
    TextDrawLetterSize(AchievementsT[playerid][3], 0.210.9);
        
    TextDrawColor(AchievementsT[playerid][3], -1);
        
    TextDrawSetOutline(AchievementsT[playerid][3], 1);
        
    TextDrawSetProportional(AchievementsT[playerid][3], 1);
        
    TextDrawSetSelectable(AchievementsT[playerid][3], 0);

        
    AchievementsT[playerid][4] = TextDrawCreate(536.0414.0"_");
        
    TextDrawBackgroundColor(AchievementsT[playerid][4], 255);
        
    TextDrawFont(AchievementsT[playerid][4], 4);
        
    TextDrawLetterSize(AchievementsT[playerid][4], 0.50.0);
        
    TextDrawColor(AchievementsT[playerid][4], -86);
        
    TextDrawUseBox(AchievementsT[playerid][4], 1);
        
    TextDrawBoxColor(AchievementsT[playerid][4], 119);
        
    TextDrawTextSize(AchievementsT[playerid][4], 30.028.0);
        
    TextDrawSetSelectable(AchievementsT[playerid][4], 0); 

    Теперь создайте секундный таймер или добавьте уже в созданный таймер этот код.
    Здесь вы должны использовать include foreach, или обыкновенный цыкл for что вам угодно
    PHP код:
    if(AchievementsCheck[i] != && AchievementsCheck[i] < gettime())//Закрытие TextDraw после открытия
    {
        
    AchievementsCheck[i] = 0;
        for(new 
    x5++) TextDrawHideForPlayer(iAchievementsT[i][x]);


    В конец мода добавляем stock или ко всем stock
    PHP код:
    stock AchievementsInfo(roomplayeridlang 0message 1)
    {
    /*  room -         номер достижения
        lang -         тип языка (0 ENG | 1 RUS)
        message -      1 показывать только TD | 2 показывать TD и сообщение в чат | 3 показывать только сообщение в чат*/
        
    new info[2];
        
    sscanf(AchievementText[room][3], "p<,>a<d>[2]"info);
        if(
    AchievementsCheck[playerid] != || Achievements[playerid][room] >= info[1]) return 1;
        
    Achievements[playerid][room] ++;
        if(
    Achievements[playerid][room] >= info[1])
        {
            if(
    message <= 2)
            {
                for(new 
    x5++) TextDrawShowForPlayer(playeridAchievementsT[playerid][x]);
                
    TextDrawSetString(AchievementsT[playerid][2], "achievement unlocked");
                
    TextDrawSetString(AchievementsT[playerid][3], AchievementText[room][lang]);
                
    TextDrawSetString(AchievementsT[playerid][4], AchievementText[room][2]);
                
    PlayerPlaySound(playerid68010.00.00.0);
                
    AchievementsCheck[playerid] = gettime()+6;
            }
            if(
    message >= 2)
            {
                new 
    string[80];
                
    format(stringsizeof(string), "Получено новое достижение: {4FDF24}%s{FFFFFF}."AchievementText[room][4]);
                
    SendClientMessage(playerid, -1string);
                
    PlayerPlaySound(playerid68010.00.00.0);
            }
        }
        

        
    /*new string[50+9+ 6*MAX_ADVANCE], str[6*MAX_ADVANCE], str1[6];// пример SAVE Mysql
        for(new x; x < MAX_ADVANCE; x ++)
        {
            format(str1, sizeof(str1), "%d,", Achievements[playerid][x]);
            strcat(str, str1);
        }
        mysql_format(MysqlConnectID, string, sizeof(string), "UPDATE profile SET achievements='%s' WHERE id=%d", str);
        mysql_tquery(MysqlConnectID, string);*/
        
    return 1;


    И всё один stock
    PHP код:
    stock SetDialogResponse(playeridslo)
    {
        switch(
    slo)
        {
            case 
    1:
            {
                new 
    string[80*+22], str[80], slot[3], info[2];
                for(new 
    idx 10*GetPVarInt(playerid"AchievementList[0]"); idx 10*GetPVarInt(playerid"AchievementList[0]")+11idx ++)
                {
                    if(
    slot[0] <= 9)
                    {
                        
    sscanf(AchievementText[idx][3], "p<,>a<d>[2]"info);
                        if(
    Achievements[playerid][idx] >= info[1]) format(strsizeof(str), "{61dd61}%s{FFFFFF}\t%s\n"AchievementText[idx][4], AchievementText[idx][5]);
                        else
                        {
                            if(
    info[0] == 0)
                            {
                                if(
    info[1] == 1format(strsizeof(str), "%s\t%s\n"AchievementText[idx][4], AchievementText[idx][5]);
                                else 
    format(strsizeof(str), "%s\t%s (%d/%d)\n"AchievementText[idx][4], AchievementText[idx][5], Achievements[playerid][idx], info[1]);
                            }
                            else 
    format(strsizeof(str), "Скрытое достижение\t\n");
                        }
                        
    strcat(stringstr);
                        
    format(strsizeof(str), "AchievementLine[%d]"idx);
                        
    SetPVarInt(playeridstridx+1);
                        if(
    idx >= MAX_ADVANCE-1)
                        {
                            if(
    GetPVarInt(playerid"AchievementList[0]") >= 1)
                            {
                                
    slot[1] = 1;
                                
    strcat(string"< Назад\n");
                                
    SetPVarInt(playerid"AchievementList[1]"slot[0]+2);
                            }
                            break;
                        }
                    }
                    
    slot[0] ++;
                    if(
    slot[0] >= 11)
                    {
                        
    slot[1] = 1;
                        
    strcat(string"> Дальше\n");
                        if(
    GetPVarInt(playerid"AchievementList[0]") >= 1strcat(string"< Назад\n");
                        break;
                    }
                }
                if(
    GetPVarInt(playerid"AchievementList[0]") >= && slot[1] == 0)
                {
                    
    strcat(string"< Назад\n");
                    
    SetPVarInt(playerid"AchievementList[1]"slot[0]+1);
                }
                for(new 
    xMAX_ADVANCE++)
                {
                    
    sscanf(AchievementText[x][3], "p<,>a<d>[2]"info);
                    if(
    Achievements[playerid][x] >= info[1]) slot[2] += 1;
                }
                
    format(strsizeof(str), "Достижения | {88AA88}Открыто %d из %d"slot[2], MAX_ADVANCE);
                return 
    ShowPlayerDialog(playerid77DIALOG_STYLE_TABLISTstrstring"Выбрать""Назад");
            }
        }
        return 
    1;


    В OnDialogResponse
    PHP код:
            case 77:
            {
                if(
    response == 0)
                {
                    
    DeletePVar(playerid"AchievementList[0]");
                    return 
    DeletePVar(playerid"AchievementList[1]");
                }
                switch(
    listitem)
                {
                    case 
    10:
                    {
                        if(
    GetPVarInt(playerid"AchievementList[1]") >= && GetPVarInt(playerid"AchievementList[1]") == listitem+&& GetPVarInt(playerid"AchievementList[0]") >= 1)
                        {
                            
    SetPVarInt(playerid"AchievementList[0]"GetPVarInt(playerid"AchievementList[0]")-1);
                            
    DeletePVar(playerid"AchievementList[1]");
                            return 
    SetDialogResponse(playerid1);
                        }
                        
    SetPVarInt(playerid"AchievementList[0]"GetPVarInt(playerid"AchievementList[0]")+1);
                        
    SetDialogResponse(playerid1);
                    }
                    case 
    11:
                    {
                        if(
    GetPVarInt(playerid"AchievementList[0]") >= 1SetPVarInt(playerid"AchievementList[0]"GetPVarInt(playerid"AchievementList[0]")-1);
                        
    SetDialogResponse(playerid1);
                    }
                    default:
                    {
                        if(
    GetPVarInt(playerid"AchievementList[1]") >= && GetPVarInt(playerid"AchievementList[1]") == listitem+&& GetPVarInt(playerid"AchievementList[0]") >= 1)
                        {
                            
    SetPVarInt(playerid"AchievementList[0]"GetPVarInt(playerid"AchievementList[0]")-1);
                            
    DeletePVar(playerid"AchievementList[1]");
                            return 
    SetDialogResponse(playerid1);
                        }
                        new 
    str[22], info[2];
                        
    format(strsizeof(str), "AchievementLine[%d]"listitem);
                        new 
    slot GetPVarInt(playeridstr)-+10*GetPVarInt(playerid"AchievementList[0]");
                        
    sscanf(AchievementText[slot][3], "p<,>a<d>[2]"info);
                        if(
    info[0] == && Achievements[playerid][slot] != info[1]) return ShowPlayerDialog(playerid78DIALOG_STYLE_MSGBOX"Неизвестно""{FFFFFF}Разгадайте тайну данного достижения.""Назад""Закрыть");
                        return 
    ShowPlayerDialog(playerid78DIALOG_STYLE_MSGBOXAchievementText[slot][4], AchievementText[slot][6], "Назад""Закрыть");
                    }
                }
                return 
    1;
            }
            case 
    78:
            {
                if(
    response == 0)
                {
                    
    DeletePVar(playerid"AchievementList[0]");
                    return 
    DeletePVar(playerid"AchievementList[1]");
                }
                return 
    SetDialogResponse(playerid1);
            } 

    Сама команда Pawn.CMD вызова диалога
    PHP код:
    cmd:advance(playeridparams[])
    {
        
    SetDialogResponse(playerid1);
        return 
    1;


    Теперь добавляем функция вызова достижения в OnVehicleRespray
    PHP код:
    if(color1 == 126 || color2 == 126AchievementsInfo(0playerid);//Достижение Перевозчик фламинго 

    И также в OnPlayerStateChange добавляем
    PHP код:
    switch(newstate)
    {
        case 
    PLAYER_STATE_DRIVERPLAYER_STATE_PASSENGER:
        {
            new 
    vehicleid GetPlayerVehicleID(playerid);
            if(
    GetVehicleModel(vehicleid)== 402AchievementsInfo(1playerid);//Достижение  Любитель Buffalo
        
    }

    На этом все, система достижений готова.

    Теперь показываю пример создание своего достижения
      Открыть/закрыть

    Покажу пример на создании достижения, погибании персонажа.

    Для начала нам нужно увеличить макрос MAX_ADVANCE на плюс один

    Теперь идем в AchievementText и добавляем в конец новую строчку
    PHP код:
    {"",      "",         "",         "0,1",         """""{FFFFFF}"
    Что за все отвечает написано сверху.
    Если вы захотите удалить достижение не удаляйте всю строку удалите только текст!!!

    У меня это будет выглядеть так
    PHP код:
    {"~n~Character Death",              "~n~Character Death",             "LD_BUM:bum2",             "0,3",         "Погибании персонажа",         "Убейте своего персонажа больше трёх раз",     "{FFFFFF}Убейте своего персонажа больше трёх раз"
    В итоге, у вас должно получится вот так
    PHP код:
    new AchievementText[MAX_ADVANCE][7][] =
    {
    /*
    XX - 1 - отвечает за скрытность достижения (0 открыто | 1 скрыто) | 2 - сколько раз нужно выполнить задание для получение достижения

        название TD ENG                       название TD RUS                 картинка                   XX                текст                                 текст 2                                     подробный текст*/
        
    {"~n~transporter~n~flamingo",         "~n~transporter~n~flamingo",    "LD_TATT:5cross3",        "1,1",         "Перевозчик фламинго",      "Покрасить автомобиль в розовый цвет",       "{FFFFFF}Ну фламинго так фламинго"},
        {
    "~n~I love this car",                "~n~I love this car",           "LD_OTB2:Ric5",           "0,5",         "Любитель Buffalo",         "Сесть 5 раз в Buffalo",                     "{FFFFFF}Найди эту машину и испытай её!"},
        {
    "~n~Character Death",                "~n~Character Death",           "LD_BUM:bum2",            "0,3",         "Погибании персонажа",      "Убейте своего персонажа больше трёх раз",   "{FFFFFF}Убейте своего персонажа больше трёх раз"}
    }; 
    Теперь идем в OnPlayerDeath, и добавляем следующий код
    PHP код:
    AchievementsInfo(2playerid); 
    Обратите внимание на цифру 2, это номер достижения.
      Открыть/закрыть



    Если вы добавите ещё одно достижение, то это уже будет цыфра 3, и так плюсуется при добавление нового достижения


    И в итоге, у нас получилась очень удобная система достижений!
    Легка в добавлении и быстрой настройки


    DOWNLOAD


    Автор: Bren
    При копировании на другие ресурсы указывайте автора
    Последний раз редактировалось Bren; 25.01.2020 в 03:25. Причина: update

 

 

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

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

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

Ваши права

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