using System.Linq; using Content.Server.GameTicking; using Content.Server.GameTicking.Rules.Components; using Content.Server._White.AspectsSystem.Aspects.Components; using Content.Server._White.AspectsSystem.Base; using Content.Server.GameTicking.Components; using Content.Shared.Hands.Components; using Content.Shared.Hands.EntitySystems; using Content.Shared.Humanoid; using Content.Shared._White.NonPeacefulRoundEnd; using Robust.Shared.Prototypes; using Robust.Shared.Random; namespace Content.Server._White.AspectsSystem.Aspects; public sealed class BattledAspect : AspectSystem { [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly SharedHandsSystem _handsSystem = default!; [Dependency] private readonly IRobustRandom _robustRandom = default!; [Dependency] private readonly ChatHelper _chatHelper = default!; private NonPeacefulRoundItemsPrototype _nonPeacefulRoundItemsPrototype = default!; public override void Initialize() { base.Initialize(); SubscribeLocalEvent(HandleLateJoin); } protected override void Started(EntityUid uid, BattledAspectComponent component, GameRuleComponent gameRule, GameRuleStartedEvent args) { base.Started(uid, component, gameRule, args); var prototypes = _prototypeManager.EnumeratePrototypes().ToList(); if (prototypes.Count == 0) ForceEndSelf(uid, gameRule); _nonPeacefulRoundItemsPrototype = _robustRandom.Pick(prototypes); var query = EntityQueryEnumerator(); while (query.MoveNext(out var ent, out _)) { GiveItem(ent); } } private void HandleLateJoin(PlayerSpawnCompleteEvent ev) { var query = EntityQueryEnumerator(); while (query.MoveNext(out var ruleEntity, out _, out var gameRule)) { if (!GameTicker.IsGameRuleAdded(ruleEntity, gameRule)) continue; if (!ev.LateJoin) return; var mob = ev.Mob; GiveItem(mob); _chatHelper.SendAspectDescription(mob, Loc.GetString("battled-aspect-desc")); } } #region Helpers private void GiveItem(EntityUid player) { var item = _robustRandom.Pick(_nonPeacefulRoundItemsPrototype.Items); var transform = CompOrNull(player); if (transform == null) return; if (!HasComp(player)) return; var weaponEntity = EntityManager.SpawnEntity(item, transform.Coordinates); _handsSystem.TryDrop(player); _handsSystem.PickupOrDrop(player, weaponEntity); } #endregion }