MachineFrameComplete.cs 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. using Content.Server.Construction.Components;
  2. using Content.Shared.Construction;
  3. using Content.Shared.Examine;
  4. using JetBrains.Annotations;
  5. using Robust.Shared.Prototypes;
  6. using Robust.Shared.Utility;
  7. namespace Content.Server.Construction.Conditions
  8. {
  9. /// <summary>
  10. /// Checks that the entity has all parts needed in the machine frame component.
  11. /// </summary>
  12. [UsedImplicitly]
  13. [DataDefinition]
  14. public sealed partial class MachineFrameComplete : IGraphCondition
  15. {
  16. [DataField("guideIconBoard")]
  17. public SpriteSpecifier? GuideIconBoard { get; private set; }
  18. [DataField("guideIconParts")]
  19. public SpriteSpecifier? GuideIconParts { get; private set; }
  20. public bool Condition(EntityUid uid, IEntityManager entityManager)
  21. {
  22. if (!entityManager.TryGetComponent(uid, out MachineFrameComponent? machineFrame))
  23. return false;
  24. return entityManager.EntitySysManager.GetEntitySystem<MachineFrameSystem>().IsComplete(machineFrame);
  25. }
  26. public bool DoExamine(ExaminedEvent args)
  27. {
  28. var entity = args.Examined;
  29. var entityManager = IoCManager.Resolve<IEntityManager>();
  30. var protoManager = IoCManager.Resolve<IPrototypeManager>();
  31. var constructionSys = entityManager.System<ConstructionSystem>();
  32. if (!entityManager.TryGetComponent(entity, out MachineFrameComponent? machineFrame))
  33. return false;
  34. if (!machineFrame.HasBoard)
  35. {
  36. args.PushMarkup(Loc.GetString("construction-condition-machine-frame-insert-circuit-board-message"));
  37. return true;
  38. }
  39. if (entityManager.EntitySysManager.GetEntitySystem<MachineFrameSystem>().IsComplete(machineFrame))
  40. return false;
  41. args.PushMarkup(Loc.GetString("construction-condition-machine-frame-requirement-label"));
  42. foreach (var (material, required) in machineFrame.MaterialRequirements)
  43. {
  44. var amount = required - machineFrame.MaterialProgress[material];
  45. if(amount == 0)
  46. continue;
  47. var stack = protoManager.Index(material);
  48. var stackEnt = protoManager.Index(stack.Spawn);
  49. args.PushMarkup(Loc.GetString("construction-condition-machine-frame-required-element-entry",
  50. ("amount", amount),
  51. ("elementName", stackEnt.Name)));
  52. }
  53. foreach (var (compName, info) in machineFrame.ComponentRequirements)
  54. {
  55. var amount = info.Amount - machineFrame.ComponentProgress[compName];
  56. if(amount == 0)
  57. continue;
  58. var examineName = constructionSys.GetExamineName(info);
  59. args.PushMarkup(Loc.GetString("construction-condition-machine-frame-required-element-entry",
  60. ("amount", info.Amount),
  61. ("elementName", examineName)));
  62. }
  63. foreach (var (tagName, info) in machineFrame.TagRequirements)
  64. {
  65. var amount = info.Amount - machineFrame.TagProgress[tagName];
  66. if(amount == 0)
  67. continue;
  68. var examineName = constructionSys.GetExamineName(info);
  69. args.PushMarkup(Loc.GetString("construction-condition-machine-frame-required-element-entry",
  70. ("amount", info.Amount),
  71. ("elementName", examineName))
  72. + "\n");
  73. }
  74. return true;
  75. }
  76. public IEnumerable<ConstructionGuideEntry> GenerateGuideEntry()
  77. {
  78. yield return new ConstructionGuideEntry()
  79. {
  80. Localization = "construction-step-condition-machine-frame-board",
  81. Icon = GuideIconBoard,
  82. EntryNumber = 0, // Set this to anything so the guide generation takes this as a numbered step.
  83. };
  84. yield return new ConstructionGuideEntry()
  85. {
  86. Localization = "construction-step-condition-machine-frame-parts",
  87. Icon = GuideIconParts,
  88. EntryNumber = 0, // Set this to anything so the guide generation takes this as a numbered step.
  89. };
  90. }
  91. }
  92. }