mirror of
https://github.com/EpochModTeam/DayZ-Epoch.git
synced 2025-12-14 04:02:37 +03:00
Replace switch do block with call using if and exitWith statements. Magazine class items are the most commonly spawned item so it is placed at the top. Switch to the more efficient form of createVehicle. Set more local variables at the top to make the file more readable. Prevent the generator from spawning halfway into the floor by raising the z coordinate. Lower the backpack spawns to prevent them from floating. Add replacement items if dayz_toolBreaking and dayz_knifeDulling are disabled.
166 lines
4.4 KiB
Plaintext
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, _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
|