[Include] IsPlayerNear*
#1

IsPlayerNear* v1.2 by White_116
Здравствуйте, уважаемые пользователи форума. Хочу представить вам результат моей проделанной работы. Изначально, по просьбе одного человека я сделал небольшую функцию для быстрого определения стоит ли игрок рядом с багажником машины. Спустя некоторое время я решил сделать определение не только багажника но и капота, крышки бензобака, дверей транспорта.

Описание:
Данный инклуд предназначен для быстрого нахождения возле чего стоит игрок.
Алгоритм несколько отличается от классической схемы поиска. В данном инклуде перебираются только те машины, которые входят в зону стрима игрока - это даёт большое преимущество, так как проверяется не более 100 машин, в то время, как в классической схеме MAX_VEHICLES. Так же присутствует более простое определение повёрнут ли игрок в сторону детали. Не каждый может похвастаться его присутствием.

Функции:
Часть первая.

Происходит поиск транспорта по указанной детали. Если персонаж стоит возле детали и повёрнут в её сторону, вернут ид транспорта в случае совпадения.
Возвращают: INVALID_VEHICLE_ID или vehicleid.
playerid - ид игрока для которого происходит поиск.
Range - допустимая дистанция. Дальше, игрок не находиться возле детали.
MaxAngle - максимальный угол поворота персонажа. Больше, игрок не повёрнут в сторону детали.
PHP Code:
native GetVehicleIfPlayerNearVehicle(playeridFloat:Range=15.0Float:MaxAngle=30.0);
native GetVehicleIfPlayerNearBoot(playeridFloat:Range=1.5Float:MaxAngle=30.0);
native GetVehicleIfPlayerNearBonnet(playeridFloat:Range=1.5Float:MaxAngle=30.0);
native GetVehicleIfPlayerNearPetrolCap(playeridFloat:Range=0.75Float:MaxAngle=30.0);
native GetVehicleIfPlayerNearDoor(playeriddoorFloat:Range=0.75Float:MaxAngle=30.0);
native GetVehicleIfPlayerNearDoor0(playeridFloat:Range=0.75Float:MaxAngle=30.0);
native GetVehicleIfPlayerNearDoor1(playeridFloat:Range=0.75Float:MaxAngle=30.0);
native GetVehicleIfPlayerNearDoor2(playeridFloat:Range=0.75Float:MaxAngle=30.0);
native GetVehicleIfPlayerNearDoor3(playeridFloat:Range=0.75Float:MaxAngle=30.0);
native GetVehicleIfPlayerNearWheel(playeridwheelFloat:Range=0.75Float:MaxAngle=30.0);
native GetVehicleIfPlayerNearWheel0(playeridFloat:Range=0.75Float:MaxAngle=30.0);
native GetVehicleIfPlayerNearWheel1(playeridFloat:Range=0.75Float:MaxAngle=30.0);
native GetVehicleIfPlayerNearWheel2(playeridFloat:Range=0.75Float:MaxAngle=30.0);
native GetVehicleIfPlayerNearWheel3(playeridFloat:Range=0.75Float:MaxAngle=30.0); 
Часть вторая.

Вернут положения детали транспорта в глобальных(мировых) координатах.
Возвращают: 0 или 1.
vehicleid - ид транспорта для которого происходит поиск координат.
x, y, z - координаты положение детали в мире.
PHP Code:
native GetVehicleBootPos(vehicleid, &Float:x, &Float:y, &Float:z);
native GetVehicleBonnetPos(vehicleid, &Float:x, &Float:y, &Float:z);
native GetVehiclePetrolCapPos(vehicleid, &Float:x, &Float:y, &Float:z);
native GetVehicleDoorPos(vehicleiddoor, &Float:x, &Float:y, &Float:z);
native GetVehicleDoor0Pos(vehicleid, &Float:x, &Float:y, &Float:z);
native GetVehicleDoor1Pos(vehicleid, &Float:x, &Float:y, &Float:z);
native GetVehicleDoor2Pos(vehicleid, &Float:x, &Float:y, &Float:z);
native GetVehicleDoor3Pos(vehicleid, &Float:x, &Float:y, &Float:z);
native GetVehicleWheelPos(vehicleidwheel, &Float:x, &Float:y, &Float:z);
native GetVehicleWheel0Pos(vehicleid, &Float:x, &Float:y, &Float:z);
native GetVehicleWheel1Pos(vehicleid, &Float:x, &Float:y, &Float:z);
native GetVehicleWheel2Pos(vehicleid, &Float:x, &Float:y, &Float:z);
native GetVehicleWheel3Pos(vehicleid, &Float:x, &Float:y, &Float:z); 
Часть третья.

