Доступ к готовым решениям

Переход в группу "Пользователь"

300.00
Одноразовый платёж
Быстрый переход в группу "Пользователи", без надобности написания постов и ожидания.

Покупка дает возможность:
Быть полноправным участником форума
Нормальное копирование кода
Создавать темы
Скачивать файлы
Доступ к архиву Pawno-Info

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

Bren

Изучающий
Пользователь
Регистрация
17 Янв 2014
Сообщения
255
Лучшие ответы
0
Репутация
39
Решил выложить свою систему достижений из старого мода.
Немного переделал, поправил моментами, так вот держите

Скриншот


Нужен 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.0, 401.0, "_");
    TextDrawLetterSize(AchievementsT[playerid][0], 0.25, 1.0);
    TextDrawUseBox(AchievementsT[playerid][0], 1);
    TextDrawBoxColor(AchievementsT[playerid][0], 170);
    TextDrawTextSize(AchievementsT[playerid][0], 640.0, 0.0);
    TextDrawSetSelectable(AchievementsT[playerid][0], 0);

    AchievementsT[playerid][1] = TextDrawCreate(535.0, 401.0, "_");
    TextDrawLetterSize(AchievementsT[playerid][1], 0.25, 4.65);
    TextDrawUseBox(AchievementsT[playerid][1], 1);
    TextDrawBoxColor(AchievementsT[playerid][1], 102);
    TextDrawTextSize(AchievementsT[playerid][1], 640.0, 0.0);
    TextDrawSetSelectable(AchievementsT[playerid][1], 0);

    AchievementsT[playerid][2] = TextDrawCreate(587.0, 401.0, "_");
    TextDrawAlignment(AchievementsT[playerid][2], 2);
    TextDrawBackgroundColor(AchievementsT[playerid][2], 255);
    TextDrawFont(AchievementsT[playerid][2], 2);
    TextDrawLetterSize(AchievementsT[playerid][2], 0.19, 0.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.0, 415.0, "_");
    TextDrawBackgroundColor(AchievementsT[playerid][3], 255);
    TextDrawFont(AchievementsT[playerid][3], 2);
    TextDrawLetterSize(AchievementsT[playerid][3], 0.21, 0.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.0, 414.0, "_");
    TextDrawBackgroundColor(AchievementsT[playerid][4], 255);
    TextDrawFont(AchievementsT[playerid][4], 4);
    TextDrawLetterSize(AchievementsT[playerid][4], 0.5, 0.0);
    TextDrawColor(AchievementsT[playerid][4], -86);
    TextDrawUseBox(AchievementsT[playerid][4], 1);
    TextDrawBoxColor(AchievementsT[playerid][4], 119);
    TextDrawTextSize(AchievementsT[playerid][4], 30.0, 28.0);
    TextDrawSetSelectable(AchievementsT[playerid][4], 0);

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

