コード例 #1
0
        public void Update(float dt)
        {
            float num = float.MaxValue;

            if (m_explosiveDataByPoint.Count > 0)
            {
                ExplosiveData[] array = m_explosiveDataByPoint.Values.ToArray();
                foreach (ExplosiveData explosiveData in array)
                {
                    Point3 point     = explosiveData.Point;
                    int    cellValue = m_subsystemTerrain.Terrain.GetCellValue(point.X, point.Y, point.Z);
                    int    num2      = Terrain.ExtractContents(cellValue);
                    Block  block     = BlocksManager.Blocks[num2];
                    if (explosiveData.FuseParticleSystem == null)
                    {
                        GunpowderKegBlock gunpowderKegBlock = block as GunpowderKegBlock;
                        if (gunpowderKegBlock != null)
                        {
                            explosiveData.FuseParticleSystem = new FuseParticleSystem(new Vector3(point.X, point.Y, point.Z) + gunpowderKegBlock.FuseOffset);
                            m_subsystemParticles.AddParticleSystem(explosiveData.FuseParticleSystem);
                        }
                    }
                    explosiveData.TimeToExplosion -= dt;
                    if (explosiveData.TimeToExplosion <= 0f)
                    {
                        m_subsystemExplosions.TryExplodeBlock(explosiveData.Point.X, explosiveData.Point.Y, explosiveData.Point.Z, cellValue);
                    }
                    float x = m_subsystemAudio.CalculateListenerDistance(new Vector3(point.X, point.Y, point.Z) + new Vector3(0.5f));
                    num = MathUtils.Min(num, x);
                }
            }
            m_fuseSound.Volume = SettingsManager.SoundsVolume * m_subsystemAudio.CalculateVolume(num, 2f);
            if (m_fuseSound.Volume > AudioManager.MinAudibleVolume)
            {
                m_fuseSound.Play();
            }
            else
            {
                m_fuseSound.Pause();
            }
        }
コード例 #2
0
 public override void Load(ValuesDictionary valuesDictionary)
 {
     m_subsystemGameInfo      = base.Project.FindSubsystem <SubsystemGameInfo>(throwOnError: true);
     SubsystemTerrain         = base.Project.FindSubsystem <SubsystemTerrain>(throwOnError: true);
     m_subsystemBlocksScanner = base.Project.FindSubsystem <SubsystemBlocksScanner>(throwOnError: true);
     SubsystemSky             = base.Project.FindSubsystem <SubsystemSky>(throwOnError: true);
     m_subsystemParticles     = base.Project.FindSubsystem <SubsystemParticles>(throwOnError: true);
     SubsystemTime            = base.Project.FindSubsystem <SubsystemTime>(throwOnError: true);
     m_subsystemAudio         = base.Project.FindSubsystem <SubsystemAudio>(throwOnError: true);
     m_precipitationStartTime = valuesDictionary.GetValue <double>("WeatherStartTime");
     m_precipitationEndTime   = valuesDictionary.GetValue <double>("WeatherEndTime");
     m_lightningIntensity     = valuesDictionary.GetValue <float>("LightningIntensity");
     m_rainSound              = m_subsystemAudio.CreateSound("Audio/Rain");
     m_rainSound.IsLooped     = true;
     m_rainSound.Volume       = 0f;
     RainSplashParticleSystem = new RainSplashParticleSystem();
     m_subsystemParticles.AddParticleSystem(RainSplashParticleSystem);
     SnowSplashParticleSystem = new SnowSplashParticleSystem();
     m_subsystemParticles.AddParticleSystem(SnowSplashParticleSystem);
     m_rainVolumeFactor = 0f;
     for (int i = -5; i <= 5; i++)
     {
         for (int j = -5; j <= 5; j++)
         {
             float distance = MathUtils.Sqrt(i * i + j * j);
             m_rainVolumeFactor += m_subsystemAudio.CalculateVolume(distance, 1.5f);
         }
     }
     m_subsystemBlocksScanner.ScanningChunkCompleted += delegate(TerrainChunk chunk)
     {
         if (m_subsystemGameInfo.WorldSettings.EnvironmentBehaviorMode == EnvironmentBehaviorMode.Living)
         {
             FreezeThawAndDepositSnow(chunk);
         }
     };
 }
