public bool RetractExtendSpikes(int x, int y, int z, bool extend) { int cellValue = base.SubsystemTerrain.Terrain.GetCellValue(x, y, z); int num = Terrain.ExtractContents(cellValue); if (BlocksManager.Blocks[num] is SpikedPlankBlock) { int data = SpikedPlankBlock.SetSpikesState(Terrain.ExtractData(cellValue), extend); int value = Terrain.ReplaceData(cellValue, data); base.SubsystemTerrain.ChangeCell(x, y, z, value); Vector3 vector = new Vector3(x, y, z); float num2 = m_subsystemAudio.CalculateListenerDistance(vector); if (!m_closestSoundToPlay.HasValue || num2 < m_subsystemAudio.CalculateListenerDistance(m_closestSoundToPlay.Value)) { m_closestSoundToPlay = vector; } return(true); } return(false); }
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 void PostprocessExplosions(bool playExplosionSound) { Point3 point = Point3.Zero; float num = float.MaxValue; float num2 = 0f; foreach (KeyValuePair <Point3, float> item in m_pressureByPoint.ToDictionary()) { num2 += item.Value; float num3 = m_subsystemAudio.CalculateListenerDistance(new Vector3(item.Key)); if (num3 < num) { num = num3; point = item.Key; } float num4 = 0.001f * MathUtils.Pow(num2, 0.5f); float num5 = MathUtils.Saturate(item.Value / 15f - num4) * m_random.Float(0.2f, 1f); if (num5 > 0.1f) { m_explosionParticleSystem.SetExplosionCell(item.Key, num5); } } foreach (KeyValuePair <Point3, SurroundingPressurePoint> item2 in m_surroundingPressureByPoint.ToDictionary()) { int cellValue = m_subsystemTerrain.Terrain.GetCellValue(item2.Key.X, item2.Key.Y, item2.Key.Z); int num6 = Terrain.ExtractContents(cellValue); SubsystemBlockBehavior[] blockBehaviors = m_subsystemBlockBehaviors.GetBlockBehaviors(num6); if (blockBehaviors.Length != 0) { for (int i = 0; i < blockBehaviors.Length; i++) { blockBehaviors[i].OnExplosion(cellValue, item2.Key.X, item2.Key.Y, item2.Key.Z, item2.Value.Pressure); } } float probability = item2.Value.IsIncendiary ? 0.5f : 0.2f; Block block = BlocksManager.Blocks[num6]; if (block.FireDuration > 0f && item2.Value.Pressure / block.ExplosionResilience > 0.2f && m_random.Bool(probability)) { m_subsystemFireBlockBehavior.SetCellOnFire(item2.Key.X, item2.Key.Y, item2.Key.Z, item2.Value.IsIncendiary ? 1f : 0.3f); } } foreach (ComponentBody body in m_subsystemBodies.Bodies) { CalculateImpulseAndDamage(body, null, out Vector3 impulse, out float damage); impulse *= m_random.Float(0.5f, 1.5f); damage *= m_random.Float(0.5f, 1.5f); body.ApplyImpulse(impulse); body.Entity.FindComponent <ComponentHealth>()?.Injure(damage, null, ignoreInvulnerability: false, "Blasted by explosion"); body.Entity.FindComponent <ComponentDamage>()?.Damage(damage); ComponentOnFire componentOnFire = body.Entity.FindComponent <ComponentOnFire>(); if (componentOnFire != null && m_random.Float(0f, 1f) < MathUtils.Min(damage - 0.1f, 0.5f)) { componentOnFire.SetOnFire(null, m_random.Float(6f, 8f)); } } foreach (Pickable pickable in m_subsystemPickables.Pickables) { Block block2 = BlocksManager.Blocks[Terrain.ExtractContents(pickable.Value)]; CalculateImpulseAndDamage(pickable.Position + new Vector3(0f, 0.5f, 0f), 20f, null, out Vector3 impulse2, out float damage2); if (damage2 / block2.ExplosionResilience > 0.1f) { TryExplodeBlock(Terrain.ToCell(pickable.Position.X), Terrain.ToCell(pickable.Position.Y), Terrain.ToCell(pickable.Position.Z), pickable.Value); pickable.ToRemove = true; } else { Vector3 vector = (impulse2 + new Vector3(0f, 0.1f * impulse2.Length(), 0f)) * m_random.Float(0.75f, 1f); if (vector.Length() > 10f) { Projectile projectile = m_subsystemProjectiles.AddProjectile(pickable.Value, pickable.Position, pickable.Velocity + vector, m_random.Vector3(0f, 20f), null); if (m_random.Float(0f, 1f) < 0.33f) { m_subsystemProjectiles.AddTrail(projectile, Vector3.Zero, new SmokeTrailParticleSystem(15, m_random.Float(0.75f, 1.5f), m_random.Float(1f, 6f), Color.White)); } pickable.ToRemove = true; } else { pickable.Velocity += vector; } } } foreach (Projectile projectile2 in m_subsystemProjectiles.Projectiles) { if (!m_generatedProjectiles.ContainsKey(projectile2)) { CalculateImpulseAndDamage(projectile2.Position + new Vector3(0f, 0.5f, 0f), 20f, null, out Vector3 impulse3, out float _); projectile2.Velocity += (impulse3 + new Vector3(0f, 0.1f * impulse3.Length(), 0f)) * m_random.Float(0.75f, 1f); } } Vector3 position = new Vector3(point.X, point.Y, point.Z); float delay = m_subsystemAudio.CalculateDelay(num); if (num2 > 1000000f) { if (playExplosionSound) { m_subsystemAudio.PlaySound("Audio/ExplosionEnormous", 1f, m_random.Float(-0.1f, 0.1f), position, 40f, delay); } m_subsystemNoise.MakeNoise(position, 1f, 100f); } else if (num2 > 100000f) { if (playExplosionSound) { m_subsystemAudio.PlaySound("Audio/ExplosionHuge", 1f, m_random.Float(-0.2f, 0.2f), position, 30f, delay); } m_subsystemNoise.MakeNoise(position, 1f, 70f); } else if (num2 > 20000f) { if (playExplosionSound) { m_subsystemAudio.PlaySound("Audio/ExplosionLarge", 1f, m_random.Float(-0.2f, 0.2f), position, 26f, delay); } m_subsystemNoise.MakeNoise(position, 1f, 50f); } else if (num2 > 4000f) { if (playExplosionSound) { m_subsystemAudio.PlaySound("Audio/ExplosionMedium", 1f, m_random.Float(-0.2f, 0.2f), position, 24f, delay); } m_subsystemNoise.MakeNoise(position, 1f, 40f); } else if (num2 > 100f) { if (playExplosionSound) { m_subsystemAudio.PlaySound("Audio/ExplosionSmall", 1f, m_random.Float(-0.2f, 0.2f), position, 22f, delay); } m_subsystemNoise.MakeNoise(position, 1f, 35f); } else if (num2 > 0f) { if (playExplosionSound) { m_subsystemAudio.PlaySound("Audio/ExplosionTiny", 1f, m_random.Float(-0.2f, 0.2f), position, 20f, delay); } m_subsystemNoise.MakeNoise(position, 1f, 30f); } }
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)); } }