using Content.Server.Humanoid.Components; using Content.Server.RandomMetadata; using Content.Shared.Humanoid.Prototypes; using Content.Shared.Preferences; using Robust.Shared.Map; using Robust.Shared.Prototypes; using Robust.Shared.Serialization.Manager; namespace Content.Server.Humanoid.Systems; /// /// This deals with spawning and setting up random humanoids. /// public sealed class RandomHumanoidSystem : EntitySystem { [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly ISerializationManager _serialization = default!; [Dependency] private readonly MetaDataSystem _metaData = default!; [Dependency] private readonly HumanoidAppearanceSystem _humanoid = default!; /// public override void Initialize() { SubscribeLocalEvent(OnMapInit, after: new []{ typeof(RandomMetadataSystem) }); } private void OnMapInit(EntityUid uid, RandomHumanoidSpawnerComponent component, MapInitEvent args) { QueueDel(uid); if (component.SettingsPrototypeId != null) SpawnRandomHumanoid(component.SettingsPrototypeId, Transform(uid).Coordinates, MetaData(uid).EntityName); } public EntityUid SpawnRandomHumanoid(string prototypeId, EntityCoordinates coordinates, string name) { if (!_prototypeManager.TryIndex(prototypeId, out var prototype)) throw new ArgumentException("Could not get random humanoid settings"); var profile = HumanoidCharacterProfile.Random(prototype.SpeciesBlacklist); var speciesProto = _prototypeManager.Index(profile.Species); var humanoid = EntityManager.CreateEntityUninitialized(speciesProto.Prototype, coordinates); _metaData.SetEntityName(humanoid, prototype.RandomizeName ? profile.Name : name); _humanoid.LoadProfile(humanoid, profile); if (prototype.Components != null) { foreach (var entry in prototype.Components.Values) { var comp = (Component)_serialization.CreateCopy(entry.Component, notNullableOverride: true); RemComp(humanoid, comp.GetType()); AddComp(humanoid, comp); } } EntityManager.InitializeAndStartEntity(humanoid); return humanoid; } }