using System.Linq; using Content.Shared.Random.Helpers; using Robust.Shared.Timing; namespace Content.Shared._Sunrise.Random; /// /// Система для генерации предсказуемых случайных чисел. /// Позволяет получать синхронизированные псевдорандомные числа между сервером и клиентом. /// /// /// Учтите, что результат БУДЕТ не похож на случайные числа из-за использования простой математической формулы для получения сида. /// /// public sealed partial class RandomPredictedSystem : EntitySystem { /* * Основная часть системы. */ [Dependency] private readonly IGameTiming _timing = default!; public override void Initialize() { base.Initialize(); InitializeTickBased(); } /// /// Создает или получает экземпляр рандома для конкретных сущностей. /// Сид зависит от текущего тика и ID сущностей, что обеспечивает предсказуемость. /// /// Список на основе ID которого будет основываться сид для рандома. /// /// Чем больше разных сущностей будет использоваться, тем случайнее будет выдаваемый результат. /// private System.Random GetOrCreateEntityRandom(List entities) { var list = entities .Select(e => GetNetEntity(e).Id) .ToList(); list.Add((int)_timing.CurTick.Value); var seed = SharedRandomExtensions.HashCodeCombine(list); var random = new System.Random(seed); return random; } /// /// Создает или получает экземпляр рандома для конкретной сущности. /// Сид зависит от текущего тика и ID сущности, что обеспечивает предсказуемость. /// /// на основе ID которого будет основываться сид для рандома. private System.Random GetOrCreateEntityRandom(EntityUid uid) { var ent = GetNetEntity(uid); var seed = SharedRandomExtensions.HashCodeCombine(new List { (int) _timing.CurTick.Value, ent.Id }); var random = new System.Random(seed); return random; } }