コード例 #3
0
        public void Update(float dt)
        {
            if (m_subsystemGameInfo.TotalElapsedGameTime > m_precipitationEndTime)
            {
                if (m_precipitationEndTime == 0.0)
                {
                    if (m_subsystemGameInfo.WorldSettings.StartingPositionMode == StartingPositionMode.Hard)
                    {
                        m_precipitationStartTime = m_subsystemGameInfo.TotalElapsedGameTime + (double)(60f * m_random.Float(2f, 3f));
                        m_lightningIntensity     = m_random.Float(0.5f, 1f);
                    }
                    else
                    {
                        m_precipitationStartTime = m_subsystemGameInfo.TotalElapsedGameTime + (double)(60f * m_random.Float(3f, 6f));
                        m_lightningIntensity     = m_random.Float(0.33f, 0.66f);
                    }
                }
                else
                {
                    m_precipitationStartTime = m_subsystemGameInfo.TotalElapsedGameTime + (double)(60f * m_random.Float(5f, 45f));
                    m_lightningIntensity     = ((m_random.Float(0f, 1f) < 0.5f) ? m_random.Float(0.33f, 1f) : 0f);
                }
                m_precipitationEndTime = m_precipitationStartTime + (double)(60f * m_random.Float(3f, 6f));
            }
            float num = (float)MathUtils.Max(0.0, MathUtils.Min(m_subsystemGameInfo.TotalElapsedGameTime - m_precipitationStartTime, m_precipitationEndTime - m_subsystemGameInfo.TotalElapsedGameTime));

            GlobalPrecipitationIntensity = (m_subsystemGameInfo.WorldSettings.AreWeatherEffectsEnabled ? MathUtils.Saturate(num * 0.04f) : 0f);
            if (GlobalPrecipitationIntensity == 1f && SubsystemTime.PeriodicGameTimeEvent(1.0, 0.0))
            {
                TerrainChunk[] allocatedChunks = SubsystemTerrain.Terrain.AllocatedChunks;
                for (int i = 0; i < allocatedChunks.Length; i++)
                {
                    TerrainChunk terrainChunk = allocatedChunks[m_random.Int(0, allocatedChunks.Length - 1)];
                    if (terrainChunk.State < TerrainChunkState.InvalidVertices1 || !m_random.Bool(m_lightningIntensity * 0.0002f))
                    {
                        continue;
                    }
                    int     num2   = terrainChunk.Origin.X + m_random.Int(0, 15);
                    int     num3   = terrainChunk.Origin.Y + m_random.Int(0, 15);
                    Vector3?vector = null;
                    for (int j = num2 - 8; j < num2 + 8; j++)
                    {
                        for (int k = num3 - 8; k < num3 + 8; k++)
                        {
                            int topHeight = SubsystemTerrain.Terrain.GetTopHeight(j, k);
                            if (!vector.HasValue || (float)topHeight > vector.Value.Y)
                            {
                                vector = new Vector3(j, topHeight, k);
                            }
                        }
                    }
                    if (vector.HasValue)
                    {
                        SubsystemSky.MakeLightningStrike(vector.Value);
                        return;
                    }
                }
            }
            if (Time.PeriodicEvent(0.5, 0.0))
            {
                float num4 = 0f;
                if (GlobalPrecipitationIntensity > 0f)
                {
                    float num5 = 0f;
                    foreach (Vector3 listenerPosition in m_subsystemAudio.ListenerPositions)
                    {
                        int     num6    = Terrain.ToCell(listenerPosition.X) - 5;
                        int     num7    = Terrain.ToCell(listenerPosition.Z) - 5;
                        int     num8    = Terrain.ToCell(listenerPosition.X) + 5;
                        int     num9    = Terrain.ToCell(listenerPosition.Z) + 5;
                        Vector3 vector2 = default(Vector3);
                        for (int l = num6; l <= num8; l++)
                        {
                            for (int m = num7; m <= num9; m++)
                            {
                                PrecipitationShaftInfo precipitationShaftInfo = GetPrecipitationShaftInfo(l, m);
                                if (precipitationShaftInfo.Type == PrecipitationType.Rain && precipitationShaftInfo.Intensity > 0f)
                                {
                                    vector2.X = (float)l + 0.5f;
                                    vector2.Y = MathUtils.Max(precipitationShaftInfo.YLimit, listenerPosition.Y);
                                    vector2.Z = (float)m + 0.5f;
                                    float num10    = vector2.X - listenerPosition.X;
                                    float num11    = 8f * (vector2.Y - listenerPosition.Y);
                                    float num12    = vector2.Z - listenerPosition.Z;
                                    float distance = MathUtils.Sqrt(num10 * num10 + num11 * num11 + num12 * num12);
                                    num5 += m_subsystemAudio.CalculateVolume(distance, 1.5f) * precipitationShaftInfo.Intensity;
                                }
                            }
                        }
                    }
                    num4 = MathUtils.Max(num4, num5);
                }
                m_targetRainSoundVolume = MathUtils.Saturate(1.5f * num4 / m_rainVolumeFactor);
            }
            m_rainSound.Volume = MathUtils.Saturate(MathUtils.Lerp(m_rainSound.Volume, SettingsManager.SoundsVolume * m_targetRainSoundVolume, 5f * dt));
            if (m_rainSound.Volume > AudioManager.MinAudibleVolume)
            {
                m_rainSound.Play();
            }
            else
            {
                m_rainSound.Pause();
            }
        }