В конец мода добавляем stock или ко всем stock
PHP:
stock AchievementsInfo(room, playerid, lang = 0, message = 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] != 0 || Achievements[playerid][room] >= info[1]) return 1;
    Achievements[playerid][room] ++;
    if(Achievements[playerid][room] >= info[1])
    {
        if(message <= 2)
        {
            for(new x; x < 5; x ++) TextDrawShowForPlayer(playerid, AchievementsT[playerid][x]);
            TextDrawSetString(AchievementsT[playerid][2], "achievement unlocked");
            TextDrawSetString(AchievementsT[playerid][3], AchievementText[room][lang]);
            TextDrawSetString(AchievementsT[playerid][4], AchievementText[room][2]);
            PlayerPlaySound(playerid, 6801, 0.0, 0.0, 0.0);
            AchievementsCheck[playerid] = gettime()+6;
        }
        if(message >= 2)
        {
            new string[80];
            format(string, sizeof(string), "Получено новое достижение: {4FDF24}%s{FFFFFF}.", AchievementText[room][4]);
            SendClientMessage(playerid, -1, string);
            PlayerPlaySound(playerid, 6801, 0.0, 0.0, 0.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(playerid, slo)
{
    switch(slo)
    {
        case 1:
        {
            new string[80*9 +22], str[80], slot[3], info[2];
            for(new idx = 10*GetPVarInt(playerid, "AchievementList[0]"); idx < 10*GetPVarInt(playerid, "AchievementList[0]")+11; idx ++)
            {
                if(slot[0] <= 9)
                {
                    sscanf(AchievementText[idx][3], "p<,>a<d>[2]", info);
                    if(Achievements[playerid][idx] >= info[1]) format(str, sizeof(str), "{61dd61}%s{FFFFFF}\t%s\n", AchievementText[idx][4], AchievementText[idx][5]);
                    else
                    {
                        if(info[0] == 0)
                        {
                            if(info[1] == 1) format(str, sizeof(str), "%s\t%s\n", AchievementText[idx][4], AchievementText[idx][5]);
                            else format(str, sizeof(str), "%s\t%s (%d/%d)\n", AchievementText[idx][4], AchievementText[idx][5], Achievements[playerid][idx], info[1]);
                        }
                        else format(str, sizeof(str), "Скрытое достижение\t\n");
                    }
                    strcat(string, str);
                    format(str, sizeof(str), "AchievementLine[%d]", idx);
                    SetPVarInt(playerid, str, idx+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]") >= 1) strcat(string, "< Назад\n");
                    break;
                }
            }
            if(GetPVarInt(playerid, "AchievementList[0]") >= 1 && slot[1] == 0)
            {
                strcat(string, "< Назад\n");
                SetPVarInt(playerid, "AchievementList[1]", slot[0]+1);
            }
            for(new x; x < MAX_ADVANCE; x ++)
            {
                sscanf(AchievementText[x][3], "p<,>a<d>[2]", info);
                if(Achievements[playerid][x] >= info[1]) slot[2] += 1;
            }
            format(str, sizeof(str), "Достижения | {88AA88}Открыто %d из %d", slot[2], MAX_ADVANCE);
            return ShowPlayerDialog(playerid, 77, DIALOG_STYLE_TABLIST, str, string, "Выбрать", "Назад");
        }
    }
    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]") >= 1 && GetPVarInt(playerid, "AchievementList[1]") == listitem+1 && GetPVarInt(playerid, "AchievementList[0]") >= 1)
                    {
                        SetPVarInt(playerid, "AchievementList[0]", GetPVarInt(playerid, "AchievementList[0]")-1);
                        DeletePVar(playerid, "AchievementList[1]");
                        return SetDialogResponse(playerid, 1);
                    }
                    SetPVarInt(playerid, "AchievementList[0]", GetPVarInt(playerid, "AchievementList[0]")+1);
                    SetDialogResponse(playerid, 1);
                }
                case 11:
                {
                    if(GetPVarInt(playerid, "AchievementList[0]") >= 1) SetPVarInt(playerid, "AchievementList[0]", GetPVarInt(playerid, "AchievementList[0]")-1);
                    SetDialogResponse(playerid, 1);
                }
                default:
                {
                    if(GetPVarInt(playerid, "AchievementList[1]") >= 1 && GetPVarInt(playerid, "AchievementList[1]") == listitem+1 && GetPVarInt(playerid, "AchievementList[0]") >= 1)
                    {
                        SetPVarInt(playerid, "AchievementList[0]", GetPVarInt(playerid, "AchievementList[0]")-1);
                        DeletePVar(playerid, "AchievementList[1]");
                        return SetDialogResponse(playerid, 1);
                    }
                    new str[22], info[2];
                    format(str, sizeof(str), "AchievementLine[%d]", listitem);
                    new slot = GetPVarInt(playerid, str)-1 +10*GetPVarInt(playerid, "AchievementList[0]");
                    sscanf(AchievementText[slot][3], "p<,>a<d>[2]", info);
                    if(info[0] == 1 && Achievements[playerid][slot] != info[1]) return ShowPlayerDialog(playerid, 78, DIALOG_STYLE_MSGBOX, "Неизвестно", "{FFFFFF}Разгадайте тайну данного достижения.", "Назад", "Закрыть");
                    return ShowPlayerDialog(playerid, 78, DIALOG_STYLE_MSGBOX, AchievementText[slot][4], AchievementText[slot][6], "Назад", "Закрыть");
                }
            }
            return 1;
        }
        case 78:
        {
            if(response == 0)
            {
                DeletePVar(playerid, "AchievementList[0]");
                return DeletePVar(playerid, "AchievementList[1]");
            }
            return SetDialogResponse(playerid, 1);
        }

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

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

И также в OnPlayerStateChange добавляем
PHP:
switch(newstate)
{
    case PLAYER_STATE_DRIVER, PLAYER_STATE_PASSENGER:
    {
        new vehicleid = GetPlayerVehicleID(playerid);
        if(GetVehicleModel(vehicleid)== 402) AchievementsInfo(1, playerid);//Достижение  Любитель 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(2, playerid);
Обратите внимание на цифру 2, это номер достижения.
Если вы добавите ещё одно достижение, то это уже будет цыфра 3, и так плюсуется при добавление нового достижения

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



Автор: Bren
При копировании на другие ресурсы указывайте автора
 
Последнее редактирование:
Сверху Снизу