diff --git a/Content.Client/Explosion/ExplosionOverlay.cs b/Content.Client/Explosion/ExplosionOverlay.cs index ad66e23803..41dceb94bd 100644 --- a/Content.Client/Explosion/ExplosionOverlay.cs +++ b/Content.Client/Explosion/ExplosionOverlay.cs @@ -32,27 +32,35 @@ public sealed class ExplosionOverlay : Overlay drawHandle.UseShader(_shader); var xforms = _entMan.GetEntityQuery(); + var query = _entMan + .EntityQuery(true); - foreach (var (comp, appearance) in _entMan.EntityQuery(true)) + foreach (var (visuals, textures, appearance) in query) { - if (comp.Epicenter.MapId != args.MapId) + if (visuals.Epicenter.MapId != args.MapId) continue; if (!appearance.TryGetData(ExplosionAppearanceData.Progress, out int index)) continue; - index = Math.Min(index, comp.Intensity.Count - 1); - DrawExplosion(drawHandle, args.WorldBounds, comp, index, xforms); + index = Math.Min(index, visuals.Intensity.Count - 1); + DrawExplosion(drawHandle, args.WorldBounds, visuals, index, xforms, textures); } drawHandle.SetTransform(Matrix3.Identity); drawHandle.UseShader(null); } - private void DrawExplosion(DrawingHandleWorld drawHandle, Box2Rotated worldBounds, ExplosionVisualsComponent exp, int index, EntityQuery xforms) + private void DrawExplosion( + DrawingHandleWorld drawHandle, + Box2Rotated worldBounds, + ExplosionVisualsComponent visuals, + int index, + EntityQuery xforms, + ExplosionVisualsTexturesComponent textures) { Box2 gridBounds; - foreach (var (gridId, tiles) in exp.Tiles) + foreach (var (gridId, tiles) in visuals.Tiles) { if (!_mapManager.TryGetGrid(gridId, out var grid)) continue; @@ -63,16 +71,16 @@ public sealed class ExplosionOverlay : Overlay gridBounds = invWorldMatrix.TransformBox(worldBounds).Enlarged(grid.TileSize * 2); drawHandle.SetTransform(worldMatrix); - DrawTiles(drawHandle, gridBounds, index, tiles, exp, grid.TileSize); + DrawTiles(drawHandle, gridBounds, index, tiles, visuals, grid.TileSize, textures); } - if (exp.SpaceTiles == null) + if (visuals.SpaceTiles == null) return; - gridBounds = Matrix3.Invert(exp.SpaceMatrix).TransformBox(worldBounds).Enlarged(2); - drawHandle.SetTransform(exp.SpaceMatrix); + gridBounds = Matrix3.Invert(visuals.SpaceMatrix).TransformBox(worldBounds).Enlarged(2); + drawHandle.SetTransform(visuals.SpaceMatrix); - DrawTiles(drawHandle, gridBounds, index, exp.SpaceTiles, exp, exp.SpaceTileSize); + DrawTiles(drawHandle, gridBounds, index, visuals.SpaceTiles, visuals, visuals.SpaceTileSize, textures); } private void DrawTiles( @@ -80,26 +88,27 @@ public sealed class ExplosionOverlay : Overlay Box2 gridBounds, int index, Dictionary> tileSets, - ExplosionVisualsComponent exp, - ushort tileSize) + ExplosionVisualsComponent visuals, + ushort tileSize, + ExplosionVisualsTexturesComponent textures) { for (var j = 0; j <= index; j++) { if (!tileSets.TryGetValue(j, out var tiles)) continue; - var frameIndex = (int) Math.Min(exp.Intensity[j] / exp.IntensityPerState, exp.FireFrames.Count - 1); - var frames = exp.FireFrames[frameIndex]; + var frameIndex = (int) Math.Min(visuals.Intensity[j] / textures.IntensityPerState, textures.FireFrames.Count - 1); + var frames = textures.FireFrames[frameIndex]; foreach (var tile in tiles) { - Vector2 centre = ((Vector2) tile + 0.5f) * tileSize; + var centre = ((Vector2) tile + 0.5f) * tileSize; if (!gridBounds.Contains(centre)) continue; var texture = _robustRandom.Pick(frames); - drawHandle.DrawTextureRect(texture, Box2.CenteredAround(centre, (tileSize, tileSize)), exp.FireColor); + drawHandle.DrawTextureRect(texture, Box2.CenteredAround(centre, (tileSize, tileSize)), textures.FireColor); } } } diff --git a/Content.Client/Explosion/ExplosionOverlaySystem.cs b/Content.Client/Explosion/ExplosionOverlaySystem.cs index 6c7fafc463..d182c0be2d 100644 --- a/Content.Client/Explosion/ExplosionOverlaySystem.cs +++ b/Content.Client/Explosion/ExplosionOverlaySystem.cs @@ -48,28 +48,35 @@ public sealed class ExplosionOverlaySystem : EntitySystem private void OnCompRemove(EntityUid uid, ExplosionVisualsComponent component, ComponentRemove args) { - QueueDel(component.LightEntity); + if (TryComp(uid, out ExplosionVisualsTexturesComponent? textures)) + QueueDel(textures.LightEntity); } private void OnExplosionInit(EntityUid uid, ExplosionVisualsComponent component, ComponentInit args) { - if (!_protoMan.TryIndex(component.ExplosionType, out ExplosionPrototype? type)) + EnsureComp(uid); + + if (!_protoMan.TryIndex(component.ExplosionType, out ExplosionPrototype? type) || + !TryComp(uid, out ExplosionVisualsTexturesComponent? textures)) + { return; + } // spawn in a client-side light source at the epicenter var lightEntity = Spawn("ExplosionLight", component.Epicenter); var light = EnsureComp(lightEntity); light.Energy = light.Radius = component.Intensity.Count; light.Color = type.LightColor; - component.LightEntity = lightEntity; - component.FireColor = type.FireColor; - component.IntensityPerState = type.IntensityPerState; + + textures.LightEntity = lightEntity; + textures.FireColor = type.FireColor; + textures.IntensityPerState = type.IntensityPerState; var fireRsi = _resCache.GetResource(type.TexturePath).RSI; foreach (var state in fireRsi) { - component.FireFrames.Add(state.GetFrames(RSI.State.Direction.South)); - if (component.FireFrames.Count == type.FireStates) + textures.FireFrames.Add(state.GetFrames(RSI.State.Direction.South)); + if (textures.FireFrames.Count == type.FireStates) break; } } diff --git a/Content.Client/Explosion/ExplosionVisualsComponent.cs b/Content.Client/Explosion/ExplosionVisualsTexturesComponent.cs similarity index 81% rename from Content.Client/Explosion/ExplosionVisualsComponent.cs rename to Content.Client/Explosion/ExplosionVisualsTexturesComponent.cs index a925b3d300..4ac7087961 100644 --- a/Content.Client/Explosion/ExplosionVisualsComponent.cs +++ b/Content.Client/Explosion/ExplosionVisualsTexturesComponent.cs @@ -1,11 +1,9 @@ -using Content.Shared.Explosion; using Robust.Client.Graphics; namespace Content.Client.Explosion; [RegisterComponent] -[ComponentReference(typeof(SharedExplosionVisualsComponent))] -public sealed class ExplosionVisualsComponent : SharedExplosionVisualsComponent +public sealed class ExplosionVisualsTexturesComponent : Component { /// /// Uid of the client-side point light entity for this explosion. diff --git a/Content.Server/Explosion/Components/ExplosionVisualsComponent.cs b/Content.Server/Explosion/Components/ExplosionVisualsComponent.cs deleted file mode 100644 index eba85ca8f6..0000000000 --- a/Content.Server/Explosion/Components/ExplosionVisualsComponent.cs +++ /dev/null @@ -1,9 +0,0 @@ -using Content.Shared.Explosion; - -namespace Content.Server.Explosion; - -[RegisterComponent] -[ComponentReference(typeof(SharedExplosionVisualsComponent))] -public sealed class ExplosionVisualsComponent : SharedExplosionVisualsComponent -{ -} diff --git a/Content.Shared/Explosion/SharedExplosionVisualsComponent.cs b/Content.Shared/Explosion/ExplosionVisualsComponent.cs similarity index 93% rename from Content.Shared/Explosion/SharedExplosionVisualsComponent.cs rename to Content.Shared/Explosion/ExplosionVisualsComponent.cs index f30f1767e5..5d1400cedb 100644 --- a/Content.Shared/Explosion/SharedExplosionVisualsComponent.cs +++ b/Content.Shared/Explosion/ExplosionVisualsComponent.cs @@ -7,8 +7,8 @@ namespace Content.Shared.Explosion; /// /// Component that is used to send explosion overlay/visual data to an abstract explosion entity. /// -[NetworkedComponent] -public abstract class SharedExplosionVisualsComponent : Component +[RegisterComponent, NetworkedComponent] +public sealed class ExplosionVisualsComponent : Component { public MapCoordinates Epicenter; public Dictionary>? SpaceTiles; @@ -52,5 +52,5 @@ public sealed class ExplosionVisualsState : ComponentState [Serializable, NetSerializable] public enum ExplosionAppearanceData { - Progress, // iteration index tracker for explosions that are still expanding outwards, + Progress, // iteration index tracker for explosions that are still expanding outwards, }