/* Spawns the specified loot definition at the specified location. Parameters: array Loot definition vector Spawn position relative to world Return value: object Spawned vehicle. Author: Foxy */ #include "Loot.hpp" //Maximum number of magazines spawned along with weapons #define MAX_WEAPON_MAGAZINES 2 #ifdef SERVER #define INCREMENT_WEAPON_HOLDERS #else #define INCREMENT_WEAPON_HOLDERS dayz_currentWeaponHolders = dayz_currentWeaponHolders + 1; #endif private ["_item","_isWater","_type","_lootInfo","_vehicle","_spawnCount","_magazines"]; _lootInfo = _this select 0; _pos = _this select 1; _type = _lootInfo select 0; _item = _lootInfo select 1; _isWater = surfaceIsWater _pos; _vehicle = objNull; call { //Spawn a single magazine if (_type == Loot_MAGAZINE) exitWith { if (dayz_classicBloodBagSystem && _item in dayz_typedBags) then { if (_item in ["bloodTester","bloodBagAPOS","bloodBagABPOS"]) then { // reduce ItemBloodBag output slightly since typed bags spawn in bulk _item = ["ItemBandage","ItemPainkiller","ItemMorphine","ItemHeatPack","ItemAntibacterialWipe"] call BIS_fnc_selectRandom; } else { _item = "ItemBloodbag"; }; }; if (!dayz_toolBreaking) then { if (_item == "equip_lever") then { // The levers are only used if tool breaking is turned on. _item = ["equip_hose","ItemPlank","equip_nails","ItemLog","equip_brick"] call BIS_fnc_selectRandom; }; }; if (!dayz_knifeDulling) then { if (_item == "equip_brick") then { // Bricks are only used to sharpen tools _item = ["equip_hose","ItemPlank","equip_nails","ItemLog"] call BIS_fnc_selectRandom; }; }; _vehicle = "WeaponHolder" createVehicle [0,0,0]; _vehicle addMagazineCargoGlobal [_item, 1]; // Fix generator spawning half way in the floor by raising z coordinate by .3 meters. if (_item == "ItemGenerator") then { _pos set [2, ((_pos select 2) + .3)]; }; if (_isWater) then { _vehicle setPos (_pos); } else { _vehicle setPosATL (_pos); }; INCREMENT_WEAPON_HOLDERS }; //Spawn a single weapon with [0,MAX_WEAPON_MAGAZINES] magazines. if (_type == Loot_WEAPON) exitWith { _vehicle = "WeaponHolder" createVehicle [0,0,0]; _vehicle addWeaponCargoGlobal [_item, 1]; if (_isWater) then { _vehicle setPos (_pos); } else { _vehicle setPosATL (_pos); }; INCREMENT_WEAPON_HOLDERS _magazines = getArray (configFile >> "CfgWeapons" >> _item >> "magazines"); if (count _magazines > 0 && {getNumber (configFile >> "CfgWeapons" >> _item >> "melee") != 1}) then { _vehicle addMagazineCargoGlobal [_magazines select 0, floor random (MAX_WEAPON_MAGAZINES + 1)]; }; }; //Spawn backpack if (_type == Loot_BACKPACK) exitWith { _vehicle = _item createVehicle [0,0,0]; // Fix floating backpacks by lowering z coordinate by .15 meters. _pos set [2, ((_pos select 2) - .15)]; if (_isWater) then { _vehicle setPos (_pos); } else { _vehicle setPosATL (_pos); }; }; //Spawn multiple items from a given group. All but weapons and magazines are ignored. if (_type == Loot_PILE) exitWith { _spawnCount = (_lootInfo select 2) + floor random ((_lootInfo select 3) - (_lootInfo select 2) + 1); _vehicle = "WeaponHolder" createVehicle [0,0,0]; Loot_InsertCargo(_vehicle, _item, _spawnCount); if (_isWater) then { _vehicle setPos (_pos); } else { _vehicle setPosATL (_pos); }; INCREMENT_WEAPON_HOLDERS }; //Spawn a vehicle if (_type == Loot_VEHICLE) exitWith { _vehicle = _item createVehicle [0,0,0]; _vehicle setDir random 360; if (_isWater) then { _vehicle setPos (_pos); } else { _vehicle setPosATL (_pos); }; }; //Spawn a container and populate it with loot from a given group if (_type == Loot_CONTAINER) exitWith { _vehicle = _item createVehicle [0,0,0]; //Number of items to spawn _spawnCount = (_lootInfo select 3) + floor random ((_lootInfo select 4) - (_lootInfo select 3) + 1); Loot_InsertCargo(_vehicle, _item, _spawnCount); _vehicle setDir random 360; if (_isWater) then { _vehicle setPos (_pos); } else { _vehicle setPosATL (_pos); }; INCREMENT_WEAPON_HOLDERS }; //Call a function which is assumed to return an object reference. if (_type == Loot_CUSTOM) exitWith { _vehicle = call (_item); if ((typeName _vehicle) != "OBJECT") exitWith {}; if (!isNull _vehicle) then { if (_isWater) then { _vehicle setPos (_pos); } else { _vehicle setPosATL (_pos); }; }; }; }; _vehicle