1
0

RandomMetadataSystem.cs 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. using Content.Shared.Dataset;
  2. using Content.Shared.Random.Helpers;
  3. using JetBrains.Annotations;
  4. using Robust.Shared.Prototypes;
  5. using Robust.Shared.Random;
  6. namespace Content.Server.RandomMetadata;
  7. public sealed class RandomMetadataSystem : EntitySystem
  8. {
  9. [Dependency] private readonly IPrototypeManager _prototype = default!;
  10. [Dependency] private readonly IRobustRandom _random = default!;
  11. [Dependency] private readonly MetaDataSystem _metaData = default!;
  12. public override void Initialize()
  13. {
  14. base.Initialize();
  15. SubscribeLocalEvent<RandomMetadataComponent, MapInitEvent>(OnMapInit);
  16. }
  17. // This is done on map init so that map-placed entities have it randomized each time the map loads, for fun.
  18. private void OnMapInit(EntityUid uid, RandomMetadataComponent component, MapInitEvent args)
  19. {
  20. var meta = MetaData(uid);
  21. if (component.NameSegments != null)
  22. {
  23. _metaData.SetEntityName(uid, GetRandomFromSegments(component.NameSegments, component.NameSeparator), meta);
  24. }
  25. if (component.DescriptionSegments != null)
  26. {
  27. _metaData.SetEntityDescription(uid,
  28. GetRandomFromSegments(component.DescriptionSegments, component.DescriptionSeparator), meta);
  29. }
  30. }
  31. /// <summary>
  32. /// Generates a random string from segments and a separator.
  33. /// </summary>
  34. /// <param name="segments">The segments that it will be generated from</param>
  35. /// <param name="separator">The separator that will be inbetween each segment</param>
  36. /// <returns>The newly generated string</returns>
  37. [PublicAPI]
  38. public string GetRandomFromSegments(List<string> segments, string? separator)
  39. {
  40. var outputSegments = new List<string>();
  41. foreach (var segment in segments)
  42. {
  43. if (_prototype.TryIndex<LocalizedDatasetPrototype>(segment, out var localizedProto))
  44. {
  45. outputSegments.Add(_random.Pick(localizedProto));
  46. }
  47. else if (_prototype.TryIndex<DatasetPrototype>(segment, out var proto))
  48. {
  49. var random = _random.Pick(proto.Values);
  50. if (Loc.TryGetString(random, out var localizedSegment))
  51. outputSegments.Add(localizedSegment);
  52. else
  53. outputSegments.Add(random);
  54. }
  55. else if (Loc.TryGetString(segment, out var localizedSegment))
  56. outputSegments.Add(localizedSegment);
  57. else
  58. outputSegments.Add(segment);
  59. }
  60. return string.Join(separator, outputSegments);
  61. }
  62. }