PDA

Просмотр полной версии : [FS] Работа Доставка газет



Igor_Stalker
21.06.2017, 20:11
Здравствуйте,хочу предоставить вам свой скрипт Работа "Доставка газет".

При входе на сервер мы сразу телепортируемся к типографии ,где мы и будем начинать нашу работу
Для этого мы встаём на пикап и начинаем работу.Нам выдают форму и рюкзак с газетами.
Мы должны сесть на велик и прокатиться по району доставляя газеты.На задание нам дают 10 минут,по истечению этого времени если мы не доставим все газеты задание будет провалено.
Всего газет 22.При доставке последней газеты ,мы должны вернуться обратно в типографию ,где мы и получим награду

Скриншоты
http://imgur.com/a/dXtAj

Видео

https://youtu.be/RkBL97VL-sA

Скачать
https://drive.google.com/open?id=0B89NbU-saqJRRUFxMlhYdHA2aDg

Автор: Я(Igor_Stalker)
При копировании на другие форумы и паблики укажите автора Igor_Stalker

$continue$
21.06.2017, 20:20
veliki5 - минимальное знание английского, чтобы знать как по англ велосипед - bike.

Если у меня будут цвета тоже в define, то что тогда? Мне использовать Ваши или оставить свои?

P.S: там ещё много не понятных моментов - дальше даже смотреть не стал.

Igor_Stalker
21.06.2017, 20:34
veliki5 - минимальное знание английского, чтобы знать как по англ велосипед - bike.

Если у меня будут цвета тоже в define, то что тогда? Мне использовать Ваши или оставить свои?

P.S: там ещё много не понятных моментов - дальше даже смотреть не стал.

сейчас исправим

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

Обновил скрипт: Обновил код,добавил больше описания к коду.Убрал лишний код

Fallen A.
21.06.2017, 21:05
Начинание хорошее, вот только код подкачал. Старайся, в будущем.

Igor_Stalker
21.06.2017, 21:10
Начинание хорошее, вот только код подкачал. Старайся, в будущем.

Спасибо!А можно узнать ,что в коде не так?

Fallen A.
21.06.2017, 21:14
Спасибо!А можно узнать ,что в коде не так?

Ну, к примеру:
я бы поместил все координаты точек в массив и потом динамически их использовал там, где у тебя куча case. Это только одно из множества.

Kovshevoy
22.06.2017, 12:13
Видел данную работу на сервере Сектор. Неплохо.

middlematt
22.06.2017, 16:20
От подбора цветов глаза начали кровоточить

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

Можно было бы добавить чекпоинты через массив и не использовать каждые 10 строк switch.

Igor_Stalker
22.06.2017, 16:36
От подбора цветов глаза начали кровоточить

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

Можно было бы добавить чекпоинты через массив и не использовать каждые 10 строк switch.

к вечеру выйдет новая обновлённая версия.

Igor_Stalker
22.06.2017, 23:04
Обновил скрипт до новой и улучшенной версии.
Скачать можно в шапке темы.
Благодарю Pa4enka за помощь

middlematt
23.06.2017, 00:04
Что, простите?


if(gazeta{playerid} == 3|| gazeta{playerid} == 4||gazeta{playerid} == 5 ||gazeta{playerid} == 9 ||gazeta{playerid} == 10
||gazeta{playerid} == 12||gazeta{playerid} == 15||gazeta{playerid} == 16||gazeta{playerid} == 18||gazeta{playerid} == 21
||gazeta{playerid} == 23||gazeta{playerid} == 24||gazeta{playerid} == 26||gazeta{playerid} == 27||gazeta{playerid} == 28
||gazeta{playerid} == 29||gazeta{playerid} == 31||gazeta{playerid} == 32||gazeta{playerid} == 33||gazeta{playerid} == 35
||gazeta{playerid} == 37||gazeta{playerid} == 38)

