Particles Tutorial: Difference between revisions

From Bohemia Interactive Community
Jump to navigation Jump to search
(Add Design Workflow and config class mention)
m (Text replacement - "{{Link|:Category:" to "{{Link|Category:")
 
(28 intermediate revisions by 3 users not shown)
Line 1: Line 1:
{{SideTOC}}
{{TOC|side}}
== Basics ==
A '''{{Link|https://en.wikipedia.org/wiki/Particle_system|particle}}''' is a (to some extent, non-physical) 2D plane that always faces the camera, or (more rarely) a 3D model.
 
A '''{{Wikipedia|Particle system|particle}}''' is a (to some extent, non-physical) 2D plane that always faces the camera, or (more rarely) a 3D model.
It can be used to simulate ambient effects, such as dust, fire, water splash, wood splinters and even rock debris.
It can be used to simulate ambient effects, such as dust, fire, water splash, wood splinters and even rock debris.


Line 9: Line 7:
A particle (as well as a particle source) is '''[[Multiplayer Scripting#Locality|local]]''' to the computer where the script has been called; one player could see smoke while another could see through without any issue.
A particle (as well as a particle source) is '''[[Multiplayer Scripting#Locality|local]]''' to the computer where the script has been called; one player could see smoke while another could see through without any issue.


{{Informative | Particles exist since [[{{ofp}}]], but the first related command ([[drop]]) was only introduced in [[{{ofpr}}]].<br>
{{Feature|informative|Particles exist since {{GameCategory|ofp|link= y}}, but the first related command ([[drop]]) was only introduced in {{GameCategory|ofpr|link= y}}.<br>
Particle source notions and commands were introduced in {{arma}}, some commands were later added in {{arma3}} (e.g [[setParticleFire]], [[setParticleClass]]).}}
Particle source notions and commands were introduced in {{GameCategory|arma1|link= y}}, some commands were later added in {{GameCategory|arma3|link= y}} (e.g [[setParticleFire]], [[setParticleClass]]).}}




== How to ==
== How To ==


=== Create a particle source ===
=== Create a Particle Source ===


[[private]] _particleSource = '''"#particlesource"''' [[createVehicleLocal]] [[getPosATL]] [[player]];
<sqf>private _particleSource = "#particlesource" createVehicleLocal ASLToAGL getPosASL player;</sqf>


{{Informative | A particle source is '''[[Multiplayer Scripting#Locality|local]]''' (and all the particle commands take a local argument too), hence [[createVehicleLocal]] usage.}}
{{Feature|informative|A particle source is '''[[Multiplayer Scripting#Locality|local]]''' (and all the particle commands take a local argument too), hence [[createVehicleLocal]] usage.}}


{{ArgTitle|Set source class|3|{{GVI|arma3|0.50}}}}
{{ArgTitle|3|Set Source Class|{{GVI|arma3|0.50}}}}


{{Informative | Particle source class must be defined in game [[configFile|config]] and '''cannot''' be declared in [[missionConfigFile]] or [[campaignConfigFile]]. See [[Arma 3 Particle Effects]] for more information.}}
<sqf>_particleSource setParticleClass "ObjectDestructionFire1Smallx"; // defined in configFile >> "CfgCloudlets"</sqf>


_particleSource [[setParticleClass]] "ObjectDestructionFire1Smallx"; {{cc|defined in [[configFile]] >> "CfgCloudlets"}}
{{Feature|informative|Particle source class must be defined in game [[configFile|config]] and '''cannot''' be declared in [[missionConfigFile]] or [[campaignConfigFile]]. See [[Arma 3: Particle Effects]] for more information.}}


=== Set source parameters ===
=== Set Source Parameters ===


{{cc|see [[ParticleArray]] for details on the array format}}
See [[ParticleArray]] for details on the array format.
_particleSource [[setParticleParams]]
<sqf>
[
_particleSource setParticleParams
["\A3\data_f\ParticleEffects\Universal\Universal", 16, 12, 0, 8],
[
"", "Billboard", 1, 3, {{cc|animationName, type, timerPeriod, lifeTime}}
["\A3\data_f\ParticleEffects\Universal\Universal", 16, 12, 0, 8],
[0,1.5,0], {{cc|position relative to ''referenceObject''}}
"", "Billboard", 1, 3, // animationName, type, timerPeriod, lifeTime
[0,0,0], {{cc|velocity}}
[0,1.5,0], // position relative to referenceObject
0, 0.005, 0.003925, 0.1, [0.25, 0.75], {{cc|rotation, weight, volume, rubbing, size}}
[0,0,0], // velocity
[<nowiki/>[1,0,0,0.5], [0,1,0,1], [0,0,01,0.25]], {{cc|colors}}
0, 0.005, 0.003925, 0.1, [0.25, 0.75], // rotation, weight, volume, rubbing, size
[1], {{cc|animationPhase}}
[[1,0,0,0.5], [0,1,0,1], [0,0,01,0.25]], // colors
0, 0, {{cc|randomDirectionPeriod, randomDirectionIntensity}}
[1], // animationPhase
"", "", {{cc|onTimer, beforeDestroy}}
0, 0, // randomDirectionPeriod, randomDirectionIntensity
[[player]], {{cc|referenceObject}}
"", "", // onTimer, beforeDestroy
0, false, {{cc|angle, bounces}}
player, // referenceObject
-1, [], {{cc|bounceOnSurface, emissiveColor}}
0, false, // angle, bounces
[0,0,0] {{cc|vectorDir}}
-1, [], // bounceOnSurface, emissiveColor
];
[0,1,0] // vectorDir - CANNOT be [0,0,0]
];
</sqf>


=== Set source drop interval ===
=== Set Source Drop Interval ===


_particleSource [[setDropInterval]] 0.0625;
<sqf>_particleSource setDropInterval 0.0625; // duration between drops</sqf>


=== Set source drop circle ===
=== Set Source Drop Circle ===


_particleSource [[setParticleCircle]] [3, [0,1,0]];
<sqf>_particleSource setParticleCircle [3, [0,1,0]]; // [circle radius, velocity]</sqf>


=== Set source random values ===
=== Set Source Random Values ===


_particleSource [[setParticleRandom]] [0, [0.1, 0.1, 0.1], [0, 0, 0.5], 0, 0.1, [0, 0, 0, 0], 0, 0];
<sqf>
/*
lifeTime,
position,
moveVelocity,
rotationVelocity,
size,
color,
directionPeriod,
directionIntensity,
angle,
bounceOnSurface
*/
_particleSource setParticleRandom [0, [0.1, 0.1, 0.1], [0, 0, 0.5], 0, 0.1, [0, 0, 0, 0], 0, 0];
</sqf>


{{ArgTitle|Set source fire properties|3|{{GVI|arma3|1.08}}}}
{{ArgTitle|3|Set Source Fire Properties|{{GVI|arma3|1.08}}}}


_particleSource [[setParticleFire]] [0.1, 0.5, 2];
<sqf>_particleSource setParticleFire [0.1, 0.5, 2]; // [coreIntensity, coreDistance, damageTime]</sqf>


=== Delete source ===
=== Delete Source ===


[[deleteVehicle]] _particleSource; {{cc|as simple as that}}
<sqf>deleteVehicle _particleSource; // as simple as that</sqf>


=== Use the [[drop]] command ===
=== Use the [[drop]] Command ===


The [[drop]] command only drops one particle. If multiple ones are needed, a loop ([[for]], [[while]]) must be used.
The [[drop]] command only drops one particle. If multiple ones are needed, a loop ([[for]], [[while]]) must be used.


{{cc|see [[ParticleArray]] for details on the array format}}
See [[ParticleArray]] for details on the array format.
[[drop]] [
<sqf>
["\A3\data_f\ParticleEffects\Universal\Universal", 16, 12, 0, 8],
drop [
"", "Billboard", 1, 3, {{cc|animationName, type, timerPeriod, lifeTime}}
["\A3\data_f\ParticleEffects\Universal\Universal", 16, 12, 0, 8],
[0,1.5,0], {{cc|position relative to ''referenceObject''}}
"", "Billboard", 1, 3, // animationName, type, timerPeriod, lifeTime
[0,0,0], {{cc|velocity}}
[0,1.5,0], // position relative to referenceObject
0, 0.005, 0.003925, 0.1, [0.25, 0.75], {{cc|rotation, weight, volume, rubbing, size}}
[0,0,0], // velocity
[<nowiki/>[1,0,0,0.5], [0,1,0,1], [0,0,01,0.25]], {{cc|colors}}
0, 0.005, 0.003925, 0.1, [0.25, 0.75], // rotation, weight, volume, rubbing, size
[1], {{cc|animationPhase}}
[[1,0,0,0.5], [0,1,0,1], [0,0,01,0.25]], // colors
0, 0, {{cc|randomDirectionPeriod, randomDirectionIntensity}}
[1], // animationPhase
"", "", {{cc|onTimer, beforeDestroy}}
0, 0, // randomDirectionPeriod, randomDirectionIntensity
[[player]] {{cc|referenceObject}}
"", "", // onTimer, beforeDestroy
];
player // referenceObject
];
</sqf>




== Design Workflow ==
== Design Workflow ==


