Dayz 1.25
Dayz Code Explorer by KGB
Загрузка...
Поиск...
Не найдено
Файл UndergroundHandlerClient.c

См. исходные тексты.

Перечисления

enum  EUndergroundPresence { NONE , OUTER , TRANSITIONING , FULL }
 

Функции

void UndergroundHandlerClient (PlayerBase player)
 
void ~UndergroundHandlerClient ()
 
PPERUndergroundAcco GetRequester ()
 
void OnTriggerEnter (UndergroundTrigger trigger)
 
void OnTriggerLeave (UndergroundTrigger trigger)
 
void CalculateEyeAccoTarget ()
 
void ProcessEyeAcco (float timeSlice)
 
void ProcessLighting (float timeSlice)
 
void ProcessSound (float timeSlice)
 
void Tick (float timeSlice)
 
void ApplyEyeAcco ()
 
void UpdateNVGRequester (float value)
 
bool CalculateEyeAcco (float timeSlice)
 
void OnTriggerInsiderUpdate ()
 
void SetUndergroundPresence (UndergroundTrigger trigger)
 
void EnableLights (bool enable)
 
void OnUpdateTimerEnd ()
 
void OnUpdateTimerIn ()
 
void OnUpdateTimerOut ()
 
void OnUndergroundPresenceUpdate (EUndergroundPresence newPresence, EUndergroundPresence oldPresence)
 

Переменные

enum EUndergroundPresence LIGHT_BLEND_SPEED_IN = 5
 
const float LIGHT_BLEND_SPEED_OUT = 1.75
 
const float MAX_RATIO = 0.9
 
const float RATIO_CUTOFF = 0
 
const float DISTANCE_CUTOFF = 5
 
const float ACCO_MODIFIER = 1
 
const float DEFAULT_INTERPOLATION_SPEED = 7
 
const string UNDERGROUND_LIGHTING = "dz\\data\\lighting\\lighting_underground.txt"
 
ref AnimationTimer m_AnimTimerLightBlend
 
PlayerBase m_Player
 
PPERUndergroundAcco m_Requester
 
PPERequester_CameraNV m_NVRequester
 
ref set< UndergroundTriggerm_InsideTriggers = new set<UndergroundTrigger>()
 
float m_EyeAccoTarget = 1
 
float m_AccoInterpolationSpeed
 
float m_EyeAcco = 1
 
float m_LightingLerpTarget
 
float m_LightingLerp
 
EffectSound m_AmbientSound
 
UndergroundTrigger m_TransitionalTrigger
 

Перечисления

◆ EUndergroundPresence

Элементы перечислений
NONE 
OUTER 
TRANSITIONING 
FULL 
2{
3 NONE,//player is not interacting with underground at any level
4 OUTER,//player is on the outskirts of the underdound, some effects are already in effect, while others might not be
5 TRANSITIONING,//player has entered underground and is in the process of screen darkening transition
6 FULL//the player is now fully entered underground
7}
@ TRANSITIONING
Definition UndergroundHandlerClient.c:5
@ NONE
Definition UndergroundHandlerClient.c:3
@ OUTER
Definition UndergroundHandlerClient.c:4
@ FULL
Definition UndergroundHandlerClient.c:6

Функции

◆ ApplyEyeAcco()

void ApplyEyeAcco ( )
protected
239 {
240 #ifdef DIAG_DEVELOPER
241 if (!DiagMenu.GetBool(DiagMenuIDs.UNDERGROUND_DISABLE_DARKENING) )
242 {
243 GetRequester().SetEyeAccommodation(m_EyeAcco);
244 }
245 else
246 {
247 GetRequester().SetEyeAccommodation(1);
248 }
249 #else
250 GetRequester().SetEyeAccommodation(m_EyeAcco);
251 #endif
252
254 if (m_LightingLerp >= 1.0 || GetDayZGame().GetWorld().IsNight())
255 {
257 }
258 //m_NVRequester.SetUndergroundExposureCoef(undergrounNVExposureCoef);
260 }
DayZGame GetDayZGame()
Definition DayZGame.c:3748
DiagMenuIDs
Definition EDiagMenuIDs.c:2
void UpdateNVGRequester(float value)
Definition UndergroundHandlerClient.c:262
PPERUndergroundAcco GetRequester()
Definition UndergroundHandlerClient.c:54
float m_EyeAcco
Definition UndergroundHandlerClient.c:28
float m_LightingLerp
Definition UndergroundHandlerClient.c:30
Definition EnDebug.c:233
Definition EntityAI.c:95
static proto bool GetBool(int id, bool reverse=false)
Get value as bool from the given script id.