{
switch(gazeta{playerid})
{
case 3:SendClientMessage(playerid,0xFFFFFFFF,!"Доставлено газет: {00FF00}1{FFFFFF}/{FF0000}22");
case 4:SendClientMessage(playerid,0xFFFFFFFF,!"Доставлено газет: {00FF00}2{FFFFFF}/{FF0000}22");
case 5:SendClientMessage(playerid,0xFFFFFFFF,!"Доставлено газет: {00FF00}3{FFFFFF}/{FF0000}22");
case 9:SendClientMessage(playerid,0xFFFFFFFF,!"Доставлено газет: {00FF00}4{FFFFFF}/{FF0000}22");
case 10:SendClientMessage(playerid,0xFFFFFFFF,!"Доставлено газет: {00FF00}5{FFFFFF}/{FF0000}22");
case 12:SendClientMessage(playerid,0xFFFFFFFF,!"Доставлено газет: {00FF00}6{FFFFFF}/{FF0000}22");
case 15:SendClientMessage(playerid,0xFFFFFFFF,!"Доставлено газет: {00FF00}7{FFFFFF}/{FF0000}22");
case 16:SendClientMessage(playerid,0xFFFFFFFF,!"Доставлено газет: {00FF00}8{FFFFFF}/{FF0000}22");
case 18:SendClientMessage(playerid,0xFFFFFFFF,!"Доставлено газет: {00FF00}9{FFFFFF}/{FF0000}22");
case 21:SendClientMessage(playerid,0xFFFFFFFF,!"Доставлено газет: {00FF00}10{FFFFFF}/{FF0000}22");
case 23:SendClientMessage(playerid,0xFFFFFFFF,!"Доставлено газет: {00FF00}11{FFFFFF}/{FF0000}22");
case 24:SendClientMessage(playerid,0xFFFFFFFF,!"Доставлено газет: {00FF00}12{FFFFFF}/{FF0000}22");
case 26:SendClientMessage(playerid,0xFFFFFFFF,!"Доставлено газет: {00FF00}13{FFFFFF}/{FF0000}22");
case 27:SendClientMessage(playerid,0xFFFFFFFF,!"Доставлено газет: {00FF00}14{FFFFFF}/{FF0000}22");
case 28:SendClientMessage(playerid,0xFFFFFFFF,!"Доставлено газет: {00FF00}15{FFFFFF}/{FF0000}22");
case 29:SendClientMessage(playerid,0xFFFFFFFF,!"Доставлено газет: {00FF00}16{FFFFFF}/{FF0000}22");
case 31:SendClientMessage(playerid,0xFFFFFFFF,!"Доставлено газет: {00FF00}17{FFFFFF}/{FF0000}22");
case 32:SendClientMessage(playerid,0xFFFFFFFF,!"Доставлено газет: {00FF00}18{FFFFFF}/{FF0000}22");
case 33:SendClientMessage(playerid,0xFFFFFFFF,!"Доставлено газет: {00FF00}19{FFFFFF}/{FF0000}22");
case 35:SendClientMessage(playerid,0xFFFFFFFF,!"Доставлено газет: {00FF00}20{FFFFFF}/{FF0000}22");
case 37:SendClientMessage(playerid,0xFFFFFFFF,!"Доставлено газет: {00FF00}21{FFFFFF}/{FF0000}22");
case 38:
{
SendClientMessage(playerid,0xFFFFFFFF,!"Доставлено газет: {00FF00}22{FFFFFF}/{FF0000}22");
SendClientMessage(playerid,0xAA3333FF,!"Отправляйтесь за наградой!");
}
}
ApplyAnimation(playerid, !"RYDER", !"RYD_BECKON_01", 4.1, false, false, false, false, 1000, false);//анимация выкидывания газеты
DisablePlayerCheckpoint(playerid);
SetPlayerCheckpoint(playerid,job_coord[gazeta{playerid}][0],job_coord[gazeta{playerid}][1],job_coord[gazeta{playerid}][2],2.0);//даём координаты игроку из массива job_coord
return 1;

}

Igor_Stalker
23.06.2017, 00:17
Что, простите?
Предложи свой вариант.

middlematt
23.06.2017, 11:34
Предложи свой вариант.


switch (gazeta{playerid})
{
case 3..37:
{
static const
fmt_str0[] = "Доставлено газет: {00FF00}%d{FFFFFF}/{FF0000}22";
new
str0[sizeof (fmt_str0)];
format(str0, sizeof (str0), fmt_str0, (gazeta{playerid} - 2));
SendClientMessage(playerid,0xFFFFFFFF,!"Доставлено газет: {00FF00}21{FFFFFF}/{FF0000}22");
}
case 38:
{
SendClientMessage(playerid,0xFFFFFFFF,!"Доставлено газет: {00FF00}22{FFFFFF}/{FF0000}22");
SendClientMessage(playerid,0xAA3333FF,!"Отправляйтесь за наградой!");
}

ApplyAnimation(playerid, !"RYDER", !"RYD_BECKON_01", 4.1, false, false, false, false, 1000, false);
DisablePlayerCheckpoint(playerid);
return SetPlayerCheckpoint(playerid,job_coord[gazeta{playerid}][0],job_coord[gazeta{playerid}][1],job_coord[gazeta{playerid}][2],2.0);
}

