| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- using Content.Shared.GameTicking;
- using Content.Shared.Hands.Components;
- using Content.Shared.Hands.EntitySystems;
- using Content.Shared.Roles;
- using Content.Shared.Traits;
- using Content.Shared.Whitelist;
- using Robust.Shared.Prototypes;
- namespace Content.Server.Traits;
- public sealed class TraitSystem : EntitySystem
- {
- [Dependency] private readonly IPrototypeManager _prototypeManager = default!;
- [Dependency] private readonly SharedHandsSystem _sharedHandsSystem = default!;
- [Dependency] private readonly EntityWhitelistSystem _whitelistSystem = default!;
- public override void Initialize()
- {
- base.Initialize();
- SubscribeLocalEvent<PlayerSpawnCompleteEvent>(OnPlayerSpawnComplete);
- }
- // When the player is spawned in, add all trait components selected during character creation
- private void OnPlayerSpawnComplete(PlayerSpawnCompleteEvent args)
- {
- // Check if player's job allows to apply traits
- if (args.JobId == null ||
- !_prototypeManager.TryIndex<JobPrototype>(args.JobId ?? string.Empty, out var protoJob) ||
- !protoJob.ApplyTraits)
- {
- return;
- }
- foreach (var traitId in args.Profile.TraitPreferences)
- {
- if (!_prototypeManager.TryIndex<TraitPrototype>(traitId, out var traitPrototype))
- {
- Log.Warning($"No trait found with ID {traitId}!");
- return;
- }
- if (_whitelistSystem.IsWhitelistFail(traitPrototype.Whitelist, args.Mob) ||
- _whitelistSystem.IsBlacklistPass(traitPrototype.Blacklist, args.Mob))
- continue;
- // Add all components required by the prototype
- EntityManager.AddComponents(args.Mob, traitPrototype.Components, false);
- // Add item required by the trait
- if (traitPrototype.TraitGear == null)
- continue;
- if (!TryComp(args.Mob, out HandsComponent? handsComponent))
- continue;
- var coords = Transform(args.Mob).Coordinates;
- var inhandEntity = EntityManager.SpawnEntity(traitPrototype.TraitGear, coords);
- _sharedHandsSystem.TryPickup(args.Mob,
- inhandEntity,
- checkActionBlocker: false,
- handsComp: handsComponent);
- }
- }
- }
|