1
0

EntityTableSelector.cs 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. using Content.Shared.EntityTable.ValueSelector;
  2. using JetBrains.Annotations;
  3. using Robust.Shared.Prototypes;
  4. using Robust.Shared.Random;
  5. namespace Content.Shared.EntityTable.EntitySelectors;
  6. [ImplicitDataDefinitionForInheritors, UsedImplicitly(ImplicitUseTargetFlags.WithInheritors)]
  7. public abstract partial class EntityTableSelector
  8. {
  9. /// <summary>
  10. /// The number of times this selector is run
  11. /// </summary>
  12. [DataField]
  13. public NumberSelector Rolls = new ConstantNumberSelector(1);
  14. /// <summary>
  15. /// A weight used to pick between selectors.
  16. /// </summary>
  17. [DataField]
  18. public float Weight = 1;
  19. /// <summary>
  20. /// A simple chance that the selector will run.
  21. /// </summary>
  22. [DataField]
  23. public double Prob = 1;
  24. public IEnumerable<EntProtoId> GetSpawns(System.Random rand,
  25. IEntityManager entMan,
  26. IPrototypeManager proto)
  27. {
  28. var rolls = Rolls.Get(rand, entMan, proto);
  29. for (var i = 0; i < rolls; i++)
  30. {
  31. if (!rand.Prob(Prob))
  32. continue;
  33. foreach (var spawn in GetSpawnsImplementation(rand, entMan, proto))
  34. {
  35. yield return spawn;
  36. }
  37. }
  38. }
  39. protected abstract IEnumerable<EntProtoId> GetSpawnsImplementation(System.Random rand,
  40. IEntityManager entMan,
  41. IPrototypeManager proto);
  42. }