Igor_Stalker
23.06.2017, 12:53
switch (gazeta{playerid})
{
case 3..37:
{
static const
fmt_str0[] = "Доставлено газет: {00FF00}%d{FFFFFF}/{FF0000}22";
new
str0[sizeof (fmt_str0)];
format(str0, sizeof (str0), fmt_str0, (gazeta{playerid} - 2));
SendClientMessage(playerid,0xFFFFFFFF,!"Доставлено газет: {00FF00}21{FFFFFF}/{FF0000}22");
}
case 38:
{
SendClientMessage(playerid,0xFFFFFFFF,!"Доставлено газет: {00FF00}22{FFFFFF}/{FF0000}22");
SendClientMessage(playerid,0xAA3333FF,!"Отправляйтесь за наградой!");
}

ApplyAnimation(playerid, !"RYDER", !"RYD_BECKON_01", 4.1, false, false, false, false, 1000, false);
DisablePlayerCheckpoint(playerid);
return SetPlayerCheckpoint(playerid,job_coord[gazeta{playerid}][0],job_coord[gazeta{playerid}][1],job_coord[gazeta{playerid}][2],2.0);
}

ты хоть сам протестируй.а потом выкладывай сюда.Ничего не работает

DeimoS
23.06.2017, 14:48
Можно сделать так

/*----------------------------------------------------------------
Скрипт написал Igor_Stalker
Благодарю Pa4enka за помощь!

Эта работа была скопирована
с сервера Samp - Сектор Магический Остров

Информация о работе: мы должны в течении 10 минут доставить газеты
по району.Для работы нам дают велосипед

При копировании на форумы и паблики, указывайте автора Igor_Stalker
По вопросам Skype (igorkrutoi3)
------------------------------------------------------------------*/
#include <a_samp>

#define PEDDLER_JOB_PICKUP_POS 2145.4985, 2834.3423, 10.8203

//переменные
new PeddlerPickupID,
PeddlerCheckpointID[MAX_PLAYERS char],
PeddlerTimerID[MAX_PLAYERS],
PeddlerDefaultSkin[MAX_PLAYERS],
TotalNewspaperID;


