- Регистрация
- 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'
Важно: В коде есть места отмеченные с текстом "ВАЖНО", найдите их и подстройте под свой мод!
Последнее редактирование модератором: