Мой первый урок. Нигде не видел подобного хотя честно говоря и не искал )) решил вмести История о том как я додумался написать скрипт готовы? Начал писать мод РП с нуля но... не хочу ставить много авто вот решил сделать динамически. и так закончили с предысторией теперь о возможностях: - Убирает 100500 одинаковых автомобилей на стоянке. - и впрочем занимает не много места. Возможно один из минусов ... много циклических операций. приступим: создаем подмены #define думаю тут все понятно не знаю что писать
Код
#define f(%1, format(%1,sizeof(%1), #define SCMW(%0,%1); SendClientMessage(%0,0xffffffFF,%1); #define MAX_STATIC_CAR 3 // количество автомобильчиков клонов которые стоят и ждут когда в их сядут и поедут
Ко всем new
Код
// Дает понять серверу куда мы ставим наши автомобили и как поворачиваем new Float:StCarVehF[MAX_STATIC_CAR][4] = { { 1497.2861,-1773.1268,13.3160,357.6053 }, { 1515.0995,-1775.5699,13.2862,210.0574 }, { 1526.0276,-1775.0869,13.2631,33.2908 } }; // Заносим данные об автомобилях модель и цвета new StCarVeh[MAX_STATIC_CAR][3] = { { 409,1,1 }, // лимузин белый белый { 411,1,1 }, // инфернус белый белый { 596,0,1 } // полицейский авто черный белый }; // тут говорим серверу что наши автомобили относятся к государственной фракции == 1 запрет игрокам если другая фракция new VertCar[MAX_STATIC_CAR] = { 1, 1, 1 }; // пригодится в дальнейшем (максимальное число клонируемого авто) запрет игрокам если другая фракция new VertCarUse[MAX_PLAYERS]; // переменная хранит ID автомобилей с ее помощью проходит слежка за автомобилями надо создать клон авто или нет new StaticVeh[MAX_STATIC_CAR]; // хранит ID клонированного автомобиля который начал использоватся для удаления при спавне иначе будет много автомобилей на месте спавна new VehDynamic[MAX_PLAYERS];
После того как мы создали все New можно приступать к созданию проверки где находится автомобиль от N точки спавна добавляем stock который будет выполнять быструю команду
Код
// создаем сток где i это id авто, m это модель автомобиля, х у и z это позиции по оси координат в пространстве и r это максимальное расстояние автомобиля от спавна stock PtPVehDist(i, m, Float:x, Float:y, Float:z, Float:r){ // создаем переменные new Float: CarPos[3], t; // получаем данные позиции автомобиля GetVehiclePos(i, CarPos[0], CarPos[1], CarPos[2]); // считываем idd автомобиля t = GetVehicleModel(i); // находим разницу между позицией авто и позицией его спавна CarPos[0] = (CarPos[0] - x); CarPos[1] = (CarPos[1] - y); CarPos[2] = (CarPos[2] - z); // начинается проверка которая возвращает 1 если автомобиль на месте и 0 если он используется if((((CarPos[0] >= -r) && (CarPos[0] <= r)) && ((CarPos[1] >= -r) && (CarPos[1] <= r)) && ((CarPos[2] >= -r) && (CarPos[2] <= r))) && m == t ) return 1; else return 0; }
В OnGameModeInit() добавляем таймер который будет запускать нашу проверку
Код
SetTimer("ReCarSys",5000,true);
Создадим паблик для проверки позиции автомобиля и создаем новый если старый уже исспользуют
Код
forward ReCarSys(); public: ReCarSys(){ // делаем подмену для упрощения понятия и видимости что мы делаем и не загромождаем код переменными #define a StCarVeh[i] #define c StCarVehF[i] #define b StaticVeh[i] // запускаем ццикл проверки где PtPVehDist начинает проверку на то что бы автомобиль был на месте и если автомобиль не на месте тогда он назначает на старую переменную этого автомобиля новый автомобиль тем самым затерая существование старого for(new i = 0;i <= MAX_STATIC_CAR;i++) if(!PtPVehDist(b,a[0],c[0],c[1],c[2],5)) b = CreateVehicle(a[0],c[0],c[1],c[2]+1,c[3],a[1],a[2],10); // кстати SpawnDelay тут (спавн авто таймер) 10 секунд ))) так что меняйте на свою цифру а то будете матюгатся что автомобиль через 10 секунд исчезает // убираем замену #undef a #undef b #undef c }
Теперь мы задаем переменной что игрок сел в ато и занимаем переменную для автомобиля в OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)
Код
// переменная для свободной переменной new n; // смотрим на свободную переменную ищем ее for(new i=0;i<MAX_PLAYERS;i++) { // занимаем переменную if(!VehDynamic [i]&& !n) n = i; // отменяем все что бы один автомобиль не занимал 2 переменные в случае если автомобиль уже занял переменную if(VehDynamic [i]== vehicleid) return 1; } // проверяем если игрок сел на место водителя if(ispassenger == 0) { // запускаем цикл поиска автомобиля в который он сел for(new i; i<MAX_STATIC_CAR;i++) { // находим совпадения что игрок именно в клонируемом автомобиле if(vehicleid == StaticVeh[i]) { // проверяем какой фракции игрок у меня PSP [pFraction]переменная в которой хранится игрока playerid // в случае если фракция автомобиля не совпадает с фракцией игрока отменяем и не продолжаем if(VertCar [i]!= PSP[pFraction]) return 1; // заносим id автомобиля в переменную для удаления при спавне VehDynamic [n]= StaticVeh[i]; // заносим id фракции в переменную для автомобиля если в нее попытается сесть игрок с другой фракции VertCarUse [n]= VertCar[i]; } } }
Теперь нужно высадить игрока если он сел в не своей фракции транспорт в OnPlayerStateChange(playerid, newstate, oldstate) пишем
Код
// проверяем на какое место сел игрок if(newstate == PLAYER_STATE_DRIVER){ // запускаем цикл проверки на фракцию в клонируемом автомобиле for(new i; i<MAX_STATIC_CAR;i++) { // узнаем id автомобиля и начинам сравнение if(GetPlayerVehicleID(playerid) == StaticVeh[i]) { // проверяем если игрок не принадлежит этой фракции if(VertCar [i]!= PSP[pFraction]){ switch(VertCar[i]){ // заносим сообщение в переменную если автомобильная фракция не совпадает с фракцией игрока case 1: f(str, "Вы не являетесь сотрудником государства."); case 2: f(str, "Вы не являетесь сотрудником новостей штата."); } // высаживаем игрока RemovePlayerFromVehicle(playerid); // высвечиваем игроку сообщение о том что он не в том авто. и отменяем функцию return SCMW(playerid,str); } } } // включаем проверку если ато где то в поле вне точки спавна for(new i; i<MAX_PLAYERS;i++) { // проверяем занесен ли транспорт в переменную клон автомобиля if(GetPlayerVehicleID(playerid) == VehDynamic[i]) { // совпадает ли фракция клон автомобиля с фракцией игрока if(VertCarUse [i]!= PSP[pFraction]){ switch(VertCarUse[i]){ case 1: f(str, "Вы не являетесь сотрудником государства."); case 2: f(str, "Вы не являетесь сотрудником новостей штата."); } RemovePlayerFromVehicle(playerid); return SCMW(playerid,str); } } } }
Теперь когда автомобиль спавнится что бы они не появлялись горой на автомобиле клоне в эту OnVehicleSpawn(vehicleid) вносим следующее
Код
// запускаем цикл проверки for(new i=0;i<=MAX_PLAYERS;i++) { // ищем переменную клонируемого автомобиля который спавнится if(VehDynamic [i]== vehicleid) { // удаляем автомобиль DestroyVehicle(VehDynamic[i]); // обнуляем переменную с автомобилем VehDynamic [i]= 0; // обнуляем переменную с фракцией VertCarUse [i]= 0; // ставим максимальное значение что бы цикл прекратился i=MAX_PLAYERS; } }
Ну вот как то так ))) кстати для избежания некоторых проблем рекомендую в OnGameModeInit() прописать хотя бы 1 автомобиль, причина является что все автомобили имеют id от 0 а при спавне мы как раз таки обнуляем и поулчится что именно этот автомобильчик клон с id 0 будет забагован и не удалится. поэтому и нужно создать там автомобиль. вот вроде и все на этом у меня. спасибо за внимание))) во ссылка на ютуб. там только не показано как проверяется на фракцию. а основной принцип есть. Автор идеи я САМ " Сергей ReSaG [e]" в сампе известен под другими именами: Maxim_Solovec и NPC_bot Хотите закопипастить? без проблем главное не забывайте про меня который додумался написать такой бесполезный скрипт ))) Доступно только для пользователей
Добавлено (05.05.2016, 18:47:06) --------------------------------------------- Хоть какой нибудь кря оставили бы что ли ((( а то глухая тишина ))
Если у тебя что то долго не получается то ты первый в истории кто додумался сделать эту глупость... А может и не глупость.
Сообщение отредактировал ReSaG[e] - Среда, 13.04.2016, 18:55:41