Files
DayZ-Epoch/SQF/dayz_code/system/scheduler/sched_buriedZeds.sqf
ebaydayz 29acecc2f2 Retire DZE_MissionLootTable variable
AFAIK there is no performance difference between configFile and
missionConfigFile.

Using missionConfigFile by default simplifies loot scripts and makes the
extra config variable unnecessary. It's one less step for admins to
customize their tables.
2016-08-23 12:57:12 -04:00

80 lines
2.6 KiB
Plaintext

// (c) facoptere@gmail.com, licensed to DayZMod for the community
sched_buriedZeds_init = {
[] // it's _buriedZeds
};
sched_buriedZeds = {
private ["_a","_c","_b","_node","_foot","_head","_z","_x","_pos",
"_config", "_zedPos", "_elevation","_buriedZeds", "_checkInsideBuilding"];
_checkInsideBuilding = {
private ["_building","_this","_point","_inside","_offset","_relPos","_boundingBox","_min","_max","_myX","_myY"];
_building = _this select 0;
_point = _this select 1;
_inside = false;
_offset = 1; // shrink building boundingbox by this length.
_relPos = _building worldToModel _point;
_boundingBox = boundingBox _building;
_min = _boundingBox select 0;
_max = _boundingBox select 1;
_myX = _relPos select 0;
_myY = _relPos select 1;
if ((_myX > (_min select 0)+_offset) and {(_myX < (_max select 0)-_offset)}) then {
if ((_myY > (_min select 1)+_offset) and {(_myY < (_max select 1)-_offset)}) then {
_inside = (1==1);
};
};
_inside
};
_buriedZeds = _this;
_c = count _buriedZeds;
if (_c > 0) then { // give a zombie a little pitch if necessary
_c = _c - 1;
_node = _buriedZeds select _c;
_foot = _node select 0;
_head = _node select 1;
_z = _node select 2;
_elevation = _node select 3;
if (lineIntersects [_head, _foot,_z]) then {
_pos = getPosATL _z;
_pos set [2, _elevation];
_z setPosATL _pos;
_z setVelocity [0,0,0.5];
//diag_log [ __FILE__, "node", _node, "moveto:", _pos ];
};
_buriedZeds resize _c;
}
else { // find potential buried Zeds
{
_z = _x;
_pos = (getPosATL _z);
if ((alive _z) AND {(_pos select 2 < 0.05)}) then {
//_a = _a + 1;
_b = nearestBuilding _z;
if (!isNull _b) then {
_config = missionConfigFile >> "CfgLoot" >> "Buildings" >> (typeOf _b) >> "zedPos";
_zedPos = [] + getArray _config;
if ((count _zedPos > 0) and {([_b, _pos] call _checkInsideBuilding)}) then {
_elevation = (_b modelToWorld (_zedPos select 0)) select 2; // ATL
_foot = ATLtoASL _pos;
_foot set [ 2, (_foot select 2) + 0.1 ];
_head = +(_foot);
_head set [ 2, (_foot select 2) + 1.5 ];
if (_elevation < _head select 2) then { // don't handle if lootpos is quite high inside the building.
_buriedZeds set [ count _buriedZeds, [_foot, _head, _z, _elevation] ];
};
};
};
};
} count ((getPosATL player) nearEntities ["zZombie_Base", 30]);
};
//diag_log format [ "alive+ground: %1, inbuilding: %2 plr in:%3 %4", _a, _c, [_b, getPosATL player] call _checkInsideBuilding, _b ];
_buriedZeds
};