In order to determine ''one'' particle behaviour, a simple [[drop]] usage in the [[Arma 3 Debug Console|Debug Console]] can do;
In order to determine ''one'' particle behaviour, a simple [[drop]] usage in the [[Arma 3: Debug Console|Debug Console]] can do;
but seeing the complete end result can be another task at hand.
but seeing the complete end result can be another task at hand.


=== Using a Script ===
=== Using a Script ===


One way to design your effect is to have an [[SQF syntax|SQF]] file, named e.g "particles.sqf", filled with your code:
One way to design your effect is to have an [[SQF Syntax|SQF]] file, named e.g "particles.sqf", filled with your code:
{ [[deleteVehicle]] _x } [[forEach]] [[allMissionObjects]] "#particlesource";
<sqf>
{ deleteVehicle _x } forEach allMissionObjects "#particlesource";
[[private]] _posATL = [[player]] [[modelToWorld]] [0,10,0];
 
private _posATL = player modelToWorld [0,10,0];
 
ps1 = "#particlesource" [[createVehicleLocal]] _posATL;
ps1 = "#particlesource" createVehicleLocal _posATL;
ps1 [[setParticleParams]] [{{codecomment|/* ... */}}];
ps1 setParticleParams [/* ... */];
ps1 [[setDropInterval]] 0.2;
ps1 setDropInterval 0.2;
 
ps2 = "#particlesource" [[createVehicleLocal]] _posATL;
ps2 = "#particlesource" createVehicleLocal _posATL;
ps2 [[setParticleParams]] [{{codecomment|/* ... */}}];
ps2 setParticleParams [/* ... */];
ps2 [[setDropInterval]] 0.2;
ps2 setDropInterval 0.2;
</sqf>


and run with
and run with
[[execVM]] "particles.sqf";
<sqf>execVM "particles.sqf";</sqf>


This format deletes all previous effects and still allows you to use the [[Arma 3 Debug Console|Debug Console]] in order to adjust particle source settings thanks to the usage of global variables (here, <tt>ps1</tt> and <tt>ps2</tt>)
This format deletes all previous effects and still allows you to use the [[Arma 3: Debug Console|Debug Console]] in order to adjust particle source settings thanks to the usage of global variables (here, {{hl|ps1}} and {{hl|ps2}}).


=== Using a Mod ===
=== Using a Mod ===


