12 float m_LifetimeStart;
13 float m_LifetimeEnd = -1;
14 float m_FadeOutTime = -1;
15 float m_FadeInTime = -1;
19 float m_BrightnessPulse;
20 float m_BrightnessPulseSpeed;
21 float m_BrightnessPulseAmplitudeMax;
22 float m_BrightnessPulseAmplitudeMin;
23 float m_BrightnessTarget;
24 float m_BrightnessSpeedOfChange = 1;
25 float m_RadiusSpeedOfChange = 1;
26 float m_OptimizeShadowsRadius = 0;
28 float m_DancingShadowsAmplitude;
29 float m_DancingShadowsSpeed;
31 float m_BlinkingSpeed;
34 bool m_IsDebugEnabled =
false;
44 static ref set<ScriptedLightBase> m_NightTimeOnlyLights =
new set<ScriptedLightBase>();
57 if (m_NightTimeOnlyLights)
59 int index = m_NightTimeOnlyLights.Find(
this);
62 m_NightTimeOnlyLights.Remove(index);
69 if (!IsVisibleDuringDaylight())
72 if (player && player.m_UndergroundPresence)
73 SetVisibleDuringDaylight(
true);
74 m_NightTimeOnlyLights.Insert(
this);
89 item.GetInventory().GetCurrentInventoryLocation( il );
95 else if (il.GetSlot() != -1)
103 private void UpdateLightMode(
string slotName);
106 private void DeleteLightWithDelay()
115 m_DeleteTimer.Run( 0.03 ,
this,
"DeleteLightNow", NULL,
true);
121 private void DeleteLightNow()
127 void AttachOnObject(
Object parent,
vector local_pos =
"0 0 0",
vector local_ori =
"0 0 0")
149 SetOrientation(local_ori);
151 parent.AddChild(
this, -1);
162 void AttachOnMemoryPoint(
Object parent,
string memory_point_start,
string memory_point_target =
"")
164 if (parent.MemoryPointExists(memory_point_start))
166 m_LocalPos = parent.GetMemoryPointPos(memory_point_start);
169 if (memory_point_target !=
"" )
171 if (parent.MemoryPointExists(memory_point_target))
173 vector target_pos = parent.GetSelectionPositionLS(memory_point_target);
175 local_ori = target_pos.VectorToAngles();
179 ErrorEx(
"memory point 'memory_point_target' not found when attaching light");
182 AttachOnObject(parent,
m_LocalPos, local_ori);
187 ErrorEx(
"memory point 'memory_point_start' not found when attaching light");
192 void DetachFromParent()
201 if ( !
m_Parent.ToDelete() && !ToDelete() )
212 static ScriptedLightBase CreateLightAtObjMemoryPoint(
typename name, notnull
Object target,
string memory_point_start,
string memory_point_target =
"",
vector global_pos =
"0 0 0",
float fade_in_time_in_s = 0)
215 if (target.MemoryPointExists(memory_point_start))
218 light.AttachOnMemoryPoint(target, memory_point_start, memory_point_target);
234 Error(
"Error! Light entity of name " +
name.ToString() +
" cannot be spawned! This name is incorrect or not inherited from ScriptedLightBase." );
238 if (fade_in_time_in_s != 0)
240 light_instance.FadeIn(fade_in_time_in_s);
247 Error(
"An instance of ScriptedLightBase was attempted to spawn on server side! Lights are CLIENT SIDE ONLY!");
251 return light_instance;
255 void SetBrightnessTo(
float value)
257 m_Brightness = value;
258 m_BrightnessTarget = value;
259 SetBrightness(m_Brightness * m_BrightnessPulse);
260 CorrectLightPulseDuringDaylight();
264 void CorrectLightPulseDuringDaylight()
266 if (m_Brightness < 100)
268 float v = m_Brightness * 0.01;
272 float brightness_compesation = 1 / v;
273 float compenset_brightness = (m_Brightness * m_BrightnessPulse) * brightness_compesation;
274 SetBrightness(compenset_brightness);
285 void FadeBrightnessTo(
float value,
float time_in_s )
287 m_BrightnessTarget = value;
291 m_BrightnessSpeedOfChange = 9999;
295 m_BrightnessSpeedOfChange =
Math.AbsFloat(m_Brightness - m_BrightnessTarget) / time_in_s;
300 void SetRadiusTo(
float value)
303 m_RadiusTarget = value;
308 void FadeRadiusTo(
float value,
float time_in_s )
310 m_RadiusTarget = value;
314 m_RadiusSpeedOfChange = 9999;
318 m_RadiusSpeedOfChange =
Math.AbsFloat(
m_Radius - m_RadiusTarget) / time_in_s;
328 DeleteLightWithDelay();
334 void SetLifetime(
float life_in_s)
341 void SetFadeOutTime(
float time_in_s)
343 m_FadeOutTime = time_in_s * 1000;
347 void FadeOut(
float time_in_s = -1)
349 float time_in_ms = time_in_s * 1000;
353 float kill_time_in_s = m_FadeOutTime*0.001;
355 FadeBrightnessTo(0, kill_time_in_s);
356 FadeRadiusTo(0, kill_time_in_s);
357 SetLifetime(kill_time_in_s);
361 FadeBrightnessTo(0, time_in_s);
362 FadeRadiusTo(0, time_in_s);
363 SetLifetime(time_in_s);
368 void FadeIn(
float time_in_s)
370 float brightness = m_Brightness;
372 FadeBrightnessTo(brightness, time_in_s);
376 void AddLifetime(
float life_in_s)
378 m_LifetimeEnd += life_in_s * 1000;
382 void OnFrameLightSource(
IEntity other,
float timeSlice)
393 if ( CheckLifetime(current_time) )
402 HandleFlickering(current_time - m_LifetimeStart, timeSlice);
403 HandleDancingShadows(current_time - m_LifetimeStart, timeSlice);
404 CheckFadeOut(current_time);
405 HandleBrightnessFadeing(timeSlice);
406 HandleRadiusFadeing(timeSlice);
409 m_LightDimming.HandleDimming(timeSlice);
411 CheckIfParentIsInCargo();
412 TryShadowOptimization();
413 OnFrameLightSource(other, timeSlice);
415 HandleBlinking(current_time);
419 void SetDancingShadowsAmplitude(
float max_deviation_in_meters)
421 m_DancingShadowsAmplitude =
Math.AbsFloat(max_deviation_in_meters);
425 void SetDancingShadowsMovementSpeed(
float speed_in_meters_per_frame)
427 m_DancingShadowsSpeed =
Math.AbsFloat(speed_in_meters_per_frame);
431 float GetDancingShadowsAmplitude()
433 return m_DancingShadowsAmplitude;
437 float GetDancingShadowsMovementSpeed()
439 return m_DancingShadowsSpeed;
443 void SetSelectionID(
int id)
445 m_HiddenSelectionID = id;
449 void UpdateLightSourceMaterial(
string path)
453 parent.SetObjectMaterial(m_HiddenSelectionID,
path);
459 m_IsDebugEnabled = state;
463 void HandleDancingShadows(
float time,
float timeSlice)
465 if (m_DancingShadowsAmplitude > 0)
467 for (
int i = 0; i < 3; i++ )
469 m_DancingShadowsLocalPos[i] = m_DancingShadowsLocalPos[i] + (
Math.RandomFloat(-m_DancingShadowsSpeed,m_DancingShadowsSpeed) * timeSlice) ;
471 if (m_DancingShadowsLocalPos[i] > m_DancingShadowsAmplitude)
472 m_DancingShadowsLocalPos[i] = m_DancingShadowsAmplitude;
474 if (m_DancingShadowsLocalPos[i] < -m_DancingShadowsAmplitude)
475 m_DancingShadowsLocalPos[i] = -m_DancingShadowsAmplitude;
490 if (m_IsDebugEnabled)
498 m_DancingShadowsLocalPos =
Vector(0,0,0);
503 void HandleFlickering(
float time,
float timeSlice)
505 if (m_BrightnessPulseAmplitudeMax > 0)
507 m_BrightnessPulse += (
Math.RandomFloat(-m_BrightnessPulseSpeed, m_BrightnessPulseSpeed) ) * timeSlice;
509 if (m_BrightnessPulse < m_BrightnessPulseAmplitudeMin + 1)
510 m_BrightnessPulse = m_BrightnessPulseAmplitudeMin + 1;
512 if (m_BrightnessPulse > m_BrightnessPulseAmplitudeMax + 1)
513 m_BrightnessPulse = m_BrightnessPulseAmplitudeMax + 1;
518 m_BrightnessPulse = 1;
523 void SetFlickerSpeed(
float speed)
525 m_BrightnessPulseSpeed = speed;
529 void SetFlickerAmplitude(
float coef)
531 m_BrightnessPulseAmplitudeMax =
Math.AbsFloat(coef);
532 m_BrightnessPulseAmplitudeMin = -
Math.AbsFloat(coef);
535 void SetFlickerAmplitudeMax(
float coef)
537 m_BrightnessPulseAmplitudeMax = coef;
540 void SetFlickerAmplitudeMin(
float coef)
542 m_BrightnessPulseAmplitudeMin = coef;
546 float GetFlickerSpeed()
548 return m_BrightnessPulseSpeed;
552 float GetFlickerAmplitudeCoefMax()
554 return m_BrightnessPulseAmplitudeMax;
558 float GetFlickerAmplitudeCoefMin()
560 return m_BrightnessPulseAmplitudeMin;
564 void TryShadowOptimization()
566 if (m_OptimizeShadowsRadius > 0)
570 if (distance_to_camera < m_OptimizeShadowsRadius)
572 SetCastShadow(
false);
582 void SetDisableShadowsWithinRadius(
float radius_in_m)
584 m_OptimizeShadowsRadius = radius_in_m;
588 float GetDisableShadowsWithinRadius()
590 return m_OptimizeShadowsRadius;
593 void CheckIfParentIsInCargo()
611 EntityAI parent2 = parent_EAI.GetHierarchyParent();
613 if (parent2 && parent2.GetInventory())
615 is_in_cargo = parent2.GetInventory().IsInCargo();
633 private bool CheckLifetime(
int current_time)
635 if ( current_time > m_LifetimeEnd && m_LifetimeEnd != -1 )
645 private void CheckFadeOut(
int current_time)
648 if ( m_FadeOutTime != -1 && m_LifetimeEnd != -1 && current_time > m_LifetimeEnd - m_FadeOutTime )
652 float time_left_in_s = (m_LifetimeEnd - current_time) * 0.001;
653 FadeBrightnessTo(0, time_left_in_s);
654 FadeRadiusTo(0, time_left_in_s);
659 private void HandleBrightnessFadeing(
float timeSlice)
661 if ( m_Brightness != m_BrightnessTarget )
663 float brightness_difference = m_Brightness - m_BrightnessTarget;
665 if (brightness_difference > m_BrightnessSpeedOfChange*timeSlice)
666 brightness_difference = m_BrightnessSpeedOfChange*timeSlice;
668 if (brightness_difference < -m_BrightnessSpeedOfChange*timeSlice)
669 brightness_difference = -m_BrightnessSpeedOfChange*timeSlice;
671 m_Brightness -= brightness_difference;
673 if ( m_Brightness > 0 || m_BrightnessTarget > 0)
675 SetBrightness(m_Brightness * m_BrightnessPulse);
676 CorrectLightPulseDuringDaylight();
686 SetBrightness(m_Brightness * m_BrightnessPulse);
687 CorrectLightPulseDuringDaylight();
692 private void HandleRadiusFadeing(
float timeSlice)
696 float radius_difference =
m_Radius - m_RadiusTarget;
698 if (radius_difference > m_RadiusSpeedOfChange*timeSlice)
699 radius_difference = m_RadiusSpeedOfChange*timeSlice;
701 if (radius_difference < -m_RadiusSpeedOfChange*timeSlice)
702 radius_difference = -m_RadiusSpeedOfChange*timeSlice;
706 if (
m_Radius > 0 || m_RadiusTarget > 0)
723 void SetBlinkingSpeed(
float _speed)
725 m_BlinkingSpeed = _speed;
729 float GetBlinkingSpeed()
731 return m_BlinkingSpeed;
735 private void HandleBlinking(
float time)
737 if ( m_BlinkingSpeed <= 0 )
742 multiplier =
Math.Sin(time * 0.001 * m_BlinkingSpeed);
743 multiplier = (multiplier + 1)/2;
745 multiplier =
Math.Round(multiplier);
746 SetBrightness(m_Brightness * multiplier);
750 void EnableDimming(
float baseBrightness,
DimmingConfig dimCfg)
753 m_LightDimming =
new LightDimming(
this, baseBrightness, dimCfg);
758 return m_LightDimming;
763 m_LightDimming = null;