Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 4 из 4

Тема: IsPlayerNear*

  1. #1
    Аватар для Osetin
    •Администратор•

    Статус
    Оффлайн
    Регистрация
    26.03.2013
    Адрес
    ♔Osetia, Vladikavkaz♔
    Сообщений
    3,432
    Репутация:
    1093 ±

    IsPlayerNear*

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

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

    Происходит поиск транспорта по указанной детали. Если персонаж стоит возле детали и повёрнут в её сторону, вернут ид транспорта в случае совпадения.
    Функции возвращают ID машины или INVALID_VEHICLE_ID, если машина не найдена.
    playerid - ид игрока для которого происходит поиск.
    Range - допустимая дистанция. Дальше - игрок не находиться возле детали.
    MaxAngle - максимальный угол поворота персонажа. Больше - игрок не повёрнут в сторону детали.

    PHP код:
    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 - ID транспорта, для которого происходит поиск координат.
    x, y, z - координаты положения детали в мире.
    PHP код:
    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 код:
    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 код:
    #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 при поиске третьей двери.

    Автор: White_116

    Скачать:
    http://pastebin.com/UJAch5WU
    http://www.solidfiles.com/d/988cb6accf/
    Последний раз редактировалось Daniel_Cortez; 05.10.2013 в 15:50.

  2. 2 пользователя(ей) сказали cпасибо:
    Daniel_Cortez (05.10.2013) DeimoS (04.07.2016)
  3. #2
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Хороший инклуд, довольно функциональный.
    Правда не радует метод перехвата функций и чуть менее, чем никакая, табуляция. Но это скорее придирки...
    Последний раз редактировалось Daniel_Cortez; 05.10.2013 в 20:09.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  4. #3
    Аватар для Salvacore
    Инжунер-погромист

    Статус
    Оффлайн
    Регистрация
    10.05.2013
    Адрес
    Аҧсуа бызшәа
    Сообщений
    2,271
    Репутация:
    418 ±
    интересно,для чего можно использовать его

  5. #4
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Например...
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    для взрыва машин при выстреле в бензобак
    ...да и для много чего ещё. Можно, например, сделать перекраску машины баллончиком (правда, это уже где-то было, но теперь такая задача решается куда проще).

    UPD: Ан нет, вру, сделать взрыв бензобака только средствами данного инклуда не выйдет, а вот для перекраски машин самое то.
    Последний раз редактировалось Daniel_Cortez; 05.10.2013 в 20:33.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  6. Пользователь сказал cпасибо:
    Airon007 (05.10.2013)
 

 

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •