FoamArtifactSystem.cs 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. using System.Linq;
  2. using Content.Server.Fluids.EntitySystems;
  3. using Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Components;
  4. using Content.Server.Xenoarchaeology.XenoArtifacts.Events;
  5. using Content.Shared.Chemistry.Components;
  6. using Robust.Shared.Random;
  7. namespace Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Systems;
  8. public sealed class FoamArtifactSystem : EntitySystem
  9. {
  10. [Dependency] private readonly IRobustRandom _random = default!;
  11. [Dependency] private readonly SmokeSystem _smoke = default!;
  12. /// <inheritdoc/>
  13. public override void Initialize()
  14. {
  15. SubscribeLocalEvent<FoamArtifactComponent, ArtifactNodeEnteredEvent>(OnNodeEntered);
  16. SubscribeLocalEvent<FoamArtifactComponent, ArtifactActivatedEvent>(OnActivated);
  17. }
  18. private void OnNodeEntered(EntityUid uid, FoamArtifactComponent component, ArtifactNodeEnteredEvent args)
  19. {
  20. if (!component.Reagents.Any())
  21. return;
  22. component.SelectedReagent = component.Reagents[args.RandomSeed % component.Reagents.Count];
  23. }
  24. private void OnActivated(EntityUid uid, FoamArtifactComponent component, ArtifactActivatedEvent args)
  25. {
  26. if (component.SelectedReagent == null)
  27. return;
  28. var sol = new Solution();
  29. var xform = Transform(uid);
  30. var range = (int) MathF.Round(MathHelper.Lerp(component.MinFoamAmount, component.MaxFoamAmount, _random.NextFloat(0, 1f)));
  31. sol.AddReagent(component.SelectedReagent, component.ReagentAmount);
  32. var foamEnt = Spawn("Foam", xform.Coordinates);
  33. var spreadAmount = range * 4;
  34. _smoke.StartSmoke(foamEnt, sol, component.Duration, spreadAmount);
  35. }
  36. }