enum
{
PJ_CP_TYPE_NEXT,
PJ_CP_TYPE_CHECK,
PJ_CP_TYPE_LAST,
PJ_CP_TYPE_END
};
enum e_PEDDLER_JOB_INFO
{
Float:pj_PosX,
Float:pj_PosY,
Float:pj_PosZ,
pj_CPType,
pj_NewspaperID
};
new Float:pjInfo[][e_PEDDLER_JOB_INFO]=//координаты чекпоинтов
{
{2117.7920, 2781.5730, 10.3300, PJ_CP_TYPE_NEXT, 0}, //0
{2087.1497, 2776.9431, 10.3299, PJ_CP_TYPE_NEXT, 0}, //1
{2046.4521, 2750.5498, 10.3318, PJ_CP_TYPE_NEXT, 0}, //2
{1996.9301, 2750.1809, 10.3321, PJ_CP_TYPE_CHECK, 0}, //3
{1954.0177, 2749.7798, 10.3325, PJ_CP_TYPE_CHECK, 0}, //4
{1896.7904, 2720.8408, 10.3278, PJ_CP_TYPE_CHECK, 0}, //5
{1699.5061, 2721.1201, 10.3323, PJ_CP_TYPE_NEXT, 0}, //6
{1694.6061, 2805.8516, 10.3318, PJ_CP_TYPE_NEXT, 0}, //7
{1664.7766, 2829.1855, 10.3316, PJ_CP_TYPE_NEXT, 0}, //8
{1551.2095, 2829.0281, 10.3325, PJ_CP_TYPE_CHECK, 0}, //9
{1558.4940, 2814.4146, 10.3251, PJ_CP_TYPE_CHECK, 0}, //10
{1618.1321, 2813.3032, 10.3328, PJ_CP_TYPE_NEXT, 0}, //11
{1674.7928, 2813.2476, 10.3312, PJ_CP_TYPE_CHECK, 0}, //12
{1679.5026, 2743.3391, 10.3323, PJ_CP_TYPE_NEXT, 0}, //13
{1645.3352, 2741.8022, 10.3304, PJ_CP_TYPE_NEXT, 0}, //14
{1599.2686, 2741.4404, 10.3284, PJ_CP_TYPE_CHECK, 0}, //15
{1536.9817, 2720.8381, 10.3256, PJ_CP_TYPE_CHECK, 0}, //16
{1552.6332, 2670.7439, 10.3326, PJ_CP_TYPE_NEXT, 0}, //17
{1579.7229, 2663.6450, 10.3325, PJ_CP_TYPE_CHECK, 0}, //18
{1579.3661, 2603.8621, 10.3237, PJ_CP_TYPE_NEXT, 0}, //19
{1539.3322, 2598.0623, 10.3300, PJ_CP_TYPE_NEXT, 0}, //20
{1487.1046, 2597.7407, 10.3296, PJ_CP_TYPE_CHECK, 0}, //21
{1348.8503, 2598.1309, 10.3256, PJ_CP_TYPE_NEXT, 0}, //22
{1267.6985, 2598.2493, 10.3305, PJ_CP_TYPE_CHECK, 0}, //23
{1279.2122, 2582.5315, 10.3304, PJ_CP_TYPE_CHECK, 0}, //24
{1347.5929, 2581.7451, 10.3315, PJ_CP_TYPE_NEXT, 0}, //25
{1416.1440, 2582.4121, 10.3321, PJ_CP_TYPE_CHECK, 0}, //26
{1512.4664, 2581.4185, 10.3254, PJ_CP_TYPE_CHECK, 0}, //27
{1563.6720, 2582.0237, 10.3325, PJ_CP_TYPE_CHECK, 0}, //28
{1594.8137, 2602.5059, 10.3315, PJ_CP_TYPE_CHECK, 0}, //29
{1593.7792, 2673.9614, 10.3325, PJ_CP_TYPE_NEXT, 0}, //30
{1568.5520, 2725.4263, 10.3249, PJ_CP_TYPE_CHECK, 0}, //31
{1651.6514, 2725.1770, 10.3330, PJ_CP_TYPE_CHECK, 0}, //32
{1673.9342, 2725.4160, 10.3257, PJ_CP_TYPE_CHECK, 0}, //33
{1703.0023, 2705.6509, 10.3302, PJ_CP_TYPE_NEXT, 0}, //34
{1887.7975, 2705.6663, 10.3255, PJ_CP_TYPE_CHECK, 0}, //35
{1931.7177, 2734.8918, 10.3309, PJ_CP_TYPE_NEXT, 0}, //36
{2056.5820, 2734.5193, 10.3327, PJ_CP_TYPE_LAST, 0}, //37
{2135.9753, 2833.2402, 10.2240, PJ_CP_TYPE_END, 0}//38
};
#define MAX_PJ_CHECHPOINTS sizeof(pjInfo)


enum e_PEDDLER_BIKE_INFO
{
pb_VehicleModel,
Float:pb_PosX,
Float:pb_PosY,
Float:pb_PosZ,
Float:pb_PosA,
pb_Color1,
pb_Color2,
pb_RespawnDelay
};
new PeddlerBikeID[2],
PeddlerBikeInfo[][e_PEDDLER_BIKE_INFO] =
{
{509, 2139.2957, 2841.2310, 10.3323, 176.8398, 7, 7, 60},
{509, 2140.7749, 2841.1785, 10.3328, 175.2333, 7, 7, 60},
{509, 2142.4055, 2841.0923, 10.3324, 178.2330, 7, 7, 60},
{509, 2143.9443, 2841.0537, 10.3326, 181.7920, 7, 7, 60},
{509, 2145.6948, 2841.2000, 10.3323, 173.1840, 7, 7, 60}
};
#define MAX_PEDDLER_BICYCLES sizeof(PeddlerBikeInfo)




