DayZ 1.30
DayZ Explorer by KGB
 
Загрузка...
Поиск...
Не найдено
GeyserArea.c
См. документацию.
1//#define GEYSER_LOGGING
2
4{
5 DORMANT = 0,
6 ERUPTION_SOON = 1, // bubbling
7 ERUPTING_PRIMARY = 2, // main particle
8 ERUPTING_SECONDARY = 4 // secondary tall particle
9}
10
11class GeyserArea : EffectArea
12{
13 protected const int UPDATE_RATE = 1000; // ms
14 protected const float PRE_ERUPTION_DURATION = 10; // delay before the geysier activates (sec)
15 protected const float ERUPTION_TALL_DURATION = 3; // lenght of secondary eruption (sec)
16 protected const float ERUPTION_TALL_DELAY = 3; // min delay between secondary eruptions (sec)
17
18 protected bool m_SecondaryActive;
19
20 protected int m_TimeElapsed; // seconds
21 protected int m_TimeSecondaryElapsed; // seconds
22 protected float m_RandomizedInterval; // randomized interval to 80% - 120% of the set value
23 protected float m_RandomizedDuration; // randomized duration to 80% - 120% of the set value
25
26 override void DeferredInit()
27 {
28 super.DeferredInit();
29
30 InitZone();
31 }
32
33 override void EEDelete( EntityAI parent )
34 {
35 if (g_Game.IsClient() && m_GeyserTrigger)
36 m_GeyserTrigger.StopEffects();
37
38 super.EEDelete( parent );
39 }
40
41 override void InitZoneServer()
42 {
43 super.InitZoneServer();
44
45 if ( m_TriggerType != "" )
46 {
47 CreateTrigger(m_PositionTrigger, m_Radius);
48 m_GeyserTrigger = GeyserTrigger.Cast(m_Trigger);
49 }
50
51 g_Game.GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(TickState, UPDATE_RATE, true);
52
54 }
55
56 void TickState()
57 {
58 m_TimeElapsed += UPDATE_RATE * 0.001;
59
60 #ifdef DIAG_DEVELOPER
61 bool diagEnabled;
62 float diagTimeInterval;
63 float diagTimeDuration;
64
65 GeyserDebugData geyserDebugData = g_Game.m_GeyserDiagData;
66 if (geyserDebugData)
67 {
68 diagEnabled = geyserDebugData.m_DiagEnabled;
69 diagTimeInterval = geyserDebugData.m_DiagTimeInterval;
70 diagTimeDuration = geyserDebugData.m_DiagTimeDuration;
71 }
72
73 float logInterval = m_RandomizedInterval;
74 if (diagEnabled)
75 {
76 logInterval = diagTimeInterval;
77 }
78
79 #ifdef GEYSER_LOGGING
80 ErrorEx("Geyser state=" + typename.EnumToString(EGeyserState, m_GeyserTrigger.GetGeyserState()) + " | Bits=" + m_GeyserTrigger.GetGeyserState() + " | Interval=" + logInterval + " | Time Elapsed=" + m_TimeElapsed, ErrorExSeverity.INFO);
81 #endif
82 #endif
83
84 if (m_GeyserTrigger.CheckGeyserState(EGeyserState.DORMANT))
85 {
87 {
88 #ifdef ENABLE_LOGGING
89 #ifdef GEYSER_LOGGING
90 #ifndef DIAG_DEVELOPER
91 Debug.Log(m_Name + ": ERUPTION_SOON, interval: " + m_RandomizedInterval + " sec");
92 #else
93 if (!diagEnabled)
94 {
95 Debug.Log(m_Name + ": ERUPTION_SOON, interval: " + m_RandomizedInterval + " sec");
96 }
97 else
98 {
99 Debug.Log(m_Name + ": ERUPTION_SOON, interval: " + diagTimeInterval + " sec");
100 }
101 #endif
102 #endif
103 #endif
104
105 m_GeyserTrigger.AddGeyserState(EGeyserState.ERUPTION_SOON);
106
107 m_TimeElapsed = 0;
108 }
109 }
110 else if (m_GeyserTrigger.CheckGeyserState(EGeyserState.ERUPTION_SOON))
111 {
112 #ifndef DIAG_DEVELOPER
114 #else
115 if (!diagEnabled && m_TimeElapsed >= m_RandomizedInterval || diagEnabled && m_TimeElapsed >= diagTimeInterval)
116 #endif
117 {
118 #ifdef ENABLE_LOGGING
119 #ifdef GEYSER_LOGGING
120 #ifndef DIAG_DEVELOPER
121 Debug.Log(m_Name + ": ERUPTING_PRIMARY, interval: " + m_RandomizedDuration + " sec");
122 #else
123 if (!diagEnabled)
124 {
125 Debug.Log(m_Name + ": ERUPTING_PRIMARY, interval: " + m_RandomizedDuration + " sec");
126 }
127 else
128 {
129 Debug.Log(m_Name + ": ERUPTING_PRIMARY, interval: " + diagTimeDuration + " sec");
130 }
131 #endif
132 #endif
133 #endif
134
135 m_GeyserTrigger.RemoveGeyserState(EGeyserState.ERUPTION_SOON);
136 m_GeyserTrigger.AddGeyserState(EGeyserState.ERUPTING_PRIMARY);
137
139
141 m_SecondaryActive = false;
142 m_TimeElapsed = 0;
143 }
144 }
145 else if (m_GeyserTrigger.CheckGeyserState(EGeyserState.ERUPTING_PRIMARY))
146 {
147 #ifndef DIAG_DEVELOPER
149 #else
150 if (!diagEnabled && m_TimeElapsed >= m_RandomizedDuration || diagEnabled && m_TimeElapsed >= diagTimeDuration)
151 #endif
152 {
154
155 #ifdef ENABLE_LOGGING
156 #ifdef GEYSER_LOGGING
157 Debug.Log(m_Name + ": ERUPTION_SOON, interval: " + m_RandomizedInterval + " sec");
158 #endif
159 #endif
160
161 m_GeyserTrigger.RemoveGeyserState(EGeyserState.ERUPTING_PRIMARY);
162 m_GeyserTrigger.RemoveGeyserState(EGeyserState.ERUPTING_SECONDARY);
163 m_GeyserTrigger.AddGeyserState(EGeyserState.ERUPTION_SOON);
164
165 m_TimeElapsed = 0;
166 }
167 #ifndef DIAG_DEVELOPER
168 else if (Math.IsInRange(m_TimeElapsed, ERUPTION_TALL_DELAY, m_RandomizedDuration - ERUPTION_TALL_DURATION)) // Ensure burst do not overlap with state transitions
169 #else
170 else if (!diagEnabled && Math.IsInRange(m_TimeElapsed, ERUPTION_TALL_DELAY, m_RandomizedDuration - ERUPTION_TALL_DURATION) || diagEnabled && Math.IsInRange(m_TimeElapsed, ERUPTION_TALL_DELAY, diagTimeDuration - ERUPTION_TALL_DURATION)) // Ensure burst do not overlap with state transitions
171 #endif
172 {
174 {
175 if (Math.RandomBool()) // 50% chance to start secondary eruption every update
176 {
177 m_GeyserTrigger.AddGeyserState(EGeyserState.ERUPTING_SECONDARY);
178
180 m_SecondaryActive = true;
181 }
182 }
183 else if (m_TimeSecondaryElapsed >= 0)
184 {
186
188 {
189 m_GeyserTrigger.RemoveGeyserState(EGeyserState.ERUPTING_SECONDARY);
190 m_SecondaryActive = false;
191 }
193 {
195 }
196 }
197 }
198 }
199 }
200
201 private void RandomizeIntervals()
202 {
203 m_RandomizedInterval = Math.RandomInt(m_EffectInterval * 0.8, m_EffectInterval * 1.2);
204 m_RandomizedDuration = Math.RandomInt(m_EffectDuration * 0.8, m_EffectDuration * 1.2);
205 }
206
208 {
209 array<Object> nearestObjects = new array<Object>();
210 g_Game.GetObjectsAtPosition(m_Position, m_Radius, nearestObjects, null);
211
212 foreach (Object obj : nearestObjects)
213 {
214 EntityAI entity = EntityAI.Cast(obj);
215 if (entity)
216 entity.ProcessDirectDamage(DamageType.CUSTOM, this, "", "HeatDamage", "0 0 0", 1000);
217 }
218 }
219}
string m_Name
Определения 3_Game/DayZ/InventoryItemType.c:34
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
DayZGame g_Game
Определения DayZGame.c:4074
vector m_Position
Cached world position.
Определения Effect.c:43
bool m_SecondaryActive
Определения GeyserArea.c:18
GeyserTrigger m_GeyserTrigger
Определения GeyserArea.c:24
void RandomizeIntervals()
Определения GeyserArea.c:201
int m_TimeElapsed
Определения GeyserArea.c:20
int m_TimeSecondaryElapsed
Определения GeyserArea.c:21
void KillEntitiesInArea()
Определения GeyserArea.c:207
float m_RandomizedInterval
Определения GeyserArea.c:22
const float ERUPTION_TALL_DURATION
Определения GeyserArea.c:15
float m_RandomizedDuration
Определения GeyserArea.c:23
const float ERUPTION_TALL_DELAY
Определения GeyserArea.c:16
const float PRE_ERUPTION_DURATION
Определения GeyserArea.c:14
void TickState()
Определения GeyserArea.c:56
enum EGeyserState UPDATE_RATE
EGeyserState
Определения GeyserArea.c:4
@ ERUPTION_SOON
Определения GeyserArea.c:6
@ DORMANT
Определения GeyserArea.c:5
@ ERUPTING_SECONDARY
Определения GeyserArea.c:8
@ ERUPTING_PRIMARY
Определения GeyserArea.c:7
void CreateTrigger()
Определения TrapBase.c:474
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/DayZ/tools/Debug.c:183
Определения 3_Game/DayZ/tools/Debug.c:2
Определения GeyserTrigger.c:4
Определения EnMath.c:7
Определения ObjectTyped.c:2
Result for an object found in CGame.IsBoxCollidingGeometryProxy.
ErrorExSeverity
Определения EnDebug.c:62
enum ShapeType ErrorEx
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/DayZ/tools/tools.c:8