Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 1 из 2 1 2 ПоследняяПоследняя
Показано с 1 по 10 из 16

Тема: processLineOfSight

  1. #1
    Аватар для Seregamil
    Проверенный

    Статус
    Оффлайн
    Регистрация
    21.11.2013
    Сообщений
    551
    Репутация:
    274 ±

    processLineOfSight

    Функция, рисующая луч в игровом мире от одной точки до другой и возвращающая позицию, в которой луч столкнулся с объектом/машиной/игроком.
    Недопрототип функции в МТА: https://wiki.multitheftauto.com/wiki/ProcessLineOfSight , но этот недопрототип полезен и в САМПе.

    Аргументы:
    PHP код:
    processLineOfSight
    //координаты старта
    Floatstart_x
    Floatstart_y
    Floatstart_z

    //координаты конца, в них же записываются координаты последней доступной точки
    &Floatend_x
    &
    Floatend_y
    &
    Floatend_z

    //параметры проверки
    boolcheck_vehicles//true - проверять машины, false - пропускать машины
    boolcheck_players //true - проверять игроков, false - пропускать игроков 
    Функция:
    PHP код:
    #define radiusCollision 3.0

    processLineOfSightFloatstart_xFloatstart_yFloatstart_z, &Floatend_x, &Floatend_y, &Floatend_zboolcheck_vehiclesboolcheck_players ){//by Seregamil
         
    new distance_between_points floatroundVectorSizeend_x start_xend_y start_yend_z start_z ) );
        if( 
    distance_between_points == )
            return ;

        new 
    Floatpack_pos_x floatdivend_x start_xfloatdistance_between_points ) ),
            
    Floatpack_pos_y floatdivend_y start_yfloatdistance_between_points ) ),
            
    Floatpack_pos_z floatdivend_z start_zfloatdistance_between_points ) ),
            
    Floatmap_z 0.0,
            
    = -1Floatpos_xFloatpos_yFloatpos_z 1;

        do{
            
    start_x += pack_pos_x;
            
    start_y += pack_pos_y;
            
    start_z += pack_pos_z;

            if( 
    check_vehicles ){
                for( ; 
    != MAX_VEHICLESi++ ){
                    if( !
    IsValidVehicle) ) continue;
                    
    GetVehiclePosipos_xpos_ypos_z );
                    if( 
    VectorSizepos_x start_xpos_y start_ypos_z start_z ) > radiusCollision ) continue;

                    
    end_x start_x;
                    
    end_y start_y;
                    
    end_z start_z;

                    return ;
                }
            }
            
            if( 
    check_players ){
                for( 
    GetMaxPlayers() - 1!= -1i-- ){
                    if( 
    IsPlayerNPC) || !IsPlayerConnected) ) continue;
                    
    GetPlayerPosipos_xpos_ypos_z );
                    if( !
    IsPlayerInRangeOfPointradiusCollisionpos_xpos_ypos_z ) ) continue;

                    
    end_x start_x;
                    
    end_y start_y;
                    
    end_z start_z;

                    return ;
                }
            }

            
    MapAndreas_FindZ_For2DCoordstart_xstart_ymap_z );

            if( 
    map_z start_z )
                continue;

            
    end_x start_x;
            
    end_y start_y;
            
    end_z start_z;
              break;
        }
        while( ++
    distance_between_points );

    Дополнительные функции, используемые в системе:
    native IsValidVehicle(vehicleid);
    Плагин MapAndreas: http://forum.sa-mp.com/showthread.php?t=275492

     Скрин построения луча от -10.4548,55.2839,12.1676 до 0.0,0.0,0.0:


    Пример использования:
    PHP код:
    new Float:0.0Float:0.0Float:0.0Object CreateObject2000, -10.4548,55.2839,12.16760.00.00.0 );
            
    processLineOfSight( -10.4548,55.2839,12.1676x,y,zfalsetrue );
            
    MoveObject(Objectx,y,z,3.0); 
    Автор: Seregamil
    Последний раз редактировалось Seregamil; 12.06.2014 в 20:04.

  2. 7 пользователя(ей) сказали cпасибо:
    georJik (12.06.2014) L0ndl3m (12.06.2014) Osetin (12.06.2014) Salvacore (12.06.2014) Unreal (15.10.2015) wAx (12.06.2014) ^_^ (12.06.2014)
  3. #2
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    1. Код:
      for( i = 0; i != MAX_VEHICLES; i++ )
      Fail.
    2. Страдает стиль задания имён в идентификаторах (processLineOfSight - другие скриптеры могут путаться при использовании этой функции).
    3. IsValidVehicle можно было объявить ещё перед началом функции (пример). Не то, чтобы обязательно, но не помешало бы.
    4. Для чего функции присвоен атрибут "public"? Возвращение функцией значений через SetTimer/SetTimerEx/CallLocalFunction невозможно (да и зачем оно вообще?)
    5. Часть табуляции сделана табами, ещё часть - пробелами, из-за чего местами табуляция неправильная. Сделай уже выбор между пробелами и табами.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  4. Пользователь сказал cпасибо:
    Osetin (12.06.2014)
  5. #3
    Аватар для ^_^
    Übermensch

    Статус
    Оффлайн
    Регистрация
    25.11.2013
    Сообщений
    157
    Репутация:
    245 ±
    Хорошая задумка - молодец, правда насчёт оформления кода я соглашусь с постом выше... Собственно, недостатки которые заметил я: (не воспринимай слишком критично, но мы же идеалисты : 3)

    1) Использование ненужной функции IsValidVehicle. Лично я использую уже задекларированую - GetVehicleModel. Она также возвращает нуль если машина не создана.

    2) Отсутствии в функции параметра точности (можно по дефолту сделать 3.0)
    VectorSize( pos_x - start_x, pos_y - start_y, pos_z - start_z ) > 3.0
    !IsPlayerInRangeOfPoint( i , 3.0, pos_x, pos_y, pos_z )
    Мне лично кажется, что 3.0 не очень хороший радиус, особенно по оси Z, тебе виднее...
    Последний раз редактировалось ^_^; 12.06.2014 в 17:38.

  6. 2 пользователя(ей) сказали cпасибо:
    Daniel_Cortez (12.06.2014) Osetin (12.06.2014)
  7. #4
    Аватар для Seregamil
    Проверенный

    Статус
    Оффлайн
    Регистрация
    21.11.2013
    Сообщений
    551
    Репутация:
    274 ±
    Код:

    for( i = 0; i != MAX_VEHICLES; i++ )

    Fail.
    Чего тебе тут ненравится?
    Страдает стиль задания имён в идентификаторах (processLineOfSight - другие скриптеры могут путаться при использовании этой функции).
    всмысле - путаться?
    Для чего функции присвоен атрибут "public"? Возвращение функцией значений через SetTimer/SetTimerEx/CallLocalFunction невозможно (да и зачем оно вообще?)
    первоначальный прототип функции предназначался немного для другого.
    Часть табуляции сделана табами, ещё часть - пробелами, из-за чего местами табуляция неправильная. Сделай уже выбор между пробелами и табами.
    А вот это уже косяк сайта, весь мой код сделан табами.
    1) Использование ненужной функции IsValidVehicle. Лично я использую уже задекларированую - GetVehicleModel. Она также возвращает нуль если машина не создана.
    код для меня - логически понятнее.
    2) Отсутствии в функции параметра точности (можно по дефолту сделать 3.0)
    VectorSize( pos_x - start_x, pos_y - start_y, pos_z - start_z ) > 3.0
    !IsPlayerInRangeOfPoint( i , 3.0, pos_x, pos_y, pos_z )
    Мне лично кажется, что 3.0 не очень хороший радиус, особенно по оси Z, тебе виднее...
    а вот тут пожалуй добавлю макрос, сами ставьте нужный вам радиус.
    Последний раз редактировалось Seregamil; 12.06.2014 в 19:54.

  8. #5
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от Seregamil Посмотреть сообщение
    Чего тебе тут ненравится?
    ID авто в SA-MP начинаются с единицы. Нулевой ID - невалидный
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  9. #6
    Аватар для Seregamil
    Проверенный

    Статус
    Оффлайн
    Регистрация
    21.11.2013
    Сообщений
    551
    Репутация:
    274 ±
    Обновил

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

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

  11. #8
    Аватар для KShaddix
    Пользователь

    Статус
    Оффлайн
    Регистрация
    07.02.2014
    Сообщений
    39
    Репутация:
    5 ±
    Цитата Сообщение от Salvador Посмотреть сообщение
    Если ты код написал для себя, зачем выкладывать -_- ?
    Не хватайся за куски фраз. Он не имел в виду, что писал лично для себя. По сути дела, он правильней сделал для восприятия аудитории, смотрящей со стороны, потому что IsValidVehicle использовал по назначению.

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

    Статус
    Оффлайн
    Регистрация
    10.05.2013
    Адрес
    Аҧсуа бызшәа
    Сообщений
    2,271
    Репутация:
    418 ±
    Цитата Сообщение от KShaddix Посмотреть сообщение
    Не хватайся за куски фраз. Он не имел в виду, что писал лично для себя. По сути дела, он правильней сделал для восприятия аудитории, смотрящей со стороны, потому что IsValidVehicle использовал по назначению.
    Простите пожалуйста.
    Но факт остаётся фактом.
    Последний раз редактировалось Salvacore; 13.06.2014 в 04:35.

  13. #10
    Аватар для Seregamil
    Проверенный

    Статус
    Оффлайн
    Регистрация
    21.11.2013
    Сообщений
    551
    Репутация:
    274 ±
    Цитата Сообщение от Salvador Посмотреть сообщение
    Если ты код написал для себя, зачем выкладывать -_- ?
    Что для людей логически понятней?
    PHP код:
    if( !IsValidVehiclevehicleid ) ) 
    PHP код:
    if( !GetVehicleModelvehicleid ) ) 

 

 
Страница 1 из 2 1 2 ПоследняяПоследняя

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

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

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

Ваши права

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