18 string m_ParamName =
"Default setup";
19 string m_ParamTriggerType =
"ContaminatedTrigger";
20 float m_ParamRadius = 100;
21 float m_ParamPosHeight = 25;
22 float m_ParamNegHeight = 10;
23 int m_ParamInnerRings = 1;
24 int m_ParamInnerSpace = 35;
25 bool m_ParamOuterToggle =
true;
26 int m_ParamOuterSpace = 20;
27 int m_ParamOuterOffset = -5;
28 int m_ParamVertLayers = 0;
29 int m_ParamVerticalOffset = 10;
30 int m_ParamEffectInterval = 0;
31 int m_ParamEffectDuration = 0;
32 int m_ParamEffectModifier = 0;
38 int m_ParamPartId = 0;
39 int m_ParamAroundPartId = 0;
40 int m_ParamTinyPartId = 0;
42 string m_ParamPpeRequesterType =
"PPERequester_ContaminatedAreaTint";
46class EffectArea :
House
49 string m_Name =
"Default setup";
54 bool m_EffectModifier;
58 float m_PositiveHeight = 25;
59 float m_NegativeHeight = 10;
64 int m_InnerSpacing = 35;
66 bool m_OuterRingToggle =
true;
67 int m_OuterRingOffset = -5;
68 int m_OuterSpacing = 20;
70 int m_VerticalLayers = 0;
71 int m_VerticalOffset = 10;
74 int m_ParticleID = ParticleList.CONTAMINATED_AREA_GAS_BIGASS;
75 int m_AroundParticleID = ParticleList.CONTAMINATED_AREA_GAS_AROUND;
76 int m_TinyParticleID = ParticleList.CONTAMINATED_AREA_GAS_TINY;
77 string m_PPERequesterType;
78 int m_PPERequesterIdx = -1;
79 int m_EffectsPriority;
82 string m_TriggerType =
"ContaminatedTrigger";
83 EffectTrigger m_Trigger;
85 ref array<Particle> m_ToxicClouds;
94 RegisterNetSyncVariableFloat(
"m_Radius", 0, 0, 2);
95 RegisterNetSyncVariableFloat(
"m_PositiveHeight", 0, 0, 2);
96 RegisterNetSyncVariableFloat(
"m_NegativeHeight", 0, 0, 2);
98 RegisterNetSyncVariableInt(
"m_InnerRings");
99 RegisterNetSyncVariableInt(
"m_InnerSpacing");
100 RegisterNetSyncVariableInt(
"m_OuterRingOffset");
101 RegisterNetSyncVariableInt(
"m_OuterSpacing");
102 RegisterNetSyncVariableInt(
"m_VerticalLayers");
103 RegisterNetSyncVariableInt(
"m_VerticalOffset");
105 RegisterNetSyncVariableInt(
"m_ParticleID");
111 RegisterNetSyncVariableBool(
"m_OuterRingToggle");
122 if ( params.m_ParamName !=
"" )
123 m_Name = params.m_ParamName;
124 if ( params.m_ParamTriggerType !=
"" )
125 m_TriggerType = params.m_ParamTriggerType;
127 if ( params.m_ParamRadius > 0 )
129 if ( params.m_ParamPosHeight > -1 )
130 m_PositiveHeight = params.m_ParamPosHeight;
131 if ( params.m_ParamNegHeight > -1 )
132 m_NegativeHeight = params.m_ParamNegHeight;
134 m_InnerRings = params.m_ParamInnerRings;
135 if ( params.m_ParamInnerSpace > -1 )
136 m_InnerSpacing = params.m_ParamInnerSpace;
138 m_OuterRingToggle = params.m_ParamOuterToggle;
139 if ( params.m_ParamOuterSpace > -1 )
140 m_OuterSpacing = params.m_ParamOuterSpace;
141 m_OuterRingOffset = params.m_ParamOuterOffset;
143 if ( params.m_ParamVertLayers > 0 )
144 m_VerticalLayers = params.m_ParamVertLayers;
145 if ( params.m_ParamVerticalOffset > 0 )
146 m_VerticalOffset = params.m_ParamVerticalOffset;
148 m_EffectInterval = params.m_ParamEffectInterval;
149 m_EffectDuration = params.m_ParamEffectDuration;
150 m_EffectModifier = params.m_ParamEffectModifier;
152 m_ParticleID = params.m_ParamPartId;
153 m_AroundParticleID = params.m_ParamAroundPartId;
154 m_TinyParticleID = params.m_ParamTinyPartId;
156 if ( params.m_ParamPpeRequesterType !=
"" )
158 m_PPERequesterType = params.m_ParamPpeRequesterType;
159 m_PPERequesterIdx = GetRequesterIndex(m_PPERequesterType);
192 if ( !
GetGame().IsDedicatedServer() )
230 override bool CanBeTargetedByAI(
EntityAI ai )
239 void PlaceParticles( vector pos,
float radius,
int nbRings,
int innerSpacing,
bool outerToggle,
int outerSpacing,
int outerOffset,
int partId )
246 Error(
"[WARNING] :: [EffectArea PlaceParticles] :: no particle defined, skipping area particle generation" );
250 bool snapFirstLayer =
true;
252 snapFirstLayer =
false;
259 Error(
"[WARNING] :: [EffectArea PlaceParticles] :: Radius of contaminated zone is set to 0, this should not happen");
263 if ( outerToggle && radius == outerOffset )
265 Error(
"[WARNING] :: [EffectArea PlaceParticles] :: Your outerOffset is EQUAL to your Radius, this will result in division by 0");
270 if ( innerSpacing == 0 )
276 int numberOfEmitters = 1;
283 ParticlePropertiesArray props =
new ParticlePropertiesArray();
286 for (
int k = 0; k <= m_VerticalLayers; k++ )
288 vector partPos = pos;
293 partPos[1] = partPos[1] + ( m_VerticalOffset * k );
297 props.Insert(ParticleProperties(partPos, ParticlePropertiesFlags.PLAY_ON_CREATION, null, vector.Zero,
this));
301 for (
int i = 1; i <= nbRings + outerToggle; i++ )
306 float angleIncrement;
308 vector temp = vector.Zero;
314 ab = radius - outerOffset;
317 angleIncrement = Math.Acos( 1 - ( ( outerSpacing * outerSpacing ) / ( 2 * Math.SqrInt(ab) ) ) );
318 temp[2] = temp[2] + ab;
324 ab = ( radius / ( nbRings + 1 ) ) * i;
327 angleIncrement = Math.Acos( 1 - ( ( innerSpacing * innerSpacing ) / ( 2 * Math.SqrInt(ab) ) ) );
328 temp[2] = temp[2] + ab;
333 for (
int j = 0; j <= ( Math.PI2 / angleIncrement ); j++ )
339 float sinAngle = Math.Sin( angle );
340 float cosAngle = Math.Cos( angle );
346 if ( k == 0 && snapFirstLayer ==
true )
348 else if ( k == 0 && snapFirstLayer ==
false )
349 partPos[1] = partPos[1] - m_NegativeHeight;
352 if ( partPos[1] <= pos[1] + m_PositiveHeight && partPos[1] >= pos[1] - m_NegativeHeight )
355 props.Insert(ParticleProperties(partPos, ParticlePropertiesFlags.PLAY_ON_CREATION, null,
GetGame().GetSurfaceOrientation( partPos[0], partPos[2] ),
this));
361 angle += angleIncrement;
368 m_ToxicClouds.Reserve(partCounter);
372 array<ParticleSource> createdParticles = gPM.CreateParticlesByIdArr(partId, props, partCounter);
373 if (createdParticles.Count() != partCounter)
375 if (gPM.IsFinishedAllocating())
377 ErrorEx(
string.Format(
"Not enough particles in pool for EffectArea: %1",
m_Name));
378 OnParticleAllocation(gPM, createdParticles);
382 gPM.GetEvents().Event_OnAllocation.Insert(OnParticleAllocation);
387 OnParticleAllocation(gPM, createdParticles);
393 void OnParticleAllocation(
ParticleManager pm, array<ParticleSource> particles)
395 foreach (ParticleSource p : particles)
397 if (p.GetOwner() ==
this)
398 m_ToxicClouds.Insert(p);
402 int GetRequesterIndex(
string type)
404 typename t = type.
ToType();
421 pos[1] = pos[1] - m_NegativeHeight;
424 if ( Class.CastTo( m_Trigger,
GetGame().CreateObjectEx( m_TriggerType, pos,
ECE_NONE ) ) )
427 m_Trigger.SetCollisionCylinder( radius, ( m_NegativeHeight + m_PositiveHeight ) );
430 if ( m_Trigger.IsInherited( EffectTrigger ) )
433 EffectTrigger.Cast( m_Trigger ).SetLocalEffects( m_AroundParticleID, m_TinyParticleID, m_PPERequesterIdx );
435 m_Trigger.
Init(
this, m_EffectsPriority);
452 if ( (
GetGame().IsClient() || !
GetGame().IsMultiplayer()) && m_ToxicClouds )
454 foreach ( Particle p : m_ToxicClouds )
460 super.EEDelete( parent );
465 player.IncreaseEffectAreaCount();
469 player.DecreaseEffectAreaCount();
eBleedingSourceType m_Type
override void InitZoneServer()
override void InitZoneClient()
override void EEDelete(EntityAI parent)
ContaminatedArea_Base EffectArea SetupZoneData(EffectAreaParams params)
override void OnPlayerEnterServer(PlayerBase player, EffectTrigger trigger)
override void OnPlayerExitServer(PlayerBase player, EffectTrigger trigger)
override bool DisableVicinityIcon()
class DayZProfilesOptions UNDEFINED
vector m_Position
Cached world position.
enum eZoneType HOT_SPRING
override void OnCEUpdate()
override bool CanPutInCargo(EntityAI parent)
override bool CanPutIntoHands(EntityAI parent)
void ParticleManager(ParticleManagerSettings settings)
Constructor (ctor)
proto native float SurfaceY(float x, float z)
proto native void ObjectDelete(Object obj)
void Init(EffectArea area, int priority)
int GetRequesterIDX()
Returns requester index.
static vector RotateAroundZero(vector pos, vector axis, float cosAngle, float sinAngle)
Rotate a vector around 0,0,0.
proto native CGame GetGame()
void Error(string err)
Messagebox with error message.
@ STATIC
Static objects are included in the query.
@ DYNAMIC
Dynamic objects are included in the query.
proto native ToType()
Returns internal type representation. Can be used in runtime, or cached in variables and used for fas...