'''Emitter 3Ditor''' (a real-time WYSIWYG particle source editor) adds and uses particle and light emitters in your scenarios '''without any scripting nor mod dependency'''.<br>
'''Emitter 3Ditor''' (a real-time WYSIWYG particle source editor) adds and uses particle and light emitters in your scenarios '''without any scripting nor mod dependency'''.<br>
[https://steamcommunity.com/sharedfiles/filedetails/?id=1613905318 Steam page] [https://forums.bohemia.net/forums/topic/221163-emitter-3ditor/ Forums post]
{{Link|link= https://steamcommunity.com/sharedfiles/filedetails/?id=1613905318|text= Steam page}} {{Link|link= https://forums.bohemia.net/forums/topic/221163-emitter-3ditor/|text= Forums post}}




== Full examples ==
== Examples ==


{{Informative | The following examples are for {{arma2}} and later titles. For {{arma}} examples, see [[ParticleTemplates]].}}
{{Feature|informative|The following examples are for {{arma2}} and later titles. For {{arma1}} examples, see [[ParticleTemplates]].}}
{{Important | For games other than {{arma3}}, replace <tt>\A3\Data_F\</tt> with:
{{Feature|important|
{{{!}}
For games other than {{arma3}}:
{{!}} {{GVI|arma2|1.00}} {{!}}{{!}} <tt>\Ca\Data\</tt>
* remove [[private]] usage
* replace {{hl|\A3\Data_F\}} with:
: {{{!}}
{{!}} {{GVI|arma2|1.00}} {{!}}{{!}} {{hl|\Ca\Data\}}
{{!}}-
{{!}}-
{{!}} {{GVI|arma2oa|1.00}} {{!}}{{!}} <tt>\Ca\Ca_e\Data\</tt>
{{!}} {{GVI|arma2oa|1.50}} {{!}}{{!}} {{hl|\Ca\Ca_e\Data\}}
{{!}}-
{{!}}-
{{!}} {{GVI|tkoh|1.00}} {{!}}{{!}} <tt>\hsim\Data_h\Data\</tt>
{{!}} {{GVI|tkoh|1.00}} {{!}}{{!}} {{hl|\hsim\Data_h\Data\}}
{{!}}}
{{!}}}
}}
}}
Line 133: Line 153:
=== Burning Vehicle Fire Look-Alike ===
=== Burning Vehicle Fire Look-Alike ===


[[Image:PE_BurningVehicleLookAlike.jpg|thumb|left|100px|Burning vehicle fire look-alike]]
[[File:PE_BurningVehicleLookAlike.jpg|thumb|left|100px|Burning vehicle fire look-alike]]
[[private]] _posATL = [[player]] [[modelToWorld]] [0,10,0];
<sqf>
private _posATL = player modelToWorld [0,10,0];
{{cc|Fire}}
 
[[private]] _ps0 = "#particlesource" [[createVehicleLocal]] _posATL;
// Fire
_ps0 [[setParticleParams]] [
private _ps0 = "#particlesource" createVehicleLocal _posATL;
["\A3\Data_F\ParticleEffects\Universal\Universal", 16, 10, 32], "", "Billboard",
_ps0 setParticleParams [
0, 1, [0, 0, 0.25], [0, 0, 0.5], 1, 1, 0.9, 0.3, [1.5],
["\A3\Data_F\ParticleEffects\Universal\Universal", 16, 10, 32], "", "Billboard",
[[1,1,1, 0.0], [1,1,1, 0.3], [1,1,1, 0.0]],
0, 1, [0, 0, 0.25], [0, 0, 0.5], 1, 1, 0.9, 0.3, [1.5],
[0.75], 0, 0, "", "", _ps0, rad -45];
[[1,1,1, 0.0], [1,1,1, 0.3], [1,1,1, 0.0]],
_ps0 [[setParticleRandom]] [0.2, [1, 1, 0], [0.5, 0.5, 0], 0, 0.5, [0, 0, 0, 0], 0, 0];
[0.75], 0, 0, "", "", _ps0, rad -45];
_ps0 [[setDropInterval]] 0.03;
_ps0 setParticleRandom [0.2, [1, 1, 0], [0.5, 0.5, 0], 0, 0.5, [0, 0, 0, 0], 0, 0];
_ps0 setDropInterval 0.03;
{{cc|Smoke part 1}}
 
[[private]] _ps1 = "#particlesource" [[createVehicleLocal]] _posATL;
// Smoke part 1
_ps1 [[setParticleParams]] [
private _ps1 = "#particlesource" createVehicleLocal _posATL;
["\A3\Data_F\ParticleEffects\Universal\Universal", 16, 7, 1], "", "Billboard",
_ps1 setParticleParams [
1, 10, [0, 0, 0.5], [0, 0, 2.9], 1, 1.275, 1, 0.066, [4, 5, 10, 10],
["\A3\Data_F\ParticleEffects\Universal\Universal", 16, 7, 1], "", "Billboard",
[[0.3, 0.3, 0.3, 0.33], [0.4, 0.4, 0.4, 0.33], [0.2, 0.2, 0, 0]],
1, 10, [0, 0, 0.5], [0, 0, 2.9], 1, 1.275, 1, 0.066, [4, 5, 10, 10],
[0, 1], 1, 0, "", "", _ps1];
[[0.3, 0.3, 0.3, 0.33], [0.4, 0.4, 0.4, 0.33], [0.2, 0.2, 0, 0]],
_ps1 [[setParticleRandom]] [0, [0, 0, 0], [0.33, 0.33, 0], 0, 0.25, [0.05, 0.05, 0.05, 0.05], 0, 0];
[0, 1], 1, 0, "", "", _ps1];
_ps1 [[setDropInterval]] 0.5;
_ps1 setParticleRandom [0, [0, 0, 0], [0.33, 0.33, 0], 0, 0.25, [0.05, 0.05, 0.05, 0.05], 0, 0];
_ps1 setDropInterval 0.5;
{{cc|Smoke part 2}}
 
[[private]] _ps2 = "#particlesource" [[createVehicleLocal]] _posATL;
// Smoke part 2
_ps2 [[setParticleParams]] [
private _ps2 = "#particlesource" createVehicleLocal _posATL;
["\A3\Data_F\ParticleEffects\Universal\Universal", 16, 9, 1], "", "Billboard",
_ps2 setParticleParams [
1, 15, [0, 0, 0.5], [0, 0, 2.9], 1, 1.275, 1, 0.066, [4, 5, 10, 10],
["\A3\Data_F\ParticleEffects\Universal\Universal", 16, 9, 1], "", "Billboard",
[[0.1, 0.1, 0.1, 0.75], [0.4, 0.4, 0.4, 0.5], [1, 1, 1, 0.2]],
1, 15, [0, 0, 0.5], [0, 0, 2.9], 1, 1.275, 1, 0.066, [4, 5, 10, 10],
[0], 1, 0, "", "", _ps2];
[[0.1, 0.1, 0.1, 0.75], [0.4, 0.4, 0.4, 0.5], [1, 1, 1, 0.2]],
_ps2 [[setParticleRandom]] [0, [0, 0, 0], [0.5, 0.5, 0], 0, 0.25, [0.05, 0.05, 0.05, 0.05], 0, 0];
[0], 1, 0, "", "", _ps2];
_ps2 [[setDropInterval]] 0.25;
_ps2 setParticleRandom [0, [0, 0, 0], [0.5, 0.5, 0], 0, 0.25, [0.05, 0.05, 0.05, 0.05], 0, 0];
_ps2 setDropInterval 0.25;
</sqf>


=== Fire ===
=== Fire ===


[[Image:PE_fire.jpg|thumb|left|100px|Fire]]
[[File:PE_fire.jpg|thumb|left|100px|Fire]]
[[private]] _posATL = [[player]] [[modelToWorld]] [0,10,0];
<sqf>
private _posATL = player modelToWorld [0,10,0];
{{cc|Fire}}
 
[[private]] _ps1 = "#particlesource" [[createVehicleLocal]] _posATL;
// Fire
_ps1 [[setParticleParams]] [
private _ps1 = "#particlesource" createVehicleLocal _posATL;
["\A3\Data_F\ParticleEffects\Universal\Universal", 16, 10, 32], "", "Billboard",
_ps1 setParticleParams [
1, 1, [0, 0, 0], [0, 0, 0.5], 0, 1, 1, 3, [0.5,1.5],
["\A3\Data_F\ParticleEffects\Universal\Universal", 16, 10, 32], "", "Billboard",
[[1,1,1,0.4], [1,1,1,0.2], [1,1,1,0]],
1, 1, [0, 0, 0], [0, 0, 0.5], 0, 1, 1, 3, [0.5,1.5],
[0.25,1], 1, 1, "", "", _ps1];
[[1,1,1,0.4], [1,1,1,0.2], [1,1,1,0]],
_ps1 [[[[setParticleRandom]]]] [0.2, [0.5, 0.5, 0.25], [0.125, 0.125, 0.125], 0.2, 0.2, [0, 0, 0, 0], 0, 0];
[0.25,1], 1, 1, "", "", _ps1];
_ps1 setDropInterval 0.05;
_ps1 setParticleRandom [0.2, [0.5, 0.5, 0.25], [0.125, 0.125, 0.125], 0.2, 0.2, [0, 0, 0, 0], 0, 0];
_ps1 setDropInterval 0.05;
{{cc|Smoke}}
 
[[private]] _ps2 = "#particlesource" [[createVehicleLocal]] _posATL;
// Smoke
_ps2 [[setParticleParams]] [
private _ps2 = "#particlesource" createVehicleLocal _posATL;
["\A3\Data_F\ParticleEffects\Universal\Universal", 16, 7, 1, 1], "", "Billboard",
_ps2 setParticleParams [
1, 5, [0, 0, 1], [0, 0, 1.5], 0, 1, 1, 0.5, [1.75,2,3,4.5], // timerPeriod → size
["\A3\Data_F\ParticleEffects\Universal\Universal", 16, 7, 1, 1], "", "Billboard",
[[1,1,1,0], [1,1,1,0.5], [1,1,1,0.4], [1,1,1,0.2], [1,1,1,0]],
1, 5, [0, 0, 1], [0, 0, 1.5], 0, 1, 1, 0.5, [1.75,2,3,4.5], // timerPeriod → size
[0.5,0.5], 0, 0, "", "", _ps2];
[[1,1,1,0], [1,1,1,0.5], [1,1,1,0.4], [1,1,1,0.2], [1,1,1,0]],
_ps2 [[setParticleRandom]] [0.5, [1, 1, 0.4], [0, 0, 0.5], 0, 0.125, [0, 0, 0, 0], rad 30, 0];
[0.5,0.5], 0, 0, "", "", _ps2];
_ps2 [[setDropInterval]] 0.1;
_ps2 setParticleRandom [0.5, [1, 1, 0.4], [0, 0, 0.5], 0, 0.125, [0, 0, 0, 0], rad 30, 0];
_ps2 setDropInterval 0.1;
</sqf>


=== Floating Orb ===
=== Floating Orb ===


[[Image:PE_FloatingOrb.jpg|thumb|left|100px|Floating Orb]]
[[File:PE_FloatingOrb.jpg|thumb|left|100px|Floating Orb]]
[[private]] _posATL = [[player]] [[modelToWorld]] [0,10,0];
<sqf>
private _posATL = player modelToWorld [0,10,0];
[[private]] _ps1 = "#particlesource" [[createVehicleLocal]] _posATL;
 
_ps1 [[setParticleParams]] [
private _ps1 = "#particlesource" createVehicleLocal _posATL;
["\A3\Data_F\ParticleEffects\Universal\Universal", 16, 12, 16, 0], "", "Billboard",
_ps1 setParticleParams [
1, 3.0141, [0, 0, 2], [0, 0, 0], 1, 1.275, 1, 0, [4],
["\A3\Data_F\ParticleEffects\Universal\Universal", 16, 12, 16, 0], "", "Billboard",
[<nowiki/>[1, 1, 1, 1]],
1, 3.0141, [0, 0, 2], [0, 0, 0], 1, 1.275, 1, 0, [4],
[1000], 1, 0, "", "", _ps1];
[[1, 1, 1, 1]],
_ps1 [[setDropInterval]] 3;
[1000], 1, 0, "", "", _ps1];
_ps1 setDropInterval 3;
</sqf>


=== Heavy Oily Smoke (Small) ===
=== Heavy Oily Smoke (Small) ===


[[Image:PE_HeavyOilySmokeSmall.jpg|thumb|left|100px|Heavy Oily Smoke (Small)]]
[[File:PE_HeavyOilySmokeSmall.jpg|thumb|left|100px|Heavy Oily Smoke (Small)]]
[[private]] _posATL = [[player]] [[modelToWorld]] [0,10,0];
<sqf>
private _posATL = player modelToWorld [0,10,0];
[[private]] _ps1 = "#particlesource" [[createVehicleLocal]] _posATL;
 
_ps1 [[setParticleParams]] [
private _ps1 = "#particlesource" createVehicleLocal _posATL;
["\A3\Data_F\ParticleEffects\Universal\Universal", 16, 7, 16, 1], "", "Billboard",
_ps1 setParticleParams [
1, 8, [0, 0, 0], [0, 0, 1.5], 0, 10, 7.9, 0.066, [1, 3, 6],
["\A3\Data_F\ParticleEffects\Universal\Universal", 16, 7, 16, 1], "", "Billboard",
[[0, 0, 0, 0], [0.05, 0.05, 0.05, 1], [0.05, 0.05, 0.05, 1], [0.05, 0.05, 0.05, 1], [0.1, 0.1, 0.1, 0.5], [0.125, 0.125, 0.125, 0]],
1, 8, [0, 0, 0], [0, 0, 1.5], 0, 10, 7.9, 0.066, [1, 3, 6],
[0.25], 1, 0, "", "", _ps1];
[[0, 0, 0, 0], [0.05, 0.05, 0.05, 1], [0.05, 0.05, 0.05, 1], [0.05, 0.05, 0.05, 1], [0.1, 0.1, 0.1, 0.5], [0.125, 0.125, 0.125, 0]],
_ps1 [[setParticleRandom]] [0, [0.25, 0.25, 0], [0.2, 0.2, 0], 0, 0.25, [0, 0, 0, 0.1], 0, 0];
[0.25], 1, 0, "", "", _ps1];
_ps1 [[setDropInterval]] 0.05;
_ps1 setParticleRandom [0, [0.25, 0.25, 0], [0.2, 0.2, 0], 0, 0.25, [0, 0, 0, 0.1], 0, 0];
_ps1 setDropInterval 0.05;
</sqf>


{{Clear}}
{{Clear}}
=== Heavy Oily Smoke (Medium) ===
=== Heavy Oily Smoke (Medium) ===


[[Image:PE_HeavyOilySmokeMedium.jpg|thumb|left|100px|Heavy Oily Smoke (Medium)]]
[[File:PE_HeavyOilySmokeMedium.jpg|thumb|left|100px|Heavy Oily Smoke (Medium)]]
[[private]] _posATL = [[player]] [[modelToWorld]] [0,10,0];
<sqf>
private _posATL = player modelToWorld [0,10,0];
[[private]] _ps1 = "#particlesource" [[createVehicleLocal]] _posATL;
 
_ps1 [[setParticleParams]] [
private _ps1 = "#particlesource" createVehicleLocal _posATL;
["\A3\Data_F\ParticleEffects\Universal\Universal", 16, 7, 16, 1], "", "Billboard",
_ps1 setParticleParams [
1, 8, [0, 0, 0], [0, 0, 2.5], 0, 10, 7.9, 0.066, [2, 6, 12],
["\A3\Data_F\ParticleEffects\Universal\Universal", 16, 7, 16, 1], "", "Billboard",
[[0, 0, 0, 0], [0.05, 0.05, 0.05, 1], [0.05, 0.05, 0.05, 1], [0.05, 0.05, 0.05, 1], [0.1, 0.1, 0.1, 0.5], [0.125, 0.125, 0.125, 0]],
1, 8, [0, 0, 0], [0, 0, 2.5], 0, 10, 7.9, 0.066, [2, 6, 12],
[0.25], 1, 0, "", "", _ps1];
[[0, 0, 0, 0], [0.05, 0.05, 0.05, 1], [0.05, 0.05, 0.05, 1], [0.05, 0.05, 0.05, 1], [0.1, 0.1, 0.1, 0.5], [0.125, 0.125, 0.125, 0]],
_ps1 [[setParticleRandom]] [0, [0.25, 0.25, 0], [0.2, 0.2, 0], 0, 0.25, [0, 0, 0, 0.1], 0, 0];
[0.25], 1, 0, "", "", _ps1];
_ps1 [[setDropInterval]] 0.1;
_ps1 setParticleRandom [0, [0.25, 0.25, 0], [0.2, 0.2, 0], 0, 0.25, [0, 0, 0, 0.1], 0, 0];
_ps1 setDropInterval 0.1;
</sqf>


{{Clear}}
{{Clear}}
=== Heavy Oily Smoke (Large) ===
=== Heavy Oily Smoke (Large) ===


[[Image:PE_HeavyOilySmokeLarge.jpg|thumb|left|100px|Heavy Oily Smoke (Large)]]
[[File:PE_HeavyOilySmokeLarge.jpg|thumb|left|100px|Heavy Oily Smoke (Large)]]
[[private]] _posATL = [[player]] [[modelToWorld]] [0,10,0];
<sqf>
private _posATL = player modelToWorld [0,10,0];
[[private]] _ps1 = "#particlesource" [[createVehicleLocal]] _posATL;
 
_ps1 [[setParticleParams]] [
private _ps1 = "#particlesource" createVehicleLocal _posATL;
["\A3\Data_F\ParticleEffects\Universal\Universal", 16, 7, 16, 1], "", "Billboard",
_ps1 setParticleParams [
1, 8, [0, 0, 0], [0, 0, 2.5], 0, 10, 7.9, 0.066, [4, 12, 20],
["\A3\Data_F\ParticleEffects\Universal\Universal", 16, 7, 16, 1], "", "Billboard",
[[0, 0, 0, 0], [0.05, 0.05, 0.05, 1], [0.05, 0.05, 0.05, 1], [0.05, 0.05, 0.05, 1], [0.1, 0.1, 0.1, 0.5], [0.125, 0.125, 0.125, 0]],
1, 8, [0, 0, 0], [0, 0, 2.5], 0, 10, 7.9, 0.066, [4, 12, 20],
[0.25], 1, 0, "", "", _ps1];
[[0, 0, 0, 0], [0.05, 0.05, 0.05, 1], [0.05, 0.05, 0.05, 1], [0.05, 0.05, 0.05, 1], [0.1, 0.1, 0.1, 0.5], [0.125, 0.125, 0.125, 0]],
_ps1 [[setParticleRandom]] [0, [0.25, 0.25, 0], [0.2, 0.2, 0], 0, 0.25, [0, 0, 0, 0.1], 0, 0];
[0.25], 1, 0, "", "", _ps1];
_ps1 [[setDropInterval]] 0.2;
_ps1 setParticleRandom [0, [0.25, 0.25, 0], [0.2, 0.2, 0], 0, 0.25, [0, 0, 0, 0.1], 0, 0];
_ps1 setDropInterval 0.2;
</sqf>


{{Clear}}
{{Clear}}
=== Light Wood Smoke (Small) ===
=== Light Wood Smoke (Small) ===


[[Image:PE_LightWoodSmokeSmall.jpg|thumb|left|100px|Light Wood Smoke (Small)]]
[[File:PE_LightWoodSmokeSmall.jpg|thumb|left|100px|Light Wood Smoke (Small)]]
[[private]] _posATL = [[player]] [[modelToWorld]] [0,10,0];
<sqf>
private _posATL = player modelToWorld [0,10,0];
[[private]] _ps1 = "#particlesource" [[createVehicleLocal]] _posATL;
 
_ps1 [[setParticleParams]] [
private _ps1 = "#particlesource" createVehicleLocal _posATL;
["\A3\Data_F\ParticleEffects\Universal\Universal", 16, 9, 16, 0], "", "Billboard",
_ps1 setParticleParams [
1, 8, [0, 0, 0], [0, 0, 1.5], 0, 10, 7.9, 0.066, [1, 3, 6],
["\A3\Data_F\ParticleEffects\Universal\Universal", 16, 9, 16, 0], "", "Billboard",
[[0.5, 0.5, 0.5, 0], [0.5, 0.5, 0.5, 0.15], [0.5, 0.5, 0.5, 0.15], [0.5, 0.5, 0.5, 0.1], [0.75, 0.75, 0.75, 0.075], [1, 1, 1, 0]],
1, 8, [0, 0, 0], [0, 0, 1.5], 0, 10, 7.9, 0.066, [1, 3, 6],
[0.25], 1, 0, "", "", _ps1];
[[0.5, 0.5, 0.5, 0], [0.5, 0.5, 0.5, 0.15], [0.5, 0.5, 0.5, 0.15], [0.5, 0.5, 0.5, 0.1], [0.75, 0.75, 0.75, 0.075], [1, 1, 1, 0]],
_ps1 [[setParticleRandom]] [0, [0.25, 0.25, 0], [0.2, 0.2, 0], 0, 0.25, [0, 0, 0, 0.1], 0, 0];
[0.25], 1, 0, "", "", _ps1];
_ps1 [[setDropInterval]] 0.05;
_ps1 setParticleRandom [0, [0.25, 0.25, 0], [0.2, 0.2, 0], 0, 0.25, [0, 0, 0, 0.1], 0, 0];
_ps1 setDropInterval 0.05;
</sqf>


{{Clear}}
{{Clear}}
=== Light Wood Smoke (Medium) ===
=== Light Wood Smoke (Medium) ===


[[Image:PE_LightWoodSmokeMedium.jpg|thumb|left|100px|Light Wood Smoke (Medium)]]
[[File:PE_LightWoodSmokeMedium.jpg|thumb|left|100px|Light Wood Smoke (Medium)]]
[[private]] _posATL = [[player]] [[modelToWorld]] [0,10,0];
<sqf>
private _posATL = player modelToWorld [0,10,0];
[[private]] _ps1 = "#particlesource" [[createVehicleLocal]] _posATL;
 
_ps1 [[setParticleParams]] [
private _ps1 = "#particlesource" createVehicleLocal _posATL;
["\A3\Data_F\ParticleEffects\Universal\Universal", 16, 9, 16, 0], "", "Billboard",
_ps1 setParticleParams [
1, 8, [0, 0, 0], [0, 0, 1.5], 0, 10, 7.9, 0.066, [2, 6, 12],
["\A3\Data_F\ParticleEffects\Universal\Universal", 16, 9, 16, 0], "", "Billboard",
[[0.5, 0.5, 0.5, 0], [0.5, 0.5, 0.5, 0.3], [0.5, 0.5, 0.5, 0.2], [0.5, 0.5, 0.5, 0.1], [0.75, 0.75, 0.75, 0.075], [1, 1, 1, 0]],
1, 8, [0, 0, 0], [0, 0, 1.5], 0, 10, 7.9, 0.066, [2, 6, 12],
[0.25], 1, 0, "", "", _ps1];
[[0.5, 0.5, 0.5, 0], [0.5, 0.5, 0.5, 0.3], [0.5, 0.5, 0.5, 0.2], [0.5, 0.5, 0.5, 0.1], [0.75, 0.75, 0.75, 0.075], [1, 1, 1, 0]],
_ps1 [[setParticleRandom]] [0, [0.25, 0.25, 0], [0.2, 0.2, 0], 0, 0.25, [0, 0, 0, 0.1], 0, 0];
[0.25], 1, 0, "", "", _ps1];
_ps1 [[setDropInterval]] 0.1;
_ps1 setParticleRandom [0, [0.25, 0.25, 0], [0.2, 0.2, 0], 0, 0.25, [0, 0, 0, 0.1], 0, 0];
_ps1 setDropInterval 0.1;
</sqf>


{{Clear}}
{{Clear}}
=== Light Wood Smoke (Large) ===
=== Light Wood Smoke (Large) ===


[[Image:PE_LightWoodSmokeLarge.jpg|thumb|left|100px|Light Wood Smoke (Large)]]
[[File:PE_LightWoodSmokeLarge.jpg|thumb|left|100px|Light Wood Smoke (Large)]]
[[private]] _posATL = [[player]] [[modelToWorld]] [0,10,0];
<sqf>
private _posATL = player modelToWorld [0,10,0];
[[private]] _ps1 = "#particlesource" [[createVehicleLocal]] _posATL;
 
_ps1 [[setParticleParams]] [
private _ps1 = "#particlesource" createVehicleLocal _posATL;
["\A3\Data_F\ParticleEffects\Universal\Universal", 16, 9, 16, 0], "", "Billboard",
_ps1 setParticleParams [
1, 8, [0, 0, 0], [0, 0, 4.5], 0, 10, 7.9, 0.5, [4, 12, 20],
["\A3\Data_F\ParticleEffects\Universal\Universal", 16, 9, 16, 0], "", "Billboard",
[[0.5, 0.5, 0.5, 0], [0.5, 0.5, 0.5, 0.5], [0.66, 0.66, 0.66, 0.33], [0.75, 0.75, 0.75, 0.25], [1, 1, 1, 0]],
1, 8, [0, 0, 0], [0, 0, 4.5], 0, 10, 7.9, 0.5, [4, 12, 20],
[0.25], 1, 0, "", "", _ps1];
[[0.5, 0.5, 0.5, 0], [0.5, 0.5, 0.5, 0.5], [0.66, 0.66, 0.66, 0.33], [0.75, 0.75, 0.75, 0.25], [1, 1, 1, 0]],
_ps1 [[setParticleRandom]] [0, [0.5, 0.5, 0], [0.2, 0.2, 0], 0, 0.25, [0, 0, 0, 0.1], 0, 0];
[0.25], 1, 0, "", "", _ps1];
_ps1 [[setDropInterval]] 0.2;
_ps1 setParticleRandom [0, [0.5, 0.5, 0], [0.2, 0.2, 0], 0, 0.25, [0, 0, 0, 0.1], 0, 0];
_ps1 setDropInterval 0.2;
</sqf>


{{Clear}}
{{Clear}}
=== Mixed Smoke (Small) ===
=== Mixed Smoke (Small) ===


[[Image:PE_MixedSmokeSmall.jpg|thumb|left|100px|Mixed Smoke (Small)]]
[[File:PE_MixedSmokeSmall.jpg|thumb|left|100px|Mixed Smoke (Small)]]
[[private]] _posATL = [[player]] [[modelToWorld]] [0,10,0];
<sqf>
private _posATL = player modelToWorld [0,10,0];
[[private]] _ps1 = "#particlesource" [[createVehicleLocal]] _posATL;
 
_ps1 [[setParticleParams]] [
private _ps1 = "#particlesource" createVehicleLocal _posATL;
["\A3\Data_F\ParticleEffects\Universal\Universal", 16, 7, 16, 1], "", "Billboard",
_ps1 setParticleParams [
1, 8, [0, 0, 0], [0, 0, 1.5], 0, 10, 7.9, 0.066, [1, 3, 6],
["\A3\Data_F\ParticleEffects\Universal\Universal", 16, 7, 16, 1], "", "Billboard",
[[0.2, 0.2, 0.2, 0], [0.2, 0.2, 0.2, 0.45], [0.2, 0.2, 0.2, 0.45], [0.35, 0.35, 0.35, 0.225], [0.5, 0.5, 0.5, 0]],
1, 8, [0, 0, 0], [0, 0, 1.5], 0, 10, 7.9, 0.066, [1, 3, 6],
[0.25], 1, 0, "", "", _ps1];
[[0.2, 0.2, 0.2, 0], [0.2, 0.2, 0.2, 0.45], [0.2, 0.2, 0.2, 0.45], [0.35, 0.35, 0.35, 0.225], [0.5, 0.5, 0.5, 0]],
_ps1 [[setParticleRandom]] [0, [0.25, 0.25, 0], [0.2, 0.2, 0], 0, 0.25, [0, 0, 0, 0.1], 0, 0];
[0.25], 1, 0, "", "", _ps1];
_ps1 [[setDropInterval]] 0.1;
_ps1 setParticleRandom [0, [0.25, 0.25, 0], [0.2, 0.2, 0], 0, 0.25, [0, 0, 0, 0.1], 0, 0];
_ps1 setDropInterval 0.1;
[[private]] _ps2 = "#particlesource" createVehicleLocal _posATL;
 
_ps2 [[setParticleParams]] [
private _ps2 = "#particlesource" createVehicleLocal _posATL;
["\A3\Data_F\ParticleEffects\Universal\Universal", 16, 9, 16, 0], "", "Billboard",
_ps2 setParticleParams [
1, 8, [0, 0, 0], [0, 0, 1.5], 0, 10, 7.9, 0.066, [1, 3, 6],
["\A3\Data_F\ParticleEffects\Universal\Universal", 16, 9, 16, 0], "", "Billboard",
[[0.33, 0.33, 0.33, 0], [0.33, 0.33, 0.33, 0.8], [0.33, 0.33, 0.33, 0.8], [0.66, 0.66, 0.66, 0.4], [1, 1, 1, 0]],
1, 8, [0, 0, 0], [0, 0, 1.5], 0, 10, 7.9, 0.066, [1, 3, 6],
[0.25], 1, 0, "", "", _ps2];
[[0.33, 0.33, 0.33, 0], [0.33, 0.33, 0.33, 0.8], [0.33, 0.33, 0.33, 0.8], [0.66, 0.66, 0.66, 0.4], [1, 1, 1, 0]],
_ps2 [[setParticleRandom]] [0, [0.25, 0.25, 0], [0.2, 0.2, 0], 0, 0.25, [0, 0, 0, 0.1], 0, 0];
[0.25], 1, 0, "", "", _ps2];
_ps2 [[setDropInterval]] 0.1;
_ps2 setParticleRandom [0, [0.25, 0.25, 0], [0.2, 0.2, 0], 0, 0.25, [0, 0, 0, 0.1], 0, 0];
_ps2 setDropInterval 0.1;
</sqf>


{{Clear}}
{{Clear}}
=== Mixed Smoke (Medium) ===
=== Mixed Smoke (Medium) ===


[[Image:PE_MixedSmokeMedium.jpg|thumb|left|100px|Mixed Smoke (Medium)]]
[[File:PE_MixedSmokeMedium.jpg|thumb|left|100px|Mixed Smoke (Medium)]]
[[private]] _posATL = [[player]] [[modelToWorld]] [0,10,0];
<sqf>
private _posATL = player modelToWorld [0,10,0];
[[private]] _ps1 = "#particlesource" [[createVehicleLocal]] _posATL;
 
_ps1 [[setParticleParams]] [
private _ps1 = "#particlesource" createVehicleLocal _posATL;
["\A3\Data_F\ParticleEffects\Universal\Universal", 16, 7, 16, 1], "", "Billboard",
_ps1 setParticleParams [
1, 8, [0, 0, 0], [0, 0, 2.5], 0, 10, 7.9, 0.066, [2, 6, 12],
["\A3\Data_F\ParticleEffects\Universal\Universal", 16, 7, 16, 1], "", "Billboard",
[[0.2, 0.2, 0.2, 0], [0.2, 0.2, 0.2, 0.3], [0.2, 0.2, 0.2, 0.3], [0.35, 0.35, 0.35, 0.2], [0.5, 0.5, 0.5, 0]],
1, 8, [0, 0, 0], [0, 0, 2.5], 0, 10, 7.9, 0.066, [2, 6, 12],
[0.25], 1, 0, "", "", _ps1];
[[0.2, 0.2, 0.2, 0], [0.2, 0.2, 0.2, 0.3], [0.2, 0.2, 0.2, 0.3], [0.35, 0.35, 0.35, 0.2], [0.5, 0.5, 0.5, 0]],
_ps1 [[setParticleRandom]] [0, [0.25, 0.25, 0], [0.2, 0.2, 0], 0, 0.25, [0, 0, 0, 0.1], 0, 0];
[0.25], 1, 0, "", "", _ps1];
_ps1 [[setDropInterval]] 0.2;
_ps1 setParticleRandom [0, [0.25, 0.25, 0], [0.2, 0.2, 0], 0, 0.25, [0, 0, 0, 0.1], 0, 0];
_ps1 setDropInterval 0.2;
[[private]] _ps2 = "#particlesource" [[createVehicleLocal]] _posATL;
 
_ps2 [[setParticleParams]] [
private _ps2 = "#particlesource" createVehicleLocal _posATL;
["\A3\Data_F\ParticleEffects\Universal\Universal", 16, 9, 16, 0], "", "Billboard",
_ps2 setParticleParams [
1, 8, [0, 0, 0], [0, 0, 2.5], 0, 10, 7.9, 0.066, [2, 6, 12],
["\A3\Data_F\ParticleEffects\Universal\Universal", 16, 9, 16, 0], "", "Billboard",
[[0.33, 0.33, 0.33, 0], [0.33, 0.33, 0.33, 0.8], [0.33, 0.33, 0.33, 0.8], [0.66, 0.66, 0.66, 0.4], [1, 1, 1, 0]],
1, 8, [0, 0, 0], [0, 0, 2.5], 0, 10, 7.9, 0.066, [2, 6, 12],
[0.25], 1, 0, "", "", _ps2];
[[0.33, 0.33, 0.33, 0], [0.33, 0.33, 0.33, 0.8], [0.33, 0.33, 0.33, 0.8], [0.66, 0.66, 0.66, 0.4], [1, 1, 1, 0]],
_ps2 [[setParticleRandom]] [0, [0.25, 0.25, 0], [0.2, 0.2, 0], 0, 0.25, [0, 0, 0, 0.1], 0, 0];
[0.25], 1, 0, "", "", _ps2];
_ps2 [[setDropInterval]] 0.2;
_ps2 setParticleRandom [0, [0.25, 0.25, 0], [0.2, 0.2, 0], 0, 0.25, [0, 0, 0, 0.1], 0, 0];
_ps2 setDropInterval 0.2;
</sqf>


{{Clear}}
{{Clear}}
=== Mixed Smoke (Large) ===
=== Mixed Smoke (Large) ===


[[Image:PE_MixedSmokeLarge.jpg|thumb|left|100px|Mixed Smoke (Large)]]
[[File:PE_MixedSmokeLarge.jpg|thumb|left|100px|Mixed Smoke (Large)]]
[[private]] _posATL = [[player]] [[modelToWorld]] [0,10,0];
<sqf>
private _posATL = player modelToWorld [0,10,0];
[[private]] _ps1 = "#particlesource" [[createVehicleLocal]] _posATL;
 
_ps1 [[setParticleParams]] [
private _ps1 = "#particlesource" createVehicleLocal _posATL;
["\A3\Data_F\ParticleEffects\Universal\Universal", 16, 7, 16, 1], "", "Billboard",
_ps1 setParticleParams [
1, 8, [0, 0, 0], [0, 0, 4.5], 0, 10, 7.9, 0.5, [4, 12, 20],
["\A3\Data_F\ParticleEffects\Universal\Universal", 16, 7, 16, 1], "", "Billboard",
[[0.2, 0.2, 0.2, 0], [0.2, 0.2, 0.2, 0.3], [0.2, 0.2, 0.2, 0.3], [0.35, 0.35, 0.35, 0.2], [0.5, 0.5, 0.5, 0]],
1, 8, [0, 0, 0], [0, 0, 4.5], 0, 10, 7.9, 0.5, [4, 12, 20],
[0.25], 1, 0, "", "", _ps1];
[[0.2, 0.2, 0.2, 0], [0.2, 0.2, 0.2, 0.3], [0.2, 0.2, 0.2, 0.3], [0.35, 0.35, 0.35, 0.2], [0.5, 0.5, 0.5, 0]],
_ps1 [[setParticleRandom]] [0, [0.4, 0.4, 0], [0.4, 0.4, 0], 0, 0.25, [0, 0, 0, 0.1], 0, 0];
[0.25], 1, 0, "", "", _ps1];
_ps1 [[setDropInterval]] 0.2;
_ps1 setParticleRandom [0, [0.4, 0.4, 0], [0.4, 0.4, 0], 0, 0.25, [0, 0, 0, 0.1], 0, 0];
_ps1 setDropInterval 0.2;
[[private]] _ps2 = "#particlesource" [[createVehicleLocal]] _posATL;
 
_ps2 [[setParticleParams]] [
private _ps2 = "#particlesource" createVehicleLocal _posATL;
["\A3\Data_F\ParticleEffects\Universal\Universal", 16, 9, 16, 0], "", "Billboard",
_ps2 setParticleParams [
1, 8, [0, 0, 0], [0, 0, 4.5], 0, 10, 7.9, 0.5, [4, 12, 20],
["\A3\Data_F\ParticleEffects\Universal\Universal", 16, 9, 16, 0], "", "Billboard",
[[0.33, 0.33, 0.33, 0], [0.33, 0.33, 0.33, 0.8], [0.33, 0.33, 0.33, 0.8], [0.66, 0.66, 0.66, 0.4], [1, 1, 1, 0]],
1, 8, [0, 0, 0], [0, 0, 4.5], 0, 10, 7.9, 0.5, [4, 12, 20],
[0.25], 1, 0, "", "", _ps2];
[[0.33, 0.33, 0.33, 0], [0.33, 0.33, 0.33, 0.8], [0.33, 0.33, 0.33, 0.8], [0.66, 0.66, 0.66, 0.4], [1, 1, 1, 0]],
_ps2 [[setParticleRandom]] [0, [0.4, 0.4, 0], [0.4, 0.4, 0], 0, 0.25, [0, 0, 0, 0.1], 0, 0];
[0.25], 1, 0, "", "", _ps2];
_ps2 [[setDropInterval]] 0.2;
_ps2 setParticleRandom [0, [0.4, 0.4, 0], [0.4, 0.4, 0], 0, 0.25, [0, 0, 0, 0.1], 0, 0];
_ps2 setDropInterval 0.2;
</sqf>


{{Clear}}
{{Clear}}
=== Rock Shower ===
=== Rock Shower ===


[[Image:PE_RockShower.jpg|thumb|left|100px|Rock Shower]]
[[File:PE_RockShower.jpg|thumb|left|100px|Rock Shower]]
[[private]] _posATL = [[player]] [[modelToWorld]] [0,10,0];
<sqf>
private _posATL = player modelToWorld [0,10,0];
[[private]] _ps1 = "#particlesource" [[createVehicleLocal]] _posATL;
 
_ps1 [[setParticleParams]] [
private _ps1 = "#particlesource" createVehicleLocal _posATL;
"\A3\Data_F\ParticleEffects\Pstone\Pstone", "", "SpaceObject",
_ps1 setParticleParams [
1, 10, [0, 0, 30], [0, 0, -2], 1, 10, 1, 0.2, [2, 2],
"\A3\Data_F\ParticleEffects\Pstone\Pstone", "", "SpaceObject",
[<nowiki/>[1, 1, 1 ,1]],
1, 10, [0, 0, 30], [0, 0, -2], 1, 10, 1, 0.2, [2, 2],
[0, 1], 1, 0, "", "", _ps1];
[[1, 1, 1 ,1]],
_ps1 [[setParticleRandom]] [0, [10, 10, 0], [0.25, 0.25, 0], 0, 1.5, [0, 0, 0, 0], 0, 0];
[0, 1], 1, 0, "", "", _ps1];
_ps1 [[setDropInterval]] 0.04;
_ps1 setParticleRandom [0, [10, 10, 0], [0.25, 0.25, 0], 0, 1.5, [0, 0, 0, 0], 0, 0];
_ps1 setDropInterval 0.04;
</sqf>




{{Clear}}
{{Clear}}
== See also ==
== See Also ==


* [[:Category:Particle System]]
* {{Link|Category:Particle System|Particle System category}}
* [[ParticleArray]] - particle array format
* [[ParticleArray]] - particle array format




[[Category:Scripting Topics]]
[[Category:Arma Scripting Tutorials]]
[[Category:Particle System]]
[[Category:{{ofp}}: Editing]]
[[Category:ArmA: Editing]]
{{GameCategory|arma2|Editing}}
{{GameCategory|arma3|Editing}}
[[Category:{{ofp}}: Tutorials]]
[[Category:ArmA: Tutorials]]
{{GameCategory|arma2|Tutorials}}
{{GameCategory|arma3|Tutorials}}

Latest revision as of 14:52, 16 October 2024

A particle is a (to some extent, non-physical) 2D plane that always faces the camera, or (more rarely) a 3D model. It can be used to simulate ambient effects, such as dust, fire, water splash, wood splinters and even rock debris.

A particle source is a non-physical object that creates particles at a certain rate and position/velocity.

A particle (as well as a particle source) is local to the computer where the script has been called; one player could see smoke while another could see through without any issue.

Particles exist since Operation Flashpoint, but the first related command (drop) was only introduced in Operation Flashpoint: Resistance.
Particle source notions and commands were introduced in ArmA: Armed Assault, some commands were later added in Arma 3 (e.g setParticleFire, setParticleClass).


How To

Create a Particle Source

private _particleSource = "#particlesource" createVehicleLocal ASLToAGL getPosASL player;

A particle source is local (and all the particle commands take a local argument too), hence createVehicleLocal usage.

Set Source Class

_particleSource setParticleClass "ObjectDestructionFire1Smallx"; // defined in configFile >> "CfgCloudlets"

Particle source class must be defined in game config and cannot be declared in missionConfigFile or campaignConfigFile. See Arma 3: Particle Effects for more information.

Set Source Parameters

See ParticleArray for details on the array format.

_particleSource setParticleParams [ ["\A3\data_f\ParticleEffects\Universal\Universal", 16, 12, 0, 8], "", "Billboard", 1, 3, // animationName, type, timerPeriod, lifeTime [0,1.5,0], // position relative to referenceObject [0,0,0], // velocity 0, 0.005, 0.003925, 0.1, [0.25, 0.75], // rotation, weight, volume, rubbing, size [[1,0,0,0.5], [0,1,0,1], [0,0,01,0.25]], // colors [1], // animationPhase 0, 0, // randomDirectionPeriod, randomDirectionIntensity "", "", // onTimer, beforeDestroy player, // referenceObject 0, false, // angle, bounces -1, [], // bounceOnSurface, emissiveColor [0,1,0] // vectorDir - CANNOT be [0,0,0] ];

Set Source Drop Interval

_particleSource setDropInterval 0.0625; // duration between drops

Set Source Drop Circle

_particleSource setParticleCircle [3, [0,1,0]]; // [circle radius, velocity]

Set Source Random Values

/* lifeTime, position, moveVelocity, rotationVelocity, size, color, directionPeriod, directionIntensity, angle, bounceOnSurface */ _particleSource setParticleRandom [0, [0.1, 0.1, 0.1], [0, 0, 0.5], 0, 0.1, [0, 0, 0, 0], 0, 0];

Set Source Fire Properties

_particleSource setParticleFire [0.1, 0.5, 2]; // [coreIntensity, coreDistance, damageTime]

Delete Source

deleteVehicle _particleSource; // as simple as that

Use the drop Command

The drop command only drops one particle. If multiple ones are needed, a loop (for, while) must be used.

See ParticleArray for details on the array format.

drop [ ["\A3\data_f\ParticleEffects\Universal\Universal", 16, 12, 0, 8], "", "Billboard", 1, 3, // animationName, type, timerPeriod, lifeTime [0,1.5,0], // position relative to referenceObject [0,0,0], // velocity 0, 0.005, 0.003925, 0.1, [0.25, 0.75], // rotation, weight, volume, rubbing, size [[1,0,0,0.5], [0,1,0,1], [0,0,01,0.25]], // colors [1], // animationPhase 0, 0, // randomDirectionPeriod, randomDirectionIntensity "", "", // onTimer, beforeDestroy player // referenceObject ];


Design Workflow

In order to determine one particle behaviour, a simple drop usage in the Debug Console can do; but seeing the complete end result can be another task at hand.

Using a Script

One way to design your effect is to have an SQF file, named e.g "particles.sqf", filled with your code:

{ deleteVehicle _x } forEach allMissionObjects "#particlesource"; private _posATL = player modelToWorld [0,10,0]; ps1 = "#particlesource" createVehicleLocal _posATL; ps1 setParticleParams [/* ... */]; ps1 setDropInterval 0.2; ps2 = "#particlesource" createVehicleLocal _posATL; ps2 setParticleParams [/* ... */]; ps2 setDropInterval 0.2;

and run with

execVM "particles.sqf";

This format deletes all previous effects and still allows you to use the Debug Console in order to adjust particle source settings thanks to the usage of global variables (here, ps1 and ps2).

Using a Mod

Emitter 3Ditor (a real-time WYSIWYG particle source editor) adds and uses particle and light emitters in your scenarios without any scripting nor mod dependency.
Steam page - Forums post


Examples

The following examples are for Arma 2 and later titles. For Armed Assault examples, see ParticleTemplates.
For games other than Arma 3:
  • remove private usage
  • replace \A3\Data_F\ with:
Logo A2.png1.00 \Ca\Data\
A2 OA Logo.png1.50 \Ca\Ca_e\Data\
tkoh logo small.png1.00 \hsim\Data_h\Data\

Burning Vehicle Fire Look-Alike

Burning vehicle fire look-alike

private _posATL = player modelToWorld [0,10,0]; // Fire private _ps0 = "#particlesource" createVehicleLocal _posATL; _ps0 setParticleParams [ ["\A3\Data_F\ParticleEffects\Universal\Universal", 16, 10, 32], "", "Billboard", 0, 1, [0, 0, 0.25], [0, 0, 0.5], 1, 1, 0.9, 0.3, [1.5], [[1,1,1, 0.0], [1,1,1, 0.3], [1,1,1, 0.0]], [0.75], 0, 0, "", "", _ps0, rad -45]; _ps0 setParticleRandom [0.2, [1, 1, 0], [0.5, 0.5, 0], 0, 0.5, [0, 0, 0, 0], 0, 0]; _ps0 setDropInterval 0.03; // Smoke part 1 private _ps1 = "#particlesource" createVehicleLocal _posATL; _ps1 setParticleParams [ ["\A3\Data_F\ParticleEffects\Universal\Universal", 16, 7, 1], "", "Billboard", 1, 10, [0, 0, 0.5], [0, 0, 2.9], 1, 1.275, 1, 0.066, [4, 5, 10, 10], [[0.3, 0.3, 0.3, 0.33], [0.4, 0.4, 0.4, 0.33], [0.2, 0.2, 0, 0]], [0, 1], 1, 0, "", "", _ps1]; _ps1 setParticleRandom [0, [0, 0, 0], [0.33, 0.33, 0], 0, 0.25, [0.05, 0.05, 0.05, 0.05], 0, 0]; _ps1 setDropInterval 0.5; // Smoke part 2 private _ps2 = "#particlesource" createVehicleLocal _posATL; _ps2 setParticleParams [ ["\A3\Data_F\ParticleEffects\Universal\Universal", 16, 9, 1], "", "Billboard", 1, 15, [0, 0, 0.5], [0, 0, 2.9], 1, 1.275, 1, 0.066, [4, 5, 10, 10], [[0.1, 0.1, 0.1, 0.75], [0.4, 0.4, 0.4, 0.5], [1, 1, 1, 0.2]], [0], 1, 0, "", "", _ps2]; _ps2 setParticleRandom [0, [0, 0, 0], [0.5, 0.5, 0], 0, 0.25, [0.05, 0.05, 0.05, 0.05], 0, 0]; _ps2 setDropInterval 0.25;

Fire

Fire

private _posATL = player modelToWorld [0,10,0]; // Fire private _ps1 = "#particlesource" createVehicleLocal _posATL; _ps1 setParticleParams [ ["\A3\Data_F\ParticleEffects\Universal\Universal", 16, 10, 32], "", "Billboard", 1, 1, [0, 0, 0], [0, 0, 0.5], 0, 1, 1, 3, [0.5,1.5], [[1,1,1,0.4], [1,1,1,0.2], [1,1,1,0]], [0.25,1], 1, 1, "", "", _ps1]; _ps1 setParticleRandom [0.2, [0.5, 0.5, 0.25], [0.125, 0.125, 0.125], 0.2, 0.2, [0, 0, 0, 0], 0, 0]; _ps1 setDropInterval 0.05; // Smoke private _ps2 = "#particlesource" createVehicleLocal _posATL; _ps2 setParticleParams [ ["\A3\Data_F\ParticleEffects\Universal\Universal", 16, 7, 1, 1], "", "Billboard", 1, 5, [0, 0, 1], [0, 0, 1.5], 0, 1, 1, 0.5, [1.75,2,3,4.5], // timerPeriod → size [[1,1,1,0], [1,1,1,0.5], [1,1,1,0.4], [1,1,1,0.2], [1,1,1,0]], [0.5,0.5], 0, 0, "", "", _ps2]; _ps2 setParticleRandom [0.5, [1, 1, 0.4], [0, 0, 0.5], 0, 0.125, [0, 0, 0, 0], rad 30, 0]; _ps2 setDropInterval 0.1;

Floating Orb

Floating Orb

private _posATL = player modelToWorld [0,10,0]; private _ps1 = "#particlesource" createVehicleLocal _posATL; _ps1 setParticleParams [ ["\A3\Data_F\ParticleEffects\Universal\Universal", 16, 12, 16, 0], "", "Billboard", 1, 3.0141, [0, 0, 2], [0, 0, 0], 1, 1.275, 1, 0, [4], [[1, 1, 1, 1]], [1000], 1, 0, "", "", _ps1]; _ps1 setDropInterval 3;

Heavy Oily Smoke (Small)

Heavy Oily Smoke (Small)

private _posATL = player modelToWorld [0,10,0]; private _ps1 = "#particlesource" createVehicleLocal _posATL; _ps1 setParticleParams [ ["\A3\Data_F\ParticleEffects\Universal\Universal", 16, 7, 16, 1], "", "Billboard", 1, 8, [0, 0, 0], [0, 0, 1.5], 0, 10, 7.9, 0.066, [1, 3, 6], [[0, 0, 0, 0], [0.05, 0.05, 0.05, 1], [0.05, 0.05, 0.05, 1], [0.05, 0.05, 0.05, 1], [0.1, 0.1, 0.1, 0.5], [0.125, 0.125, 0.125, 0]], [0.25], 1, 0, "", "", _ps1]; _ps1 setParticleRandom [0, [0.25, 0.25, 0], [0.2, 0.2, 0], 0, 0.25, [0, 0, 0, 0.1], 0, 0]; _ps1 setDropInterval 0.05;

Heavy Oily Smoke (Medium)

Heavy Oily Smoke (Medium)

private _posATL = player modelToWorld [0,10,0]; private _ps1 = "#particlesource" createVehicleLocal _posATL; _ps1 setParticleParams [ ["\A3\Data_F\ParticleEffects\Universal\Universal", 16, 7, 16, 1], "", "Billboard", 1, 8, [0, 0, 0], [0, 0, 2.5], 0, 10, 7.9, 0.066, [2, 6, 12], [[0, 0, 0, 0], [0.05, 0.05, 0.05, 1], [0.05, 0.05, 0.05, 1], [0.05, 0.05, 0.05, 1], [0.1, 0.1, 0.1, 0.5], [0.125, 0.125, 0.125, 0]], [0.25], 1, 0, "", "", _ps1]; _ps1 setParticleRandom [0, [0.25, 0.25, 0], [0.2, 0.2, 0], 0, 0.25, [0, 0, 0, 0.1], 0, 0]; _ps1 setDropInterval 0.1;

Heavy Oily Smoke (Large)

Heavy Oily Smoke (Large)

private _posATL = player modelToWorld [0,10,0]; private _ps1 = "#particlesource" createVehicleLocal _posATL; _ps1 setParticleParams [ ["\A3\Data_F\ParticleEffects\Universal\Universal", 16, 7, 16, 1], "", "Billboard", 1, 8, [0, 0, 0], [0, 0, 2.5], 0, 10, 7.9, 0.066, [4, 12, 20], [[0, 0, 0, 0], [0.05, 0.05, 0.05, 1], [0.05, 0.05, 0.05, 1], [0.05, 0.05, 0.05, 1], [0.1, 0.1, 0.1, 0.5], [0.125, 0.125, 0.125, 0]], [0.25], 1, 0, "", "", _ps1]; _ps1 setParticleRandom [0, [0.25, 0.25, 0], [0.2, 0.2, 0], 0, 0.25, [0, 0, 0, 0.1], 0, 0]; _ps1 setDropInterval 0.2;

Light Wood Smoke (Small)

Light Wood Smoke (Small)

private _posATL = player modelToWorld [0,10,0]; private _ps1 = "#particlesource" createVehicleLocal _posATL; _ps1 setParticleParams [ ["\A3\Data_F\ParticleEffects\Universal\Universal", 16, 9, 16, 0], "", "Billboard", 1, 8, [0, 0, 0], [0, 0, 1.5], 0, 10, 7.9, 0.066, [1, 3, 6], [[0.5, 0.5, 0.5, 0], [0.5, 0.5, 0.5, 0.15], [0.5, 0.5, 0.5, 0.15], [0.5, 0.5, 0.5, 0.1], [0.75, 0.75, 0.75, 0.075], [1, 1, 1, 0]], [0.25], 1, 0, "", "", _ps1]; _ps1 setParticleRandom [0, [0.25, 0.25, 0], [0.2, 0.2, 0], 0, 0.25, [0, 0, 0, 0.1], 0, 0]; _ps1 setDropInterval 0.05;

Light Wood Smoke (Medium)

Light Wood Smoke (Medium)

private _posATL = player modelToWorld [0,10,0]; private _ps1 = "#particlesource" createVehicleLocal _posATL; _ps1 setParticleParams [ ["\A3\Data_F\ParticleEffects\Universal\Universal", 16, 9, 16, 0], "", "Billboard", 1, 8, [0, 0, 0], [0, 0, 1.5], 0, 10, 7.9, 0.066, [2, 6, 12], [[0.5, 0.5, 0.5, 0], [0.5, 0.5, 0.5, 0.3], [0.5, 0.5, 0.5, 0.2], [0.5, 0.5, 0.5, 0.1], [0.75, 0.75, 0.75, 0.075], [1, 1, 1, 0]], [0.25], 1, 0, "", "", _ps1]; _ps1 setParticleRandom [0, [0.25, 0.25, 0], [0.2, 0.2, 0], 0, 0.25, [0, 0, 0, 0.1], 0, 0]; _ps1 setDropInterval 0.1;

Light Wood Smoke (Large)

Light Wood Smoke (Large)

private _posATL = player modelToWorld [0,10,0]; private _ps1 = "#particlesource" createVehicleLocal _posATL; _ps1 setParticleParams [ ["\A3\Data_F\ParticleEffects\Universal\Universal", 16, 9, 16, 0], "", "Billboard", 1, 8, [0, 0, 0], [0, 0, 4.5], 0, 10, 7.9, 0.5, [4, 12, 20], [[0.5, 0.5, 0.5, 0], [0.5, 0.5, 0.5, 0.5], [0.66, 0.66, 0.66, 0.33], [0.75, 0.75, 0.75, 0.25], [1, 1, 1, 0]], [0.25], 1, 0, "", "", _ps1]; _ps1 setParticleRandom [0, [0.5, 0.5, 0], [0.2, 0.2, 0], 0, 0.25, [0, 0, 0, 0.1], 0, 0]; _ps1 setDropInterval 0.2;

Mixed Smoke (Small)

Mixed Smoke (Small)

private _posATL = player modelToWorld [0,10,0]; private _ps1 = "#particlesource" createVehicleLocal _posATL; _ps1 setParticleParams [ ["\A3\Data_F\ParticleEffects\Universal\Universal", 16, 7, 16, 1], "", "Billboard", 1, 8, [0, 0, 0], [0, 0, 1.5], 0, 10, 7.9, 0.066, [1, 3, 6], [[0.2, 0.2, 0.2, 0], [0.2, 0.2, 0.2, 0.45], [0.2, 0.2, 0.2, 0.45], [0.35, 0.35, 0.35, 0.225], [0.5, 0.5, 0.5, 0]], [0.25], 1, 0, "", "", _ps1]; _ps1 setParticleRandom [0, [0.25, 0.25, 0], [0.2, 0.2, 0], 0, 0.25, [0, 0, 0, 0.1], 0, 0]; _ps1 setDropInterval 0.1; private _ps2 = "#particlesource" createVehicleLocal _posATL; _ps2 setParticleParams [ ["\A3\Data_F\ParticleEffects\Universal\Universal", 16, 9, 16, 0], "", "Billboard", 1, 8, [0, 0, 0], [0, 0, 1.5], 0, 10, 7.9, 0.066, [1, 3, 6], [[0.33, 0.33, 0.33, 0], [0.33, 0.33, 0.33, 0.8], [0.33, 0.33, 0.33, 0.8], [0.66, 0.66, 0.66, 0.4], [1, 1, 1, 0]], [0.25], 1, 0, "", "", _ps2]; _ps2 setParticleRandom [0, [0.25, 0.25, 0], [0.2, 0.2, 0], 0, 0.25, [0, 0, 0, 0.1], 0, 0]; _ps2 setDropInterval 0.1;

Mixed Smoke (Medium)

Mixed Smoke (Medium)

private _posATL = player modelToWorld [0,10,0]; private _ps1 = "#particlesource" createVehicleLocal _posATL; _ps1 setParticleParams [ ["\A3\Data_F\ParticleEffects\Universal\Universal", 16, 7, 16, 1], "", "Billboard", 1, 8, [0, 0, 0], [0, 0, 2.5], 0, 10, 7.9, 0.066, [2, 6, 12], [[0.2, 0.2, 0.2, 0], [0.2, 0.2, 0.2, 0.3], [0.2, 0.2, 0.2, 0.3], [0.35, 0.35, 0.35, 0.2], [0.5, 0.5, 0.5, 0]], [0.25], 1, 0, "", "", _ps1]; _ps1 setParticleRandom [0, [0.25, 0.25, 0], [0.2, 0.2, 0], 0, 0.25, [0, 0, 0, 0.1], 0, 0]; _ps1 setDropInterval 0.2; private _ps2 = "#particlesource" createVehicleLocal _posATL; _ps2 setParticleParams [ ["\A3\Data_F\ParticleEffects\Universal\Universal", 16, 9, 16, 0], "", "Billboard", 1, 8, [0, 0, 0], [0, 0, 2.5], 0, 10, 7.9, 0.066, [2, 6, 12], [[0.33, 0.33, 0.33, 0], [0.33, 0.33, 0.33, 0.8], [0.33, 0.33, 0.33, 0.8], [0.66, 0.66, 0.66, 0.4], [1, 1, 1, 0]], [0.25], 1, 0, "", "", _ps2]; _ps2 setParticleRandom [0, [0.25, 0.25, 0], [0.2, 0.2, 0], 0, 0.25, [0, 0, 0, 0.1], 0, 0]; _ps2 setDropInterval 0.2;

Mixed Smoke (Large)

Mixed Smoke (Large)

private _posATL = player modelToWorld [0,10,0]; private _ps1 = "#particlesource" createVehicleLocal _posATL; _ps1 setParticleParams [ ["\A3\Data_F\ParticleEffects\Universal\Universal", 16, 7, 16, 1], "", "Billboard", 1, 8, [0, 0, 0], [0, 0, 4.5], 0, 10, 7.9, 0.5, [4, 12, 20], [[0.2, 0.2, 0.2, 0], [0.2, 0.2, 0.2, 0.3], [0.2, 0.2, 0.2, 0.3], [0.35, 0.35, 0.35, 0.2], [0.5, 0.5, 0.5, 0]], [0.25], 1, 0, "", "", _ps1]; _ps1 setParticleRandom [0, [0.4, 0.4, 0], [0.4, 0.4, 0], 0, 0.25, [0, 0, 0, 0.1], 0, 0]; _ps1 setDropInterval 0.2; private _ps2 = "#particlesource" createVehicleLocal _posATL; _ps2 setParticleParams [ ["\A3\Data_F\ParticleEffects\Universal\Universal", 16, 9, 16, 0], "", "Billboard", 1, 8, [0, 0, 0], [0, 0, 4.5], 0, 10, 7.9, 0.5, [4, 12, 20], [[0.33, 0.33, 0.33, 0], [0.33, 0.33, 0.33, 0.8], [0.33, 0.33, 0.33, 0.8], [0.66, 0.66, 0.66, 0.4], [1, 1, 1, 0]], [0.25], 1, 0, "", "", _ps2]; _ps2 setParticleRandom [0, [0.4, 0.4, 0], [0.4, 0.4, 0], 0, 0.25, [0, 0, 0, 0.1], 0, 0]; _ps2 setDropInterval 0.2;

Rock Shower

Rock Shower

private _posATL = player modelToWorld [0,10,0]; private _ps1 = "#particlesource" createVehicleLocal _posATL; _ps1 setParticleParams [ "\A3\Data_F\ParticleEffects\Pstone\Pstone", "", "SpaceObject", 1, 10, [0, 0, 30], [0, 0, -2], 1, 10, 1, 0.2, [2, 2], [[1, 1, 1 ,1]], [0, 1], 1, 0, "", "", _ps1]; _ps1 setParticleRandom [0, [10, 10, 0], [0.25, 0.25, 0], 0, 1.5, [0, 0, 0, 0], 0, 0]; _ps1 setDropInterval 0.04;


See Also