mirror of
https://github.com/EpochModTeam/DayZ-Epoch.git
synced 2025-12-14 20:13:13 +03:00
101 lines
4.8 KiB
Plaintext
101 lines
4.8 KiB
Plaintext
/*
|
|
DayZ Epoch Smoking Chimneys by JasonTM
|
|
Description: This configurable function will scan for houses and industrial exhaust stacks near the player and create smoke effects at the chimney opening.
|
|
parameters:
|
|
1. Radius to search around the player for buildings. Default - 500 meters.
|
|
2. Chance that a building will spawn a smoke particle source (0 - 1). Default - .3.
|
|
3. Max number of houses to spawn a particle source around a player. Default - 30.
|
|
Usage: [500, .3, 30] execVM "path/fn_chimney.sqf";
|
|
|
|
Credit to Maddmatt for BIS_Effects_Burn
|
|
Credit to Karel Moricky for fnc_houseEffects.sqf
|
|
*/
|
|
|
|
private ["_int","_relPos","_ps","_cl","_pos","_type","_li","_array","_params","_max","_chance","_radius","_count"];
|
|
|
|
_radius = _this select 0;
|
|
_chance = _this select 1;
|
|
_max = _this select 2;
|
|
_array = [];
|
|
_params = [];
|
|
_hasPS = false;
|
|
_count = 0;
|
|
|
|
while {1 == 1} do {
|
|
if (_count < _max) then {
|
|
{
|
|
if !(_x getVariable ["chimneyCheck",false]) then {
|
|
_type = typeOf _x;
|
|
_hasPS = false;
|
|
if (_type in ["Land_Ind_Stack_Big","Land_komin","Land_Ind_MalyKomin"]) then { // Industrial smoke stacks spawn heavier smoke effects and light sources.
|
|
if (_type == "Land_Ind_Stack_Big") then {_params = [3,[-1.16309,3.48633,29.4432]];};
|
|
if (_type == "Land_komin") then {_params = [3,[0.0849609,0.819702,14.1062]];};
|
|
if (_type == "Land_Ind_MalyKomin") then {_params = [2,[0.685303,0.271484,19.4]];};
|
|
_int = _params select 0;
|
|
_relPos =_params select 1;
|
|
_pos = _x modelToWorld _relPos;
|
|
_ps = "#particlesource" createVehicleLocal _pos;
|
|
_ps setPos _pos;
|
|
_li = "#lightpoint" createVehicleLocal _pos;
|
|
_li setLightBrightness (_int/30);
|
|
_li setLightAmbient[0.8, 0.6, 0.2];
|
|
_li setLightColor[1, 0.5, 0.4];
|
|
_li lightAttachObject [_x, _relPos];
|
|
_cl = 0.8/_int;
|
|
_ps setDropInterval (0.01 + 0.02*_int);
|
|
_ps setParticleRandom [0.7*_int, [1 - _int/10,1 - _int/10,1 - _int/10], [0.2*_int, 0.2*_int, 0.05*_int], 0, 0.3, [0.05, 0.05, 0.05, 0], 0, 0];
|
|
_ps setDropInterval (0.01 + 0.02*_int);
|
|
_ps setParticleParams
|
|
[["\Ca\Data\ParticleEffects\Universal\Universal", 16, 7, 48],
|
|
"","Billboard",1, 3*_int,
|
|
_relPos,[0, 0, 0.5*_int],
|
|
0, 0.05, 0.04, 0.05, [0.5*_int, 3*_int],
|
|
[[_cl, _cl, _cl, 0.2],[_cl, _cl, _cl, 1],[_cl, _cl, _cl, 1],
|
|
[0.05+_cl, 0.05+_cl, 0.05+_cl, 0.9],[0.1+_cl, 0.1+_cl, 0.1+_cl, 0.6],[0.2+_cl, 0.2+_cl, 0.2+_cl, 0.3], [1,1,1, 0]],
|
|
[0.8,0.3,0.25], 1, 0, "", "", _x];
|
|
_array = _array + [[_x,_ps,_li]];
|
|
_count = _count + 1;
|
|
_hasPS = true;
|
|
} else {
|
|
if (random 1 < _chance) then {
|
|
for "_i" from 0 to 10 do {
|
|
_relPos = _x selectionPosition format ["AIChimney_small_%1", _i];
|
|
if (_relPos distance [0,0,0] > 0) exitWith { // Chimney found
|
|
_pos = _x modelToWorld _relPos;
|
|
_ps = "#particlesource" createVehicleLocal _pos;
|
|
_ps setParticleRandom [1, [0, 0, 0], [0.1, 0.1, 0.1], 2, 0.2, [0.05, 0.05, 0.05, 0.05], 0, 0];
|
|
_ps setParticleParams [["\Ca\Data\ParticleEffects\Universal\universal.p3d", 16, 8, 16],
|
|
"", "Billboard", 1, (4 + random 4),
|
|
[0,0,0], [0, 0, 0.5 + random 0.5],
|
|
1, 1.275, 1, 0.066, [0.4, 1 + random 0.5, 2 + random 2],
|
|
//[[0.4, 0.4, 0.4*1.2, 0.1 + random 0.1], [0.5, 0.5, 0.5*1.2, 0.05 + random 0.05], [0.7, 0.7, 0.7*1.2, 0]],
|
|
[[0.4, 0.4, 0.4*1.2, 0.6], [0.5, 0.5, 0.5*1.2, 0.3], [0.7, 0.7, 0.7*1.2, 0]], // darker smoke
|
|
[0], 1, 0, "", "", ""];
|
|
_ps setDropInterval 0.3;
|
|
_array = _array + [[_x,_ps]];
|
|
_count = _count + 1;
|
|
_hasPS = true;
|
|
};
|
|
};
|
|
};
|
|
};
|
|
_x setVariable ["chimneyCheck",true]; // set variable on all buildings so they don't get checked continuously.
|
|
if !(_hasPS) then {_array = _array + [[_x]];}; // place all buildings into the array for proximity checking.
|
|
};
|
|
if (_count == _max) exitWith {}; // Exit the loop when desired number of houses have active chimneys.
|
|
} forEach ((getPos player) nearObjects ["House", _radius]);
|
|
};
|
|
|
|
uiSleep 30;
|
|
//diag_log formatText ["[fn_chimney] count of active chimneys: %1",_count];
|
|
//diag_log formatText ["[fn_chimney] array of buildings: %1",_array];
|
|
{
|
|
if ((player distance (getPos (_x select 0))) > (_radius + 300)) then { // Check to see if the player has moved far enough away from the building.
|
|
(_x select 0) setVariable ["chimneyCheck", false]; // set variable to false so it can be checked again.
|
|
if (count _x > 1) then {deleteVehicle (_x select 1); _count = _count - 1;}; // delete particle source if it exists.
|
|
if (count _x > 2) then {deleteVehicle (_x select 2);}; // delete light source on stacks.
|
|
_array = [_array,_forEachIndex] call fnc_deleteAt;
|
|
};
|
|
} forEach _array;
|
|
};
|