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

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

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

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

Мануал Система квестов (by: Leo)

JIEON_COJIORS

Изучающий
Пользователь
Регистрация
27 Авг 2015
Сообщения
357
Лучшие ответы
0
Репутация
188

Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!


Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!


Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!

PHP:
#include <a_samp>
#include <a_mysql>
#include <Pawn.CMD>

new Float:player_pos[MAX_PLAYERS][4],
    player_vw[MAX_PLAYERS],
    player_int[MAX_PLAYERS];

new player_params[MAX_PLAYERS];

enum quest_enum
{
    //Название квеста
    quest_name[70],
    //Информация
    quest_info[360],
    //Место, куда должен отправиться игрок(GPS). Указывайте 0, если координаты не требуются
Float:quest_pos_x,
Float:quest_pos_y,
Float:quest_pos_z,
    //Камера, показывает на то, что по этим координатам, когда выводится информация. Указывайте 0, если не требуется
Float:quest_cam_x,
Float:quest_cam_y,
Float:quest_cam_z,
Float:quest_cam_a,

    //Линия квеста
    quest_line
    //ВАЖНО: НЕ СМЕШИВАТЬ ЛИНИИ. ЧТО БЫ ЛИНИЯ КВЕСТА НОМЕР 1 ВСЕГДА ШЛА ЗА КВЕСТОМ ЭТОЙ ЖЕ ЛИНИИ
    //ТО ЕСТЬ, ЧТОБЫ ПОСЛЕ КВЕСТА С ЛИНИЕЙ 2 НЕ ШЕЛ КВЕСТ С ЛИНИЕЙ 1
}
new quest[][quest_enum] = {
    // линия квеста - с чистого листа!
    {"Получить сведения о штате",
    "Вы только, приехали в штат, в котором отсутствовали несколько лет,\nВам необходимо разузнать, что нового и как тут все устроено.\nНайдите человека и расспросите его.\n\nПодсказка: Человек находится в аэропорту",
    0.0,-0.0,0.0,0.0,0.0,-0.0,0.0, 0},
    //Трудоустройство
    {"Вступить во фракцию",
    "Работа - это деятельность, необходимая каждому человеку.\n\
    Как не крути, а человеку работа необходима как воздух!\n\
    Чтобы открыть в себе что то новое, реализовать себя, свои таланты и способности.",
    0.0,-0.0,0.0,0.0,0.0,-0.0,0.0, 1},
    // - Недвижимиость
    {"Приобрести жилой дом",
    "Всем известна пословица «Каждый человек в своей жизни должен построить дом,\n\
    посадить дерево и вырастить сына». Из этих слов ясно, что сначало нужно построить дом,\n\
    к выбору которого стоит отнестись серьезно, так как от выбора будет зависеть вторая часть пословицы.",
    0.0,-0.0,0.0,0.0,0.0,-0.0,0.0, 2},
    //- Закон или криминал
    {"Мастерство",
    "Для выживания в этом опасном мире многим требуется оружие,\n\
    но увы не каждый умеет правильно с ним обращаться\n\
    Поднимите уровень владения всеми ружьями до 100 процентов",
    0.0,-0.0,0.0,0.0,0.0,-0.0,0.0, 3}
}; //GivePlayerQuest

static const quest_lines[][] = {
    "С чистого листа",
    "Трудоустройство",
    "Недвижимость",
    "Закон или криминал"
};
new quest_status[MAX_PLAYERS][sizeof(quest)];

