123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191 |
- class FlareSimulation : Managed
- {
- protected Particle m_ParMainFire;
- protected EffectSound m_BurningSound;
- protected FlareLight m_FlareLight;
- const static float MAX_FARLIGHT_DIST = 40;
- const static float MIN_FARLIGHT_DIST = 5;
-
- static ref NoiseParams m_NoisePar; // Contains the noise data ( template and strength )
- float m_LastNoiseTime = -1;
- float m_NoiseTimer = 0;
- const float NOISE_DELAY = 5; // How much time between two consecutive noise pings
-
- // flare effect rotation
- protected const float FLARE_SPIN_RATE = 1.15; // in degrees per simul tick
- protected const float FLARE_SPIN_RADIUS = 0.18; // radius of circling motion
- protected Entity m_Flare;
- protected vector m_RotationPoint;
- protected vector m_FlarePosition;
- protected float m_RotationDegrees;
-
- static protected typename m_ScriptedLight;
- static protected int m_ParticleId;
-
- void FlareSimulation()
- {
- m_ScriptedLight = FlareLight;
- m_ParticleId = ParticleList.FLAREPROJ_ACTIVATE;
- }
-
- void OnActivation(Entity flare)
- {
- if ( !GetGame().IsServer() || !GetGame().IsMultiplayer() )
- {
- m_FlareLight = FlareLight.Cast( ScriptedLightBase.CreateLight( m_ScriptedLight, Vector(0,0,0) ) );
- if ( m_FlareLight )
- m_FlareLight.AttachOnObject( flare );
-
- if (m_ParMainFire)
- m_ParMainFire.Stop();
- m_Flare = flare;
- m_RotationPoint = m_Flare.GetOrigin();
- m_FlarePosition = m_Flare.GetOrigin() + Vector(FLARE_SPIN_RADIUS,0,FLARE_SPIN_RADIUS);
-
- m_ParMainFire = ParticleManager.GetInstance().PlayInWorld( m_ParticleId, m_FlarePosition );
-
- flare.PlaySoundSetLoop( m_BurningSound, "roadflareLoop_SoundSet", 0, 0 );
- }
-
- if ( GetGame().IsServer() )
- {
- // Create and load noise parameters
- m_NoisePar = new NoiseParams();
- m_NoisePar.LoadFromPath("cfgWeapons Flaregun_Base NoiseFlare");
- }
- }
-
- void OnTermination(Entity flare)
- {
- //MiscGameplayFunctions.GenerateAINoiseAtPosition(flare.GetPosition(), NOISE_DELAY, m_NoisePar);
- }
-
- void OnFire( Entity flare)
- {
- //m_ParMainFire = ParticleManager.GetInstance().PlayOnObject( ParticleList.FLAREPROJ_FIRE, flare);
- //m_ParMainFire.SetWiggle( 7, 0.3);
- }
-
- void Simulate( Entity flare )
- {
- DayZPlayer player = GetGame().GetPlayer();
- if ( player )
- vector playerPos = player.GetPosition();
- float dist = vector.DistanceSq(flare.GetPosition(), playerPos);
-
- if ( ( dist <= MAX_FARLIGHT_DIST * MAX_FARLIGHT_DIST ) && ( dist > MIN_FARLIGHT_DIST * MIN_FARLIGHT_DIST ) )
- m_ParMainFire.SetParameter( 0, EmitorParam.SIZE, MiscGameplayFunctions.Normalize(dist, MAX_FARLIGHT_DIST * MAX_FARLIGHT_DIST) );
-
- if ( dist <= MIN_FARLIGHT_DIST * MIN_FARLIGHT_DIST )
- TurnOffDistantLight();
- //CastFlareAINoise( flare.GetPosition() );
- FlareParticleUpdate();
- }
-
- // Rotate flare particle and set its new position
- protected void FlareParticleUpdate()
- {
- m_RotationDegrees += FLARE_SPIN_RATE;
- if (m_RotationDegrees > 360)
- m_RotationDegrees = 0;
-
- float angleRad = m_RotationDegrees * Math.DEG2RAD;
- float sin = Math.Sin(angleRad);
- float cos = Math.Cos(angleRad);
-
- vector newFlarePos = m_ParMainFire.GetOrigin();
- float surfacePos = GetGame().SurfaceY(newFlarePos[0], newFlarePos[2]);
-
- if (newFlarePos[1] - surfacePos < 1) // reached ground
- {
- if (m_Flare.GetOrigin()[1] <= surfacePos) // actual flare pos might not match and height could be underground
- m_ParMainFire.SetPosition(Vector(newFlarePos[0], surfacePos, newFlarePos[2]));
- else
- m_ParMainFire.SetPosition(Vector(newFlarePos[0], m_Flare.GetOrigin()[1] ,newFlarePos[2]));
-
- return;
- }
- // rotate vector around point
- float xRotated = ((m_FlarePosition[0] - m_RotationPoint[0]) * cos) - ((m_FlarePosition[2] - m_RotationPoint[2]) * sin) + m_RotationPoint[0];
- float yRotated = ((m_FlarePosition[0] - m_RotationPoint[0]) * sin) + ((m_FlarePosition[2] - m_RotationPoint[2]) * cos) + m_RotationPoint[2];
-
- newFlarePos[0] = xRotated;
- newFlarePos[1] = m_Flare.GetOrigin()[1];
- newFlarePos[2] = yRotated;
-
- m_ParMainFire.SetPosition(newFlarePos);
- }
-
- void CastFlareAINoise( vector position )
- {
- if ( m_LastNoiseTime < 0 )
- m_LastNoiseTime = GetGame().GetTime() * 0.0033;
- float delta_time = GetGame().GetTime() * 0.0033 - m_LastNoiseTime;
- m_LastNoiseTime = GetGame().GetTime() * 0.0033;
-
- m_NoiseTimer += delta_time;
- if ( m_NoiseTimer >= NOISE_DELAY )
- {
- MiscGameplayFunctions.GenerateAINoiseAtPosition(position, NOISE_DELAY, m_NoisePar);
-
- m_NoiseTimer = 0;
- }
- }
-
- void TurnOffDistantLight()
- {
- if (m_ParMainFire)
- {
- m_ParMainFire.SetParameter(0, EmitorParam.LIFETIME, 0);
- m_ParMainFire.SetParameter(0, EmitorParam.LIFETIME_RND, 0);
- m_ParMainFire.SetParameter(0, EmitorParam.REPEAT, 0);
- m_ParMainFire.SetParameter(0, EmitorParam.SIZE, 0);
- }
- }
-
- void ~FlareSimulation()
- {
- if (m_ParMainFire)
- m_ParMainFire.Stop();
-
- if (m_BurningSound)
- m_BurningSound.SoundStop();
-
- if (m_FlareLight)
- m_FlareLight.FadeOut();
- }
- }
- class FlareSimulation_Red : FlareSimulation
- {
- void FlareSimulation_Red()
- {
- m_ScriptedLight = FlareLightRed;
- m_ParticleId = ParticleList.FLAREPROJ_ACTIVATE_RED;
- }
- }
- class FlareSimulation_Green : FlareSimulation
- {
- void FlareSimulation_Green()
- {
- m_ScriptedLight = FlareLightGreen;
- m_ParticleId = ParticleList.FLAREPROJ_ACTIVATE_GREEN;
- }
- }
- class FlareSimulation_Blue : FlareSimulation
- {
- void FlareSimulation_Blue()
- {
- m_ScriptedLight = FlareLightBlue;
- m_ParticleId = ParticleList.FLAREPROJ_ACTIVATE_BLUE;
- }
- }
|