Files
DayZ-Epoch/SQF/dayz_code/loot/spawn.sqf
2020-01-10 07:23:33 -06:00

166 lines
4.4 KiB
Plaintext

/*
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, _lootInfo select 2, _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