DayZ 1.30
DayZ Explorer by KGB
 
Загрузка...
Поиск...
Не найдено
EffectArea.c
См. документацию.
1// #define EFFECT_AREA_VISUAL_DEBUG
2
3// Mostly used for better readability
5{
6 STATIC = 1,
8}
9
10enum EEffectAreaType
11{
15 OIL_PIT = 8
16}
17
18// Class used for parameter transfer, all of the params are shadows of EffectArea member variables
19class EffectAreaParams
20{
21 string m_ParamName = "Default setup";
22 string m_ParamTriggerType = "ContaminatedTrigger";
23 float m_ParamRadius = 100;
24 float m_ParamPosHeight = 25;
25 float m_ParamNegHeight = 10;
26 int m_ParamInnerRings = 1;
27 int m_ParamInnerSpace = 35;
28 bool m_ParamOuterToggle = true;
29 int m_ParamOuterSpace = 20;
30 int m_ParamOuterOffset = -5;
31 int m_ParamVertLayers = 0;
32 int m_ParamVerticalOffset = 10;
33 int m_ParamEffectInterval = 0;
34 int m_ParamEffectDuration = 0;
35 int m_ParamEffectModifier = 0;
36 /*
37 int m_ParamPartId = ParticleList.CONTAMINATED_AREA_GAS_BIGASS;
38 int m_ParamAroundPartId = ParticleList.CONTAMINATED_AREA_GAS_AROUND;
39 int m_ParamTinyPartId = ParticleList.CONTAMINATED_AREA_GAS_TINY;
40 */
41 int m_ParamPartId = 0;
42 int m_ParamAroundPartId = 0;
43 int m_ParamTinyPartId = 0;
44
45 string m_ParamPpeRequesterType = "PPERequester_ContaminatedAreaTint";
46}
47
48// Base class for contaminated and other "Effect" areas
49class EffectArea : House
50{
51 // Area Data
52 string m_Name = "Default setup"; // The user defined name of the area
53 int m_Type = eZoneType.STATIC; // If the zone is static or dynamic
54 vector m_Position; // World position of area snapped to ground on creation (see: EffectAreaLoader)
55 vector m_PositionTrigger; // World position adjusted according to trigger pivot (pivot is cylinder center)
56 int m_EffectInterval; // If non persisent effect: determines intervals between effect activation
57 int m_EffectDuration; // If non persisent effect: determines duration of effect
58 bool m_EffectModifier; // Flag for modification of internal behavior of the effect
59
60 // Trigger Data
61 float m_Radius = 100; // Radius of the Contaminated Area
62 float m_PositiveHeight = 25; // Distance between center and maximum height
63 float m_NegativeHeight = 10; // Distance between center and minimum height
64
65 // PCG parameters
66 // Inner Particle data
67 int m_InnerRings = 1; // The amount of inner rings one wants
68 int m_InnerSpacing = 35; // Distance between two particles placed on inner rings of the area
69 // Outer particle data
70 bool m_OuterRingToggle = true; // Allow disabling outer ring if undesired
71 int m_OuterRingOffset = -5; // Distance between the outermost ring of particles and area radius
72 int m_OuterSpacing = 20; // Distance between two particles placed on the outer most ring of the area
73 // Verticality handling
74 int m_VerticalLayers = 0; // Used to add multiple layers vertically and set vertical spacing ( 0 don't do anything )
75 int m_VerticalOffset = 10; // Used to determine vertical offset between two vertical layers
76
77 // Particles and visual effects
78 int m_ParticleID = ParticleList.CONTAMINATED_AREA_GAS_BIGASS;
79 int m_AroundParticleID = ParticleList.CONTAMINATED_AREA_GAS_AROUND;
80 int m_TinyParticleID = ParticleList.CONTAMINATED_AREA_GAS_TINY;
81 string m_PPERequesterType;
82 int m_PPERequesterIdx = -1;
83 int m_EffectsPriority; // When multiple areas overlap, only the area with the highest priority will play its effects
84
85 const int PARTICLES_MAX = 1000; // Better safe than sorry
86
87 // Other values and storage
88 string m_TriggerType = "ContaminatedTrigger"; // The trigger class used by this zone
89 EffectTrigger m_Trigger; // The trigger used to determine if player is inside toxic area
90
91 ref array<Particle> m_ToxicClouds; // All static toxic clouds in ContaminatedArea
92
93 // ----------------------------------------------
94 // INITIAL SETUP
95 // ----------------------------------------------
96
97 void EffectArea()
98 {
99 RegisterNetSyncVariableFloat("m_Radius", 0, 0, 2);
100 RegisterNetSyncVariableFloat("m_PositiveHeight", 0, 0, 2);
101 RegisterNetSyncVariableFloat("m_NegativeHeight", 0, 0, 2);
102
103 RegisterNetSyncVariableInt("m_InnerRings");
104 RegisterNetSyncVariableInt("m_InnerSpacing");
105 RegisterNetSyncVariableInt("m_OuterRingOffset");
106 RegisterNetSyncVariableInt("m_OuterSpacing");
107 RegisterNetSyncVariableInt("m_VerticalLayers");
108 RegisterNetSyncVariableInt("m_VerticalOffset");
109
110 RegisterNetSyncVariableInt("m_ParticleID");
111 /*
112 RegisterNetSyncVariableInt("m_AroundParticleID");
113 RegisterNetSyncVariableInt("m_TinyParticleID");
114 RegisterNetSyncVariableInt("m_PPERequesterIdx");
115 */
116 RegisterNetSyncVariableBool("m_OuterRingToggle");
117 }
118
119 void ~EffectArea()
120 {
121
122 }
123
124 void SetupZoneData( EffectAreaParams params )
125 {
126 // A lot of branching, allowing to use default values on specified params
127 if ( params.m_ParamName != "" )
128 m_Name = params.m_ParamName;
129 if ( params.m_ParamTriggerType != "" )
130 m_TriggerType = params.m_ParamTriggerType;
131
132 if ( params.m_ParamRadius > 0 )
133 m_Radius = params.m_ParamRadius;
134 if ( params.m_ParamPosHeight > -1 )
135 m_PositiveHeight = params.m_ParamPosHeight;
136 if ( params.m_ParamNegHeight > -1 )
137 m_NegativeHeight = params.m_ParamNegHeight;
138
139 m_InnerRings = params.m_ParamInnerRings;
140 if ( params.m_ParamInnerSpace > -1 )
141 m_InnerSpacing = params.m_ParamInnerSpace;
142
143 m_OuterRingToggle = params.m_ParamOuterToggle;
144 if ( params.m_ParamOuterSpace > -1 )
145 m_OuterSpacing = params.m_ParamOuterSpace;
146 m_OuterRingOffset = params.m_ParamOuterOffset;
147
148 if ( params.m_ParamVertLayers > 0 )
149 m_VerticalLayers = params.m_ParamVertLayers;
150 if ( params.m_ParamVerticalOffset > 0 )
151 m_VerticalOffset = params.m_ParamVerticalOffset;
152
153 m_EffectInterval = params.m_ParamEffectInterval;
154 m_EffectDuration = params.m_ParamEffectDuration;
155 m_EffectModifier = params.m_ParamEffectModifier;
156
157 m_ParticleID = params.m_ParamPartId;
158 m_AroundParticleID = params.m_ParamAroundPartId;
159 m_TinyParticleID = params.m_ParamTinyPartId;
160
161 if ( params.m_ParamPpeRequesterType != "" )
162 {
163 m_PPERequesterType = params.m_ParamPpeRequesterType;
164 m_PPERequesterIdx = GetRequesterIndex(m_PPERequesterType);
165 }
166 // We get the PPE index for future usage and synchronization
167
168 // DEVELOPER NOTE :
169 // If you cannot register a new requester, add your own indexation and lookup methods to get an index and synchronize it
170 // EXAMPLE : m_PPERequesterIdx = MyLookupMethod()
171
172 #ifdef ENABLE_LOGGING
173 Debug.Log(">>>> SetupZoneData: Finished: " + m_Name);
174 #endif
175
176 // We sync our data
177 SetSynchDirty();
178 }
179
180 void Tick()
181 {
182 #ifdef DIAG_DEVELOPER
183 #ifdef EFFECT_AREA_VISUAL_DEBUG
184 CleanupDebugShapes(m_DebugTargets);
185 #endif
186 #endif
187 }
188
189
190 // Through this we will evaluate the resize of particles
191 override void OnCEIterate(float currentTime, float elapsedTime)
192 {
193 super.OnCEIterate(currentTime, elapsedTime);
194 Tick();
195 }
196
197 void InitZone()
198 {
199 // Debug.Log("------------------------------------------");
200 // Debug.Log("InitZone: " + m_Name);
201
203 m_PositionTrigger = m_Position;
204 m_PositionTrigger[1] = m_Position[1] + ((m_PositiveHeight - m_NegativeHeight) * 0.5); // Cylinder trigger pivot correction
205
206 if (!g_Game.IsDedicatedServer())
208
209 if (g_Game.IsServer())
211
212 // Debug.Log("------------------------------------------");
213 }
214
215 // The following methods are to be overriden to execute specifc logic
216 void InitZoneServer();
217 void InitZoneClient();
218
219 // ----------------------------------------------
220 // INTERACTION SETUP
221 // ----------------------------------------------
222
223 override bool CanPutInCargo( EntityAI parent )
224 {
225 return false;
226 }
227
228 override bool CanPutIntoHands( EntityAI parent )
229 {
230 return false;
231 }
232
233 override bool DisableVicinityIcon()
234 {
235 return true;
236 }
237
238 override bool CanBeTargetedByAI( EntityAI ai )
239 {
240 return false;
241 }
242
243 // ----------------------------------------------
244 // PARTICLE GENERATION
245 // ----------------------------------------------
246 // Used to position all particles procedurally
247 void PlaceParticles( vector pos, float radius, int nbRings, int innerSpacing, bool outerToggle, int outerSpacing, int outerOffset, int partId )
248 {
249 // Debug.Log("PlaceParticles: " + pos);
250
251 #ifdef NO_GUI
252 return; // do not place any particles if there is no GUI
253 #endif
254 if (partId == 0)
255 {
256 Error("[WARNING] :: [EffectArea PlaceParticles] :: no particle defined, skipping area particle generation" );
257 return;
258 }
259 if ( radius == 0 )
260 {
261 Error("[WARNING] :: [EffectArea PlaceParticles] :: Radius of contaminated zone is set to 0, this should not happen");
262 return;
263 }
264 if ( outerToggle && radius == outerOffset )
265 {
266 Error("[WARNING] :: [EffectArea PlaceParticles] :: Your outerOffset is EQUAL to your Radius, this will result in division by 0");
267 return;
268 }
269
270 int partCount = 0; // Number of spawned emitters
271
272 ParticlePropertiesArray props = new ParticlePropertiesArray();
273
274 // Inner spacing of 0 would cause infinite loops as no increment would happen
275 if (innerSpacing == 0)
276 innerSpacing = 1;
277
278 // For each concentric ring, we place a particle emitter at a set offset
279 for ( int i = 0; i <= nbRings + outerToggle; ++i )
280 {
281 if (i == 0) // Skipping 0, we want to start by placing a particle at center of area
282 {
283 SpawnParticles(props, pos, pos, partCount);
284 }
285 else
286 {
287 // We prepare the variables to use later in calculation
288 float angleIncrement; // The value added to the offset angle to place following particle
289 float ab; // Length of a side of triangle used to calculate particle positionning
290 vector temp = vector.Zero; // Vector we rotate to position next spawn point
291
292 // The particle density is not the same on the final ring which will only happen if toggled
293 // Toggle uses bool parameter treated as int, thus i > nbRings test ( allows to limit branching )
294 if ( i > nbRings )
295 {
296 ab = radius - outerOffset; // We want to leave some space to better see area demarcation
297
298 // We calculate the rotation angle depending on particle spacing and distance from center
299 angleIncrement = Math.Acos( 1 - ( ( outerSpacing * outerSpacing ) / ( 2 * Math.SqrInt(ab) ) ) );
300 temp[2] = temp[2] + ab;
301
302 //Debug.Log("Radius of last circle " + i + " is : " + ab);
303 }
304 else
305 {
306 ab = ( radius / ( nbRings + 1 ) ) * i; // We add the offset from one ring to another
307
308 // We calculate the rotation angle depending on particle spacing and distance from center
309 angleIncrement = Math.Acos( 1 - ( ( innerSpacing * innerSpacing ) / ( 2 * Math.SqrInt(ab) ) ) );
310 temp[2] = temp[2] + ab;
311
312 //Debug.Log("Radius of inner circle " + i + " is : " + ab);
313 }
314
315 for ( int j = 0; j <= ( Math.PI2 / angleIncrement ); j++ )
316 {
317 // Determine position of particle emitter
318 // Use offset of current ring for vector length
319
320 float sinAngle = Math.Sin(angleIncrement * j);
321 float cosAngle = Math.Cos(angleIncrement * j);
322
323 vector partPos = vector.RotateAroundZero( temp, vector.Up, cosAngle, sinAngle );
324 partPos += pos;
325
326 SpawnParticles(props, pos, partPos, partCount);
327 }
328 }
329 }
330
331 InsertParticles(props, partCount, partId);
332 }
333
334 // Fill the radius with particle emitters using the Circle packing in a circle method
335 void FillWithParticles(vector pos, float areaRadius, float outwardsBleed, float partSize, int partId)
336 {
337 // Debug.Log("FillWithParticles: " + pos);
338
339 #ifdef NO_GUI
340 return; // do not place any particles if there is no GUI
341 #endif
342 if (partId == 0)
343 return;
344
345 if (partSize <= 0)
346 partSize = 1;
347
348 int partCount = 0; // Number of spawned emitters
349 int ringCount = 0; // Number of area rings
350 float ringDist = 0; // Distance between rings
351
352 float radiusMax = areaRadius + outwardsBleed; // Visual radius of the area
353 float radiusPart = partSize / 2; // Particle radius
354
355 bool centerPart = true; // Spawn central particle?
356
357 ParticlePropertiesArray props = new ParticlePropertiesArray();
358
359 // Debug.Log("Area radius: " + radiusMax + "m, Particle radius: " + radiusPart + "m");
360
361 if (radiusMax > radiusPart * 1.5) // Area has to be larger than particle, plus some margin
362 {
363 if (radiusMax < radiusPart * 2.5) // Area fits one ring of particles, but no center particle (minus some overlap margin)
364 {
365 ringDist = radiusMax - radiusPart; // Snap the particles to outer edge
366 ringCount = 1;
367 centerPart = false;
368 }
369 else // Area fits all
370 {
371 radiusMax -= radiusPart; // Snap the particles to outer edge
372 ringCount = Math.Ceil(radiusMax / partSize); // Get number of inner rings
373 ringDist = radiusMax / ringCount; // Adjust ring distance after rounding
374 }
375 }
376
377 // Debug.Log("We have : " + ringCount + " rings, " + ringDist + "m apart, center: " + centerPart);
378 // Debug.Log("We have : " + m_VerticalLayers + " layers, " + m_VerticalOffset + "m apart");
379
380 // For each concentric ring, we place a particle emitter at a set offset
381 for (int ring = 0; ring <= ringCount; ++ring)
382 {
383 if (ring == 0 && centerPart) // We start by placing particle at center of area
384 {
385 SpawnParticles(props, pos, pos, partCount);
386 }
387 else if (ring > 0)
388 {
389 float ringRadius = ringDist * ring;
390 float circumference = 2 * Math.PI2 * ringRadius;
391
392 int count = Math.Floor(circumference / partSize); // Get number of particles on ring (roughly)
393 float angleInc = Math.PI2 / count; // Get angle between particles on ring
394
395 for (int i = 0; i < count; ++i) // Insert particles around the ring
396 {
397 vector partPos = pos;
398 float x = ringRadius * Math.Sin(angleInc * i);
399 float z = ringRadius * Math.Cos(angleInc * i);
400
401 partPos[0] = partPos[0] + x;
402 partPos[2] = partPos[2] + z;
403
404 SpawnParticles(props, pos, partPos, partCount);
405 }
406 }
407 }
408
409 InsertParticles(props, partCount, partId);
410 }
411
412 protected void SpawnParticles(ParticlePropertiesArray props, vector centerPos, vector partPos, inout int count)
413 {
414 float roadY = g_Game.SurfaceRoadY(partPos[0], partPos[2]); // Snap particles to ground
415
416 if (partPos[1] > roadY)
417 partPos[1] = roadY;
418
419 // We also populate vertically, layer 0 will be snapped to ground, subsequent layers will see particles floating by m_VerticalOffset
420 for (int layer = 0; layer <= m_VerticalLayers; ++layer)
421 {
422 partPos[1] = partPos[1] + (m_VerticalOffset * layer);
423
424 // We check that spawned particle is inside the trigger
425 if (count < PARTICLES_MAX && Math.IsInRange(partPos[1], centerPos[1] - m_NegativeHeight, centerPos[1] + m_PositiveHeight))
426 {
427 props.Insert(ParticleProperties(partPos, ParticlePropertiesFlags.PLAY_ON_CREATION, null, g_Game.GetSurfaceOrientation( partPos[0], partPos[2] ), this));
428 ++count;
429 }
430 }
431 }
432
433 private void InsertParticles(ParticlePropertiesArray props, int count, int partId)
434 {
435 m_ToxicClouds.Reserve(count);
436
437 ParticleManager gPM = ParticleManager.GetInstance();
438
439 array<ParticleSource> createdParticles = gPM.CreateParticlesByIdArr(partId, props, count);
440 if (createdParticles.Count() != count)
441 {
442 if (gPM.IsFinishedAllocating())
443 {
444 ErrorEx(string.Format("Not enough particles in pool for EffectArea: %1", m_Name));
445 OnParticleAllocation(gPM, createdParticles);
446 }
447 else
448 {
449 gPM.GetEvents().Event_OnAllocation.Insert(OnParticleAllocation);
450 }
451 }
452 else
453 {
454 OnParticleAllocation(gPM, createdParticles);
455 }
456
457 // Debug.Log("Emitter count: " + count);
458 }
459
460 void OnParticleAllocation(ParticleManager pm, array<ParticleSource> particles)
461 {
462 foreach (ParticleSource p : particles)
463 {
464 if (p.GetOwner() == this) // Safety, since it can be unrelated particles when done through event
465 {
466 m_ToxicClouds.Insert(p);
467 }
468 }
469 }
470
471 int GetRequesterIndex(string type)
472 {
473 typename t = type.ToType();
474 if (!t)
475 return - 1;
476 PPERequesterBase req = PPERequesterBank.GetRequester(t);
477 if (req)
478 return req.GetRequesterIDX();
479 return -1;
480 }
481
482
483 // ----------------------------------------------
484 // TRIGGER SETUP
485 // ----------------------------------------------
486 void CreateTrigger(vector pos, int radius)
487 {
488 #ifdef DIAG_DEVELOPER
489 #ifdef EFFECT_AREA_VISUAL_DEBUG
490 Shape dbgShape;
491 CleanupDebugShapes(m_DebugTargets);
492 #endif
493 #endif
494
495 // Create new trigger of specified type
496 if (Class.CastTo(m_Trigger, g_Game.CreateObjectEx(m_TriggerType, pos, ECE_NONE)))
497 {
498 // We finalize trigger dimension setup
499 float centerHeightCorrection = (m_PositiveHeight - m_NegativeHeight) * 0.5;
500
501 m_Trigger.SetCollisionCylinderTwoWay(radius, -(m_NegativeHeight + centerHeightCorrection), (m_PositiveHeight - centerHeightCorrection));
502 m_Trigger.SetPosition(pos);
503 m_Trigger.Update();
504
505 #ifdef DIAG_DEVELOPER
506 #ifdef EFFECT_AREA_VISUAL_DEBUG
507 /*
508 vector cubePos = pos;
509 cubePos[0] = cubePos[0] + radius;
510 cubePos[1] = cubePos[1] + (m_PositiveHeight - centerHeightCorrection);
511 cubePos[2] = cubePos[2] + radius;
512 m_DebugTargets.Insert(Debug.DrawCube(cubePos, 0.5, 0x1fff0000));
513 */
514
515 vector colliderPosDebug = pos;
517 colliderPosDebug[1] = pos[1] + (m_PositiveHeight - centerHeightCorrection);
518 m_DebugTargets.Insert(Debug.DrawSphere(colliderPosDebug, 0.15, 0x1f0000ff, ShapeFlags.NOZWRITE));
519 //m_DebugTargets.Insert(Debug.DrawLine(cubePos, colliderPosDebug, 0x1fff0000, ShapeFlags.NOZWRITE)); // connector
521 m_DebugTargets.Insert(Debug.DrawSphere(pos, 0.15, 0x1fff0000, ShapeFlags.NOZWRITE));
522 //m_DebugTargets.Insert(Debug.DrawLine(cubePos, pos, 0x1fff0000, ShapeFlags.NOZWRITE)); // connector
523
525 colliderPosDebug[1] = pos[1] - (m_NegativeHeight + centerHeightCorrection);
526 m_DebugTargets.Insert(Debug.DrawSphere(colliderPosDebug, 0.15, 0x1f00ff00, ShapeFlags.NOZWRITE));
527 //m_DebugTargets.Insert(Debug.DrawLine(cubePos, colliderPosDebug, 0x1fff0000, ShapeFlags.NOZWRITE)); // connector
528
529 float triggerHeight = (m_PositiveHeight + m_NegativeHeight);
530 m_DebugTargets.Insert(Debug.DrawCylinder(pos, radius, triggerHeight, 0x1f0000ff, ShapeFlags.TRANSP|ShapeFlags.NOZWRITE));
531 #endif
532 #endif
533
534 // If the trigger is lower in hierarchy and can see it's local effects customized, we pass the new parameters
535 if ( m_Trigger.IsInherited(EffectTrigger))
536 {
537 //Debug.Log("We override area local effects");
538 EffectTrigger.Cast(m_Trigger).SetLocalEffects(m_AroundParticleID, m_TinyParticleID, m_PPERequesterIdx);
539 }
540 m_Trigger.Init(this, m_EffectsPriority);
541 //Debug.Log("We created the trigger at : " + m_Trigger.GetWorldPosition() );
542 }
543 }
544
545 // ----------------------------------------------
546 // AREA DELETION
547 // ----------------------------------------------
548
549 override void EEDelete( EntityAI parent )
550 {
551 if ( m_Trigger )
552 {
553 g_Game.ObjectDelete( m_Trigger );
554 }
555
556 // We stop playing particles on this client when the base object is deleted ( out of range for example )
557 if ( (g_Game.IsClient() || !g_Game.IsMultiplayer()) && m_ToxicClouds )
558 {
559 foreach ( Particle p : m_ToxicClouds )
560 {
561 p.Stop();
562 }
563 }
564
565 super.EEDelete( parent );
566 }
567
568 void OnPlayerEnterServer(PlayerBase player, EffectTrigger trigger)
569 {
570 player.IncreaseEffectAreaCount();
571 }
572 void OnPlayerExitServer(PlayerBase player, EffectTrigger trigger)
573 {
574 player.DecreaseEffectAreaCount();
575 }
576
577 #ifdef DIAG_DEVELOPER
578 #ifdef EFFECT_AREA_VISUAL_DEBUG
579 protected ref array<Shape> m_DebugTargets = new array<Shape>();
580
581 protected void CleanupDebugShapes(array<Shape> shapes)
582 {
583 foreach (Shape shape : shapes)
584 Debug.RemoveShape(shape);
585
586 shapes.Clear();
587 }
588 #endif
589 #endif
590}
string m_Name
Определения 3_Game/DayZ/InventoryItemType.c:34
class LogManager EntityAI
eBleedingSourceType m_Type
float m_Radius
Определения AIGroupBehaviour.c:10
string Debug()
Определения CachedEquipmentStorageBase.c:26
const int ECE_NONE
Определения CentralEconomy.c:7
override void OnPlayerExitServer(PlayerBase player, EffectTrigger trigger)
Определения ContaminatedArea.c:47
override void OnPlayerEnterServer(PlayerBase player, EffectTrigger trigger)
Определения ContaminatedArea.c:40
override void InitZoneServer()
Определения ContaminatedArea.c:56
override void InitZoneClient()
Определения ContaminatedArea.c:54
override void EEDelete(EntityAI parent)
Определения ContaminatedArea.c:61
override void Tick()
Определения ContaminatedArea_Dynamic.c:106
override void SetupZoneData(EffectAreaParams params)
Определения ContaminatedArea_Dynamic.c:121
override void OnParticleAllocation(ParticleManager pm, array< ParticleSource > particles)
Определения ContaminatedArea_DynamicBase.c:87
override void InitZone()
Определения ContaminatedArea_DynamicBase.c:61
override bool DisableVicinityIcon()
Определения DayZAnimal.c:75
DayZGame g_Game
Определения DayZGame.c:4074
class DayZProfilesOptions UNDEFINED
void CleanupDebugShapes(array< Shape > shapesArr)
DEPRECATED.
Определения DynamicMusicPlayer.c:1038
vector m_Position
Cached world position.
Определения Effect.c:43
enum eZoneType VOLCANIC
enum eZoneType HOT_SPRING
eZoneType
Определения EffectArea.c:5
override void OnCEIterate(float currentTime, float elapsedTime)
Определения ExplosivesBase.c:82
override bool CanPutInCargo(EntityAI parent)
Определения ExplosivesBase.c:259
override bool CanPutIntoHands(EntityAI parent)
Определения ExplosivesBase.c:269
Icon x
void PPERequesterBase(int requester_IDX)
Определения PPERequestPlatformsBase.c:445
void ParticleManager(ParticleManagerSettings settings)
Constructor (ctor)
Определения ParticleManager.c:88
void CreateTrigger()
Определения TrapBase.c:474
void Init(EffectArea area, int priority)
Определения EffectTrigger.c:49
Определения CrashBase.c:2
int GetRequesterIDX()
Returns requester index.
Определения PPERequestPlatformsBase.c:65
void SetCollisionCylinderTwoWay(float radius, float negativeHeight, float positiveHeight)
Input value validated version of SetCollisionCylinderTwoWay.
Определения ScriptedEntity.c:84
void Error(string err)
Messagebox with error message.
Определения EnDebug.c:90
enum ShapeType ErrorEx
ShapeFlags
Определения EnDebug.c:126
class DiagMenu Shape
don't call destructor directly. Use Destroy() instead
@ STATIC
Static objects are included in the query.
Определения EnEntity.c:150
@ DYNAMIC
Dynamic objects are included in the query.
Определения EnWorld.c:142
vector GetPosition()
Get the world position of the Effect.
Определения Effect.c:473
proto native ToType()
Returns internal type representation. Can be used in runtime, or cached in variables and used for fas...