MachinePartSystem.cs 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. using System.Linq;
  2. using Content.Shared.Construction.Components;
  3. using Content.Shared.Examine;
  4. using Content.Shared.Lathe;
  5. using Content.Shared.Materials;
  6. using Robust.Shared.Prototypes;
  7. namespace Content.Shared.Construction
  8. {
  9. /// <summary>
  10. /// Deals with machine parts and machine boards.
  11. /// </summary>
  12. public sealed class MachinePartSystem : EntitySystem
  13. {
  14. [Dependency] private readonly IPrototypeManager _prototype = default!;
  15. [Dependency] private readonly SharedLatheSystem _lathe = default!;
  16. [Dependency] private readonly SharedConstructionSystem _construction = default!;
  17. public override void Initialize()
  18. {
  19. base.Initialize();
  20. SubscribeLocalEvent<MachineBoardComponent, ExaminedEvent>(OnMachineBoardExamined);
  21. }
  22. private void OnMachineBoardExamined(EntityUid uid, MachineBoardComponent component, ExaminedEvent args)
  23. {
  24. if (!args.IsInDetailsRange)
  25. return;
  26. using (args.PushGroup(nameof(MachineBoardComponent)))
  27. {
  28. args.PushMarkup(Loc.GetString("machine-board-component-on-examine-label"));
  29. foreach (var (material, amount) in component.StackRequirements)
  30. {
  31. var stack = _prototype.Index(material);
  32. var name = _prototype.Index(stack.Spawn).Name;
  33. args.PushMarkup(Loc.GetString("machine-board-component-required-element-entry-text",
  34. ("amount", amount),
  35. ("requiredElement", Loc.GetString(name))));
  36. }
  37. foreach (var (_, info) in component.ComponentRequirements)
  38. {
  39. var examineName = _construction.GetExamineName(info);
  40. args.PushMarkup(Loc.GetString("machine-board-component-required-element-entry-text",
  41. ("amount", info.Amount),
  42. ("requiredElement", examineName)));
  43. }
  44. foreach (var (_, info) in component.TagRequirements)
  45. {
  46. var examineName = _construction.GetExamineName(info);
  47. args.PushMarkup(Loc.GetString("machine-board-component-required-element-entry-text",
  48. ("amount", info.Amount),
  49. ("requiredElement", examineName)));
  50. }
  51. }
  52. }
  53. public Dictionary<string, int> GetMachineBoardMaterialCost(Entity<MachineBoardComponent> entity, int coefficient = 1)
  54. {
  55. var (_, comp) = entity;
  56. var materials = new Dictionary<string, int>();
  57. foreach (var (stackId, amount) in comp.StackRequirements)
  58. {
  59. var stackProto = _prototype.Index(stackId);
  60. var defaultProto = _prototype.Index(stackProto.Spawn);
  61. if (defaultProto.TryGetComponent<PhysicalCompositionComponent>(out var physComp, EntityManager.ComponentFactory))
  62. {
  63. foreach (var (mat, matAmount) in physComp.MaterialComposition)
  64. {
  65. materials.TryAdd(mat, 0);
  66. materials[mat] += matAmount * amount * coefficient;
  67. }
  68. }
  69. else if (_lathe.TryGetRecipesFromEntity(stackProto.Spawn, out var recipes))
  70. {
  71. var partRecipe = recipes[0];
  72. if (recipes.Count > 1)
  73. partRecipe = recipes.MinBy(p => p.Materials.Values.Sum());
  74. foreach (var (mat, matAmount) in partRecipe!.Materials)
  75. {
  76. materials.TryAdd(mat, 0);
  77. materials[mat] += matAmount * amount * coefficient;
  78. }
  79. }
  80. }
  81. var genericPartInfo = comp.ComponentRequirements.Values.Concat(comp.ComponentRequirements.Values);
  82. foreach (var info in genericPartInfo)
  83. {
  84. var amount = info.Amount;
  85. var defaultProtoId = info.DefaultPrototype;
  86. if (_lathe.TryGetRecipesFromEntity(defaultProtoId, out var recipes))
  87. {
  88. var partRecipe = recipes[0];
  89. if (recipes.Count > 1)
  90. partRecipe = recipes.MinBy(p => p.Materials.Values.Sum());
  91. foreach (var (mat, matAmount) in partRecipe!.Materials)
  92. {
  93. materials.TryAdd(mat, 0);
  94. materials[mat] += matAmount * amount * coefficient;
  95. }
  96. }
  97. else if (_prototype.TryIndex(defaultProtoId, out var defaultProto) &&
  98. defaultProto.TryGetComponent<PhysicalCompositionComponent>(out var physComp, EntityManager.ComponentFactory))
  99. {
  100. foreach (var (mat, matAmount) in physComp.MaterialComposition)
  101. {
  102. materials.TryAdd(mat, 0);
  103. materials[mat] += matAmount * amount * coefficient;
  104. }
  105. }
  106. }
  107. return materials;
  108. }
  109. }
  110. }