Перекрестные ссылки DiagMenu::GetBool(), GetDayZGame(), GetRequester(), m_EyeAcco, m_LightingLerp и UpdateNVGRequester().

Используется в ProcessEyeAcco().

◆ CalculateEyeAcco()

bool CalculateEyeAcco ( float timeSlice)
protected
268 {
269 if (m_TransitionalTrigger || !m_Player.m_UndergroundPresence || (m_EyeAccoTarget == 1))
270 {
274 if (Math.AbsFloat(accoDiff) < 0.01)
275 {
277 return true;
278 }
279 }
280 else
281 {
283 }
284 return false;
285 }
UndergroundTrigger m_TransitionalTrigger
Definition UndergroundHandlerClient.c:33
PlayerBase m_Player
Definition UndergroundHandlerClient.c:21
float m_EyeAccoTarget
Definition UndergroundHandlerClient.c:26
float m_AccoInterpolationSpeed
Definition UndergroundHandlerClient.c:27
Definition EnMath.c:7
static proto float AbsFloat(float f)
Returns absolute value.

Перекрестные ссылки Math::AbsFloat(), m_AccoInterpolationSpeed, m_EyeAcco, m_EyeAccoTarget, m_Player и m_TransitionalTrigger.

Используется в ProcessEyeAcco().

◆ CalculateEyeAccoTarget()

void CalculateEyeAccoTarget ( )
protected
82 {
83 if (m_TransitionalTrigger && m_TransitionalTrigger.m_Data.Breadcrumbs.Count() >= 2)
84 {
85 float closestDist = float.MAX;
86 float acco;
89
90
91 int excludeMask = 0;
92 foreach (int indx, auto crumb:m_TransitionalTrigger.m_Data.Breadcrumbs)
93 {
94 if (indx > 32)//error handling for exceeding this limit is handled elsewhere
95 break;
96
97 float dist = vector.Distance(m_Player.GetPosition(), crumb.GetPosition());
98 float crumbRadius = m_TransitionalTrigger.m_Data.Breadcrumbs[indx].Radius;
100
101 if (crumbRadius != -1)
102 {
104 }
106 {
107 excludeMask = (excludeMask | (1 << indx));
108 }
109 else if (m_TransitionalTrigger.m_Data.Breadcrumbs[indx].UseRaycast)
110 {
111 int idx = m_Player.GetBoneIndexByName("Head");
112 vector rayStart = m_Player.GetBonePositionWS(idx);
113 vector rayEnd = crumb.GetPosition();
115 float hitFraction;
117
119 {
120 excludeMask = (excludeMask | (1 << indx));
121 }
122 }
123
124 distances.Insert(dist);
125
126 #ifdef DIAG_DEVELOPER
127 if ( DiagMenu.GetBool(DiagMenuIDs.UNDERGROUND_SHOW_BREADCRUMB) )
128 {
129 Debug.DrawSphere(crumb.GetPosition(),0.1, COLOR_RED, ShapeFlags.ONCE);
130 }
131 #endif
132 }
133 float baseDst = distances[0];
134 float sum = 0;
135 //Print(excludeMask);
136 foreach (float dst:distances)
137 {
138 if (dst == 0)
139 dst = 0.1;
140 float dstInv = (baseDst / dst) * baseDst;
141 sum += dstInv;
143 }
144 float sumCheck = 0;
145 float eyeAcco = 0;
146 foreach (int i, float dstInvert:distancesInverted)
147 {
148 /*
149 //Print(m_TransitionalTrigger.m_Data.Breadcrumbs[i].EyeAccommodation);
150 //Print(m_TransitionalTrigger.m_Data.Breadcrumbs.Count());
151 */
152 if ((1 << i) & excludeMask)
153 continue;
154 float ratio = dstInvert / sum;
155 if (ratio > MAX_RATIO)
157 if (ratio > RATIO_CUTOFF)
158 {
159 #ifdef DIAG_DEVELOPER
160 if (DiagMenu.GetBool(DiagMenuIDs.UNDERGROUND_SHOW_BREADCRUMB) )
161 {
162 float intensity = (1-ratio) * 255;
163 Debug.DrawLine(GetGame().GetPlayer().GetPosition() + "0 1 0", m_TransitionalTrigger.m_Data.Breadcrumbs[i].GetPosition(),ARGB(0,255,intensity,intensity),ShapeFlags.ONCE);
164 }
165 #endif
166 eyeAcco += ratio * m_TransitionalTrigger.m_Data.Breadcrumbs[i].EyeAccommodation;
167
168 }
169
170 }
172 }
173 }
PhxInteractionLayers
Definition DayZPhysics.c:2
const float DISTANCE_CUTOFF
Definition UndergroundHandlerClient.c:15
const float ACCO_MODIFIER
Definition UndergroundHandlerClient.c:16
const float RATIO_CUTOFF
Definition UndergroundHandlerClient.c:14
const float MAX_RATIO
Definition UndergroundHandlerClient.c:13
string m_Data
Definition UniversalTemperatureSource.c:205
Definition DayZPhysics.c:124
static proto bool RayCastBullet(vector begPos, vector endPos, PhxInteractionLayers layerMask, Object ignoreObj, out Object hitObject, out vector hitPosition, out vector hitNormal, out float hitFraction)
Definition Debug.c:14
static Shape DrawLine(vector from, vector to, int color=0xFFFFFFFF, int flags=0)
Definition Debug.c:540
static Shape DrawSphere(vector pos, float size=1, int color=0x1fff7f7f, ShapeFlags flags=ShapeFlags.TRANSP|ShapeFlags.NOOUTLINE)
Definition Debug.c:485
Definition ObjectTyped.c:2
Definition EnConvert.c:106
static proto native float Distance(vector v1, vector v2)
Returns the distance between tips of two 3D vectors.
proto native CGame GetGame()
const int COLOR_RED
Definition constants.c:64
ShapeFlags
Definition EnDebug.c:126
int ARGB(int a, int r, int g, int b)
Definition proto.c:322

