SpillTileReaction.cs 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. using Content.Server.Fluids.EntitySystems;
  2. using Content.Shared.Chemistry.Components;
  3. using Content.Shared.Chemistry.Reaction;
  4. using Content.Shared.Chemistry.Reagent;
  5. using Content.Shared.FixedPoint;
  6. using Content.Shared.Movement.Components;
  7. using Content.Shared.Movement.Systems;
  8. using Content.Shared.Slippery;
  9. using Content.Shared.StepTrigger.Components;
  10. using Content.Shared.StepTrigger.Systems;
  11. using JetBrains.Annotations;
  12. using Robust.Shared.Map;
  13. namespace Content.Server.Chemistry.TileReactions
  14. {
  15. [UsedImplicitly]
  16. [DataDefinition]
  17. public sealed partial class SpillTileReaction : ITileReaction
  18. {
  19. [DataField("launchForwardsMultiplier")] public float LaunchForwardsMultiplier = 1;
  20. [DataField("requiredSlipSpeed")] public float RequiredSlipSpeed = 6;
  21. [DataField("paralyzeTime")] public float ParalyzeTime = 1;
  22. /// <summary>
  23. /// <see cref="SlipperyComponent.SuperSlippery"/>
  24. /// </summary>
  25. [DataField("superSlippery")] public bool SuperSlippery;
  26. public FixedPoint2 TileReact(TileRef tile,
  27. ReagentPrototype reagent,
  28. FixedPoint2 reactVolume,
  29. IEntityManager entityManager,
  30. List<ReagentData>? data)
  31. {
  32. if (reactVolume < 5)
  33. return FixedPoint2.Zero;
  34. if (entityManager.EntitySysManager.GetEntitySystem<PuddleSystem>()
  35. .TrySpillAt(tile, new Solution(reagent.ID, reactVolume, data), out var puddleUid, false, false))
  36. {
  37. var slippery = entityManager.EnsureComponent<SlipperyComponent>(puddleUid);
  38. slippery.LaunchForwardsMultiplier = LaunchForwardsMultiplier;
  39. slippery.ParalyzeTime = ParalyzeTime;
  40. slippery.SuperSlippery = SuperSlippery;
  41. entityManager.Dirty(puddleUid, slippery);
  42. var step = entityManager.EnsureComponent<StepTriggerComponent>(puddleUid);
  43. entityManager.EntitySysManager.GetEntitySystem<StepTriggerSystem>().SetRequiredTriggerSpeed(puddleUid, RequiredSlipSpeed, step);
  44. var slow = entityManager.EnsureComponent<SpeedModifierContactsComponent>(puddleUid);
  45. var speedModifier = 1 - reagent.Viscosity;
  46. entityManager.EntitySysManager.GetEntitySystem<SpeedModifierContactsSystem>().ChangeModifiers(puddleUid, speedModifier, slow);
  47. return reactVolume;
  48. }
  49. return FixedPoint2.Zero;
  50. }
  51. }
  52. }