public OnFilterScriptInit()//если использовать как мод
{
for(new i, c; i < MAX_PJ_CHECHPOINTS; i++)// Вычисляем номер доставленной газеты относительно чекпоинта
{
if(pjInfo[i][pj_CPType] == PJ_CP_TYPE_CHECK)
{
pjInfo[i][pj_NewspaperID] = ++c;
}
else if(pjInfo[i][pj_CPType] == PJ_CP_TYPE_LAST)
{
TotalNewspaperID =
pjInfo[i][pj_NewspaperID] = ++c;
}
}


PeddlerBikeID[0] = AddStaticVehicleEx( PeddlerBikeInfo[0][pb_VehicleModel],
PeddlerBikeInfo[0][pb_PosX],
PeddlerBikeInfo[0][pb_PosY],
PeddlerBikeInfo[0][pb_PosZ],
PeddlerBikeInfo[0][pb_PosA],
PeddlerBikeInfo[0][pb_Color1],
PeddlerBikeInfo[0][pb_Color2],
PeddlerBikeInfo[0][pb_RespawnDelay]);


#if MAX_PEDDLER_BICYCLES-1 > 1
for(new i = 1; i < MAX_PEDDLER_BICYCLES-1; i++)
{
AddStaticVehicleEx( PeddlerBikeInfo[i][pb_VehicleModel],
PeddlerBikeInfo[i][pb_PosX],
PeddlerBikeInfo[i][pb_PosY],
PeddlerBikeInfo[i][pb_PosZ],
PeddlerBikeInfo[i][pb_PosA],
PeddlerBikeInfo[i][pb_Color1],
PeddlerBikeInfo[i][pb_Color2],
PeddlerBikeInfo[i][pb_RespawnDelay]);
}
#endif

PeddlerBikeID[1] = AddStaticVehicleEx( PeddlerBikeInfo[MAX_PEDDLER_BICYCLES-1][pb_VehicleModel],
PeddlerBikeInfo[MAX_PEDDLER_BICYCLES-1][pb_PosX],
PeddlerBikeInfo[MAX_PEDDLER_BICYCLES-1][pb_PosY],
PeddlerBikeInfo[MAX_PEDDLER_BICYCLES-1][pb_PosZ],
PeddlerBikeInfo[MAX_PEDDLER_BICYCLES-1][pb_PosA],
PeddlerBikeInfo[MAX_PEDDLER_BICYCLES-1][pb_Color1],
PeddlerBikeInfo[MAX_PEDDLER_BICYCLES-1][pb_Color2],
PeddlerBikeInfo[MAX_PEDDLER_BICYCLES-1][pb_RespawnDelay]);

PeddlerPickupID = CreatePickup(1550, 23, PEDDLER_JOB_PICKUP_POS, 0);//пикап работы
Create3DTextLabel(!"Квест: {00FF00}Доставка газет!", 0xFF0000FF, PEDDLER_JOB_PICKUP_POS, 15, 0, 1);// 3 д текст на пикапе
SetObjectMaterialText(CreateObject(19353, 2139.4216, 2827.7844, 11.6892, -0.5999, 0.9999, -2.7115), !"Типография", 0, 140, !"Arial", 60, 0, -65536, 0, 1);//
return 1;
}

public OnPlayerEnterCheckpoint(playerid)//паблик, который используется когда игрок использует чекпоинт
{
if(!PeddlerCheckpointID{playerid})
return 1;
new vehicleid = GetPlayerVehicleID(playerid);
if(!(PeddlerBikeID[0] <= vehicleid <= PeddlerBikeID[1]))//проверка на то сидит ли игрок на велосипеде
{
SendClientMessage(playerid, 0xFF0000FF, "");
SendClientMessage(playerid, 0xFF0000FF, !"Вы должны быть на велосипеде! Вы провалили квест 'Доставка газет'!");
SendClientMessage(playerid, 0xFF0000FF, "");
PeddlerCheckpointID{playerid} = 0;//обнуляем переменную
SetPlayerSkin(playerid, PeddlerDefaultSkin[playerid]);//выдаём наш первоначальный скин
RemovePlayerAttachedObject(playerid, 0);//удаляем рюкзак
SetVehicleToRespawn(vehicleid);//респавним велосипед
DisablePlayerCheckpoint(playerid);//удаляем чекпоинты
KillTimer(PeddlerTimerID[playerid]);//убиваем таймер(10 минут )
return 1;
}

new idx = ++PeddlerCheckpointID{playerid};
DisablePlayerCheckpoint(playerid);

new string[43+11*2+1];
format(string, sizeof(string), "Доставлено газет: {00FF00}%d{FFFFFF}/{FF0000}%d", pjInfo[idx][pj_NewspaperID], TotalNewspaperID);
switch(pjInfo[idx][pj_CPType])
{
case PJ_CP_TYPE_CHECK:
{
SendClientMessage(playerid, 0xFFFFFFFF, string);
}
case PJ_CP_TYPE_LAST:
{
SendClientMessage(playerid, 0xFFFFFFFF, string);
SendClientMessage(playerid, 0xAA3333FF, !"Отправляйтесь за наградой!");
}
case PJ_CP_TYPE_END:
{
PeddlerCheckpointID{playerid} = 0;
SetPlayerSkin(playerid, PeddlerDefaultSkin[playerid]);
RemovePlayerAttachedObject(playerid, 0);
SetVehicleToRespawn(vehicleid);
DisablePlayerCheckpoint(playerid);
//
CallLocalFunction("GiveRewardForPeddlerJob", "%d", playerid);
//
KillTimer(PeddlerTimerID[playerid]);//убиваем таймер
return 1;
}
}
ApplyAnimation(playerid, !"RYDER", !"RYD_BECKON_01", 4.1, false, false, false, false, 1000, false);//анимация выкидывания газеты
DisablePlayerCheckpoint(playerid);
SetPlayerCheckpoint(playerid, pjInfo[idx][pj_PosX], pjInfo[idx][pj_PosY], pjInfo[idx][pj_PosZ], 2.0);//даём координаты игроку из массива pjInfo
return 1;
}

