using Content.Server.Popups; using Content.Shared.Hands.Components; using Content.Shared.Alert; using Content.Shared.Hands.EntitySystems; using Content.Shared._White.OfferItem; using Content.Shared.IdentityManagement; using Robust.Shared.Player; namespace Content.Server._White.OfferItem; public sealed class OfferItemSystem : SharedOfferItemSystem { [Dependency] private readonly AlertsSystem _alertsSystem = default!; [Dependency] private readonly SharedHandsSystem _hands = default!; [Dependency] private readonly PopupSystem _popup = default!; public override void Update(float frameTime) { base.Update(frameTime); var query = EntityQueryEnumerator(); while (query.MoveNext(out var uid, out var offerItem)) { if (!TryComp(uid, out var hands) || hands.ActiveHand == null) continue; if (offerItem.Hand != null && hands.Hands[offerItem.Hand].HeldEntity == null) { if (offerItem.Target != null) { UnReceive(offerItem.Target.Value, offerItem: offerItem); offerItem.IsInOfferMode = false; Dirty(uid, offerItem); } else UnOffer(uid, offerItem); } if (!offerItem.IsInReceiveMode) { _alertsSystem.ClearAlert(uid, AlertType.Offer); continue; } _alertsSystem.ShowAlert(uid, AlertType.Offer); } } /// /// Accepting the offer and receive item /// public void Receive(EntityUid uid, OfferItemComponent? component = null) { if (!Resolve(uid, ref component) || !TryComp(component.Target, out var offerItem) || offerItem.Hand == null || component.Target == null || !TryComp(uid, out var hands)) return; if (offerItem.Item != null) { if (!_hands.TryPickup(uid, offerItem.Item.Value, handsComp: hands)) { _popup.PopupEntity(Loc.GetString("offer-item-full-hand"), uid, uid); return; } _popup.PopupEntity(Loc.GetString("offer-item-give", ("item", Identity.Entity(offerItem.Item.Value, EntityManager)), ("target", Identity.Entity(uid, EntityManager))), component.Target.Value, component.Target.Value); _popup.PopupEntity(Loc.GetString("offer-item-give-other", ("user", Identity.Entity(component.Target.Value, EntityManager)), ("item", Identity.Entity(offerItem.Item.Value, EntityManager)), ("target", Identity.Entity(uid, EntityManager))), component.Target.Value, Filter.PvsExcept(component.Target.Value, entityManager: EntityManager), true); RaiseLocalEvent(offerItem.Item.Value, new HandedEvent(component.Target.Value, uid)); } offerItem.Item = null; UnReceive(uid, component, offerItem); } }