Перекрестные ссылки ACCO_MODIFIER, ARGB(), COLOR_RED, vector::Distance(), DISTANCE_CUTOFF, Debug::DrawLine(), Debug::DrawSphere(), DiagMenu::GetBool(), GetGame(), m_EyeAccoTarget, m_Player, m_TransitionalTrigger, MAX_RATIO, RATIO_CUTOFF и DayZPhysics::RayCastBullet().

Используется в ProcessEyeAcco().

◆ EnableLights()

void EnableLights ( bool enable)
protected
353 {
354 foreach (ScriptedLightBase light:ScriptedLightBase.m_NightTimeOnlyLights)
355 {
356 light.SetVisibleDuringDaylight(enable);
357 }
358 }
Definition PointLightBase.c:2

Используется в OnUndergroundPresenceUpdate().

◆ GetRequester()

PPERUndergroundAcco GetRequester ( )
protected
55 {
56 if (!m_Requester)
57 {
58 m_Requester = PPERUndergroundAcco.Cast(PPERequesterBank.GetRequester( PPERequesterBank.REQ_UNDERGROUND));
59 m_Requester.Start();
60 }
61 return m_Requester;
62 }
PPERUndergroundAcco m_Requester
Definition UndergroundHandlerClient.c:22

Перекрестные ссылки m_Requester.

Используется в ApplyEyeAcco(), ProcessEyeAcco() и Managed::RegisterRequester().

◆ OnTriggerEnter()

void OnTriggerEnter ( UndergroundTrigger trigger)
protected
65 {
68
69 }
ref set< UndergroundTrigger > m_InsideTriggers
Definition UndergroundHandlerClient.c:24
void OnTriggerInsiderUpdate()
Definition UndergroundHandlerClient.c:289

Перекрестные ссылки m_InsideTriggers и OnTriggerInsiderUpdate().

◆ OnTriggerInsiderUpdate()

