1
0

SharedCorporealSystem.cs 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. using Content.Shared.Physics;
  2. using Robust.Shared.Physics;
  3. using System.Linq;
  4. using Content.Shared.Movement.Systems;
  5. using Content.Shared.Revenant.Components;
  6. using Robust.Shared.Physics.Systems;
  7. namespace Content.Shared.Revenant.EntitySystems;
  8. /// <summary>
  9. /// Makes the revenant solid when the component is applied.
  10. /// Additionally applies a few visual effects.
  11. /// Used for status effect.
  12. /// </summary>
  13. public abstract class SharedCorporealSystem : EntitySystem
  14. {
  15. [Dependency] private readonly SharedAppearanceSystem _appearance = default!;
  16. [Dependency] private readonly MovementSpeedModifierSystem _movement = default!;
  17. [Dependency] private readonly SharedPhysicsSystem _physics = default!;
  18. public override void Initialize()
  19. {
  20. base.Initialize();
  21. SubscribeLocalEvent<CorporealComponent, ComponentStartup>(OnStartup);
  22. SubscribeLocalEvent<CorporealComponent, ComponentShutdown>(OnShutdown);
  23. SubscribeLocalEvent<CorporealComponent, RefreshMovementSpeedModifiersEvent>(OnRefresh);
  24. }
  25. private void OnRefresh(EntityUid uid, CorporealComponent component, RefreshMovementSpeedModifiersEvent args)
  26. {
  27. args.ModifySpeed(component.MovementSpeedDebuff, component.MovementSpeedDebuff);
  28. }
  29. public virtual void OnStartup(EntityUid uid, CorporealComponent component, ComponentStartup args)
  30. {
  31. _appearance.SetData(uid, RevenantVisuals.Corporeal, true);
  32. if (TryComp<FixturesComponent>(uid, out var fixtures) && fixtures.FixtureCount >= 1)
  33. {
  34. var fixture = fixtures.Fixtures.First();
  35. _physics.SetCollisionMask(uid, fixture.Key, fixture.Value, (int) (CollisionGroup.SmallMobMask | CollisionGroup.GhostImpassable), fixtures);
  36. _physics.SetCollisionLayer(uid, fixture.Key, fixture.Value, (int) CollisionGroup.SmallMobLayer, fixtures);
  37. }
  38. _movement.RefreshMovementSpeedModifiers(uid);
  39. }
  40. public virtual void OnShutdown(EntityUid uid, CorporealComponent component, ComponentShutdown args)
  41. {
  42. _appearance.SetData(uid, RevenantVisuals.Corporeal, false);
  43. if (TryComp<FixturesComponent>(uid, out var fixtures) && fixtures.FixtureCount >= 1)
  44. {
  45. var fixture = fixtures.Fixtures.First();
  46. _physics.SetCollisionMask(uid, fixture.Key, fixture.Value, (int) CollisionGroup.GhostImpassable, fixtures);
  47. _physics.SetCollisionLayer(uid, fixture.Key, fixture.Value, 0, fixtures);
  48. }
  49. component.MovementSpeedDebuff = 1; //just so we can avoid annoying code elsewhere
  50. _movement.RefreshMovementSpeedModifiers(uid);
  51. }
  52. }