Dayz Explorer 1.29.162510
Loading...
Searching...
No Matches
undergroundhandlerclient.c
Go to the documentation of this file.
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}
8
10{
11 const float LIGHT_BLEND_SPEED_IN = 5;
12 const float LIGHT_BLEND_SPEED_OUT = 1.75;
13 const float MAX_RATIO = 0.9;//how much max ratio between 0..1 can a single breadcrumb occupy
14 const float RATIO_CUTOFF = 0;//what's the minimum ratio a breadcrumb needs to have to be considered when calculatiing accommodation
15 const float DISTANCE_CUTOFF = 5;//we ignore breadcrumbs further than this distance
16 const float ACCO_MODIFIER = 1;//when we calculate eye accommodation between 0..1 based on the breadcrumbs values and distances, we multiply the result by this modifier to get the final eye accommodation value
18 const string UNDERGROUND_LIGHTING = "dz\\data\\lighting\\lighting_underground.txt";
20
22 protected PPERUndergroundAcco m_Requester;
23 protected PPERequester_CameraNV m_NVRequester;
24 protected ref set<UndergroundTrigger> m_InsideTriggers = new set<UndergroundTrigger>();
25
26 protected float m_EyeAccoTarget = 1;
27 protected float m_AccoInterpolationSpeed;
28 protected float m_EyeAcco = 1;
29 protected float m_LightingLerpTarget;
30 protected float m_LightingLerp;
31 protected string m_AmbientController; // active sound controlelr for ambient
33
34 protected UndergroundTrigger m_BestTrigger;
35 protected UndergroundTrigger m_TransitionalTrigger;
36
38 {
39 g_Game.GetWorld().LoadUserLightingCfg(UNDERGROUND_LIGHTING, "Underground");
40 m_Player = player;
41 m_NVRequester = PPERequester_CameraNV.Cast(PPERequesterBank.GetRequester(PPERequesterBank.REQ_CAMERANV));
42 }
43
45 {
46 if (g_Game)
47 {
48 g_Game.GetWorld().SetExplicitVolumeFactor_EnvSounds2D(1, 0.5);
49 g_Game.GetWeather().SuppressLightningSimulation(false);
50 g_Game.GetWorld().SetUserLightingLerp(0);
52 m_AmbientSound.Stop();
53 }
54 }
55
56 protected PPERUndergroundAcco GetRequester()
57 {
58 if (!m_Requester)
59 {
60 m_Requester = PPERUndergroundAcco.Cast(PPERequesterBank.GetRequester( PPERequesterBank.REQ_UNDERGROUND));
61 m_Requester.Start();
62 }
63 return m_Requester;
64 }
65
66 void OnTriggerEnter(UndergroundTrigger trigger)
67 {
68 m_InsideTriggers.Insert(trigger);
70 }
71
72 void OnTriggerLeave(UndergroundTrigger trigger)
73 {
74 int index = m_InsideTriggers.Find(trigger);
75 if (index != -1)
76 m_InsideTriggers.Remove(index);
77
79 }
80
81 protected void CalculateEyeAccoTarget()
82 {
84 return;
85
86 if (m_TransitionalTrigger.m_Data.UseLinePointFade && m_TransitionalTrigger.m_Data.Breadcrumbs.Count() >= 2)
87 {
89 }
90 else if (m_TransitionalTrigger.m_Data.Breadcrumbs.Count() >= 1)
91 {
93 }
94 }
95
96 protected void CalculateBreadCrumbs()
97 {
98 float closestDist = float.MAX;
99 array<float> distances = new array<float>();
100 array<float> distancesInverted = new array<float>();
101
102 int excludeMask = 0;
103 foreach (int indx, auto crumb : m_TransitionalTrigger.m_Data.Breadcrumbs)
104 {
105 if (indx > 32)//error handling for exceeding this limit is handled elsewhere
106 break;
107
108 float dist = vector.Distance(m_Player.GetPosition(), crumb.GetPosition());
109 float crumbRadius = m_TransitionalTrigger.m_Data.Breadcrumbs[indx].Radius;
110 float maxRadiusAllowed = DISTANCE_CUTOFF;
111
112 switch (crumb.ExternalValueController.Type)
113 {
114 case "DoorState":
115 {
116 BreadcrumbDoorStateController ctrl = new BreadcrumbDoorStateController(crumb.ExternalValueController.Params);
117 if (!ctrl || (ctrl && ctrl.SelectionName == ""))
118 break;
119
120 Building building = Building.Cast(m_TransitionalTrigger.GetTriggerParentObject());
121 if (!building)
122 break;
123
124 float animPhase = building.GetAnimationPhase(ctrl.SelectionName);
125 m_LightingLerpTarget = Math.Clamp(Easing.EaseInOutQuint(1 - animPhase), 0.0, 1.0);
126 m_LightingLerp = Easing.EaseInQuint(1 - Math.Remap(0.2, 0.5, 0.0, 1.0, animPhase));
127 m_EyeAccoTarget = Math.Remap(0.2, 0.5, 0.0, m_TransitionalTrigger.m_Data.Breadcrumbs[indx].EyeAccommodation, animPhase * ACCO_MODIFIER);
128
129 return;
130 }
131 }
132
133 if (crumbRadius != -1)
134 maxRadiusAllowed = crumbRadius;
135 if (dist > maxRadiusAllowed)
136 excludeMask = (excludeMask | (1 << indx));
137 else if (m_TransitionalTrigger.m_Data.Breadcrumbs[indx].UseRaycast)
138 {
139 vector rayStart;
140 MiscGameplayFunctions.GetHeadBonePos(m_Player, rayStart);
141 vector rayEnd = crumb.GetPosition();
142 vector hitPos, hitNormal;
143 float hitFraction;
144 Object hitObj;
145
146 if (DayZPhysics.RayCastBullet(rayStart, rayEnd,PhxInteractionLayers.TERRAIN | PhxInteractionLayers.ROADWAY| PhxInteractionLayers.BUILDING, null, hitObj, hitPos, hitNormal, hitFraction))
147 {
148 excludeMask = (excludeMask | (1 << indx));
149 }
150 }
151
152 distances.Insert(dist);
153
154 #ifdef DIAG_DEVELOPER
155 if ( DiagMenu.GetBool(DiagMenuIDs.UNDERGROUND_SHOW_BREADCRUMB) )
156 Debug.DrawSphere(crumb.GetPosition(),0.1, COLOR_RED, ShapeFlags.ONCE);
157 #endif
158 }
159
160 float baseDst = distances[0];
161 float sum = 0;
162
163 foreach (float dst:distances)
164 {
165 if (dst == 0)
166 dst = 0.1;
167 float dstInv = (baseDst / dst) * baseDst;
168 sum += dstInv;
169 distancesInverted.Insert(dstInv);
170 }
171
172 float sumCheck = 0;
173 float eyeAcco = 0;
174 foreach (int i, float dstInvert:distancesInverted)
175 {
176 if ((1 << i) & excludeMask)
177 continue;
178
179 float ratio = dstInvert / sum;
180 if (ratio > MAX_RATIO)
181 ratio = MAX_RATIO;
182
183 if (ratio > RATIO_CUTOFF)
184 {
185 #ifdef DIAG_DEVELOPER
186 if (DiagMenu.GetBool(DiagMenuIDs.UNDERGROUND_SHOW_BREADCRUMB) )
187 {
188 float intensity = (1-ratio) * 255;
189 Debug.DrawLine(g_Game.GetPlayer().GetPosition() + "0 1 0", m_TransitionalTrigger.m_Data.Breadcrumbs[i].GetPosition(),ARGB(0,255,intensity,intensity),ShapeFlags.ONCE);
190 }
191 #endif
192
193 eyeAcco += ratio * m_TransitionalTrigger.m_Data.Breadcrumbs[i].EyeAccommodation;
194 }
195 }
196
197 m_EyeAccoTarget = eyeAcco * ACCO_MODIFIER;
198 }
199
200 protected void CalculateLinePointFade()
201 {
203 JsonUndergroundAreaBreadcrumb startPoint = points[0];
204 JsonUndergroundAreaBreadcrumb endPoint = points[points.Count() - 1];
205 vector playerPos = m_Player.GetPosition();
206
207 bool forceAcco;
208 float acco;
209 float accoMax = m_TransitionalTrigger.m_Data.Breadcrumbs[0].EyeAccommodation;
210 float accoMin = endPoint.EyeAccommodation;
211 JsonUndergroundAreaBreadcrumb closestPoint;
212 JsonUndergroundAreaBreadcrumb secondaryPoint;
213 float distanceToClosest;
214 float distanceToSecondary;
215 float distanceBetweenPoints;
216
217 foreach (JsonUndergroundAreaBreadcrumb point : points) //identify closest segment
218 {
219 float dist = vector.DistanceSq(playerPos, point.GetPosition());
220 if (!closestPoint || dist < distanceToClosest)
221 {
222 if (closestPoint)
223 {
224 secondaryPoint = closestPoint;
225 distanceToSecondary = distanceToClosest;
226 }
227 closestPoint = point;
228 distanceToClosest = dist;
229 }
230 else if (!secondaryPoint || dist < secondaryPoint)
231 {
232 secondaryPoint = point;
233 distanceToSecondary = dist;
234 }
235
236 #ifdef DIAG_DEVELOPER
237 if (DiagMenu.GetBool(DiagMenuIDs.UNDERGROUND_SHOW_BREADCRUMB))
238 Debug.DrawSphere(point.GetPosition(),0.1, COLOR_RED, ShapeFlags.ONCE);
239 #endif
240 }
241
242 distanceBetweenPoints = vector.DistanceSq(closestPoint.GetPosition(), secondaryPoint.GetPosition());
243
244 if (closestPoint == startPoint && secondaryPoint == points[1] && distanceToSecondary > distanceBetweenPoints) // before first point, do nothing
245 acco = accoMax;
246 else if (closestPoint == endPoint && secondaryPoint == points[points.Count() - 2] && distanceToSecondary > distanceBetweenPoints) // past second point, do nothing
247 acco = accoMin;
248 else // between the two points, lerp
249 {
250 if (closestPoint == endPoint)
251 secondaryPoint = points[points.Count() - 2];
252 else if (closestPoint == startPoint)
253 secondaryPoint = points[1];
254 else if (distanceBetweenPoints < distanceToClosest || distanceBetweenPoints < distanceToSecondary)
255 {
256 JsonUndergroundAreaBreadcrumb nexPoint = points[points.Find(closestPoint) + 1];
257 if (vector.DistanceSq(playerPos, nexPoint.GetPosition()) < vector.DistanceSq(closestPoint.GetPosition(), nexPoint.GetPosition()))
258 secondaryPoint = nexPoint;
259 else
260 {
261 acco = closestPoint.EyeAccommodation;
262 forceAcco = true;
263 }
264 }
265
266 if (!forceAcco)
267 {
268 distanceToSecondary = vector.DistanceSq(playerPos, secondaryPoint.GetPosition());
269
270 acco = distanceToSecondary / (distanceToClosest + distanceToSecondary); // progress
271 acco = Math.Lerp(secondaryPoint.EyeAccommodation, closestPoint.EyeAccommodation, acco);
272
273 if (points.Find(closestPoint) > points.Find(secondaryPoint))
274 m_LightingLerpTarget = closestPoint.LightLerp;
275 else
276 m_LightingLerpTarget = secondaryPoint.LightLerp;
277
278 }
279 }
280
282
284 {
285 if (m_LightingLerpTarget == 1)
286 {
288 m_AnimTimerLightBlend.Run(1, this, "OnUpdateTimerIn", "OnUpdateTimerEnd",0, false, LIGHT_BLEND_SPEED_IN);
289 }
290 else
291 {
293 m_AnimTimerLightBlend.Run(0, this, "OnUpdateTimerOut", "OnUpdateTimerEnd",m_LightingLerp, false, LIGHT_BLEND_SPEED_OUT);
294 }
295 }
296
297 #ifdef DIAG_DEVELOPER
298 if (DiagMenu.GetBool(DiagMenuIDs.UNDERGROUND_SHOW_BREADCRUMB))
299 {
300 vector headPosition;
301 MiscGameplayFunctions.GetHeadBonePos(m_Player, headPosition);
302 Debug.DrawLine(headPosition, closestPoint.GetPosition(), COLOR_YELLOW, ShapeFlags.ONCE);
303 if (acco != accoMin && acco != accoMax)
304 Debug.DrawLine(closestPoint.GetPosition(), secondaryPoint.GetPosition(), COLOR_RED, ShapeFlags.ONCE);
305
306 DbgUI.Begin(String("Underground Areas"), 20, 20);
307 DbgUI.Text(String("Closest point id: " + points.Find(closestPoint)));
308 DbgUI.Text(String("Second closest id: " + points.Find(secondaryPoint)));
309 DbgUI.End();
310 }
311 #endif
312 }
313
314 protected void ProcessEyeAcco(float timeSlice)
315 {
317 bool reachedTarget = CalculateEyeAcco(timeSlice);
318 ApplyEyeAcco();
319 if(reachedTarget && !m_Player.m_UndergroundPresence)
320 {
321 GetRequester().Stop();
323 //m_NVRequester.SetUndergroundExposureCoef(1.0);
324 m_Player.KillUndergroundHandler();
325 }
326
327 }
328
329 protected void ProcessLighting(float timeSlice)
330 {
331 #ifdef DEVELOPER
332 if (!DiagMenu.GetBool(DiagMenuIDs.UNDERGROUND_DISABLE_DARKENING) )
333 {
334 g_Game.GetWorld().SetUserLightingLerp(m_LightingLerp);
335 }
336 else
337 {
338 g_Game.GetWorld().SetUserLightingLerp(0);
339 }
340 #else
341 g_Game.GetWorld().SetUserLightingLerp(m_LightingLerp);
342 #endif
343 }
344
345 protected void ProcessSound(float timeSlice)
346 {
347 if (m_BestTrigger && m_BestTrigger.m_Data && m_BestTrigger.m_Data.AmbientSoundType != string.Empty) // caves use sound controllers so EnvSounds2D shouldnt be touched
348 return;
349
350 // reduces all env sounds and increases ambient based on eye acco
351 g_Game.GetWorld().SetExplicitVolumeFactor_EnvSounds2D(m_EyeAcco, 0);
352
353 if (m_AmbientSound)
354 {
355 if (m_TransitionalTrigger && m_TransitionalTrigger.m_Data.Breadcrumbs.Count() >= 2)
356 m_AmbientSound.SetSoundVolume(1-m_EyeAcco);
357 }
358 }
359
360 void Tick(float timeSlice)
361 {
362 if (!m_Player.IsAlive())
363 return;
364
365 ProcessEyeAcco(timeSlice);
366 ProcessLighting(timeSlice);
367 ProcessSound(timeSlice);
368
369 #ifdef DIAG_DEVELOPER
370 if ( DiagMenu.GetBool(DiagMenuIDs.UNDERGROUND_SHOW_BREADCRUMB) )
371 {
372 DisplayDebugInfo(g_Game.GetWorld().GetEyeAccom(), m_LightingLerp);
373 }
374 #endif
375
376 }
377
378 protected void ApplyEyeAcco()
379 {
380 #ifdef DIAG_DEVELOPER
381 if (!DiagMenu.GetBool(DiagMenuIDs.UNDERGROUND_DISABLE_DARKENING) )
382 {
383 GetRequester().SetEyeAccommodation(m_EyeAcco);
384 }
385 else
386 {
387 GetRequester().SetEyeAccommodation(1);
388 }
389 #else
390 GetRequester().SetEyeAccommodation(m_EyeAcco);
391 #endif
392
393 float undergrounNVExposureCoef = m_EyeAcco;
394 if (m_LightingLerp >= 1.0 || GetDayZGame().GetWorld().IsNight())
395 {
396 undergrounNVExposureCoef = 1.0;
397 }
398 //m_NVRequester.SetUndergroundExposureCoef(undergrounNVExposureCoef);
399 UpdateNVGRequester(undergrounNVExposureCoef);
400 }
401
402 protected void UpdateNVGRequester(float value)
403 {
404 m_NVRequester.SetUndergroundExposureCoef(value);
405 }
406
407 protected bool CalculateEyeAcco(float timeSlice)
408 {
409 if (m_TransitionalTrigger || !m_Player.m_UndergroundPresence || (m_EyeAccoTarget == 1))
410 {
411 float accoDiff = m_EyeAccoTarget - m_EyeAcco;
412 float increase = accoDiff * m_AccoInterpolationSpeed * timeSlice;
413 m_EyeAcco += increase;
414 if (Math.AbsFloat(accoDiff) < 0.01)
415 {
417 return true;
418 }
419 }
420 else
421 {
423 }
424 return false;
425 }
426
427
428
429 protected void OnTriggerInsiderUpdate()
430 {
431 EUndergroundTriggerType bestType = EUndergroundTriggerType.UNDEFINED;
433 UndergroundTrigger bestTrigger;
434 m_EyeAccoTarget = 1;
436
437 foreach (auto t:m_InsideTriggers)
438 {
439 if (t.m_Type > bestType)
440 {
441 bestTrigger = t;
442 bestType = t.m_Type;
443 }
444 }
445 //Print(m_InsideTriggers.Count());
446 //Print(bestType);
447 if (bestTrigger)
448 {
449 m_BestTrigger = bestTrigger;
450
451 if (bestTrigger.m_Type == EUndergroundTriggerType.TRANSITIONING)
452 {
453 m_TransitionalTrigger = bestTrigger;
454 }
455 m_EyeAccoTarget = bestTrigger.m_Accommodation;
456 if (bestTrigger.m_InterpolationSpeed != -1 && bestTrigger.m_InterpolationSpeed != 0)
457 m_AccoInterpolationSpeed = bestTrigger.m_InterpolationSpeed;
458 }
459
460 SetUndergroundPresence(bestTrigger);
461 }
462
463
464 protected void SetUndergroundPresence(UndergroundTrigger trigger)
465 {
467 EUndergroundPresence oldPresence = m_Player.m_UndergroundPresence;
468
469 if (trigger)
470 {
471 if (trigger.m_Type == EUndergroundTriggerType.OUTER)
472 newPresence = EUndergroundPresence.OUTER;
473 else if (trigger.m_Type == EUndergroundTriggerType.TRANSITIONING)
474 newPresence = EUndergroundPresence.TRANSITIONING;
475 else if (trigger.m_Type == EUndergroundTriggerType.INNER)
476 newPresence = EUndergroundPresence.FULL;
477 }
478
479 if (newPresence != oldPresence)//was there a change ?
480 {
481 OnUndergroundPresenceUpdate(newPresence, oldPresence);
482 m_Player.SetUnderground(newPresence);
483 }
484 }
485
486 protected void EnableLights(bool enable)
487 {
488 foreach (ScriptedLightBase light:ScriptedLightBase.m_NightTimeOnlyLights)
489 {
490 light.SetVisibleDuringDaylight(enable);
491 }
492 }
493
495
497 {
499 return;
500 float value01 = m_AnimTimerLightBlend.GetValue();
501 float result = Easing.EaseInQuint(value01);
502 m_LightingLerp = result;
503
504 }
505
507 {
509 return;
510 float value01 = m_AnimTimerLightBlend.GetValue();
511 float result = Easing.EaseOutCubic(value01);
512 m_LightingLerp = result;
513 }
514
515 protected void PlayAmbientSound()
516 {
517 if (m_BestTrigger)
518 {
519 if (m_BestTrigger.m_Data.AmbientSoundType != string.Empty)
520 {
521 m_AmbientController = m_BestTrigger.m_Data.AmbientSoundType;
522 SetSoundControllerOverride(m_AmbientController, 1.0, SoundControllerAction.Overwrite);
523 }
524 if (m_BestTrigger.m_Data.AmbientSoundSet != string.Empty)
525 {
526 if (m_AmbientSound && m_BestTrigger.m_Data.AmbientSoundSet != m_AmbientSound.GetSoundSet())
528
529 m_Player.PlaySoundSetLoop(m_AmbientSound, m_BestTrigger.m_Data.AmbientSoundSet, 3, 3);
530 }
531
532 }
533 }
534
535 protected void StopAmbientSound()
536 {
537 if (m_AmbientController != string.Empty)
538 {
539 SetSoundControllerOverride(m_AmbientController, 0, SoundControllerAction.None);
540 m_AmbientController = string.Empty;
541 }
542 else if (m_AmbientSound)
543 m_Player.StopSoundSet(m_AmbientSound);
544 }
545
547 {
548 //Print("-----> On Undeground Presence update " + EnumTools.EnumToString(EUndergroundPresence, newPresence) + " " + EnumTools.EnumToString(EUndergroundPresence, oldPresence));
549 if (newPresence > EUndergroundPresence.NONE)
550 {
551 if (oldPresence == EUndergroundPresence.NONE)
552 {
553 EnableLights(true);
554 if (m_BestTrigger && m_BestTrigger.m_Data)
556 }
557 if (newPresence > EUndergroundPresence.OUTER && oldPresence <= EUndergroundPresence.OUTER)
558 {
559 g_Game.GetWeather().SuppressLightningSimulation(true);
561 }
562 if (newPresence == EUndergroundPresence.FULL)
563 {
565 m_AnimTimerLightBlend.Run(1.0, this, "OnUpdateTimerIn", "OnUpdateTimerEnd", m_LightingLerp, false, LIGHT_BLEND_SPEED_IN);
566 }
567 }
568 if (newPresence < EUndergroundPresence.FULL && oldPresence == EUndergroundPresence.FULL)
569 {
571 m_AnimTimerLightBlend.Run(0.0, this, "OnUpdateTimerOut", "OnUpdateTimerEnd", m_LightingLerp, false, LIGHT_BLEND_SPEED_OUT);
572 }
573 if (newPresence <= EUndergroundPresence.OUTER && oldPresence > EUndergroundPresence.OUTER)
574 {
575 g_Game.GetWeather().SuppressLightningSimulation(false);
576 }
577 if (newPresence == EUndergroundPresence.NONE)
578 {
580
581 if (oldPresence >= EUndergroundPresence.OUTER)
582 {
583 g_Game.GetWorld().SetUserLightingLerp(0);
584 EnableLights(false);
585 }
586 }
587 }
588
589 #ifdef DIAG_DEVELOPER
590 protected void DisplayDebugInfo(float acco, float lighting)
591 {
592 if (acco < 0.0001)
593 acco = 0;
594 DbgUI.Begin(String("Underground Areas"), 20, 20);
595 DbgUI.Text(String("Eye Accomodation: " + acco.ToString()));
596 DbgUI.Text(String("Lighting lerp: " + lighting.ToString()));
597 DbgUI.End();
598 }
599 #endif
600}
enum EWetnessLevel FULL
map m_Player
AnimationTimer class. This timer is for animating float value. usage:
Definition tools.c:651
Definition dbgui.c:60
Definition debug.c:2
Input value between 0 and 1, returns value adjusted by easing, no automatic clamping of input(do your...
Definition easing.c:3
Wrapper class for managing sound through SEffectManager.
Definition effectsound.c:5
Definition enmath.c:7
Result for an object found in CGame.IsBoxCollidingGeometryProxy.
override void Tick()
DayZGame g_Game
Definition dayzgame.c:3942
DayZGame GetDayZGame()
Definition dayzgame.c:3944
PhxInteractionLayers
Definition dayzphysics.c:2
DiagMenuIDs
Definition ediagmenuids.c:2
const int COLOR_RED
Definition constants.c:64
const int COLOR_YELLOW
Definition constants.c:67
ShapeFlags
Definition endebug.c:126
string String(string s)
Helper for passing string expression to functions with void parameter. Example: Print(String("Hello "...
Definition enscript.c:339
@ NONE
body is not in simulation, nor in collision world
SetSoundControllerOverride(string controllerName, float value, SoundControllerAction action)
Empty
Definition hand_states.c:14
void ProcessSound()
int ARGB(int a, int r, int g, int b)
Definition proto.c:322
void BreadcrumbDoorStateController(TStringArray params)
bool CalculateEyeAcco(float timeSlice)
void ApplyEyeAcco()
void StopAmbientSound()
void UndergroundHandlerClient(PlayerBase player)
ref AnimationTimer m_AnimTimerLightBlend
const float DEFAULT_INTERPOLATION_SPEED
const float DISTANCE_CUTOFF
void OnTriggerLeave(UndergroundTrigger trigger)
string m_AmbientController
UndergroundTrigger m_TransitionalTrigger
PPERUndergroundAcco m_Requester
void UpdateNVGRequester(float value)
const float ACCO_MODIFIER
void CalculateEyeAccoTarget()
ref set< UndergroundTrigger > m_InsideTriggers
enum EUndergroundPresence LIGHT_BLEND_SPEED_IN
PPERUndergroundAcco GetRequester()
EffectSound m_AmbientSound
void CalculateLinePointFade()
void OnTriggerInsiderUpdate()
void OnUpdateTimerEnd()
UndergroundTrigger m_BestTrigger
const float RATIO_CUTOFF
float m_EyeAcco
void CalculateBreadCrumbs()
void ProcessLighting(float timeSlice)
void EnableLights(bool enable)
float m_LightingLerpTarget
const float LIGHT_BLEND_SPEED_OUT
void ~UndergroundHandlerClient()
void OnUndergroundPresenceUpdate(EUndergroundPresence newPresence, EUndergroundPresence oldPresence)
float m_EyeAccoTarget
PPERequester_CameraNV m_NVRequester
float m_AccoInterpolationSpeed
void OnTriggerEnter(UndergroundTrigger trigger)
void OnUpdateTimerIn()
void OnUpdateTimerOut()
void ProcessEyeAcco(float timeSlice)
float m_LightingLerp
const string UNDERGROUND_LIGHTING
void SetUndergroundPresence(UndergroundTrigger trigger)
const float MAX_RATIO
void PlayAmbientSound()