CMD:quest(playerid)
{
    new quest_line_current[sizeof(quest_lines)], //Количество квесто в определенном сюжете
        quest_line_compleate[sizeof(quest_lines)]; //Количество выполненных сюжетов в определенном сюжете

    for(new i; i < sizeof(quest); i++)
    {
        quest_line_current[quest[i][quest_line]]++; //Узнаем сколько квестов в сюжете
        if(quest_status[playerid][i]) quest_line_compleate[quest[i][quest_line]]++; //Узнаем сколько выполненных
    }
    new empire_str[280],
        progress_end;

    for(new i; i < sizeof(quest_lines); i++)
    {
        progress_end = 100*quest_line_compleate[i]/quest_line_current[i]; //Узнаем % выполненных квестов в сюжете

        if(quest_line_current[i] != quest_line_compleate[i]) format(empire_str,sizeof(empire_str),"%s{B4B5B7}Глава %d:{FFFFFF} %s\t\t{9ACD32}%.1f%%\n",empire_str,i+1,quest_lines[i],float(progress_end));
        else format(empire_str,sizeof(empire_str),"%s{B4B5B7}Глава %d:{FFFFFF} %s\t\t{9ACD32}Завершена\n",empire_str,i+1,quest_lines[i]);
    }
    ShowPlayerDialog(playerid,9988,DIALOG_STYLE_TABLIST,"{B4B5B7}Сюжетная линия:",empire_str,!">>",!"Закрыть");
    return 1;
}
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
    switch(listitem)
    {
        case 9988:
        {
            if(!response) return true;
            player_params[playerid] = listitem; //Сохраняем выбранную линию

               new empire_str[500];

            for(new i; i < sizeof(quest); i++)
            {
                if(listitem != quest[i][quest_line]) continue; //Пропускаем квесты с неподходящим сюжетом
                if(i == 0) format(empire_str,sizeof(empire_str),"%s%s%s\t\t\n",empire_str,(quest_status[playerid][i]) ? ("{9ACD32}") : ("{FFFFFF}"),quest[i][quest_name]);
                else if(!quest_status[playerid][i-1]) format(empire_str,sizeof(empire_str),"%s{B4B5B7}%s\t\t\n",empire_str,quest[i][quest_name]);
                else format(empire_str,sizeof(empire_str),"%s%s%s\t\t\n",empire_str,(quest_status[playerid][i]) ? ("{9ACD32}") : ("{FFFFFF}"),quest[i][quest_name]);
            }
            return ShowPlayerDialog(playerid,9989,DIALOG_STYLE_TABLIST,inputtext,empire_str,!">>",!"Закрыть");
        }
        case 9989:
        {
            if(!response) return player_params[playerid] = 0,cmd_quest(playerid);

            if(player_params[playerid])
            {
                for(new i; i < sizeof(quest); i++)
                {
                    if(player_params[playerid] != quest[i][quest_line]) listitem ++; //Выдаем listitem правильный номер квеста
                    else break;
                }
            }

            //Возврашаем игрока если квест выполнен
            if(quest_status[playerid][listitem] == 1)
                return cmd_quest(playerid);

            //Выводим информацию в диалоге
            ShowQuestInfo(playerid,listitem);
            return 1;
        }
        case 9990:
        {
            new i = player_params[playerid];
            player_params[playerid] = 0;

            if(!response)
            {
                if(quest[i][quest_cam_x] != 0 && quest[i][quest_cam_y] != 0)
                {
                    SetPlayerPos(playerid,player_pos[playerid][0], player_pos[playerid][1], player_pos[playerid][2]);
                    SetPlayerVirtualWorld(playerid,player_vw[playerid]);
                    SetPlayerInterior(playerid,player_int[playerid]);
                }
                return cmd_quest(playerid);
            }

            if(quest[i][quest_cam_x] != 0 && quest[i][quest_cam_y] != 0) SpawnPlayer(playerid);

            SendClientMessage(playerid,-1,"Задание начато, приступайте к выполнению!");

            if(quest[i][quest_pos_x] != 0 && quest[i][quest_pos_y] != 0)
//                return GPS(playerid,quest[i][quest_pos_x], quest[i][quest_pos_y], quest[i][quest_pos_z],quest[i][quest_name]);
                    //Тут свой вывод в GPS, ВАЖНО!

            return 1;
        }
    }
    return 1;
}
stock ShowQuestInfo(playerid,listitem)
{
    new empire_str[460];
    format(empire_str,sizeof(empire_str),"{B4B5B7}%s\n\n{FFFFFF}%s\n\n{B4B5B7}- Хотите взяться за это задание?",quest[listitem][quest_name],quest[listitem][quest_info]);
    ShowPlayerDialog(playerid,9990,DIALOG_STYLE_MSGBOX,!"{B4B5B7}Задание:",empire_str,!"Начать","Закрыть");
    //Если есть координаты камеры и человек пешком, задействуем их
    if(quest[listitem][quest_cam_x] != 0 && quest[listitem][quest_cam_y] != 0 && GetPlayerState(playerid) != PLAYER_STATE_DRIVER)
    {
         GetPlayerPos(playerid, player_pos[playerid][0], player_pos[playerid][1], player_pos[playerid][2]);
           GetPlayerFacingAngle(playerid, player_pos[playerid][3]);
         player_int[playerid] = GetPlayerInterior(playerid);
         player_vw[playerid] = GetPlayerVirtualWorld(playerid);

        InterpolateCameraPosToPoint(playerid, quest[listitem][quest_cam_x] + 1.0 * floatsin(-quest[listitem][quest_cam_a], degrees),
        quest[listitem][quest_cam_y] + 1.0 * floatcos(-quest[listitem][quest_cam_a], degrees),quest[listitem][quest_cam_z]+0.4,quest[listitem][quest_cam_a]-200.0);

        SetPlayerPos(playerid,quest[listitem][quest_cam_x], quest[listitem][quest_cam_y], quest[listitem][quest_cam_z]-5);

        SetPlayerVirtualWorld(playerid,0);
        SetPlayerInterior(playerid,0);

        TogglePlayerControllable(playerid,false);
    }
    player_params[playerid] = listitem;
    return 1;
}
stock GivePlayerQuest(playerid,quest_id)
{
    if(quest_status[playerid]) return 1;
    quest_status[playerid] = 1;

    new empire_str[200];

    format(empire_str,80,"Вы выполнили квест: {B4B5B7}%s",quest[quest_id][quest_name]);
    SendClientMessage(playerid,-1, empire_str);

    ShowQuestInfo(playerid,quest_id+1);

    //Тут своё сохранение // ВАЖНО
    f(empire_str, "UPDATE `accounts` SET `Quest` = '");
    for(new i; i < sizeof(quest); i++) f(empire_str,"%s%d,",empire_str,quest_status[playerid][i]);
    format(empire_str, sizeof(empire_str), "%s' WHERE `Name` = '%s'",empire_str,name(playerid));
    mysql_tquery(bc_mysql, empire_str, "", "");
    return 1;
}
stock InterpolateCameraPosToPoint(playerid, Float:tx, Float:ty, Float:tz, Float:ta)
{
    new Float:x, Float:y, Float:z, Float:x2, Float:y2, Float:z2;
    GetPlayerCameraPos(playerid,x,y,z);
    x2= 0.7 * floatsin(ta,degrees) + tx;
    y2= -0.7 * floatcos(ta,degrees) + ty;
    z2 = tz;
    InterpolateCameraPos(playerid,x,y,z,x2,y2,z2,700,CAMERA_MOVE);
    GetPlayerCameraFrontVector(playerid,x2,y2,z2);
    InterpolateCameraLookAt(playerid,x + x2,y + y2,z + z2,tx,ty,tz,700,CAMERA_MOVE);
    return 1;
}

С моей версией Mysql - R41, загрузка выглядит так:

PHP:
            new
                str[158],
                string_[46];

            format(string_,sizeof(string_),"p<,>a<i>[%d]",sizeof(quest));
            cache_get_value_name(0, "Quest", str),sscanf(str, string_,player_temp[playerid][quest_status]);
Описание систем: Это версия квестов удобна тем, что вы легко можете добавлять квесты, сюжетные линии!

Описание функций:
PHP:
- GivePlayerQuest(playerid,quest_id) - Этот stock должен вызываться когда игрок выполняет тот или иной квест![/FONT][/CENTER]
[FONT=Courier New][CENTER]- playerid - ид игрока выполнившего квест
- quest_id - ид квеста(по номеру из переменной 'quest'


Важно: В коде есть места отмеченные с текстом "ВАЖНО", найдите их и подстройте под свой мод!
 
Последнее редактирование модератором:
Сверху Снизу