Происходит проверка, находится ли персонаж возле заданного транспорта и детали а так же повёрнут ли в её сторону.
Возвращают: 0 или 1.
playerid - ид игрока для которого происходит поиск.
vehicleid - ид транспорта относительно которого происходит поиск координат.
Range - допустимая дистанция. Дальше, игрок не находиться возле детали.
MaxAngle - максимальный угол поворота персонажа. Больше, игрок не повёрнут в сторону детали.
PHP Code:
native IsPlayerNearVehicle(playeridvehicleidFloat:Range=15.0Float:MaxAngle=30.0);
native IsPlayerNearVehicleBoot(playeridvehicleidFloat:Range=1.5Float:MaxAngle=30.0);
native IsPlayerNearVehicleBonnet(playeridvehicleidFloat:Range=1.5Float:MaxAngle=30.0);
native IsPlayerNearVehiclePetrolCap(playeridvehicleidFloat:Range=0.75Float:MaxAngle=30.0);
native IsPlayerNearVehicleDoor(playeridvehicleiddoorFloat:Range=0.75Float:MaxAngle=30.0);
native IsPlayerNearVehicleDoor0(playeridvehicleidFloat:Range=0.75Float:MaxAngle=30.0);
native IsPlayerNearVehicleDoor1(playeridvehicleidFloat:Range=0.75Float:MaxAngle=30.0);
native IsPlayerNearVehicleDoor2(playeridvehicleidFloat:Range=0.75Float:MaxAngle=30.0);
native IsPlayerNearVehicleDoor3(playeridvehicleidFloat:Range=0.75Float:MaxAngle=30.0);
native IsPlayerNearVehicleWheel(playeridvehicleidwheelFloat:Range=0.75Float:MaxAngle=30.0);
native IsPlayerNearVehicleWheel0(playeridvehicleidFloat:Range=0.75Float:MaxAngle=30.0);
native IsPlayerNearVehicleWheel1(playeridvehicleidFloat:Range=0.75Float:MaxAngle=30.0);
native IsPlayerNearVehicleWheel2(playeridvehicleidFloat:Range=0.75Float:MaxAngle=30.0);
native IsPlayerNearVehicleWheel3(playeridvehicleidFloat:Range=0.75Float:MaxAngle=30.0); 
Примечание:
  • Boot-багажник, Bonnet-капот, PetrolCap-крышка бензобака, Wheel-колесо, Door-дверь (число соответствует номеру пассажирского места)
  • Для того, чтобы не учитывать, повёрнут ли персонаж в сторону детали, нужно MaxAngle указывать больше или ровно 180.0. Если вы укажите отрицательное число, то поиск не даст результат.
  • Для работы необходим инклуд: foreach
  • Для тех у кого выскакивает ошибка undefined symbol "IsValidVehicle" нужно сделать так, как показано в примере, т.е. добавить native IsValidVehicle(vehicleid); перед инклудом.

Примемер:
PHP Code:
#define FILTERSCRIPT
native IsValidVehicle(vehicleid);
#include <IsPlayerNear>
public OnPlayerKeyStateChange(playeridnewkeysoldkeys)
{
    if(
newkeys KEY_FIRE)
    {
        new 
str[128];
        
newkeys=GetVehicleIfPlayerNearVehicle(playerid10.030.0);//вернёт ид машины.
        
if(newkeys)format(str,128,"Ты стоишь рядом и смотришь на машину номер: %d"newkeys);
        else 
str="Ты не смотришь на машину или не стоишь рядом с ней.";
        return 
SendClientMessage(playerid,-1,str);
    }
    return 
1;

Ошибки и баги:
  • Есть возможность не нахождения, стоит ли игрок возле детали машины, когда машина стоит на не ровной поверхности. Фискисть пытался, но GetVehicleRotationQuat не корректно работает если машина пуста.
  • В связи с тем, что данные мной не отфильтрованы, возможно не правильное положение или поиск колёс и крышки бензобака.
Изменения v1.1:
  • Подправлен код и изменены названия некоторых функций.
  • Добавлены функции для нахождения колёс.
  • Исправил недочёт, когда двери расположенные сзади, где багажник, считались боковыми.
Изменения v1.2:
  • Подправлен код и немного оптимизации.
  • Исправил bug, при поиске третьей двери.

►►Просмотреть v1.2: Pastebin
►►Скачать v1.2: SolidFiles

►►Просмотреть v1.1: Pastebin
►►Скачать v1.1: SolidFiles
Reply
#2

Несколько вопросов не разглядывая кода:
* Для Ромзеса делал?)
* Если я встану сзади вертолёта за чего малыми лопастями, то я там обнаружу багажник?))
* Что выдаёт при 2 и 3 позиции "у двери" в случае с мотоциклом? Или этим способом можно найти справа или слева мотака стоит чел?
* Комментарий про двери и бензобаки ясен - вопрос с буррито,и прочими мелковозами отпадает.
* Предложение: сделать проверку и определение позиции колёс.
* Зачем записывать факт застрименности машины игроку?
Reply
#3

