NinjaConditionsSystem.cs 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. using Content.Server.Objectives.Components;
  2. using Content.Server.Roles;
  3. using Content.Server.Warps;
  4. using Content.Shared.Objectives.Components;
  5. using Content.Shared.Ninja.Components;
  6. using Content.Shared.Roles;
  7. using Robust.Shared.Random;
  8. namespace Content.Server.Objectives.Systems;
  9. /// <summary>
  10. /// Handles the objective conditions that hard depend on ninja.
  11. /// Survive is handled by <see cref="SurviveConditionSystem"/> since it works without being a ninja.
  12. /// </summary>
  13. public sealed class NinjaConditionsSystem : EntitySystem
  14. {
  15. [Dependency] private readonly MetaDataSystem _metaData = default!;
  16. [Dependency] private readonly NumberObjectiveSystem _number = default!;
  17. [Dependency] private readonly IRobustRandom _random = default!;
  18. [Dependency] private readonly SharedRoleSystem _roles = default!;
  19. public override void Initialize()
  20. {
  21. SubscribeLocalEvent<DoorjackConditionComponent, ObjectiveGetProgressEvent>(OnDoorjackGetProgress);
  22. SubscribeLocalEvent<SpiderChargeConditionComponent, RequirementCheckEvent>(OnSpiderChargeRequirementCheck);
  23. SubscribeLocalEvent<SpiderChargeConditionComponent, ObjectiveAfterAssignEvent>(OnSpiderChargeAfterAssign);
  24. SubscribeLocalEvent<StealResearchConditionComponent, ObjectiveGetProgressEvent>(OnStealResearchGetProgress);
  25. }
  26. // doorjack
  27. private void OnDoorjackGetProgress(EntityUid uid, DoorjackConditionComponent comp, ref ObjectiveGetProgressEvent args)
  28. {
  29. args.Progress = DoorjackProgress(comp, _number.GetTarget(uid));
  30. }
  31. private float DoorjackProgress(DoorjackConditionComponent comp, int target)
  32. {
  33. // prevent divide-by-zero
  34. if (target == 0)
  35. return 1f;
  36. return MathF.Min(comp.DoorsJacked / (float) target, 1f);
  37. }
  38. // spider charge
  39. private void OnSpiderChargeRequirementCheck(EntityUid uid, SpiderChargeConditionComponent comp, ref RequirementCheckEvent args)
  40. {
  41. if (args.Cancelled || !_roles.MindHasRole<NinjaRoleComponent>(args.MindId))
  42. return;
  43. // choose spider charge detonation point
  44. var warps = new List<EntityUid>();
  45. var query = EntityQueryEnumerator<BombingTargetComponent, WarpPointComponent>();
  46. while (query.MoveNext(out var warpUid, out _, out var warp))
  47. {
  48. if (warp.Location != null)
  49. {
  50. warps.Add(warpUid);
  51. }
  52. }
  53. if (warps.Count <= 0)
  54. {
  55. args.Cancelled = true;
  56. return;
  57. }
  58. comp.Target = _random.Pick(warps);
  59. }
  60. private void OnSpiderChargeAfterAssign(EntityUid uid, SpiderChargeConditionComponent comp, ref ObjectiveAfterAssignEvent args)
  61. {
  62. string title;
  63. if (comp.Target == null || !TryComp<WarpPointComponent>(comp.Target, out var warp) || warp.Location == null)
  64. {
  65. // this should never really happen but eh
  66. title = Loc.GetString("objective-condition-spider-charge-title-no-target");
  67. }
  68. else
  69. {
  70. title = Loc.GetString("objective-condition-spider-charge-title", ("location", warp.Location));
  71. }
  72. _metaData.SetEntityName(uid, title, args.Meta);
  73. }
  74. // steal research
  75. private void OnStealResearchGetProgress(EntityUid uid, StealResearchConditionComponent comp, ref ObjectiveGetProgressEvent args)
  76. {
  77. args.Progress = StealResearchProgress(comp, _number.GetTarget(uid));
  78. }
  79. private float StealResearchProgress(StealResearchConditionComponent comp, int target)
  80. {
  81. // prevent divide-by-zero
  82. if (target == 0)
  83. return 1f;
  84. return MathF.Min(comp.DownloadedNodes.Count / (float) target, 1f);
  85. }
  86. }