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

iamdss

Участник
Сообщения
126
Реакции
12
Необходимо определить расстояние до стены, каков примерный алгоритм и функции сурсмода? Хочу защищать афк игроков, которые отвернулись к стене лицом.
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #2
PHP:
wS_GetLookPos(client, Float:wS_Pos[3])  // Получение позиции прицела
{ 
	decl Float:EyePosition[3], Float:EyeAngles[3], Handle:h_trace; 
	GetClientEyePosition(client, EyePosition); 
	GetClientEyeAngles(client, EyeAngles); 
	h_trace = TR_TraceRayFilterEx(EyePosition, EyeAngles, MASK_SOLID, RayType_Infinite, wS_GetLookPos_Filter, client); 
	TR_GetEndPosition(wS_Pos, h_trace); 
	CloseHandle(h_trace); 
}

public bool:wS_GetLookPos_Filter(ent, mask, any:client)  //Проверка, что игрок не смотрит сам на себя.
{ 
	return client != ent; 
}
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #4
AlmazON, это будет точка куда он смотрит. Дистанцию уже сам получит...
 

Саша Шеин

Кому костылей?
Сообщения
1,697
Реакции
621
Объясните мне как клиент может смотреть на себя? Или для чего это?

PHP:
public bool:wS_GetLookPos_Filter(ent, mask, any:client)
{
return client != ent;
}
 

gibs

Фитиль народного волненья
Сообщения
722
Реакции
407
Мошенник
Объясните мне как клиент может смотреть на себя? Или для чего это?

PHP:
public bool:wS_GetLookPos_Filter(ent, mask, any:client)
{
return client != ent;
}

Это фильтр. Трейс - это прямая линия. В данном случае из точки в инфинит, то-есть в бесконечность. Это линия попадает в объекты, которые и фильтруется. Если в фильтре вернуть истину, то трейс завершается.
 

iamdss

Участник
Сообщения
126
Реакции
12
Спасибо, ребята. Попробую сейчас...

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

Reiko1231

AlexTheRegent
Сообщения
508
Реакции
1,336
Как определить, что смотрим именно на вертикальную поверхность
Точно - никак. Лишь допусками или диапазонами.
Вариант 1. По углу смотрящего (z составляющая). Если она в диапазоне от 0 до 30 градусов, считать, что смотрит на пол.
Вариант 2. По конечной координате - если она совпадает с GetClientAbsOrigin() по z координате в диапазоне, скажем, от +=10.0, то тогда считать, что он смотрит на землю.
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
Можно извратиться, "покрыв" нужную стену большой по размерам (подходящей) энтити - если трейсер находит её номер, значит, игрок точно смотрит на стену (установленную энтити). Весьма точно, хотя малостоящее (очень неудобное - ставить на каждой карте то).
С другой стороны - так можно определить даже нужные нам стены.
 

Reiko1231

AlexTheRegent
Сообщения
508
Реакции
1,336
Странно, я по x углу смещения определял. Если 0.0, то смотрит вперёд. Если < 0.0, то вниз, если > 0.0, то вверх.

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



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