[Решено] Видит ли игрок игрока на экране

Nico Yazawa

Бывший MrChester =(
Сообщения
326
Реакции
303
Здравствуйте, вот задумался писать новую фичу и хотел бы кое-что узнать.

Есть два игрока (игрок1 и игрок2), надо узнать, находиться ли игрок2 в поле зрения игрока1. Как это можно реализовать?
Варианты с GetClientAimTarget отпадают, так как он ищет игрока под прицелом.
Буду рад помощи.
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,569
Реакции
5,071
м/б вот это юзать: GetClientsInRange · halflife · SourceMod Scripting API Reference
с флагом RangeType_Visibility

Вот как-то так:
C-подобный:
stock bool IsTargetVisible(int client, int target)
{
    static int i, num, clients[MAXPLAYERS];
    static float pos[3];

    GetClientEyePosition(client, pos);
    num = GetClientsInRange(pos, RangeType_Visibility, clients, sizeof(clients));
    if(!num) return false;

    for(i = 0; i < num; i++) if(clients[i] == target) return true;

    return false;
}
 
Последнее редактирование:

Nico Yazawa

Бывший MrChester =(
Сообщения
326
Реакции
303
м/б вот это юзать: GetClientsInRange · halflife · SourceMod Scripting API Reference
с флагом RangeType_Visibility

Вот как-то так:
C-подобный:
stock bool IsTargetVisible(int client, int target)
{
    static int i, num, clients[MAXPLAYERS];
    static float pos[3];

    GetClientAbsOrigin(client, pos);
    num = GetClientsInRange(pos, RangeType_Visibility, clients, sizeof(clients));
    if(!num) return false;

    for(i = 0; i < num; i++) if(clients[i] == target) return true;

    return false;
}
Спасибо за идею!
Прикрепил скриншот, не знаете чем отличаются они друг от друга?
 

Вложения

  • firefox_AQo3HhW6g8.png
    firefox_AQo3HhW6g8.png
    1.4 КБ · Просмотры: 103

tonline_kms65_1

Участник
Сообщения
565
Реакции
225
Возможно ему нужны только те игроки, которые находятся в поле зрения(т.е. те что за спиной не видны).
А так видны все те, кто находятся в радиусе.
 

Nico Yazawa

Бывший MrChester =(
Сообщения
326
Реакции
303
Возможно ему нужны только те игроки, которые находятся в поле зрения(т.е. те что за спиной не видны).
А так видны все те, кто находятся в радиусе.
То есть то что скинул Grey83 не будет работать так, как я хотел ( я хотел, в поле зрения )?
 
Последнее редактирование:

tonline_kms65_1

Участник
Сообщения
565
Реакции
225
То есть то что скинул Крузя не будет работать так, как я хотел ( я хотел, в поле зрения )?

Я не могу сказать это точно. Если есть время - попробуй, но судя по описанию этой ф-ии я не вижу там установки "угла зрения".
Я вообще стараюсь подальше держаться от таких ф-ий, работу которых я не знаю.
Когда делал своих дронов, все делал с помощью мат. расчетов. Там можно угол обзора кварами задать.
Немного мозг поднапрячь, зато потом пригодится, а самое главное - точно знаешь как работает определенный блок кода.
Есть отличная статья, в ней подробно, простым языком объясняется как можно в любой игре сделать то, что тебе нужно.
Неплохо было бы её здесь, в уроках программирования использовать.

Принцип простой:
1. циклом проходишь, всех игроков, по ихнему id (их там максимум 32(64))
2. найденных проверяешь на расстояние(заданный радиус, можно назвать четкостью зрения (близорукость)). КВАР
3. отсекаешь тех кто за пределами угла зрения игрока. КВАР
4. находишь того, кто ближе всех
5. проверяешь не за препятствием ли этот найденный игрок

Проверку, как по мне, лучше делать таймером с интервалом 0,1 сек, вполне хватает, да и проц. меньше грузит.
Вот и весь процесс.
 
Последнее редактирование:

Nico Yazawa

Бывший MrChester =(
Сообщения
326
Реакции
303
Я не могу сказать это точно. Если есть время - попробуй, но судя по описанию этой ф-ии я не вижу там установки "угла зрения".
Я вообще стараюсь подальше держаться от таких ф-ий, работу которых я не знаю.
Когда делал своих дронов, все делал с помощью мат. расчетов. Там можно угол обзора кварами задать.
Немного мозг поднапрячь, зато потом пригодится, а самое главное - точно знаешь как работает определенный блок кода.
Есть отличная статья, в ней подробно, простым языком объясняется как можно в любой игре сделать то, что тебе нужно.
Неплохо было бы её здесь, в уроках программирования использовать.

Принцип простой:
1. циклом проходишь, всех игроков, по ихнему id (их там максимум 32(64))
2. найденных проверяешь на расстояние(заданный радиус, можно назвать четкостью зрения (близорукость)). КВАР
3. отсекаешь тех кто за пределами угла зрения игрока. КВАР
4. находишь того, кто ближе всех
5. проверяешь не за препятствием ли этот найденный игрок

Проверку, как по мне, лучше делать таймером с интервалом 0,1 сек, вполне хватает, да и проц. меньше грузит.
Вот и весь процесс.
А проверить за препятствиями ли игрок как?
 

Nico Yazawa

Бывший MrChester =(
Сообщения
326
Реакции
303
Последнее редактирование:
Сверху Снизу