Quote:
Originally Posted by Mutha_X
View Post
Несколько вопросов не разглядывая кода:
* Для Ромзеса делал?)
* Если я встану сзади вертолёта за чего малыми лопастями, то я там обнаружу багажник?))
* Что выдаёт при 2 и 3 позиции "у двери" в случае с мотоциклом? Или этим способом можно найти справа или слева мотака стоит чел?
* Комментарий про двери и бензобаки ясен - вопрос с буррито,и прочими мелковозами отпадает.
* Предложение: сделать проверку и определение позиции колёс.
* Зачем записывать факт застрименности машины игроку?
1) Нет.
2) Да, так как у меня нет массива с информацией присутствия багажника или капота а также крышки бензобака.
3) Массив с пассажирскими дверьми присутствует. У мотоцикла нет 2, 3, позиции - значит и проверка идёт мимо.
5) Если нужно то сделаю, опять же как быть с танком и 6 колёсными грузовиками?
6) Чтобы не проверять те машины до которых он не дотягивается, прочти описание.
Reply
#4

Функции Is*** не могут возвращать ничего кроме логических значений истины или лжи. Я рекомендую переименовать функции которые возвращают идентификатор машины в Get***, а вместо 0 возвращать задефайненое значение INVALID_VEHICLE_ID.

ЗЫ
Quote:

Для работы не обходим инклуд:

Необходим пишется слитно.
Reply
#5

Всем спасибо, завтра наверное будет готово. Если скинете массивы с информацией присутствия багажника или капота а также крышки бензобака, будет вообще шикарно.
Reply
#6

Quote:
MaxAngel
Максимальный ангел . MaxAngle правильно
Reply
#7

Да, с релизом поспешил... Хотел написать, насчёт Is и INVALID_VEHICLE_ID, но Stepashka опередил
Reply
#8

Quote:
Originally Posted by AirKite
View Post
Да, с релизом поспешил.
Есть такое. Обновил инклуд.
Reply
#9

  1. pawn Code:
    if((GetVehicleModel(vehicleid)-400) < 0)continue;
    замени на IsValidVehicle.
  2. Всю арифметику и сравнения с дробными числами выполнять средствами специальных функций.
  3. И самое глобальное:
    • Удаляешь весь дублирующий код по определению ближайшей машины.
    • Помещаешь определение ближайшей машины и расстояния до неё в OnVehicleStreamIn и OnVehicleStreamOut.
    • Храниь эти данные глобально для каждого игрока.
    • Во всех твоих проверках работаешь с данными из глобального массива.
Для точности, вдруг события стримминга машин не вызывались пока человек бегал в определенной зоне, можно добавить параметр релевантности данных и если он превысил какой-то порог, обновлять данные ближайшей машины.
Reply
#10

Quote:
Originally Posted by Stepashka
View Post
pawn Code:
if((GetVehicleModel(vehicleid)-400) < 0)continue;
замени на IsValidVehicle.
-Ок.

Quote:
Originally Posted by Stepashka
View Post
Помещаешь определение ближайшей машины и расстояния до неё в OnVehicleStreamIn и OnVehicleStreamOut.
А тут я встал в ступор. Как это определять расстояние? Его можно получить один раз при стриме транспорта и оно будет потом меняться. Допустим я с другом еду на разных машинах, можно так кататься вечно и я не выйду из стрима его машины а расстояние будет меняться.
Reply


Forum Jump:


Users browsing this thread: 3 Guest(s)