1
0

ProjectileSystem.cs 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. using Content.Shared.Projectiles;
  2. using Robust.Shared.Spawners;
  3. using Content.Shared.Weapons.Ranged.Systems;
  4. using Robust.Client.Animations;
  5. using Robust.Client.GameObjects;
  6. using Robust.Shared.GameStates;
  7. using TimedDespawnComponent = Robust.Shared.Spawners.TimedDespawnComponent;
  8. namespace Content.Client.Projectiles;
  9. public sealed class ProjectileSystem : SharedProjectileSystem
  10. {
  11. [Dependency] private readonly AnimationPlayerSystem _player = default!;
  12. public override void Initialize()
  13. {
  14. base.Initialize();
  15. SubscribeNetworkEvent<ImpactEffectEvent>(OnProjectileImpact);
  16. }
  17. private void OnProjectileImpact(ImpactEffectEvent ev)
  18. {
  19. var coords = GetCoordinates(ev.Coordinates);
  20. if (Deleted(coords.EntityId))
  21. return;
  22. var ent = Spawn(ev.Prototype, coords);
  23. if (TryComp<SpriteComponent>(ent, out var sprite))
  24. {
  25. sprite[EffectLayers.Unshaded].AutoAnimated = false;
  26. sprite.LayerMapTryGet(EffectLayers.Unshaded, out var layer);
  27. var state = sprite.LayerGetState(layer);
  28. var lifetime = 0.5f;
  29. if (TryComp<TimedDespawnComponent>(ent, out var despawn))
  30. lifetime = despawn.Lifetime;
  31. var anim = new Animation()
  32. {
  33. Length = TimeSpan.FromSeconds(lifetime),
  34. AnimationTracks =
  35. {
  36. new AnimationTrackSpriteFlick()
  37. {
  38. LayerKey = EffectLayers.Unshaded,
  39. KeyFrames =
  40. {
  41. new AnimationTrackSpriteFlick.KeyFrame(state.Name, 0f),
  42. }
  43. }
  44. }
  45. };
  46. _player.Play(ent, anim, "impact-effect");
  47. }
  48. }
  49. }