drawHandle.UseShader(_shader);
var xforms = _entMan.GetEntityQuery<TransformComponent>();
+ var query = _entMan
+ .EntityQuery<ExplosionVisualsComponent, ExplosionVisualsTexturesComponent, AppearanceComponent>(true);
- foreach (var (comp, appearance) in _entMan.EntityQuery<ExplosionVisualsComponent, AppearanceComponent>(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<TransformComponent> xforms)
+ private void DrawExplosion(
+ DrawingHandleWorld drawHandle,
+ Box2Rotated worldBounds,
+ ExplosionVisualsComponent visuals,
+ int index,
+ EntityQuery<TransformComponent> 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;
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(
Box2 gridBounds,
int index,
Dictionary<int, List<Vector2i>> 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);
}
}
}
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<ExplosionVisualsTexturesComponent>(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<PointLightComponent>(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<RSIResource>(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;
}
}