コード例 #4
0
 public void Update(float dt)
 {
     if (!base.IsAddedToProject)
     {
         return;
     }
     if (IsOnFire)
     {
         m_fireDuration = MathUtils.Max(m_fireDuration - dt, 0f);
         if (m_onFireParticleSystem == null)
         {
             m_onFireParticleSystem = new OnFireParticleSystem();
             m_subsystemParticles.AddParticleSystem(m_onFireParticleSystem);
         }
         BoundingBox boundingBox = ComponentBody.BoundingBox;
         m_onFireParticleSystem.Position = 0.5f * (boundingBox.Min + boundingBox.Max);
         m_onFireParticleSystem.Radius   = 0.5f * MathUtils.Min(boundingBox.Max.X - boundingBox.Min.X, boundingBox.Max.Z - boundingBox.Min.Z);
         if (ComponentBody.ImmersionFactor > 0.5f && ComponentBody.ImmersionFluidBlock is WaterBlock)
         {
             Extinguish();
             m_subsystemAudio.PlaySound("Audio/SizzleLong", 1f, 0f, m_onFireParticleSystem.Position, 4f, autoDelay: true);
         }
         if (Time.PeriodicEvent(0.5, 0.0))
         {
             float distance = m_subsystemAudio.CalculateListenerDistance(ComponentBody.Position);
             m_soundVolume = m_subsystemAudio.CalculateVolume(distance, 2f, 5f);
         }
         m_subsystemAmbientSounds.FireSoundVolume = MathUtils.Max(m_subsystemAmbientSounds.FireSoundVolume, m_soundVolume);
     }
     else
     {
         if (m_onFireParticleSystem != null)
         {
             m_onFireParticleSystem.IsStopped = true;
             m_onFireParticleSystem           = null;
         }
         m_soundVolume = 0f;
     }
     if (!(m_subsystemTime.GameTime > m_nextCheckTime))
     {
         return;
     }
     m_nextCheckTime = m_subsystemTime.GameTime + (double)m_random.Float(0.9f, 1.1f);
     TouchesFire     = CheckIfBodyTouchesFire();
     if (TouchesFire)
     {
         m_fireTouchCount++;
         if (m_fireTouchCount >= 5)
         {
             SetOnFire(null, m_random.Float(12f, 15f));
         }
     }
     else
     {
         m_fireTouchCount = 0;
     }
     if (ComponentBody.ImmersionFactor > 0.2f && ComponentBody.ImmersionFluidBlock is MagmaBlock)
     {
         SetOnFire(null, m_random.Float(12f, 15f));
     }
 }