void OnTriggerInsiderUpdate ( )
protected
290 {
294 m_EyeAccoTarget = 1;
296
297 foreach (auto t:m_InsideTriggers)
298 {
299 if (t.m_Type > bestType)
300 {
301 bestTrigger = t;
302 bestType = t.m_Type;
303 }
304 }
305 //Print(m_InsideTriggers.Count());
306 //Print(bestType);
307 if (bestTrigger)
308 {
309 if (bestTrigger.m_Type == EUndergroundTriggerType.TRANSITIONING)
310 {
312 }
313 m_EyeAccoTarget = bestTrigger.m_Accommodation;
314 if (bestTrigger.m_InterpolationSpeed != -1 && bestTrigger.m_InterpolationSpeed != 0)
315 m_AccoInterpolationSpeed = bestTrigger.m_InterpolationSpeed;
316 }
317
319 }
const float DEFAULT_INTERPOLATION_SPEED
Definition UndergroundHandlerClient.c:17
void SetUndergroundPresence(UndergroundTrigger trigger)
Definition UndergroundHandlerClient.c:322

Перекрестные ссылки DEFAULT_INTERPOLATION_SPEED, m_AccoInterpolationSpeed, m_EyeAccoTarget, m_InsideTriggers, m_TransitionalTrigger и SetUndergroundPresence().

Используется в OnTriggerEnter() и OnTriggerLeave().

◆ OnTriggerLeave()

void OnTriggerLeave ( UndergroundTrigger trigger)
protected
72 {
73 int index = m_InsideTriggers.Find(trigger);
74 if (index != -1)
75 {
76 m_InsideTriggers.Remove(index);
77 }
79 }

Перекрестные ссылки m_InsideTriggers и OnTriggerInsiderUpdate().

◆ OnUndergroundPresenceUpdate()

void OnUndergroundPresenceUpdate ( EUndergroundPresence newPresence,
EUndergroundPresence oldPresence )
protected
383 {
384 //Print("-----> On Undeground Presence update " + EnumTools.EnumToString(EUndergroundPresence, newPresence) + " " + EnumTools.EnumToString(EUndergroundPresence, oldPresence));
386 {
388 {
389 EnableLights(true);
390 }
392 {
393 GetGame().GetWeather().SuppressLightningSimulation(true);
394 m_Player.PlaySoundSetLoop(m_AmbientSound, "Underground_SoundSet",3,3);
395 }
397 {
399 m_AnimTimerLightBlend.Run(1, this, "OnUpdateTimerIn", "OnUpdateTimerEnd",0, false, LIGHT_BLEND_SPEED_IN);
400 }
401 }
403 {
405 m_AnimTimerLightBlend.Run(0, this, "OnUpdateTimerOut", "OnUpdateTimerEnd",m_LightingLerp, false, LIGHT_BLEND_SPEED_OUT);
406 }
408 {
409 GetGame().GetWeather().SuppressLightningSimulation(false);
410 if (m_AmbientSound)
411 m_Player.StopSoundSet(m_AmbientSound);
412 }
414 {
415 GetGame().GetWorld().SetUserLightingLerp(0);
416 EnableLights(false);
417 }
418 }
ref AnimationTimer m_AnimTimerLightBlend
Definition UndergroundHandlerClient.c:19
enum EUndergroundPresence LIGHT_BLEND_SPEED_IN
EffectSound m_AmbientSound
Definition UndergroundHandlerClient.c:31
void EnableLights(bool enable)
Definition UndergroundHandlerClient.c:352
const float LIGHT_BLEND_SPEED_OUT
Definition UndergroundHandlerClient.c:12
EUndergroundPresence
Definition UndergroundHandlerClient.c:2
AnimationTimer class. This timer is for animating float value. usage:
Definition tools.c:653

Перекрестные ссылки EnableLights(), GetGame(), LIGHT_BLEND_SPEED_IN, LIGHT_BLEND_SPEED_OUT, m_AmbientSound, m_AnimTimerLightBlend, m_LightingLerp и m_Player.

Используется в SetUndergroundPresence().

◆ OnUpdateTimerEnd()

void OnUpdateTimerEnd ( )
protected

◆ OnUpdateTimerIn()

