1
0

ExplosionSystem.Visuals.cs 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. using System.Numerics;
  2. using Content.Shared.Explosion;
  3. using Content.Shared.Explosion.Components;
  4. using Content.Shared.Explosion.EntitySystems;
  5. using Robust.Server.GameObjects;
  6. using Robust.Shared.GameStates;
  7. using Robust.Shared.Map;
  8. namespace Content.Server.Explosion.EntitySystems;
  9. // This part of the system handled send visual / overlay data to clients.
  10. public sealed partial class ExplosionSystem
  11. {
  12. public void InitVisuals()
  13. {
  14. SubscribeLocalEvent<ExplosionVisualsComponent, ComponentGetState>(OnGetState);
  15. }
  16. private void OnGetState(EntityUid uid, ExplosionVisualsComponent component, ref ComponentGetState args)
  17. {
  18. Dictionary<NetEntity, Dictionary<int, List<Vector2i>>> tileLists = new();
  19. foreach (var (grid, data) in component.Tiles)
  20. {
  21. tileLists.Add(GetNetEntity(grid), data);
  22. }
  23. args.State = new ExplosionVisualsState(
  24. component.Epicenter,
  25. component.ExplosionType,
  26. component.Intensity,
  27. component.SpaceTiles,
  28. tileLists,
  29. component.SpaceMatrix,
  30. component.SpaceTileSize);
  31. }
  32. /// <summary>
  33. /// Constructor for the shared <see cref="ExplosionEvent"/> using the server-exclusive explosion classes.
  34. /// </summary>
  35. private EntityUid CreateExplosionVisualEntity(MapCoordinates epicenter, string prototype, Matrix3x2 spaceMatrix, ExplosionSpaceTileFlood? spaceData, IEnumerable<ExplosionGridTileFlood> gridData, List<float> iterationIntensity)
  36. {
  37. var explosionEntity = Spawn(null, MapCoordinates.Nullspace);
  38. var comp = AddComp<ExplosionVisualsComponent>(explosionEntity);
  39. foreach (var grid in gridData)
  40. {
  41. comp.Tiles.Add(grid.Grid.Owner, grid.TileLists);
  42. }
  43. comp.SpaceTiles = spaceData?.TileLists;
  44. comp.Epicenter = epicenter;
  45. comp.ExplosionType = prototype;
  46. comp.Intensity = iterationIntensity;
  47. comp.SpaceMatrix = spaceMatrix;
  48. comp.SpaceTileSize = spaceData?.TileSize ?? DefaultTileSize;
  49. Dirty(explosionEntity, comp);
  50. // Light, sound & visuals may extend well beyond normal PVS range. In principle, this should probably still be
  51. // restricted to something like the same map, but whatever.
  52. _pvsSys.AddGlobalOverride(GetNetEntity(explosionEntity));
  53. var appearance = AddComp<AppearanceComponent>(explosionEntity);
  54. _appearance.SetData(explosionEntity, ExplosionAppearanceData.Progress, 1, appearance);
  55. return explosionEntity;
  56. }
  57. }