97 lines
3.2 KiB
Plaintext
97 lines
3.2 KiB
Plaintext
/*
|
|
File: fn_spawnVehicle.sqf
|
|
Author: KP Liberation Dev Team - https://github.com/KillahPotatoes
|
|
Date: 2019-12-03
|
|
Last Update: 2020-05-06
|
|
License: MIT License - http://www.opensource.org/licenses/MIT
|
|
|
|
Description:
|
|
Spawns a vehicle with all needed Liberation connections/dependencies.
|
|
|
|
Parameter(s):
|
|
_pos - Position to spawn the vehicle [POSITION, defaults to [0, 0, 0]]
|
|
_classname - Classname of the vehicle to spawn [STRING, defaults to ""]
|
|
_precise - Selector if the vehicle should spawned precisely on given position [BOOL, defaults to false]
|
|
_rndDir - Selector if the direction should be randomized [BOOL, defaults to true]
|
|
|
|
Returns:
|
|
Spawned vehicle [OBJECT]
|
|
*/
|
|
|
|
params [
|
|
["_pos", [0, 0, 0], [[]], [2, 3]],
|
|
["_classname", "", [""]],
|
|
["_precise", false, [false]],
|
|
["_rndDir", true, [false]]
|
|
];
|
|
|
|
if (_pos isEqualTo [0, 0, 0]) exitWith {["No or zero pos given"] call BIS_fnc_error; objNull};
|
|
if (_classname isEqualTo "") exitWith {["Empty string given"] call BIS_fnc_error; objNull};
|
|
if (!canSuspend) exitWith {_this spawn KPLIB_fnc_spawnVehicle};
|
|
|
|
private _newvehicle = objNull;
|
|
private _spawnpos = [];
|
|
|
|
if (_precise) then {
|
|
// Directly use given pos, if precise placement is true
|
|
_spawnpos = _pos;
|
|
} else {
|
|
// Otherwise find a suitable position for vehicle spawning near given pos
|
|
private _i = 0;
|
|
while {_spawnPos isEqualTo []} do {
|
|
_i = _i + 1;
|
|
_spawnpos = (_pos getPos [random 150, random 360]) findEmptyPosition [10, 100, _classname];
|
|
if (_i isEqualTo 10) exitWith {};
|
|
};
|
|
};
|
|
|
|
if (_spawnPos isEqualTo zeroPos) exitWith {
|
|
["No suitable spawn position found."] call BIS_fnc_error;
|
|
[format ["Couldn't find spawn position for %1 around position %2", _classname, _pos], "WARNING"] call KPLIB_fnc_log;
|
|
objNull
|
|
};
|
|
|
|
// If it's a chopper, spawn it flying
|
|
if (_classname in opfor_choppers) then {
|
|
_newvehicle = createVehicle [_classname, _spawnpos, [], 0, 'FLY'];
|
|
_newvehicle flyInHeight (80 + (random 120));
|
|
_newvehicle allowDamage false;
|
|
} else {
|
|
_newvehicle = _classname createVehicle _spawnpos;
|
|
_newvehicle allowDamage false;
|
|
|
|
[_newvehicle] call KPLIB_fnc_allowCrewInImmobile;
|
|
|
|
// Randomize direction and reset position and vector
|
|
if (_rndDir) then {
|
|
_newvehicle setDir (random 360);
|
|
};
|
|
_newvehicle setPos _spawnpos;
|
|
_newvehicle setVectorUp surfaceNormal position _newvehicle;
|
|
};
|
|
|
|
// Clear cargo, if enabled
|
|
[_newvehicle] call KPLIB_fnc_clearCargo;
|
|
|
|
// Process KP object init
|
|
[_newvehicle] call KPLIB_fnc_addObjectInit;
|
|
|
|
// Spawn crew of vehicle
|
|
if (_classname in militia_vehicles) then {
|
|
[_newvehicle] call KPLIB_fnc_spawnMilitiaCrew;
|
|
} else {
|
|
private _grp = createGroup [GRLIB_side_enemy, true];
|
|
private _crew = units (createVehicleCrew _newvehicle);
|
|
_crew joinSilent _grp;
|
|
sleep 0.1;
|
|
{_x addMPEventHandler ["MPKilled", {_this spawn kill_manager}];} forEach _crew;
|
|
};
|
|
|
|
// Add MPKilled and GetIn EHs and enable damage again
|
|
_newvehicle addMPEventHandler ["MPKilled", {_this spawn kill_manager}];
|
|
sleep 0.1;
|
|
_newvehicle allowDamage true;
|
|
_newvehicle setDamage 0;
|
|
|
|
_newvehicle
|