void OnUpdateTimerIn ( )
protected
363 {
365 return;
366 float value01 = m_AnimTimerLightBlend.GetValue();
369
370 }
Input value between 0 and 1, returns value adjusted by easing, no automatic clamping of input(do your...
Definition Easing.c:3
static float EaseInQuint(float t)
Definition Easing.c:78

Перекрестные ссылки Easing::EaseInQuint(), m_AnimTimerLightBlend и m_LightingLerp.

◆ OnUpdateTimerOut()

void OnUpdateTimerOut ( )
protected
373 {
375 return;
376 float value01 = m_AnimTimerLightBlend.GetValue();
379 }
static float EaseOutCubic(float t)
Definition Easing.c:42

Перекрестные ссылки Easing::EaseOutCubic(), m_AnimTimerLightBlend и m_LightingLerp.

◆ ProcessEyeAcco()

void ProcessEyeAcco ( float timeSlice)
protected
176 {
179 ApplyEyeAcco();
180 if(reachedTarget && !m_Player.m_UndergroundPresence)
181 {
182 GetRequester().Stop();
184 //m_NVRequester.SetUndergroundExposureCoef(1.0);
185 m_Player.KillUndergroundHandler();
186 }
187
188 }
bool CalculateEyeAcco(float timeSlice)
Definition UndergroundHandlerClient.c:267
void ApplyEyeAcco()
Definition UndergroundHandlerClient.c:238
void CalculateEyeAccoTarget()
Definition UndergroundHandlerClient.c:81

Перекрестные ссылки ApplyEyeAcco(), CalculateEyeAcco(), CalculateEyeAccoTarget(), GetRequester(), m_Player и UpdateNVGRequester().

Используется в Tick().

◆ ProcessLighting()

void ProcessLighting ( float timeSlice)
protected
191 {
192 #ifdef DEVELOPER
193 if (!DiagMenu.GetBool(DiagMenuIDs.UNDERGROUND_DISABLE_DARKENING) )
194 {
195 GetGame().GetWorld().SetUserLightingLerp(m_LightingLerp);
196 }
197 else
198 {
199 GetGame().GetWorld().SetUserLightingLerp(0);
200 }
201 #else
202 GetGame().GetWorld().SetUserLightingLerp(m_LightingLerp);
203 #endif
204 }

Перекрестные ссылки DiagMenu::GetBool(), GetGame() и m_LightingLerp.

Используется в Tick().

◆ ProcessSound()

void ProcessSound ( float timeSlice)
protected
207 {
208 GetGame().GetWorld().SetExplicitVolumeFactor_EnvSounds2D(m_EyeAcco, 0);
209 if (m_AmbientSound)
210 {
212 //Print(m_AmbientSound.GetSoundVolume());
213 }
214 else
215 {
216 m_Player.PlaySoundSetLoop(m_AmbientSound, "Underground_SoundSet",3,3);
217 }
218 }
void SetSoundVolume(float volume)
Set the RELATIVE volume for the sound.
Definition EffectSound.c:833

Перекрестные ссылки GetGame(), m_AmbientSound, m_EyeAcco, m_Player и EffectSound::SetSoundVolume().

◆ SetUndergroundPresence()

void SetUndergroundPresence ( UndergroundTrigger trigger)
protected
323 {
325 EUndergroundPresence oldPresence = m_Player.m_UndergroundPresence;
326
327 if (trigger)
328 {
329 if (trigger.m_Type == EUndergroundTriggerType.OUTER)
330 {
332 }
333 else if (trigger.m_Type == EUndergroundTriggerType.TRANSITIONING)
334 {
335 newPresence = EUndergroundPresence.TRANSITIONING;
336 }
337 else if (trigger.m_Type == EUndergroundTriggerType.INNER)
338 {
340 }
341 }
342
343 if (newPresence != oldPresence)//was there a change ?
344 {
346 m_Player.SetUnderground(newPresence);
347 }
348
349
350 }
void OnUndergroundPresenceUpdate(EUndergroundPresence newPresence, EUndergroundPresence oldPresence)
Definition UndergroundHandlerClient.c:382

Перекрестные ссылки m_Player и OnUndergroundPresenceUpdate().

Используется в OnTriggerInsiderUpdate().

◆ Tick()

void Tick ( float timeSlice)
protected
221 {
222 if (!m_Player.IsAlive())
223 return;
224
228
229 #ifdef DIAG_DEVELOPER
230 if ( DiagMenu.GetBool(DiagMenuIDs.UNDERGROUND_SHOW_BREADCRUMB) )
231 {
232 DisplayDebugInfo(GetGame().GetWorld().GetEyeAccom(), m_LightingLerp);
233 }
234 #endif
235
236 }
void ProcessSound()
Definition HungerSoundHandler.c:28
void ProcessLighting(float timeSlice)
Definition UndergroundHandlerClient.c:190
void ProcessEyeAcco(float timeSlice)
Definition UndergroundHandlerClient.c:175

Перекрестные ссылки DiagMenu::GetBool(), GetGame(), m_LightingLerp, m_Player, ProcessEyeAcco(), ProcessLighting() и ProcessSound().

◆ UndergroundHandlerClient()

void UndergroundHandlerClient ( PlayerBase player)
protected
36 {
37 GetGame().GetWorld().LoadUserLightingCfg(UNDERGROUND_LIGHTING, "Underground");
39 m_NVRequester = PPERequester_CameraNV.Cast(PPERequesterBank.GetRequester( PPERequesterBank.REQ_CAMERANV));
40 }
PPERequester_CameraNV m_NVRequester
Definition UndergroundHandlerClient.c:23
const string UNDERGROUND_LIGHTING
Definition UndergroundHandlerClient.c:18

Перекрестные ссылки GetGame(), m_NVRequester, m_Player и UNDERGROUND_LIGHTING.

Используется в ManBase::GetUndergroundHandler(), OnEnterClientEvent() и OnLeaveClientEvent().

◆ UpdateNVGRequester()

void UpdateNVGRequester ( float value)
protected
263 {
264 m_NVRequester.SetUndergroundExposureCoef(value);
265 }

Перекрестные ссылки m_NVRequester.

Используется в ApplyEyeAcco() и ProcessEyeAcco().

◆ ~UndergroundHandlerClient()

43 {
44 if (GetGame())
45 {
46 GetGame().GetWorld().SetExplicitVolumeFactor_EnvSounds2D(1, 0.5);
47 GetGame().GetWeather().SuppressLightningSimulation(false);
48 GetGame().GetWorld().SetUserLightingLerp(0);
51 }
52 }
override void Stop()
Stops sound.
Definition EffectSound.c:244

Перекрестные ссылки GetGame(), m_AmbientSound и EffectSound::Stop().

Переменные

◆ ACCO_MODIFIER

const float ACCO_MODIFIER = 1

Используется в CalculateEyeAccoTarget().

◆ DEFAULT_INTERPOLATION_SPEED

const float DEFAULT_INTERPOLATION_SPEED = 7

Используется в OnTriggerInsiderUpdate().

◆ DISTANCE_CUTOFF

const float DISTANCE_CUTOFF = 5

Используется в CalculateEyeAccoTarget().

◆ LIGHT_BLEND_SPEED_IN

enum EUndergroundPresence LIGHT_BLEND_SPEED_IN = 5

Используется в OnUndergroundPresenceUpdate().

◆ LIGHT_BLEND_SPEED_OUT

const float LIGHT_BLEND_SPEED_OUT = 1.75

Используется в OnUndergroundPresenceUpdate().

◆ m_AccoInterpolationSpeed

float m_AccoInterpolationSpeed
protected

Используется в CalculateEyeAcco() и OnTriggerInsiderUpdate().

◆ m_AmbientSound

EffectSound m_AmbientSound
protected

◆ m_AnimTimerLightBlend

ref AnimationTimer m_AnimTimerLightBlend
protected

◆ m_EyeAcco

float m_EyeAcco = 1
protected

Используется в ApplyEyeAcco(), CalculateEyeAcco() и ProcessSound().

◆ m_EyeAccoTarget

float m_EyeAccoTarget = 1
protected

◆ m_InsideTriggers

ref set<UndergroundTrigger> m_InsideTriggers = new set<UndergroundTrigger>()
protected

◆ m_LightingLerp

◆ m_LightingLerpTarget

float m_LightingLerpTarget
protected

◆ m_NVRequester

PPERequester_CameraNV m_NVRequester
protected

Используется в UndergroundHandlerClient() и UpdateNVGRequester().

◆ m_Player

PlayerBase m_Player
protected

◆ m_Requester

◆ m_TransitionalTrigger

UndergroundTrigger m_TransitionalTrigger
protected

◆ MAX_RATIO

const float MAX_RATIO = 0.9

Используется в CalculateEyeAccoTarget().

◆ RATIO_CUTOFF

const float RATIO_CUTOFF = 0

Используется в CalculateEyeAccoTarget().

◆ UNDERGROUND_LIGHTING

const string UNDERGROUND_LIGHTING = "dz\\data\\lighting\\lighting_underground.txt"

Используется в UndergroundHandlerClient().