lopster102, тогда на мой взгляд лучшим способом будет:
private _up = lineIntersectsWith [eyePos player, eyePos player vectorAdd [0, 0, 100], player, objNull, false]; private _down = lineIntersectsWith [eyePos player, eyePos player vectorAdd [0, 0, -100], player, objNull, false]; private _inside = !((_up arrayIntersect _down) isEqualTo []);Суть в том, что: т. к. здание имеет крышу и пол, то логично предположить, что если линия вверх и линия вниз пересекли один и тот же объект, то мы как минимум находимся в беседке , так же тут нужно еще проверить, а не находиться ли игрок в технике (Т. к. она тоже как ни странно имеет крышу и пол), и по возможность отфильтровать объекты с которыми мы не хотим взаимодействовать
PS Ну и дальше чисто оптимизация и повышение точности:
* Проверять только наличие крыши над головой
* Ленивую проверку пересечений
* Длину линии проверки
* Больше линий проверки (В разные стороны, со сдвигом в сторону и т. д.)
* и т. д.
Спасибо!это похоже то что надо!а вот интересно про второй вариант почитать бы еще=).
private["_unit", "_inside", "_building", "_relPos", "_boundingBox", "_min", "_max", "_myX", "_myY", "_myZ"]; _unit = (_this select 0); _inside = false; _building = nearestObject [_unit, "HouseBase"]; if (isNull _building) exitWith {_inside}; _relPos = _building worldToModel (getPosATL _unit); _boundingBox = boundingBox _building; _min = _boundingBox select 0; _max = _boundingBox select 1; _myX = _relPos select 0; _myY = _relPos select 1; _myZ = _relPos select 2; if ( (_myX > (_min select 0)) and (_myX < (_max select 0)) ) then { if ( (_myY > (_min select 1)) and (_myY < (_max select 1)) ) then { if ( (_myZ > (_min select 2)) and (_myZ < (_max select 2)) ) then {_inside = true;}; }; }; _insideспс