DayZ 1.28
DayZ Explorer by KGB
 
Загрузка...
Поиск...
Не найдено
GeyserArea.c
См. документацию.
2{
3 DORMANT = 0,
4 ERUPTION_SOON = 1, // bubbling
5 ERUPTING_PRIMARY = 2, // main particle
6 ERUPTING_SECONDARY = 4 // secondary tall particle
7}
8
9class GeyserArea : EffectArea
10{
11 protected const int UPDATE_RATE = 1000; // ms
12 protected const float PRE_ERUPTION_DURATION = 10; // delay before the geysier activates (sec)
13 protected const float ERUPTION_TALL_DURATION = 3; // lenght of secondary eruption (sec)
14 protected const float ERUPTION_TALL_DELAY = 3; // min delay between secondary eruptions (sec)
15
16 protected bool m_SecondaryActive;
17
18 protected int m_TimeElapsed; // seconds
19 protected int m_TimeSecondaryElapsed; // seconds
20 protected float m_RandomizedInterval; // randomized interval to 80% - 120% of the set value
21 protected float m_RandomizedDuration; // randomized duration to 80% - 120% of the set value
23
24 override void DeferredInit()
25 {
26 super.DeferredInit();
27
28 InitZone();
29 }
30
31 override void EEDelete( EntityAI parent )
32 {
33 if (GetGame().IsClient() && m_GeyserTrigger)
34 m_GeyserTrigger.StopEffects();
35
36 super.EEDelete( parent );
37 }
38
39 override void InitZoneServer()
40 {
41 super.InitZoneServer();
42
43 if ( m_TriggerType != "" )
44 {
45 CreateTrigger(m_PositionTrigger, m_Radius);
46 m_GeyserTrigger = GeyserTrigger.Cast(m_Trigger);
47 }
48
50
52 }
53
54 void TickState()
55 {
56 m_TimeElapsed += UPDATE_RATE * 0.001;
57
58 if (m_GeyserTrigger.CheckGeyserState(EGeyserState.DORMANT))
59 {
61 {
62 #ifdef ENABLE_LOGGING
63 Debug.Log(m_Name + ": ERUPTION_SOON, interval: " + m_RandomizedInterval + " sec");
64 #endif
65
66 m_GeyserTrigger.AddGeyserState(EGeyserState.ERUPTION_SOON);
67
68 m_TimeElapsed = 0;
69 }
70 }
71 else if (m_GeyserTrigger.CheckGeyserState(EGeyserState.ERUPTION_SOON))
72 {
74 {
75 #ifdef ENABLE_LOGGING
76 Debug.Log(m_Name + ": ERUPTING_PRIMARY, interval: " + m_RandomizedDuration + " sec");
77 #endif
78
79 m_GeyserTrigger.RemoveGeyserState(EGeyserState.ERUPTION_SOON);
80 m_GeyserTrigger.AddGeyserState(EGeyserState.ERUPTING_PRIMARY);
81
83
85 m_SecondaryActive = false;
86 m_TimeElapsed = 0;
87 }
88 }
89 else if (m_GeyserTrigger.CheckGeyserState(EGeyserState.ERUPTING_PRIMARY))
90 {
92 {
94
95 #ifdef ENABLE_LOGGING
96 Debug.Log(m_Name + ": ERUPTION_SOON, interval: " + m_RandomizedInterval + " sec");
97 #endif
98
99 m_GeyserTrigger.RemoveGeyserState(EGeyserState.ERUPTING_PRIMARY);
100 m_GeyserTrigger.RemoveGeyserState(EGeyserState.ERUPTING_SECONDARY);
101 m_GeyserTrigger.AddGeyserState(EGeyserState.ERUPTION_SOON);
102
103 m_TimeElapsed = 0;
104 }
105 else if (Math.IsInRange(m_TimeElapsed, ERUPTION_TALL_DELAY, m_RandomizedDuration - ERUPTION_TALL_DURATION)) // Ensure burst do not overlap with state transitions
106 {
108 {
109 if (Math.RandomBool()) // 50% chance to start secondary eruption every update
110 {
111 m_GeyserTrigger.AddGeyserState(EGeyserState.ERUPTING_SECONDARY);
112
114 m_SecondaryActive = true;
115 }
116 }
117 else if (m_TimeSecondaryElapsed >= 0)
118 {
120
122 {
123 m_GeyserTrigger.RemoveGeyserState(EGeyserState.ERUPTING_SECONDARY);
124 m_SecondaryActive = false;
125 }
127 {
129 }
130 }
131 }
132 }
133 }
134
135 private void RandomizeIntervals()
136 {
137 m_RandomizedInterval = Math.RandomInt(m_EffectInterval * 0.8, m_EffectInterval * 1.2);
138 m_RandomizedDuration = Math.RandomInt(m_EffectDuration * 0.8, m_EffectDuration * 1.2);
139 }
140
142 {
143 array<Object> nearestObjects = new array<Object>();
144 GetGame().GetObjectsAtPosition(m_Position, m_Radius, nearestObjects, null);
145
146 foreach (Object obj : nearestObjects)
147 {
148 EntityAI entity = EntityAI.Cast(obj);
149 if (entity)
150 entity.ProcessDirectDamage(DamageType.CUSTOM, this, "", "HeatDamage", "0 0 0", 1000);
151 }
152 }
153}
float m_Radius
Определения AIGroupBehaviour.c:10
override void DeferredInit()
Определения ContaminatedArea.c:49
override void InitZoneServer()
Определения ContaminatedArea.c:56
override void EEDelete(EntityAI parent)
Определения ContaminatedArea.c:61
override void InitZone()
Определения ContaminatedArea_DynamicBase.c:61
DamageType
exposed from C++ (do not change)
Определения DamageSystem.c:11
vector m_Position
Cached world position.
Определения Effect.c:43
bool m_SecondaryActive
Определения GeyserArea.c:16
GeyserTrigger m_GeyserTrigger
Определения GeyserArea.c:22
void RandomizeIntervals()
Определения GeyserArea.c:135
int m_TimeElapsed
Определения GeyserArea.c:18
int m_TimeSecondaryElapsed
Определения GeyserArea.c:19
void KillEntitiesInArea()
Определения GeyserArea.c:141
float m_RandomizedInterval
Определения GeyserArea.c:20
const float ERUPTION_TALL_DURATION
Определения GeyserArea.c:13
float m_RandomizedDuration
Определения GeyserArea.c:21
const float ERUPTION_TALL_DELAY
Определения GeyserArea.c:14
const float PRE_ERUPTION_DURATION
Определения GeyserArea.c:12
void TickState()
Определения GeyserArea.c:54
enum EGeyserState UPDATE_RATE
EGeyserState
Определения GeyserArea.c:2
@ ERUPTION_SOON
Определения GeyserArea.c:4
@ DORMANT
Определения GeyserArea.c:3
@ ERUPTING_SECONDARY
Определения GeyserArea.c:6
@ ERUPTING_PRIMARY
Определения GeyserArea.c:5
class SyncedValue m_Name
void CreateTrigger()
Определения TrapBase.c:475
proto native void GetObjectsAtPosition(vector pos, float radius, out array< Object > objects, out array< CargoBase > proxyCargos)
Returns list of all objects in circle "radius" around position "pos".
override ScriptCallQueue GetCallQueue(int call_category)
Определения DayZGame.c:1187
static void Log(string message=LOG_DEFAULT, string plugin=LOG_DEFAULT, string author=LOG_DEFAULT, string label=LOG_DEFAULT, string entity=LOG_DEFAULT)
Prints debug message with normal prio.
Определения 3_Game/tools/Debug.c:122
Определения 3_Game/tools/Debug.c:2
Определения GeyserTrigger.c:2
Определения EnMath.c:7
Определения ObjectTyped.c:2
proto void CallLater(func fn, int delay=0, bool repeat=false, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL)
adds call into the queue with given parameters and arguments (arguments are held in memory until the ...
Result for an object found in CGame.IsBoxCollidingGeometryProxy.
proto native CGame GetGame()
static proto bool IsInRange(float v, float min, float max)
Returns if value is between min and max (inclusive)
static bool RandomBool()
Returns a random bool .
Определения EnMath.c:73
static proto int RandomInt(int min, int max)
Returns a random int number between and min [inclusive] and max [exclusive].
const int CALL_CATEGORY_SYSTEM
Определения 3_Game/tools/tools.c:8