Всем доброго времени суток.
Написал я систему транспорта с сохранением тюнинга и автосалоном. Решим поделиться со всеми.
Это мой первый скрипт. Попрошу больше критики, дабы научиться на своих ошибках.
Для работоспособности скрипта необходимо в папке scriptfiles создать файл CarPrice.ini
Для работоспособности скрипта необходимо в папке scriptfiles создать папку "cars"
==========================================================================================
В скрипте присутствую такие команды как:
Код:
/editprice
/park
/lock
/selectcar
/sellcar
Для написания использовал такие инклуды/плагины как:
#include <a_samp>
#include <mxINI>
#include <sscanf2>
Итак, приступим
В начало мода/скрипта добавляем необходимые переменные/массивы:
#define SELLCAR_DIALOG 3000//Диалог продажи машины
#define BUYCAR_DIALOG 3001//Диалог покупки машины
new CarBuyPickup;//Пикап автосалона
new bool:PlayerInShop[MAX_PLAYERS];//переменная определяющая находится ли игрок в автосалоне
new PlayerText:ASalon[MAX_PLAYERS][7];//Массив для Текстдравов
new Text3D:OwnText[MAX_PLAYERS];//Массив для прикрепления 3D текста к машине
new OwnCar[MAX_PLAYERS];//Массив для прикрепления машины
new VehicleNames[][] = // Названия машин
{
"Landstalker", "Bravura", "Buffalo", "Linerunner", "Perrenial", "Sentinel",
"Dumper", "Firetruck", "Trashmaster", "Stretch", "Manana", "Infernus",
"Voodoo", "Pony", "Mule", "Cheetah", "Ambulance", "Leviathan", "Moonbeam",
"Esperanto", "Taxi", "Washington", "Bobcat", "Whoopee", "BF Injection",
"Hunter", "Premier", "Enforcer", "Securicar", "Banshee", "Predator", "Bus",
"Rhino", "Barracks", "Hotknife", "Trailer", "Previon", "Coach", "Cabbie",
"Stallion", "Rumpo", "RC Bandit", "Romero", "Packer", "Monster", "Admiral",
"Squalo", "Seasparrow", "Pizzaboy", "Tram", "Trailer", "Turismo", "Speeder",
"Reefer", "Tropic", "Flatbed", "Yankee", "Caddy", "Solair", "Berkley's RC Van",
"Skimmer", "PCJ-600", "Faggio", "Freeway", "RC Baron", "RC Raider", "Glendale",
"Oceanic","Sanchez", "Sparrow", "Patriot", "Quad", "Coastguard", "Dinghy",
"Hermes", "Sabre", "Rustler", "ZR-350", "Walton", "Regina", "Comet", "BMX",
"Burrito", "Camper", "Marquis", "Baggage", "Dozer", "Maverick", "News Chopper",
"Rancher", "FBI Rancher", "Virgo", "Greenwood", "Jetmax", "Hotring", "Sandking",
"Blista Compact", "Police Maverick", "Boxville", "Benson", "Mesa", "RC Goblin",
"Hotring Racer A", "Hotring Racer B", "Bloodring Banger", "Rancher", "Super GT",
"Elegant", "Journey", "Bike", "Mountain Bike", "Beagle", "Cropduster", "Stunt",
"Tanker", "Roadtrain", "Nebula", "Majestic", "Buccaneer", "Shamal", "Hydra",
"FCR-900", "NRG-500", "HPV1000", "Cement Truck", "Tow Truck", "Fortune",
"Cadrona", "FBI Truck", "Willard", "Forklift", "Tractor", "Combine", "Feltzer",
"Remington", "Slamvan", "Blade", "Freight", "Streak", "Vortex", "Vincent",
"Bullet", "Clover", "Sadler", "Firetruck", "Hustler", "Intruder", "Primo",
"Cargobob", "Tampa", "Sunrise", "Merit", "Utility", "Nevada", "Yosemite",
"Windsor", "Monster", "Monster", "Uranus", "Jester", "Sultan", "Stratium",
"Elegy", "Raindance", "RC Tiger", "Flash", "Tahoma", "Savanna", "Bandito",
"Freight Flat", "Streak Carriage", "Kart", "Mower", "Dune", "Sweeper",
"Broadway", "Tornado", "AT-400", "DFT-30", "Huntley", "Stafford", "BF-400",
"News Van", "Tug", "Trailer", "Emperor", "Wayfarer", "Euros", "Hotdog", "Club",
"Freight Box", "Trailer", "Andromada", "Dodo", "RC Cam", "Launch", "Police Car",
"Police Car", "Police Car", "Police Ranger", "Picador", "S.W.A.T", "Alpha",
"Phoenix", "Glendale", "Sadler", "Luggage", "Luggage", "Stairs", "Boxville",
"Tiller", "Utility Trailer"
};
new nBuyVehicleIds[] = //id моделей машин, которые не будут появляться в автосалоне, если хотите убрать какую-то машину из автосалона, добавьте id её модели сюда
{
403, 406, 407, 408, 414, 416, 417, 420, 423, 425, 427, 428, 430, 431, 432 , 433,
435, 437, 438, 441, 443, 444, 446, 447, 449, 450, 452, 453, 454, 455, 456, 457,
460, 464, 465, 469, 472, 473, 476, 484, 485, 486, 487, 488, 493, 497, 498, 499,
501, 511, 512, 513, 519, 520, 524, 530, 531, 532, 537, 538, 539, 544, 548, 553,
556, 557, 563, 564, 569, 570, 571, 572, 574, 577, 578, 584, 588, 590, 591, 592,
593, 594, 595, 601, 606, 607, 608, 609, 610, 611, 448 ,
};
enum cInfo
{
cCarId,//номер модели машины
cPrice,//Стоимость машины
cColor1,//цвет 1
cColor2,//цвет 2
cFrontBumper,//передний бампер
cRearBumper,//задний бампер
cHydraulics,//гидравлика
cSideskirt,//боковые молдинги
cVentRight,//хз
cVentLeft,//хз
cSpoiler,//спойлер
cExhaust,//выхлоп
cWheels,//колеса
cStereo,//музыка
cNitro,//нитро
cLamps,//фары
cHood,//капот
cRoof,//крыша
cBumper,//кенгурятник
}
new CarInfo[MAX_PLAYERS][cInfo];//Переменная с информацией об автомобиле
========================================================================================
Теперь, в OnGameModeInit()/OnFilterScriptInit()
CarBuyPickup = CreatePickup(1098,2,553.3808,-1261.2106,17.2422,0);//Создаем пикап автосалона
Create3DTextLabel( "{00AC4C}Автосалон", 0x008080FF, 553.3808,-1261.2106,18.2422, 80.0, 0 );//Создаем 3D текст автосалона
========================================================================================В OnPlayerConnect
new string[64];// Масив с путём для файла
new PlayerName[MAX_PLAYER_NAME];//Переменная для записи имени
GetPlayerName(playerid, PlayerName,sizeof(PlayerName));//Получаем имя игрока
format(string,sizeof(string), "cars/%s.ini", PlayerName);//Форматируем
if(fexist(string))//Если файл игрока в папке cars существует, загружаем его машину на сервер
{
GetCar(playerid);//функция загрузки машины
}
========================================================================================
В OnPlayerDisconnect
//////////////////////////Обнуляем все переменные для id игрока когда он выходит/////////////////////////
PlayerInShop[playerid] = false;
CarInfo[playerid][cCarId] = 0;
CarInfo[playerid][cPrice] = 0;
CarInfo[playerid][cColor1] = 0;
CarInfo[playerid][cColor2] = 0;
CarInfo[playerid][cFrontBumper] = 0;
CarInfo[playerid][cRearBumper] = 0;
CarInfo[playerid][cHydraulics] = 0;
CarInfo[playerid][cSideskirt] = 0;
CarInfo[playerid][cVentRight] = 0;
CarInfo[playerid][cVentLeft] = 0;
CarInfo[playerid][cSpoiler] = 0;
CarInfo[playerid][cExhaust] = 0;
CarInfo[playerid][cWheels] = 0;
CarInfo[playerid][cStereo] = 0;
CarInfo[playerid][cNitro] = 0;
CarInfo[playerid][cLamps] = 0;
CarInfo[playerid][cHood] = 0;
CarInfo[playerid][cRoof] = 0;
CarInfo[playerid][cBumper] = 0;
DestroyDynamic3DTextLabel(OwnText[playerid]);
DestroyVehicle(OwnCar[playerid]);
//////////////////////////Обнуляем все переменные для id игрока когда он выходит/////////////////////////
========================================================================================
В OnVehicleMod
if(vehicleid == OwnCar[playerid])//Если игрок тюнингует свою машину
{
//////////////////////////////////////////////Сохраняем тюнинг/////////////////////////////////////////////
CarInfo[playerid][cFrontBumper] = GetVehicleComponentInSlot(vehicleid, CARMODTYPE_FRONT_BUMPER);
CarInfo[playerid][cRearBumper] = GetVehicleComponentInSlot(vehicleid, CARMODTYPE_REAR_BUMPER);
CarInfo[playerid][cHydraulics] = GetVehicleComponentInSlot(vehicleid, CARMODTYPE_HYDRAULICS);
CarInfo[playerid][cSideskirt] = GetVehicleComponentInSlot(vehicleid, CARMODTYPE_SIDESKIRT);
CarInfo[playerid][cVentRight] = GetVehicleComponentInSlot(vehicleid, CARMODTYPE_VENT_RIGHT);
CarInfo[playerid][cVentLeft] = GetVehicleComponentInSlot(vehicleid, CARMODTYPE_VENT_LEFT);
CarInfo[playerid][cSpoiler] = GetVehicleComponentInSlot(vehicleid, CARMODTYPE_SPOILER);
CarInfo[playerid][cExhaust] = GetVehicleComponentInSlot(vehicleid, CARMODTYPE_EXHAUST);
CarInfo[playerid][cWheels] = GetVehicleComponentInSlot(vehicleid, CARMODTYPE_WHEELS);
CarInfo[playerid][cStereo] = GetVehicleComponentInSlot(vehicleid, CARMODTYPE_STEREO);
CarInfo[playerid][cNitro] = GetVehicleComponentInSlot(vehicleid, CARMODTYPE_NITRO);
CarInfo[playerid][cLamps] = GetVehicleComponentInSlot(vehicleid, CARMODTYPE_LAMPS);
CarInfo[playerid][cHood] = GetVehicleComponentInSlot(vehicleid, CARMODTYPE_HOOD);
CarInfo[playerid][cRoof] = GetVehicleComponentInSlot(vehicleid, CARMODTYPE_ROOF);
CarInfo[playerid][cBumper] = GetVehicleComponentInSlot(vehicleid, CARMODTYPE_FRONT_BUMPER);
//////////////////////////////////////////////////////////////////////////////////////////////////
SaveCar(playerid);//Сохраняем машину
}
========================================================================================
В OnVehicleRespray
if(vehicleid == OwnCar[playerid])//Если игрок перекрашивает свою машину
{
CarInfo[playerid][cColor1] = color1;//Сохраняем 1 цвет машины
CarInfo[playerid][cColor2] = color2;//Сохраняем 2 цвет машины
}
========================================================================================
В OnDialogResponse
switch(dialogid)
{
case SELLCAR_DIALOG://Диалог продажи авто
{
if(response)
{
new String[128];
DestroyVehicle(OwnCar[playerid]);//Удаляем машину игрока
GivePlayerMoney(playerid, CarInfo[playerid][cPrice]/2);//Возвращаем половину стоимости машины
format(String,sizeof(String),"{1673C7}Ты продал свой автомобиль {008080}%s{1673C7} за {008080}%d.",VehicleNames[CarInfo[playerid][cCarId] - 400], CarInfo[playerid][cPrice]/2);
SendClientMessage(playerid, 0xFF0000AA, String);//Выводим сообщение о покупке
/////////////////////////////////////////Удаляем весь тюнинг//////////////////////////////////////////
CarInfo[playerid][cCarId] = 0;
CarInfo[playerid][cPrice] = 0;
CarInfo[playerid][cColor1] = 0;
CarInfo[playerid][cColor2] = 0;
CarInfo[playerid][cFrontBumper] = 0;
CarInfo[playerid][cRearBumper] = 0;
CarInfo[playerid][cHydraulics] = 0;
CarInfo[playerid][cSideskirt] = 0;
CarInfo[playerid][cVentRight] = 0;
CarInfo[playerid][cVentLeft] = 0;
CarInfo[playerid][cSpoiler] = 0;
CarInfo[playerid][cExhaust] = 0;
CarInfo[playerid][cWheels] = 0;
CarInfo[playerid][cStereo] = 0;
CarInfo[playerid][cNitro] = 0;
CarInfo[playerid][cLamps] = 0;
//////////////////////////////////////////////////////////////////////////////////
DestroyDynamic3DTextLabel(OwnText[playerid]);//удаляем 3D текст
SaveCar(playerid);//Сохраняем машину
}
}
case BUYCAR_DIALOG://Диалог покупки авто
{
if(response)
{
if(GetPlayerMoney(playerid) >= CarInfo[playerid][cPrice])//Проверка достаточно ли денег у игрока
{
GivePlayerMoney(playerid,-CarInfo[playerid][cPrice]);//Забираем деньги у игрока
new String[128];
format(String,sizeof(String),"{1673C7}Поздравляем, ты купил {008080}%s{1673C7}. Чтобы вызвать машину введи: {FF0000}[/park]",VehicleNames[CarInfo[playerid][cCarId] - 400]);
SendClientMessage(playerid, 0xFF0000AA, String);//Выводим сообщение о покупке
SaveCar(playerid);//Сохраняем машину
SetPlayerPos(playerid,551.3364,-1269.2418,17.2422);//Переносим игрока недалеко от пикапа автосалона, чтобы повторно не задействовать пикап после покупки авто
SetPlayerVirtualWorld(playerid,0);//Переносим игрока в общий виртуальный мир
SetCameraBehindPlayer(playerid);//Возвращаем камеру игроку
PlayerInShop[playerid] = false;//Говорим что игрок вышел из автосалона
DestroyVehicle(OwnCar[playerid]);//Удаляем машину, заспавненную игроком при выборе
TogglePlayerControllable(playerid,1);//размораживаем игрока
CancelSelectTextDraw(playerid);//Убираем возможность выбирать текстдравы
for(new i=0;i<7;i++)
{
PlayerTextDrawDestroy(playerid, ASalon[playerid][i]);//удаляем все текстдравы
}
}
else SendClientMessage(playerid, 0xFF0000FF, "У тебя недостаточно денег.");//Выводим сообщение, если у игрока мало денег
}
}
}
========================================================================================
В OnPlayerPickUpPickup
if(pickupid == CarBuyPickup)
{
if(CarInfo[playerid][cCarId]!=0) return SendClientMessage(playerid, 0xFF0000FF,"У тебя уже есть машина.");//Выводим сообщение, если у игрока уже есть машина
TogglePlayerControllable(playerid,0);//Фризим игрока
SetPlayerVirtualWorld(playerid,playerid+1);//Переносим игрока в виртуальный мир, чтобы никто не мешал
SetPlayerCameraPos(playerid, 551.3364,-1269.2418,17.2422);//Где будет находиться камера
SetPlayerCameraLookAt(playerid, 550.2451,-1280.0016,16.9753);//Куда будет смотреть камера
PlayerInShop[playerid] = true;//Указываем что игрок зашел в автосалон
CarInfo[playerid][cCarId] = 400;//Указываем id первой машины
SendClientMessage(playerid, -1,"Для быстрого перехода к машине введи /selectcar [id].");
BuyCar(playerid);//Вызываем функцию покупки авто
}
========================================================================================
В OnPlayerClickPlayerTextDraw
if(playertextid == ASalon[playerid][0])// Если игрок нажал на Текстдрав "Next"
{
NextCar(playerid);//Вызываем функцию, которая показывает следующую машину
}
if(playertextid == ASalon[playerid][1])// Если игрок нажал на Текстдрав "Back"
{
BackCar(playerid);//Вызываем функцию, которая показывает предыдущую машину
}
if(playertextid == ASalon[playerid][4])// Если игрок нажал на Текстдрав "Buy"
{
new string[128];
format(string,sizeof(string),"Ты уверен, что хочешь купить %s за %d$?",VehicleNames[CarInfo[playerid][cCarId] - 400], CarInfo[playerid][cPrice]);
ShowPlayerDialog(playerid, BUYCAR_DIALOG, DIALOG_STYLE_MSGBOX, "Покупка авто", string, "Купить", "Отмена");//Выводим диалог покупки игроку
}
if(playertextid == ASalon[playerid][5])// Если игрок нажал на Текстдрав "Exit"
{
SetPlayerPos(playerid,551.3364,-1269.2418,17.2422);//Телепортируем игрока чтобы он не подобрал пикап повторно после возвращение в 0 virtualworld
SetPlayerVirtualWorld(playerid,0);//Переносим игрока в общий виртуальный мир
SetCameraBehindPlayer(playerid);//Возвращаем камеру игроку
PlayerInShop[playerid] = false;//Говорим что игрок вышел из автосалона
CarInfo[playerid][cCarId] = 0;//Обнуляем Id авто игрока, т.к. он ничего не купил
CarInfo[playerid][cPrice] = 0;//Обнуляем цену авто игрока, т.к. он ничего не купил
DestroyVehicle(OwnCar[playerid]);//Удаляем машину, заспавненную игроком при выборе
TogglePlayerControllable(playerid,1);//размораживаем игрока
CancelSelectTextDraw(playerid);//Убираем возможность выбирать текстдравы
for(new i=0;i<7;i++)
{
PlayerTextDrawDestroy(playerid, ASalon[playerid][i]);//удаляем все текстдравы
}
}
========================================================================================
Далее, ниже всех пабликов создаем нужные нам функции
GetPriceCar(playerid)//функция получаения цены автомобиля
{
new string[64];
new iniFile = ini_openFile("CarPrice.ini");// Открываем файл по тому пути который указали.
format(string, sizeof(string), "%d", CarInfo[playerid][cCarId]);// получаем номер строки, равный id модели транспорта
ini_getInteger(iniFile,string,CarInfo[playerid][cPrice]);//получаем стоимость машины
ini_closeFile(iniFile);// Закрываем файл
}
BuyCar(playerid)//Функция покупки автомобиля
{
new string[64];// Масив с путём для файла
new PlayerName[MAX_PLAYER_NAME];//Переменная для хранения имени
GetPlayerName(playerid, PlayerName,sizeof(PlayerName));
format(string,sizeof(string), "cars/%s.ini", PlayerName);// Добавляем имя игрока, в путь с машинами
if(!fexist(string))
{
new iniFile = ini_createFile(string);// Создаём файл с именем игрока в папке cars
if(iniFile < 0)// Если файл не открыт
{
iniFile = ini_openFile(string);// Открываем
}
if(iniFile >= 0)// Если файл открыт
{
ini_setInteger(iniFile,"CarId",0);// Записываем id машины игрока
ini_closeFile(iniFile);// Закрываем файл
}
}
GetPriceCar(playerid);//Вызываем функцию получаения цены автомобиля
OwnCar[playerid] = CreateVehicle(CarInfo[playerid][cCarId],550.2451,-1280.0016,16.9753,43.9849,0,0,-1);//Создаем авто
SetVehicleVirtualWorld(OwnCar[playerid], playerid+1);//Переносим автомобиль в виртуальный мир равный id игрока + 1 (+1 чтобы авто не спавнилось в 0 вм когда id игрока = 0)
ASalon[playerid][0] = CreatePlayerTextDraw(playerid, 410.333343, 370.444732, "Next");//создаем текстдрав next
PlayerTextDrawLetterSize(playerid, ASalon[playerid][0], 0.510665, 1.829999);
PlayerTextDrawTextSize(playerid, ASalon[playerid][0], 20.000000, 61.000000);
PlayerTextDrawAlignment(playerid, ASalon[playerid][0], 2);
PlayerTextDrawColor(playerid, ASalon[playerid][0], -1);
PlayerTextDrawUseBox(playerid, ASalon[playerid][0], 1);
PlayerTextDrawBoxColor(playerid, ASalon[playerid][0], 255);
PlayerTextDrawSetShadow(playerid, ASalon[playerid][0], 0);
PlayerTextDrawSetOutline(playerid, ASalon[playerid][0], 1);
PlayerTextDrawBackgroundColor(playerid, ASalon[playerid][0], 255);
PlayerTextDrawFont(playerid, ASalon[playerid][0], 2);
PlayerTextDrawSetProportional(playerid, ASalon[playerid][0], 0);
PlayerTextDrawSetShadow(playerid, ASalon[playerid][0], 0);
PlayerTextDrawSetSelectable(playerid, ASalon[playerid][0], true);
PlayerTextDrawShow(playerid,ASalon[playerid][0]);
ASalon[playerid][1] = CreatePlayerTextDraw(playerid, 237.000000, 369.200317, "Back");//создаем текстдрав back
PlayerTextDrawLetterSize(playerid, ASalon[playerid][1], 0.510665, 1.829999);
PlayerTextDrawTextSize(playerid, ASalon[playerid][1], 20.000000, 61.000000);
PlayerTextDrawAlignment(playerid, ASalon[playerid][1], 2);
PlayerTextDrawColor(playerid, ASalon[playerid][1], -1);
PlayerTextDrawUseBox(playerid, ASalon[playerid][1], 1);
PlayerTextDrawBoxColor(playerid, ASalon[playerid][1], 255);
PlayerTextDrawSetShadow(playerid, ASalon[playerid][1], 0);
PlayerTextDrawSetOutline(playerid, ASalon[playerid][1], 1);
PlayerTextDrawBackgroundColor(playerid, ASalon[playerid][1], 255);
PlayerTextDrawFont(playerid, ASalon[playerid][1], 2);
PlayerTextDrawSetProportional(playerid, ASalon[playerid][1], 0);
PlayerTextDrawSetShadow(playerid, ASalon[playerid][1], 0);
PlayerTextDrawSetSelectable(playerid, ASalon[playerid][1], true);
PlayerTextDrawShow(playerid,ASalon[playerid][1]);
format(string,sizeof(string),"Model: %s",VehicleNames[CarInfo[playerid][cCarId] - 400]);//создаем текстдрав Model
ASalon[playerid][2] = CreatePlayerTextDraw(playerid, 25.666702, 231.481582, string);//создаем текстдрав Model
PlayerTextDrawLetterSize(playerid, ASalon[playerid][2], 0.400333, 1.600000);
PlayerTextDrawAlignment(playerid, ASalon[playerid][2], 1);
PlayerTextDrawColor(playerid, ASalon[playerid][2], -1);
PlayerTextDrawSetShadow(playerid, ASalon[playerid][2], 16);
PlayerTextDrawSetOutline(playerid, ASalon[playerid][2], 1);
PlayerTextDrawBackgroundColor(playerid, ASalon[playerid][2], 255);
PlayerTextDrawFont(playerid, ASalon[playerid][2], 1);
PlayerTextDrawSetProportional(playerid, ASalon[playerid][2], 1);
PlayerTextDrawSetShadow(playerid, ASalon[playerid][2], 16);
PlayerTextDrawShow(playerid,ASalon[playerid][2]);
format(string,sizeof(string),"Price: %d",CarInfo[playerid][cPrice]);//создаем текстдрав Price
ASalon[playerid][3] = CreatePlayerTextDraw(playerid, 26.333368, 253.881561, string);
PlayerTextDrawLetterSize(playerid, ASalon[playerid][3], 0.400333, 1.600000);
PlayerTextDrawAlignment(playerid, ASalon[playerid][3], 1);
PlayerTextDrawColor(playerid, ASalon[playerid][3], -1);
PlayerTextDrawSetShadow(playerid, ASalon[playerid][3], 16);
PlayerTextDrawSetOutline(playerid, ASalon[playerid][3], 1);
PlayerTextDrawBackgroundColor(playerid, ASalon[playerid][3], 255);
PlayerTextDrawFont(playerid, ASalon[playerid][3], 1);
PlayerTextDrawSetProportional(playerid, ASalon[playerid][3], 1);
PlayerTextDrawSetShadow(playerid, ASalon[playerid][3], 16);
PlayerTextDrawShow(playerid, ASalon[playerid][3]);
ASalon[playerid][4] = CreatePlayerTextDraw(playerid, 543.333618, 221.526046, "Buy");//создаем текстдрав Buy
PlayerTextDrawLetterSize(playerid, ASalon[playerid][4], 0.427333, 1.649777);
PlayerTextDrawTextSize(playerid, ASalon[playerid][4], 640.000000, 15.000000);
PlayerTextDrawAlignment(playerid, ASalon[playerid][4], 1);
PlayerTextDrawColor(playerid, ASalon[playerid][4], 2147418367);
PlayerTextDrawUseBox(playerid, ASalon[playerid][4], 1);
PlayerTextDrawBoxColor(playerid, ASalon[playerid][4], 255);
PlayerTextDrawSetShadow(playerid, ASalon[playerid][4], 0);
PlayerTextDrawSetOutline(playerid, ASalon[playerid][4], 1);
PlayerTextDrawBackgroundColor(playerid, ASalon[playerid][4], 255);
PlayerTextDrawFont(playerid, ASalon[playerid][4], 1);
PlayerTextDrawSetProportional(playerid, ASalon[playerid][4], 1);
PlayerTextDrawSetShadow(playerid, ASalon[playerid][4], 0);
PlayerTextDrawSetSelectable(playerid, ASalon[playerid][4], true);
PlayerTextDrawShow(playerid, ASalon[playerid][4]);
ASalon[playerid][5] = CreatePlayerTextDraw(playerid, 543.667053, 246.829727, "Exit");//создаем текстдрав Exit
PlayerTextDrawLetterSize(playerid, ASalon[playerid][5], 0.427333, 1.649777);
PlayerTextDrawTextSize(playerid, ASalon[playerid][5], 642.000000, 15.000000);
PlayerTextDrawAlignment(playerid, ASalon[playerid][5], 1);
PlayerTextDrawColor(playerid, ASalon[playerid][5], -16764161);
PlayerTextDrawUseBox(playerid, ASalon[playerid][5], 1);
PlayerTextDrawBoxColor(playerid, ASalon[playerid][5], 255);
PlayerTextDrawSetShadow(playerid, ASalon[playerid][5], 0);
PlayerTextDrawSetOutline(playerid, ASalon[playerid][5], 1);
PlayerTextDrawBackgroundColor(playerid, ASalon[playerid][5], 255);
PlayerTextDrawFont(playerid, ASalon[playerid][5], 1);
PlayerTextDrawSetProportional(playerid, ASalon[playerid][5], 1);
PlayerTextDrawSetShadow(playerid, ASalon[playerid][5], 0);
PlayerTextDrawSetSelectable(playerid, ASalon[playerid][5], true);
PlayerTextDrawShow(playerid, ASalon[playerid][5]);
format(string,sizeof(string),"Model Id: %d",CarInfo[playerid][cCarId]);
ASalon[playerid][6] = CreatePlayerTextDraw(playerid, 26.333368, 274.622467, string);//создаем текстдрав Id
PlayerTextDrawLetterSize(playerid, ASalon[playerid][6], 0.400332, 1.600000);
PlayerTextDrawAlignment(playerid, ASalon[playerid][6], 1);
PlayerTextDrawColor(playerid, ASalon[playerid][6], -1);
PlayerTextDrawSetShadow(playerid, ASalon[playerid][6], 16);
PlayerTextDrawSetOutline(playerid, ASalon[playerid][6], 1);
PlayerTextDrawBackgroundColor(playerid, ASalon[playerid][6], 255);
PlayerTextDrawFont(playerid, ASalon[playerid][6], 1);
PlayerTextDrawSetProportional(playerid, ASalon[playerid][6], 1);
PlayerTextDrawSetShadow(playerid, ASalon[playerid][6], 16);
PlayerTextDrawShow(playerid, ASalon[playerid][6]);
SelectTextDraw(playerid,0xFF0000FF);//Вызываем курсор, чтобы игрок мог выбрать текстдрав
}
NextCar(playerid)//Функция вызова следующей машины
{
if(CarInfo[playerid][cCarId] == 605) CarInfo[playerid][cCarId] = 400;// проверка, если предыдущая машины была последней, то перекидывает к первой машине
else CarInfo[playerid][cCarId] ++;// если нет, то просто переменная плюсуется
///////////////////////////Проверка нету ли данного авто в списке запрещенных для автосалона машине/////////////////////////////////////////////
for(new i =0; i<sizeof(nBuyVehicleIds); i++)
{
if(CarInfo[playerid][cCarId] == nBuyVehicleIds[i]) return NextCar(playerid);
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
CreateShopCar(playerid);//Вызываем функцию создания машины в автосалоне
return true;
}
BackCar(playerid)//Функция вызова предыдущей машины, тут все аналогично NextCar(playerid) только все наоборот
{
if(CarInfo[playerid][cCarId] == 400) CarInfo[playerid][cCarId] = 605;
else CarInfo[playerid][cCarId] --;
for(new i =0; i<sizeof(nBuyVehicleIds); i++)
{
if(CarInfo[playerid][cCarId] == nBuyVehicleIds[i]) return BackCar(playerid);
}
CreateShopCar(playerid);
return true;
}
CreateShopCar(playerid)//Функцию создания машины в автосалоне
{
new string[64];
DestroyVehicle(OwnCar[playerid]);//Удаляем предыдущую машину
OwnCar[playerid] = CreateVehicle(CarInfo[playerid][cCarId],550.2451,-1280.0016,16.9753,43.9849,0,0,-1);//Создаем новую машину
SetVehicleVirtualWorld(OwnCar[playerid], playerid+1);//Устанавливаем этой машине виртуальный мир id игрока +1
GetPriceCar(playerid);//получем цену машины
format(string,sizeof(string),"Model: %s",VehicleNames[CarInfo[playerid][cCarId] - 400]);
PlayerTextDrawSetString (playerid, ASalon[playerid][2] , string);//Выводим на текстдрав модель машины
format(string,sizeof(string),"Price: %d",CarInfo[playerid][cPrice]);
PlayerTextDrawSetString(playerid, ASalon[playerid][3], string);//Выводим на текстдрав цену машины
format(string,sizeof(string),"Model Id: %d",CarInfo[playerid][cCarId]);
PlayerTextDrawSetString(playerid, ASalon[playerid][6], string);//Выводим на текстдрав id машины
return 1;
}
SaveCar(playerid)//Функцию сохранения машины
{
new string[64];
new PlayerName[MAX_PLAYER_NAME];//Переменная для имени
GetPlayerName(playerid, PlayerName,sizeof(PlayerName));//берем имя игрока
format(string, sizeof(string), "cars/%s.ini", PlayerName);// Добавляем имя игрока, в путь для сохранения
new iniFile = ini_openFile(string);// Открываем файл по тому пути который указали.
ini_setInteger(iniFile,"CarId",CarInfo[playerid][cCarId]);//Сохраняем id модели транспортая игрока
ini_setInteger(iniFile,"Price",CarInfo[playerid][cPrice]);//Сохраняем цену автомобиля
ini_setInteger(iniFile,"Color1",CarInfo[playerid][cColor1]);//Сохраняем цвет авто 1
ini_setInteger(iniFile,"Color2",CarInfo[playerid][cColor2]);//Сохраняем цвет авто 2
ini_setInteger(iniFile,"FrontBumper",CarInfo[playerid][cFrontBumper]);//Сохраняем передний бампер
ini_setInteger(iniFile,"RearBumper",CarInfo[playerid][cRearBumper]);//Сохраняем задний бампер
ini_setInteger(iniFile,"Hydraulics",CarInfo[playerid][cHydraulics]);//Сохраняем гидравлику
ini_setInteger(iniFile,"Sideskirt",CarInfo[playerid][cSideskirt]);//Сохраняем пороги
ini_setInteger(iniFile,"VentRight",CarInfo[playerid][cVentRight]);//ну внатуре хз что это такое
ini_setInteger(iniFile,"VentLeft",CarInfo[playerid][cVentLeft]);//и это тоже
ini_setInteger(iniFile,"Spoiler",CarInfo[playerid][cSpoiler]);//Сохраняем спойлер
ini_setInteger(iniFile,"Exhaust",CarInfo[playerid][cExhaust]);//Сохраняем выхлоп
ini_setInteger(iniFile,"Wheels",CarInfo[playerid][cWheels]);//Сохраняем колеса
ini_setInteger(iniFile,"Stereo",CarInfo[playerid][cStereo]);//Сохраняем стерео
ini_setInteger(iniFile,"Nitro",CarInfo[playerid][cNitro]);//Сохраняем нитро
ini_setInteger(iniFile,"Lamps",CarInfo[playerid][cLamps]);//Сохраняем фары
ini_setInteger(iniFile,"Hood",CarInfo[playerid][cHood]);//Сохраняем капот
ini_setInteger(iniFile,"Roof",CarInfo[playerid][cRoof]);//Сохраняем крышу
ini_setInteger(iniFile,"Bumper",CarInfo[playerid][cBumper]);//Сохраняем накладки на бампер/решетку радиатора
ini_closeFile(iniFile);// Закрываем файл
}
GetCar(playerid)//функция загрузки машины ( Тут то же самое что и с сохранением, только все наоборот )
{
new string[64];
new PlayerName[MAX_PLAYER_NAME];
GetPlayerName(playerid, PlayerName,sizeof(PlayerName));
format(string, sizeof(string), "cars/%s.ini", PlayerName);// Добавляем имя игрока, в путь для загрузки
new iniFile = ini_openFile(string);// Открываем файл по тому пути который указали.
ini_getInteger(iniFile,"CarId",CarInfo[playerid][cCarId]);//
ini_getInteger(iniFile,"Price",CarInfo[playerid][cPrice]);//
ini_getInteger(iniFile,"Color1",CarInfo[playerid][cColor1]);//
ini_getInteger(iniFile,"Color2",CarInfo[playerid][cColor2]);//
ini_getInteger(iniFile,"FrontBumper",CarInfo[playerid][cFrontBumper]);//
ini_getInteger(iniFile,"RearBumper",CarInfo[playerid][cRearBumper]);//
ini_getInteger(iniFile,"Hydraulics",CarInfo[playerid][cHydraulics]);//
ini_getInteger(iniFile,"Sideskirt",CarInfo[playerid][cSideskirt]);//
ini_getInteger(iniFile,"VentRight",CarInfo[playerid][cVentRight]);//
ini_getInteger(iniFile,"VentLeft",CarInfo[playerid][cVentLeft]);//
ini_getInteger(iniFile,"Spoiler",CarInfo[playerid][cSpoiler]);//
ini_getInteger(iniFile,"Exhaust",CarInfo[playerid][cExhaust]);//
ini_getInteger(iniFile,"Wheels",CarInfo[playerid][cWheels]);//
ini_getInteger(iniFile,"Stereo",CarInfo[playerid][cStereo]);//
ini_getInteger(iniFile,"Nitro",CarInfo[playerid][cNitro]);//
ini_getInteger(iniFile,"Lamps",CarInfo[playerid][cLamps]);//
ini_getInteger(iniFile,"Hood",CarInfo[playerid][cHood]);//
ini_getInteger(iniFile,"Roof",CarInfo[playerid][cRoof]);//
ini_getInteger(iniFile,"Bumper",CarInfo[playerid][cBumper]);//
ini_closeFile(iniFile);// Закрываем файл
}
========================================================================================
Теперь идут команды написанные на ZCMD
/editprice - Команда для изменения цены автомобиля автосалоне. Изменять цену может только администратор. После изменения цены, цена сразу же сохраняется в файл.
CMD:editprice(playerid, params[])//Команда для изменения цены автомобиля в автосалоне
{
if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid,0xFF0000FF,"Ты не админ.");//Проверка является ли игрок Rcon админом
if(sscanf(params,"i",params[0])) return SendClientMessage(playerid,0xFF0000FF,"Используй: /editprice [цена]");//Если игрок неправильно написал команду
if(PlayerInShop[playerid] == false) return SendClientMessage(playerid, 0xFF0000FF, "Ты не в автосалоне.");//Если игрок не находится автосалоне
new string[64];
new iniFile = ini_openFile("CarPrice.ini");// Открываем файл по тому пути который указали.
format(string, sizeof(string), "%d", CarInfo[playerid][cCarId]);// Добавляем имя игрока
ini_setInteger(iniFile,string,params[0]);//Меняем цену автомобиля
ini_closeFile(iniFile);// Закрываем файл
SendClientMessage(playerid,-1,"Цена изменена и сохранена");//Выводим сообщние о том, что цена сохранена
format(string,sizeof(string),"Price: %d",params[0]);//Форматируем string
PlayerTextDrawSetString(playerid, ASalon[playerid][3], string);//Сразу же меняем текстдрав с ценой
return 1;
}
========================================================================================
/selectcar - Команда для быстрого выбора машины в автосалоне по id, можно использовать только находясь в автосалоне
CMD:selectcar(playerid, params[])//Команда для быстрого выбора машины в автосалоне, если игрок знает id её модели
{
if(sscanf(params,"d", params[0])) return SendClientMessage(playerid, 0xFF0000AA, "Введите /selectcar [id]");//Если игрок неправильно написал команду
if(PlayerInShop[playerid] == false) return SendClientMessage(playerid, 0xFF0000FF, "Ты не в автосалоне.");//Если игрок не находится автосалоне
for(new i =0; i<sizeof(nBuyVehicleIds); i++)
{
if(params[0] == nBuyVehicleIds[i]) return SendClientMessage(playerid, 0xFF0000FF, "Авто с данным id не продается в автосалоне, укажите другой id.");//Проверяет введенный id по запрещенным автомобилям в автосалоне
}
CarInfo[playerid][cCarId] = params[0];//Записывает в переменную с id модели введенный id
CreateShopCar(playerid);//Вызывает функцию создания авто в автосалоне
return 1;
}
CMD:sellcar(playerid)//Продажа машины
{
if(PlayerInShop[playerid] == true) SendClientMessage(playerid, 0xFF0000FF, "Эту команду нельзя использовать находясь в автосалоне");//Проверяет не находится ли игрок в автосалоне
if(CarInfo[playerid][cCarId] == 0) return SendClientMessage(playerid, 0xFF0000FF, "У тебя нет транспортного средства.");//Если у игрока есть машина
new string[64];
format(string, sizeof(string), "Вы собираетесь продать свою машину за %d", CarInfo[playerid][cPrice]/2);
ShowPlayerDialog(playerid, SELLCAR_DIALOG, DIALOG_STYLE_MSGBOX, "Продажа машины", string, "Продать", "Отмена");//Выводит диалог продажи авто
return 1;
}
CMD:park(playerid,vehicleid)//Вызов собственной машины
{
if(PlayerInShop[playerid] == true) SendClientMessage(playerid, 0xFF0000FF, "Эту команду нельзя использовать находясь в автосалоне");//проверка не находится ли игрок в автосалоне
if (CarInfo[playerid][cCarId] == 0) return SendClientMessage(playerid, 0xFF0000FF, "У тебя нет транспортного средства.");//Если у игрока есть машина
new string[128];
new PlayerName[MAX_PLAYER_NAME];
GetPlayerName(playerid, PlayerName, sizeof(PlayerName));//Берем имя игрока
new Float:x, Float:y, Float:z, Float:Angle;
format(string, sizeof(string), "{006699}Владелец: {FFFF00}%s", PlayerName);//Форматируем текст для 3D текста
DestroyVehicle(OwnCar[playerid]);//Удаляем машину, если она уже была создана
DestroyDynamic3DTextLabel(OwnText[playerid]);//Удаляем старый 3D текст
OwnText[playerid] = Create3DTextLabel(string, 0xFF0000AA, 7.77, 7.77, 7.77, 30.0, 0, 1 );//Создаем 3D текст для машины
GetPlayerPos(playerid, x, y, z);//Получаем позицию игрока
GetPlayerFacingAngle(playerid, Angle);//Получаем угол поворота игрока
OwnCar[playerid] = CreateVehicle(CarInfo[playerid][cCarId], x+2, y, z, Angle, CarInfo[playerid][cColor1], CarInfo[playerid][cColor2], -1);//Создаем машину
///////////////////////////////////////////////////ТЮНИНГУЕМ АВТО///////////////////////////////////////////////////////////////////////////////////
AddVehicleComponent(OwnCar[playerid],CarInfo[playerid][cFrontBumper]);
AddVehicleComponent(OwnCar[playerid],CarInfo[playerid][cRearBumper]);
AddVehicleComponent(OwnCar[playerid],CarInfo[playerid][cHydraulics]);
AddVehicleComponent(OwnCar[playerid],CarInfo[playerid][cSideskirt]);
AddVehicleComponent(OwnCar[playerid],CarInfo[playerid][cVentRight]);
AddVehicleComponent(OwnCar[playerid],CarInfo[playerid][cVentLeft]);
AddVehicleComponent(OwnCar[playerid],CarInfo[playerid][cSpoiler]);
AddVehicleComponent(OwnCar[playerid],CarInfo[playerid][cExhaust]);
AddVehicleComponent(OwnCar[playerid],CarInfo[playerid][cWheels]);
AddVehicleComponent(OwnCar[playerid],CarInfo[playerid][cStereo]);
AddVehicleComponent(OwnCar[playerid],CarInfo[playerid][cNitro]);
AddVehicleComponent(OwnCar[playerid],CarInfo[playerid][cLamps]);
AddVehicleComponent(OwnCar[playerid],CarInfo[playerid][cHood]);
AddVehicleComponent(OwnCar[playerid],CarInfo[playerid][cRoof]);
AddVehicleComponent(OwnCar[playerid],CarInfo[playerid][cBumper]);
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Attach3DTextLabelToVehicle(OwnText[playerid], OwnCar[playerid], 0.0, 0.0, 1.0 );//Прикрепляем 3D текст к машине
return 1;
}
CMD:lock(playerid)//Команда для открытия/закрытия машины
{
if(PlayerInShop[playerid] == true) SendClientMessage(playerid, 0xFF0000FF, "Эту команду нельзя использовать находясь в автосалоне");//Проверка на нахождение в автосалоне
new Float:x, Float:y, Float:z;//Создаем переменные для координат
GetVehiclePos(OwnCar[playerid], x, y, z);//Получаем координаты авто
if(!IsPlayerInRangeOfPoint(playerid, 10.0, x, y, z)) return SendClientMessage(playerid, 0xFF0000FF, "Ты слишком далеко от своей машины.");//Проверка на нахождение рядом с машиной
new CarParams[7];
GetVehicleParamsEx(OwnCar[playerid], CarParams[0], CarParams[1], CarParams[2], CarParams[3], CarParams[4], CarParams[5], CarParams[6]);//Получаем параметры авто
if(CarParams[3] == 1) CarParams[3] = 0, SendClientMessage(playerid, 0x00FF00FF, "Машина открыта");//Если машины была закрыта, открываем её
else CarParams[3] = 1, SendClientMessage(playerid, 0xFF0000FF, "Машина закрыта");
SetVehicleParamsEx(OwnCar[playerid], CarParams[0], CarParams[1], CarParams[2], CarParams[3] ,CarParams[4], CarParams[5], CarParams[6]);//Иначе если машины была открыта, закрываем её
return 1;
}