Дистанция до стены

Тема в разделе "Программирование / Скриптинг", создана пользователем iamdss, 14 июл 2015.

  1. iamdss

    iamdss

    Сообщения:
    117
    Симпатии:
    0
    Необходимо определить расстояние до стены, каков примерный алгоритм и функции сурсмода? Хочу защищать афк игроков, которые отвернулись к стене лицом.
     
  2. R1KO

    R1KO Супер-модератор

    Сообщения:
    5.987
    Симпатии:
    2.985
    PHP:
    wS_GetLookPos(clientFloat:wS_Pos[3])  // Получение позиции прицела

        
    decl Float:EyePosition[3], Float:EyeAngles[3], Handle:h_trace
        
    GetClientEyePosition(clientEyePosition); 
        
    GetClientEyeAngles(clientEyeAngles); 
        
    h_trace TR_TraceRayFilterEx(EyePositionEyeAnglesMASK_SOLIDRayType_InfinitewS_GetLookPos_Filterclient); 
        
    TR_GetEndPosition(wS_Posh_trace); 
        
    CloseHandle(h_trace); 
    }

    public 
    bool:wS_GetLookPos_Filter(entmaskany:client)  //Проверка, что игрок не смотрит сам на себя.

        return 
    client != ent
    }
     
    iamdss нравится это.
  3. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.523
    Симпатии:
    1.972
    GetVectorDistance допиши. Ты же так и не получил
    А лишь позицию.
     
    iamdss нравится это.
  4. R1KO

    R1KO Супер-модератор

    Сообщения:
    5.987
    Симпатии:
    2.985
    AlmazON, это будет точка куда он смотрит. Дистанцию уже сам получит...
     
  5. Саша Шеин

    Саша Шеин

    Сообщения:
    1.259
    Симпатии:
    191
    Объясните мне как клиент может смотреть на себя? Или для чего это?

    PHP:
    public bool:wS_GetLookPos_Filter(entmaskany:client)
    {
    return 
    client != ent;
    }
     
  6. gibs

    gibs Фитиль народного волненья

    Сообщения:
    538
    Симпатии:
    137
    Это фильтр. Трейс - это прямая линия. В данном случае из точки в инфинит, то-есть в бесконечность. Это линия попадает в объекты, которые и фильтруется. Если в фильтре вернуть истину, то трейс завершается.
     
    Саша Шеин, AlmazON и iamdss нравится это.
  7. iamdss

    iamdss

    Сообщения:
    117
    Симпатии:
    0
    Спасибо, ребята. Попробую сейчас...

    Добавлено через 4 часа 6 минут
    Да, всё получилось, расстояние до стены и угол наклона взгляда получаю нормально. Однако, появилась проблема. Если игрок смотрит в пол, то для алгоритма это такая же поверхность, как и стена. Допусками и диапазонами проблему, увы, не решить. Как определить, что смотрим именно на вертикальную поверхность?
     
    Последнее редактирование: 15 июл 2015
  8. Reiko1231

    Reiko1231 AlexTheRegent

    Сообщения:
    237
    Симпатии:
    569
    Точно - никак. Лишь допусками или диапазонами.
    Вариант 1. По углу смотрящего (z составляющая). Если она в диапазоне от 0 до 30 градусов, считать, что смотрит на пол.
    Вариант 2. По конечной координате - если она совпадает с GetClientAbsOrigin() по z координате в диапазоне, скажем, от +=10.0, то тогда считать, что он смотрит на землю.
     
    iamdss нравится это.
  9. White Wolf

    White Wolf [] (int _n) -> double { return (_n % 2) == 0;}); Супер-модератор

    Сообщения:
    1.191
    Симпатии:
    419
    Странно, я по x углу смещения определял. Если 0.0, то смотрит вперёд. Если < 0.0, то вниз, если > 0.0, то вверх.
     
    iamdss нравится это.
  10. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.523
    Симпатии:
    1.972
    Можно извратиться, "покрыв" нужную стену большой по размерам (подходящей) энтити - если трейсер находит её номер, значит, игрок точно смотрит на стену (установленную энтити). Весьма точно, хотя малостоящее (очень неудобное - ставить на каждой карте то).
    С другой стороны - так можно определить даже нужные нам стены.
     
    iamdss нравится это.
  11. Reiko1231

    Reiko1231 AlexTheRegent

    Сообщения:
    237
    Симпатии:
    569
    Вероятно, это была связанная система координат roll pitch yaw, в ней roll (0 индекс) показывает угол игрока относительно оси Z. Я же писал про неподвижную xyz систему координат.
    [​IMG]


    Ну а это уже допущение, что человек на каждой карте расставит эти сущности. Без допущений - это чистый вариант, который работает на любой карте в любом случае, без предварительной обработки.
     
    Последнее редактирование: 15 июл 2015
    iamdss и AlmazON нравится это.