DayZ 1.30
DayZ Explorer by KGB
 
Загрузка...
Поиск...
Не найдено
VehicleVFXComponent.c
См. документацию.
2{
3 int m_ParticleId = -1;
4 int m_EffectId = -1;
5
8
10 ref ParticleParamsOverrideData m_ParticleParamsData;
11
12 protected int m_LastPlayedTime = -1;
13 protected float m_CooldownSec = 0;
14
16 {
17 m_ParticleParamsData = new ParticleParamsOverrideData();
18 }
19
24
25 // --------------------------------------------------------------------------------
26
28 void SetCooldown(float seconds)
29 {
30 m_CooldownSec = seconds;
31 }
32
33 // --------------------------------------------------------------------------------
34
36 {
37 return m_CooldownSec;
38 }
39
40 // --------------------------------------------------------------------------------
41
43 bool CanPlay()
44 {
45 if (m_CooldownSec <= 0 || m_LastPlayedTime == -1)
46 return true;
47
49 return (g_Game.GetTime() - m_LastPlayedTime) >= (int)(m_CooldownSec * 1000);
50 }
51
52 // --------------------------------------------------------------------------------
53
55 {
56 m_LastPlayedTime = g_Game.GetTime();
57 }
58
59 // --------------------------------------------------------------------------------
60
62 {
63 if (m_CooldownSec <= 0 || m_LastPlayedTime == -1)
64 return 0;
65
66 float elapsed = (g_Game.GetTime() - m_LastPlayedTime) * 0.001;
67 float remaining = m_CooldownSec - elapsed;
68 if (remaining > 0)
69 return remaining;
70
71 return 0.0;
72 }
73
74 // --------------------------------------------------------------------------------
75
77 {
79 }
80}
81
83{
87
89 {
92 m_CooldownSec = cooldownSec;
93 }
94}
95
97{
101
104
112
113 // --------------------------------------------------------------------------------
114
115 vector ConvertMemPointToPosition(string memoryPointName)
116 {
117 if (m_Parent.MemoryPointExists(memoryPointName))
118 return m_Parent.GetMemoryPointPos(memoryPointName);
119
120 return vector.Zero;
121 }
122
123 // --------------------------------------------------------------------------------
124
126 void RegisterEffect(EVehicleVFXEffect effectId, typename effectTypename, VehicleVFXDataParams params)
127 {
128 if (!m_EffectsMap.Contains(effectId))
129 m_EffectsMap.Set(effectId, CreateEffectData(effectTypename, params));
130 #ifdef DIAG_DEVELOPER
131 else
132 ErrorEx(string.Format("Effect '%1' is already registered.", EnumTools.EnumToString(EVehicleVFXEffect, effectId)));
133 #endif
134 }
135
136 // --------------------------------------------------------------------------------
137
139 void RegisterEffectGroup(EVehicleVFXEffectGroup groupId, typename effectTypename, int count, VehicleVFXDataParams params)
140 {
141 if (!m_EffectGroupsMap.Contains(groupId))
142 {
144 for (int i = 0; i < count; ++i)
145 groupData.Insert(CreateEffectData(effectTypename, params));
146
147 m_EffectGroupsMap.Insert(groupId, groupData);
148 }
149 #ifdef DIAG_DEVELOPER
150 else
151 ErrorEx(string.Format("Group for '%1' is already registered", EnumTools.EnumToString(EVehicleVFXEffectGroup, groupId)));
152 #endif
153 }
154
155 // --------------------------------------------------------------------------------
156
157 protected VehicleVFXData CreateEffectData(typename effectTypename, VehicleVFXDataParams params)
158 {
159 VehicleVFXData data = new VehicleVFXData();
160 data.m_Position = params.m_Position;
161 data.m_Orientation = params.m_Orientation;
162 data.m_Effect = EffectParticle.Cast(effectTypename.Spawn());
163
164 data.SetCooldown(params.m_CooldownSec);
165
166 return data;
167 }
168
169 // --------------------------------------------------------------------------------
170
171 protected void PlayEffectData(notnull VehicleVFXData data, EntityAI parent)
172 {
174 if (!data.CanPlay())
175 return;
176
177 SurfaceInfo surfaceInfo = m_SurfaceInfo;
179 {
181 surfaceParams.syncMode = UseObjectsMode.NoLock;
183 surfaceParams.position = parent.GetPosition();
184 g_Game.GetSurface(surfaceParams, surfaceResult);
185 surfaceInfo = surfaceResult.surface;
186 }
187
188
189 if(data.m_EffectId == -1)
190 {
192 if (data.m_Position == "-1 -1 -1")
193 return;
194
195 data.m_Effect.ParticleParamsOverride(data.m_ParticleParamsData);
196 data.m_EffectId = SEffectManager.PlayOnObject(data.m_Effect, parent, data.m_Position, data.m_Orientation);
197
199 data.MarkPlayed();
200 }
201 else
202 {
204 if (!data.m_Effect.IsPlaying())
205 {
206 data.m_Effect.Start();
207 data.m_ParticleParamsData.ClearAll();
208
210 data.MarkPlayed();
211 }
212
213 data.m_Effect.SelectFromSurface(surfaceInfo);
214
215 Particle particle = Particle.Cast(data.m_Effect.GetParticle());
216 if (particle)
217 {
218 data.m_Effect.ParticleParamsOverride(data.m_ParticleParamsData);
219 }
220 }
221 }
222
223 // --------------------------------------------------------------------------------
224
225 protected void StopEffectData(VehicleVFXData data)
226 {
227 if (data && data.m_Effect)
228 {
229 data.m_Effect.Stop();
230 data.m_EffectId = -1;
231 data.m_ParticleParamsData.ClearAll();
232 }
233 }
234
235 // --------------------------------------------------------------------------------
236
238 {
239 if (data && data.m_Effect)
240 return data.m_Effect.IsPlaying();
241
242 return false;
243 }
244
245 // --------------------------------------------------------------------------------
246
248 {
249 if (data)
250 return data.CanPlay();
251
252 return false;
253 }
254
255 // --------------------------------------------------------------------------------
256
258 {
259 if (data && data.m_Effect)
260 {
261 data.m_Position = position;
263 }
264 }
265
266 // --------------------------------------------------------------------------------
268 // --------------------------------------------------------------------------------
269
270 void PlayEffect(EVehicleVFXEffect effectId, EntityAI parent = null)
271 {
272 if (!parent)
273 parent = m_Parent;
274
275 VehicleVFXData data = m_EffectsMap.Get(effectId);
276 if (data)
277 PlayEffectData(data, parent);
278 }
279
280 // --------------------------------------------------------------------------------
281
283 {
284 StopEffectData(m_EffectsMap.Get(effectId));
285 }
286
287 // --------------------------------------------------------------------------------
288
290 {
291 foreach (int effectId, VehicleVFXData data : m_EffectsMap)
292 StopEffectData(data);
293
294 foreach (int groupId, array<ref VehicleVFXData> groupData : m_EffectGroupsMap)
295 {
296 foreach (VehicleVFXData groupEffectData : groupData)
297 StopEffectData(groupEffectData);
298 }
299 }
300
301 // --------------------------------------------------------------------------------
302
303 void SetEffectCooldown(EVehicleVFXEffect effectId, float seconds)
304 {
305 VehicleVFXData data = m_EffectsMap.Get(effectId);
306 if (data)
307 data.SetCooldown(seconds);
308 #ifdef DIAG_DEVELOPER
309 else
310 ErrorEx(string.Format("Cannot set cooldown, effect '%1' does not exist.", EnumTools.EnumToString(EVehicleVFXEffect, effectId)));
311 #endif
312 }
313
314 // --------------------------------------------------------------------------------
315
317 {
318 return CanPlayEffectData(m_EffectsMap.Get(effectId));
319 }
320
321 // --------------------------------------------------------------------------------
322
324 {
325 VehicleVFXData data = m_EffectsMap.Get(effectId);
326 if (data)
327 return data.GetRemainingCooldown();
328
329 return 0;
330 }
331
332 // --------------------------------------------------------------------------------
333
335 {
336 VehicleVFXData data = m_EffectsMap.Get(effectId);
337 if (data)
338 data.ResetCooldown();
339 }
340
341 // --------------------------------------------------------------------------------
342
344 {
345 return IsEffectDataPlaying(m_EffectsMap.Get(effectId));
346 }
347
348 // --------------------------------------------------------------------------------
349
351 {
352 VehicleVFXData data = m_EffectsMap.Get(effectId);
353 if (!data)
354 {
355 ErrorEx(string.Format("Effect '%1' does not exist. Isn't it group? Consider use of SetEffectGroupPositions", EnumTools.EnumToString(EVehicleVFXEffect, effectId)));
356 return;
357 }
358
360 }
361
362 // --------------------------------------------------------------------------------
363
364 void SetEffectParticleState(EVehicleVFXEffect effectId, int particleId)
365 {
366 VehicleVFXData data = m_EffectsMap.Get(effectId);
367 if (data && data.m_Effect)
368 data.m_Effect.SetParticleState(particleId);
369 }
370
371 // --------------------------------------------------------------------------------
372
373 ref ParticleParamsOverrideData GetParticleParamsOverrideData(EVehicleVFXEffect effectId)
374 {
375 VehicleVFXData data = m_EffectsMap.Get(effectId);
376 if (data && data.m_ParticleParamsData)
377 return data.m_ParticleParamsData;
378
379 #ifdef DIAG_DEVELOPER
380 ErrorEx(string.Format("No particle params override data set for %1", EnumTools.EnumToString(EVehicleVFXEffect, effectId)));
381 #endif
382
383 return null;
384 }
385
386 // --------------------------------------------------------------------------------
388 // --------------------------------------------------------------------------------
389
390 void PlayEffectGroup(EVehicleVFXEffectGroup groupId, EntityAI parent = null)
391 {
392 if (!parent)
393 parent = m_Parent;
394
395 array<ref VehicleVFXData> groupData = m_EffectGroupsMap.Get(groupId);
396 if (!groupData)
397 return;
398
399 foreach (VehicleVFXData data : groupData)
400 PlayEffectData(data, parent);
401 }
402
403 // --------------------------------------------------------------------------------
404
405 void StopEffectGroup(EVehicleVFXEffectGroup groupId)
406 {
407 array<ref VehicleVFXData> groupData = m_EffectGroupsMap.Get(groupId);
408 if (!groupData)
409 return;
410
411 foreach (VehicleVFXData data : groupData)
412 StopEffectData(data);
413 }
414
415 // --------------------------------------------------------------------------------
416
417 void SetEffectGroupCooldown(EVehicleVFXEffectGroup groupId, float seconds)
418 {
419 array<ref VehicleVFXData> groupData = m_EffectGroupsMap.Get(groupId);
420 if (!groupData)
421 {
422 #ifdef DIAG_DEVELOPER
423 ErrorEx(string.Format("Cannot set cooldown, group '%1' does not exist.", EnumTools.EnumToString(EVehicleVFXEffectGroup, groupId)));
424 #endif
425 return;
426 }
427
428 foreach (VehicleVFXData data : groupData)
429 data.SetCooldown(seconds);
430 }
431
432 // --------------------------------------------------------------------------------
433
435 bool CanPlayEffectGroup(EVehicleVFXEffectGroup groupId)
436 {
437 array<ref VehicleVFXData> groupData = m_EffectGroupsMap.Get(groupId);
438 if (!groupData)
439 return false;
440
441 foreach (VehicleVFXData data : groupData)
442 {
443 if (!CanPlayEffectData(data))
444 return false;
445 }
446
447 return true;
448 }
449
450 // --------------------------------------------------------------------------------
451
453 float GetEffectGroupRemainingCooldown(EVehicleVFXEffectGroup groupId)
454 {
455 array<ref VehicleVFXData> groupData = m_EffectGroupsMap.Get(groupId);
456 if (!groupData)
457 return 0;
458
459 float maxRemaining = 0;
460 foreach (VehicleVFXData data : groupData)
461 {
462 float remaining = data.GetRemainingCooldown();
463 if (remaining > maxRemaining)
464 maxRemaining = remaining;
465 }
466
467 return maxRemaining;
468 }
469
470 // --------------------------------------------------------------------------------
471
472 void ResetEffectGroupCooldown(EVehicleVFXEffectGroup groupId)
473 {
474 array<ref VehicleVFXData> groupData = m_EffectGroupsMap.Get(groupId);
475 if (!groupData)
476 return;
477
478 foreach (VehicleVFXData data : groupData)
479 data.ResetCooldown();
480 }
481
482 // --------------------------------------------------------------------------------
483
485 bool IsEffectGroupPlayed(EVehicleVFXEffectGroup groupId)
486 {
487 array<ref VehicleVFXData> groupData = m_EffectGroupsMap.Get(groupId);
488 if (!groupData)
489 return false;
490
491 foreach (VehicleVFXData data : groupData)
492 {
493 if (IsEffectDataPlaying(data))
494 return true;
495 }
496
497 return false;
498 }
499
500 // --------------------------------------------------------------------------------
501
502 void SetEffectGroupPositions(EVehicleVFXEffectGroup groupId, TVectorArray positions)
503 {
504 array<ref VehicleVFXData> groupData = m_EffectGroupsMap.Get(groupId);
505 if (!groupData || !positions)
506 return;
507
508 int count = Math.Min(groupData.Count(), positions.Count());
509 for (int i = 0; i < count; ++i)
510 SetEffectDataPosition(groupData[i], positions[i]);
511 }
512
513 // --------------------------------------------------------------------------------
514
515 void SetEffectGroupParticleState(EVehicleVFXEffectGroup groupId, int particleId)
516 {
517 array<ref VehicleVFXData> groupData = m_EffectGroupsMap.Get(groupId);
518 if (!groupData)
519 return;
520
521 foreach (VehicleVFXData data : groupData)
522 {
523 if (data.m_Effect)
524 data.m_Effect.SetParticleState(particleId);
525 }
526 }
527
528 // --------------------------------------------------------------------------------
529
530 ref ParticleParamsOverrideData GetEffectGroupParticleParamsOverrideData(EVehicleVFXEffectGroup groupId)
531 {
532 array<ref VehicleVFXData> groupData = m_EffectGroupsMap.Get(groupId);
533 if (groupData)
534 {
535 foreach (VehicleVFXData data : groupData)
536 {
537 if (data && data.m_ParticleParamsData)
538 return data.m_ParticleParamsData;
539 }
540 }
541
542 #ifdef DIAG_DEVELOPER
543 ErrorEx(string.Format("No particle params override data set for group %1", EnumTools.EnumToString(EVehicleVFXEffectGroup, groupId)));
544 #endif
545
546 return null;
547 }
548
549 // --------------------------------------------------------------------------------
550
551 void SetSurfaceInfo(SurfaceInfo surfaceInfo)
552 {
553 if (surfaceInfo)
554 {
556 m_SurfaceInfo = surfaceInfo;
557
558 return;
559 }
560
562 }
563
564 // --------------------------------------------------------------------------------
565
566 #ifdef DIAG_DEVELOPER
567 void ListGroups()
568 {
569 foreach (int groupId, array<ref VehicleVFXData> groupData : m_EffectGroupsMap)
570 Print(string.Format("[VFX] group '%1' members=%2", EnumTools.EnumToString(EVehicleVFXEffectGroup, groupId), groupData.Count()));
571 }
572
573 // --------------------------------------------------------------------------------
574
576 void ListCooldowns()
577 {
578 foreach (int effectId, VehicleVFXData data : m_EffectsMap)
579 Print(string.Format("[VFX] '%1' cooldown=%2s canPlay=%3 remaining=%4s", EnumTools.EnumToString(EVehicleVFXEffect, effectId), data.GetCooldown(), data.CanPlay(), data.GetRemainingCooldown()));
580
581 foreach (int groupId, array<ref VehicleVFXData> groupData : m_EffectGroupsMap)
582 {
583 foreach (int index, VehicleVFXData groupEffectData : groupData)
584 Print(string.Format("[VFX] group '%1'[%2] cooldown=%3s canPlay=%4 remaining=%5s", EnumTools.EnumToString(EVehicleVFXEffectGroup, groupId), index, groupEffectData.GetCooldown(), groupEffectData.CanPlay(), groupEffectData.GetRemainingCooldown()));
585 }
586 }
587 #endif
588}
ActionOverrideData int
DayZGame g_Game
Определения DayZGame.c:4074
vector position
Определения DustKickupEffects.c:20
vector orientation
Определения DustKickupEffects.c:21
EVehicleVFXEffect
Identifiers of individual vehicle VFX effects.
Определения EVehicleVFXTypes.c:3
vector m_Position
Cached world position.
Определения Effect.c:43
UseObjectsMode
Определения SurfaceInfo.c:74
void VehicleVFXDataParams(vector position=vector.Zero, vector orientation=vector.Up, float cooldownSec=0.0)
Определения VehicleVFXComponent.c:88
float m_CooldownSec
Определения VehicleVFXComponent.c:86
override void Stop()
Stops all elements this effect consists of.
Определения EffectParticle.c:224
void SetParticleState(int state)
override void SetCurrentLocalPosition(vector pos, bool updateCached=true)
Set the current local position of the managed Particle.
Определения EffectParticle.c:435
Wrapper class for managing particles through SEffectManager.
Определения EffectParticle.c:5
static string EnumToString(typename e, int enumValue)
Return string name of enum value.
Определения EnConvert.c:699
Определения EnConvert.c:688
Определения EnMath.c:7
Legacy way of using particles in the game.
Определения Particle.c:7
static int PlayOnObject(notnull Effect eff, Object obj, vector local_pos="0 0 0", vector local_ori="0 0 0", bool force_rotation_relative_to_world=false)
Play an Effect.
Определения EffectManager.c:70
Manager class for managing Effect (EffectParticle, EffectSound)
Определения EffectManager.c:6
vector position
3D position to trace the surface from
Определения SurfaceInfo.c:100
UseObjectsMode syncMode
See UseObjectsMode, SurfaceTraceType.Roadway only.
Определения SurfaceInfo.c:106
SurfaceInfo surface
Returned SurfaceInfo, plain pointer.
Определения SurfaceInfo.c:134
Определения SurfaceInfo.c:9
void StopEffectGroup(EVehicleVFXEffectGroup groupId)
Определения VehicleVFXComponent.c:405
void SetEffectCooldown(EVehicleVFXEffect effectId, float seconds)
Определения VehicleVFXComponent.c:303
void ResetEffectGroupCooldown(EVehicleVFXEffectGroup groupId)
Определения VehicleVFXComponent.c:472
float GetEffectGroupRemainingCooldown(EVehicleVFXEffectGroup groupId)
longest remaining cooldown across the group members
Определения VehicleVFXComponent.c:453
bool IsEffectDataPlaying(VehicleVFXData data)
Определения VehicleVFXComponent.c:237
void SetEffectGroupParticleState(EVehicleVFXEffectGroup groupId, int particleId)
Определения VehicleVFXComponent.c:515
void StopAllEffects()
Определения VehicleVFXComponent.c:289
bool IsEffectPlayed(EVehicleVFXEffect effectId)
Определения VehicleVFXComponent.c:343
float GetEffectRemainingCooldown(EVehicleVFXEffect effectId)
Определения VehicleVFXComponent.c:323
void PlayEffectData(notnull VehicleVFXData data, EntityAI parent)
Определения VehicleVFXComponent.c:171
void PlayEffect(EVehicleVFXEffect effectId, EntityAI parent=null)
single effect API
Определения VehicleVFXComponent.c:270
SurfaceInfo m_SurfaceInfo
Определения VehicleVFXComponent.c:100
void StopEffectData(VehicleVFXData data)
Определения VehicleVFXComponent.c:225
void SetEffectGroupCooldown(EVehicleVFXEffectGroup groupId, float seconds)
Определения VehicleVFXComponent.c:417
bool m_SurfaceInfoOverriden
Определения VehicleVFXComponent.c:98
bool CanPlayEffectData(VehicleVFXData data)
Определения VehicleVFXComponent.c:247
ref map< int, ref array< ref VehicleVFXData > > m_EffectGroupsMap
keyed by EVehicleVFXEffectGroup
Определения VehicleVFXComponent.c:103
bool CanPlayEffect(EVehicleVFXEffect effectId)
Определения VehicleVFXComponent.c:316
void RegisterEffectGroup(EVehicleVFXEffectGroup groupId, typename effectTypename, int count, VehicleVFXDataParams params)
register multiple instances of single type of effect owned by the given group
Определения VehicleVFXComponent.c:139
void SetEffectDataPosition(VehicleVFXData data, vector position)
Определения VehicleVFXComponent.c:257
void SetEffectParticleState(EVehicleVFXEffect effectId, int particleId)
Определения VehicleVFXComponent.c:364
void ResetEffectCooldown(EVehicleVFXEffect effectId)
Определения VehicleVFXComponent.c:334
ref ParticleParamsOverrideData GetParticleParamsOverrideData(EVehicleVFXEffect effectId)
Определения VehicleVFXComponent.c:373
void StopEffect(EVehicleVFXEffect effectId)
Определения VehicleVFXComponent.c:282
vector ConvertMemPointToPosition(string memoryPointName)
Определения VehicleVFXComponent.c:115
EntityAI m_Parent
Определения VehicleVFXComponent.c:99
void SetSurfaceInfo(SurfaceInfo surfaceInfo)
Определения VehicleVFXComponent.c:551
bool IsEffectGroupPlayed(EVehicleVFXEffectGroup groupId)
true when any member of the group is playing
Определения VehicleVFXComponent.c:485
ref map< int, ref VehicleVFXData > m_EffectsMap
keyed by EVehicleVFXEffect
Определения VehicleVFXComponent.c:102
void SetEffectGroupPositions(EVehicleVFXEffectGroup groupId, TVectorArray positions)
Определения VehicleVFXComponent.c:502
void PlayEffectGroup(EVehicleVFXEffectGroup groupId, EntityAI parent=null)
effect group API
Определения VehicleVFXComponent.c:390
void SetEffectPosition(EVehicleVFXEffect effectId, vector position)
Определения VehicleVFXComponent.c:350
bool CanPlayEffectGroup(EVehicleVFXEffectGroup groupId)
true only when every member of the group can play
Определения VehicleVFXComponent.c:435
VehicleVFXData CreateEffectData(typename effectTypename, VehicleVFXDataParams params)
Определения VehicleVFXComponent.c:157
void VehicleVFXComponent(notnull EntityAI parent)
Определения VehicleVFXComponent.c:105
void RegisterEffect(EVehicleVFXEffect effectId, typename effectTypename, VehicleVFXDataParams params)
register single instance of effect
Определения VehicleVFXComponent.c:126
ref ParticleParamsOverrideData GetEffectGroupParticleParamsOverrideData(EVehicleVFXEffectGroup groupId)
Определения VehicleVFXComponent.c:530
float GetRemainingCooldown()
Определения VehicleVFXComponent.c:61
void SetCooldown(float seconds)
set the cooldown window (in seconds); 0 disables the guard
Определения VehicleVFXComponent.c:28
ref EffectParticle m_Effect
Определения VehicleVFXComponent.c:9
int m_EffectId
Определения VehicleVFXComponent.c:4
ref ParticleParamsOverrideData m_ParticleParamsData
Определения VehicleVFXComponent.c:10
vector m_Orientation
Определения VehicleVFXComponent.c:7
int m_ParticleId
Определения VehicleVFXComponent.c:3
float GetCooldown()
Определения VehicleVFXComponent.c:35
void MarkPlayed()
Определения VehicleVFXComponent.c:54
void SetPosition(vector position)
Определения VehicleVFXComponent.c:20
bool CanPlay()
true if enough time has elapsed since the last playback (or it never played / no cooldown set)
Определения VehicleVFXComponent.c:43
vector m_Position
Определения VehicleVFXComponent.c:6
void ResetCooldown()
Определения VehicleVFXComponent.c:76
int m_LastPlayedTime
g_Game.GetTime() (ms) when this effect last started; -1 = never played
Определения VehicleVFXComponent.c:12
void VehicleVFXData()
Определения VehicleVFXComponent.c:15
float m_CooldownSec
minimum seconds required between playbacks (0 = no guard)
Определения VehicleVFXComponent.c:13
Result for an object found in CGame.IsBoxCollidingGeometryProxy.
Определения Transport.c:70
static const vector Zero
Определения EnConvert.c:123
static const vector Up
Определения EnConvert.c:120
Определения EnConvert.c:119
proto void Print(void var)
Prints content of variable to console/log.
enum ShapeType ErrorEx
array< vector > TVectorArray
Определения EnScript.c:738
static proto float Min(float x, float y)
Returns smaller of two given values.