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(); } }
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); } }; }
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(); } }
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)); } }