/* // Теперь эту функцию можно создавать в моде и выдавать там нужную награду
forward GiveRewardForPeddlerJob(playerid);
public GiveRewardForPeddlerJob(playerid)
{
SendClientMessage(playerid, 0x00FF00AA, !"Чем больше ваш уровень - тем больше награда за этот квест!");
SendClientMessage(playerid, 0x33CCFFAA, !"Вы доставили газеты подписчикам и получили:");
SendClientMessage(playerid, 0xFF9900AA, !"Положительный отзыв с этого квеста! {00FF00}Подробности о репутации в Ратуше.");
SendClientMessage(playerid, 0xFFFF00AA, !"Деньги(20000 вирт)!");
SendClientMessage(playerid, 0xFFFF00AA, !"Опыт(8 exp)!");
GivePlayerMoney(playerid, 20000);
return 1;
}
*/

@__UpdatePeddlerJob(playerid);
@__UpdatePeddlerJob(playerid)// паблик таймера(через 10 минут вызывается этот паблик если мы не выполним задание)
{
SendClientMessage(playerid, 0xFF0000FF, !"Вы не успели доставить газеты подписчикам в срок!");
PeddlerCheckpointID{playerid} = 0;//обнуляем переменную
SetPlayerSkin(playerid, PeddlerDefaultSkin[playerid]);//выдаём игроку первоначальный скин
RemovePlayerAttachedObject(playerid, 0);//удаляем рюкзак
SetVehicleToRespawn(GetPlayerVehicleID(playerid));//респавним велосипед
DisablePlayerCheckpoint(playerid);//удаляем чекпоинт работы
return 1;
}

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])//при подходе на пикап работы, выскакивает диалог о начале или конце работы
{
if(dialogid == 1)//если используете скрипт как фс, то замените на свободный ид диалога в своём моде
{
if(response)//начать
{
if(PeddlerCheckpointID{playerid} == 0)
{
SendClientMessage(playerid, 0xFFFFFFFF, !"РЕДАКТОР: Привет!Нужно срочно доставить газеты подписчикам.");
SendClientMessage(playerid, 0xFFFFFFFF, !"РЕДАКТОР: Времени совсем нет, поэтому поторопись!");
SendClientMessage(playerid, 0xFFFFFFFF, !"РЕДАКТОР: Бери велосипед и постарайся успеть доставить все газеты!");
SendClientMessage(playerid, 0xAA3333FF, !"Отправляйтесь к метке на карте! У вас есть 10 минут на это задание.");
PeddlerDefaultSkin[playerid] = GetPlayerSkin(playerid);
SetPlayerSkin(playerid, 36);//выдаём скин
SetPlayerAttachedObject(playerid, 0, 19559, 1, 0.051000, -0.056999, 0.003000, -5.199950, 85.300025, 0.000000, 1.168999, 1.098000, 0.962999);//прикрепляем рюкзак к игроку
SetPlayerCheckpoint(playerid, 2119.8196, 2824.0574, 10.3323, 2.0);//включаем 1 чекпоинт
PeddlerCheckpointID{playerid}--;
PeddlerTimerID[playerid] = SetTimer(!"@__UpdatePeddlerJob", 550000, false);//на задание даётся 10 мин, если мы не выполнили работу в течении 10 минут задание проваливается
return 1;

}
}
else//закончить
{
SendClientMessage(playerid, 0xFFFFFFFF, !"Вы отказались от квеста.");
PeddlerCheckpointID{playerid} = 0;//обнуляем переменную
SetPlayerSkin(playerid, PeddlerDefaultSkin[playerid]);//выдаём первоначальный скин
RemovePlayerAttachedObject(playerid, 0);//удаляем рюкзак
DisablePlayerCheckpoint(playerid);//удаляем чекпоинт
return 1;
}
}
return 1;
}

