Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 6 из 6
  1. #1
    Аватар для Wise
    Пользователь

    Статус
    Оффлайн
    Регистрация
    30.10.2014
    Сообщений
    148
    Репутация:
    37 ±

    Расстояние между двумя игроками.

    Здравствуйте. Эта функция ещё актуальная? Или есть что-нибудь попроще, чтобы узнать расстояние между 2мя игроками?
    PHP код:
    stock Float:GetDistanceBetweenPlayers(p1,p2)
    {
        new 
    Float:x1,Float:y1,Float:z1,Float:x2,Float:y2,Float:z2;
        if(!
    IsPlayerConnected(p1) || !IsPlayerConnected(p2)) return -1.00;
        
    GetPlayerPos(p1,x1,y1,z1);
        
    GetPlayerPos(p2,x2,y2,z2);
        return 
    floatsqroot(floatpower(floatabs(floatsub(x2,x1)),2)+floatpower(floatabs(floatsub(y2,y1)),2)+floatpower(floatabs(floatsub(z2,z1)),2));


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

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    1. Использование IsPlayerConnected не обязательно, т.к. во всех функциях, выполняющих действия с игроками, есть встроенные проверки подключения.
    Взять, например, GetPlayerPos: эта функция возвращает координаты игрока косвенно, через передаваемые ей аргументы. Сама же она возвращает ещё и статус подключения игрока: 1, если подключен, иначе - 0.
    PHP код:
    new x1y1z1x2y2z2;
    if((
    == GetPlayerPos(p1,x1,y1,z1) || (== GetPlayerPos(p2,x2,y2,z2)))
        return -
    1.00
    2. http://pro-pawn.ru/showthread.php?6407-VectorSize
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  3. Пользователь сказал cпасибо:
    Wise (14.11.2015)
  4. #3
    Аватар для Wise
    Пользователь

    Статус
    Оффлайн
    Регистрация
    30.10.2014
    Сообщений
    148
    Репутация:
    37 ±
    Воспользовался вторым пунктом. Немного переделал пример, получил вот такую функцию:
    PHP код:
    stock Float:GetDistanceBetweenPlayers(u1u2)
    {
        new 
    Float:coor_one[3], Float:coor_two[3];
        
    GetPlayerPos(u1coor_one[0], coor_one[1], coor_one[2]);
        
    GetPlayerPos(u2coor_two[0], coor_two[1], coor_two[2]);
        return 
    VectorSize(coor_one[0]-coor_two[0], coor_one[1]-coor_two[1], coor_one[2]-coor_two[2]);

    В принципе работает также, как и первый пункт. Спасибо большое.

    UPD: Если кто-то возьмёт себе, из-за стока будет ошибка. Добавьте forward.
    PHP код:
    forward Float:GetDistanceBetweenPlayers(u1u2);
    public 
    Float:GetDistanceBetweenPlayers(u1u2)
    {
        new 
    Float:coor_one[3], Float:coor_two[3];
        
    GetPlayerPos(u1coor_one[0], coor_one[1], coor_one[2]);
        
    GetPlayerPos(u2coor_two[0], coor_two[1], coor_two[2]);
        return 
    VectorSize(coor_one[0]-coor_two[0], coor_one[1]-coor_two[1], coor_one[2]-coor_two[2]);

    Последний раз редактировалось Wise; 14.11.2015 в 17:44.

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

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от Wise Посмотреть сообщение
    PHP код:
    new Float:coor_one[3], Float:coor_two[3]; 
    http://pro-pawn.ru/showthread.php?12821

    И да, где проверка на подключение? Если хотя бы один из игроков не подключен, функция будет возвращать некорректные результаты.
    Неужели вам настолько лень сделать так, как советуют, и поставить одну строчку с if?

    Btw, накопал тут ещё одну функцию: GetPlayerDistanceFromPoint.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  6. #5
    Аватар для Wise
    Пользователь

    Статус
    Оффлайн
    Регистрация
    30.10.2014
    Сообщений
    148
    Репутация:
    37 ±
    Перед тем, как написать тему, я использовал поиск. Функцию GetPlayerDistanceFromPoint я находил, она мне не подходит. На счёт вашего замечания, я просто поспешил. Исправил.
    PHP код:
    forward Float:GetDistanceBetweenPlayers(u1u2);
    public 
    Float:GetDistanceBetweenPlayers(u1u2)
    {
        new 
    Float:x1Float:y1Float:z1,
        
    Float:x2Float:y2Float:z2;
        if((
    == GetPlayerPos(u1x1y1z1) || (== GetPlayerPos(u2x2y2z2)))) return -1.00;
        
    GetPlayerPos(u1x1y1z1);
        
    GetPlayerPos(u2x2y2z2);
        return 
    VectorSize(x1-x2y1-y2z1-z2);

    Последний раз редактировалось Wise; 14.11.2015 в 18:24.

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

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от Wise Посмотреть сообщение
    PHP код:
        if((== GetPlayerPos(u1x1y1z1) || (== GetPlayerPos(u2x2y2z2)))) return -1.00;
        
    GetPlayerPos(u1x1y1z1);
        
    GetPlayerPos(u2x2y2z2); 
    Зачем узнавать координаты 2 раза подряд? Вы их уже узнаёте в if.


    Цитата Сообщение от Wise Посмотреть сообщение
    Перед тем, как написать тему, я использовал поиск. Функцию GetPlayerDistanceFromPoint я находил, она мне не подходит.
    Значит плохо искали.
    Единственный минус в GetPlayerDistanceFromPoint: она возвращает значение напрямую, а не через аргумент, поэтому придётся отдельно проверять подключение одного из игроков с помощью IsPlayerConnected.
    PHP код:
    if(== IsPlayerConnected(p1))
        return -
    1.00;
    new 
    Float:xFloat:yFloat:z;
    if(
    == GetPlayerPos(p2xyz))
        return 
    1.00;
    return 
    GetPlayerDistanceFromPoint(targetidxyz); 
    В итоге чуть больше строк кода, но львиная доля времени отнимется на вызов нативных функций SA:MP (не на выполнение функций, а именно на сам их вызов, т.е. на процесс перехода с интерпретируемого кода на нативный и обратно).
    Здесь этих вызовов так же 3, как и в варианте с VectorSize. Зато этот вариант менее требователен к стеку: 3 локальных переменных против 6.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

 

 

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

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

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

Ваши права

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