PHP код:
/*----------------------------------------------------------------
Скрипт написал 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;
}