public OnPlayerDisconnect(playerid, reason)//обнуление переменной работы и таймера
{
PeddlerCheckpointID{playerid} =
PeddlerTimerID[playerid] = 0;
return 1;
}

public OnPlayerDeath(playerid, killerid, reason)//при смерти работа заканчивается
{
PeddlerCheckpointID{playerid} = 0;//обнуляем переменную
SetPlayerSkin(playerid, PeddlerDefaultSkin[playerid]);//выдаём первоначальный скин
RemovePlayerAttachedObject(playerid, 0);//удаляем рюкзак
SetVehicleToRespawn(GetPlayerVehicleID(playerid));//респавним велосипед
DisablePlayerCheckpoint(playerid);//удаляем чекпоинт
KillTimer(PeddlerTimerID[playerid]);//убиваем таймер
return 1;
}

public OnPlayerStateChange(playerid, newstate, oldstate)//паблик используется когда игрок меняет свой статус(сел в транспорт, идёт пешком)
{
if(newstate == PLAYER_STATE_DRIVER)
{
if(PeddlerCheckpointID{playerid} == 0)//проверка на взял ли игрок квест
{
SendClientMessage(playerid, 0xFFFFFFFF, !"Вы не брали квест 'Доставка газет'!");
RemovePlayerFromVehicle(playerid);//выкидываем из машины если игрок не брал квест
return 1;
}
}
return 1;
}

public OnPlayerPickUpPickup(playerid, pickupid)//паблик используется когда игрок использует пикап
{
if(pickupid == PeddlerPickupID)
{
ShowPlayerDialog(playerid, 1, DIALOG_STYLE_MSGBOX, !"{FF0000}Выбор", !"{00FF00}Что вы хотите?", !"Начать", !"Закончить");//если игрок использует пикап то отправляем игроку диалог
}
return 1;
}

public OnPlayerConnect(playerid)//иконка "Т"(типография) на карте
{
SetPlayerMapIcon(playerid, 0, 2145.4985, 2834.3423, 10.8203, 42, 0xbf8f8f, MAPICON_LOCAL);
return 1;
}

public OnPlayerRequestClass(playerid, classid)//спавн
{
SetSpawnInfo(playerid, 0, 289, 2130.8569, 2833.3203, 10.8740, 274.1458, 0, 0, 0, 0, 0, 0);
SpawnPlayer(playerid);
SendClientMessage(playerid, 0xFFFFFFFF, !"Вы появились рядом с типографией. /тп - команда для тп к типографии");
ApplyAnimation(playerid, !"RYDER", !"RYD_BECKON_01", 4.1, false, false, false, false, 1000, false);//подгрузка анимации(Баг в том что первая анимация не показывается, а все последущие показывается, эта подгрузка убирает это баг)
return 1;
}

public OnPlayerCommandText(playerid, cmdtext[])// команда для тп к типографии(введите /тп )
{
if(strcmp(!"/тп", cmdtext, true, 10) == 0)
{
SetPlayerPos(playerid, 2130.8569, 2833.3203, 10.8740);
SetPlayerFacingAngle(playerid, 274.1458);
SetPlayerVirtualWorld(playerid, 0);
SetPlayerInterior(playerid, 0);
return 1;
}
return 0;
}


Хотя и это далеко не идеальный вариант, ибо, например, не учтено, что у игрока может быть приаттачен какой-то другой объект на слот 0, из-за чего этот объект удалится (следует проверять, приаттачен ли объект и если приаттачен - сохранять его ID, чтоб по окончанию работы выдавать его обратно).
Ну и я не смотрел особо код ниже функции "@__UpdatePeddlerJob(playerid)"