Описание: Функция получает на вход переменную юнита и возвращает bool значение в зависимости от того, находится ли игрок в здании или же нет.
Автор: DrSova (участник нашего Discord).
Применение: [/*переменная игрока*/] call fnc_isInsideBuilding;
Пример:
Создаем проверку присутствия игрока в доме каждую секунду.
1. Помещаем код функции (находится в самом низу страницы) в init.sqf вашей миссии.
fnc_isInsideBuilding в коде - является переменной, которая хранит в себе функцию и далее будет использоваться для ее вызова. Название можно изменить на любое удобное вам.
2. Следующий код будет проверять присутствие игрока в здании и выводить на экран сообщение: В доме ли игрок или же нет. (Код также можно поместить в init.sqf)
[] spawn {
while {true} do {
_isInside = [player] call fnc_isInsideBuilding; //Вызов функции проверки и запись результата в локальную переменную _isInside
if (str _isInside == "true") then { //Проверка значения переменной
hintSilent "Игрок в доме"; //При соблюдении данного условия на экран выведется сообщение "Игрок в доме"
} else {
hintSilent "Игрок не в доме"; //При остальных условиях на экран выведется сообщение "Игрок не в доме"
};
sleep 1; //Задержка выполнения скрипта. Чем меньше задержка - тем хуже производительность
};
};
Код функции
fnc_isInsideBuilding = {
private["_unit1","_building","_type","_relPos","_boundingBox","_min","_max","_myX","_myY","_myZ","_inside"];
_unit1 = _this select 0;
_inside = false;
_buildingsCheck = [];
_buildingsCheck = _unit1 call {
_end = [];
_array = lineIntersectsSurfaces [
getPosWorld _this,
getPosWorld _this vectorAdd [0, 0, 50],
_this, objNull, true, 1, "GEOM", "NONE"
];
{
_house = _x select 3;
if (_house isKindOf "HouseBase") then {
_end pushback _house;
};
} forEach _array;
_end
};
{
_relPos = _x WorldToModel (getposATL _unit1);
_boundingBox = boundingBoxReal _x;
_min = [];
_max = [];
_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;
} else { _inside = false; };
} else { _inside = false; };
} else { _inside = false; };
} forEach _buildingsCheck;
_inside
};
Обсудить это можно в нашем Discord канале