using Content.Server._CP14.WeatherControl; using Content.Server.Weather; using Content.Shared._CP14.Demiplane.Components; using Content.Shared.Weather; using Robust.Shared.Audio; using Robust.Shared.Map.Components; using Robust.Shared.Prototypes; namespace Content.Server._CP14.Demiplane; public sealed partial class CP14DemiplaneSystem { [Dependency] private readonly WeatherSystem _weather = default!; private void InitDestruction() { SubscribeLocalEvent(OnDestructionStarted); } public void StartDestructDemiplane(Entity demiplane) { if (!TryComp(demiplane, out var map)) return; if (HasComp(demiplane)) return; EnsureComp(demiplane); if (HasComp(demiplane)) { RemCompDeferred(demiplane); } if (!_proto.TryIndex("CP14DemiplaneDestructionStorm", out var indexedWeather)) return; _weather.SetWeather(map.MapId, indexedWeather, null); } private void OnDestructionStarted(Entity ent, ref ComponentAdd args) { ent.Comp.EndTime = _timing.CurTime + ent.Comp.TimeToDestruction; ent.Comp.SelectedSong = new SoundPathSpecifier(_audio.GetSound(ent.Comp.Sound)); } private void UpdateDestruction(float frameTime) { var query = EntityQueryEnumerator(); while (query.MoveNext(out var uid, out var destruction, out var demiplane)) { var remaining = destruction.EndTime - _timing.CurTime; if (destruction.SelectedSong is null) continue; var audioLength = _audio.GetAudioLength(destruction.SelectedSong.Path.ToString()); if (destruction.Stream is null && remaining < audioLength) { var audio = _audio.PlayPvs(destruction.Sound, uid); destruction.Stream = audio?.Entity; _audio.SetMapAudio(audio); Dirty(uid, destruction); DemiplaneAnnounce(uid, Loc.GetString("cp14-demiplane-countdown", ("duration", audioLength.Minutes))); } if (remaining <= TimeSpan.Zero) { _audio.Stop(destruction.Stream); DeleteDemiplane((uid, demiplane)); } } } }