diff --git a/Content.Server/Store/Conditions/BuyerAntagCondition.cs b/Content.Server/Store/Conditions/BuyerAntagCondition.cs index 4b1b6013eb..0d1c33a61a 100644 --- a/Content.Server/Store/Conditions/BuyerAntagCondition.cs +++ b/Content.Server/Store/Conditions/BuyerAntagCondition.cs @@ -27,13 +27,12 @@ public sealed partial class BuyerAntagCondition : ListingCondition public override bool Condition(ListingConditionArgs args) { var ent = args.EntityManager; - var minds = ent.System(); - if (!minds.TryGetMind(args.Buyer, out var mindId, out var mind)) - return true; + if (!ent.HasComponent(args.Buyer)) + return true; // inanimate objects don't have minds var roleSystem = ent.System(); - var roles = roleSystem.MindGetAllRoleInfo(mindId); + var roles = roleSystem.MindGetAllRoleInfo(args.Buyer); if (Blacklist != null) { diff --git a/Content.Server/Store/Conditions/BuyerDepartmentCondition.cs b/Content.Server/Store/Conditions/BuyerDepartmentCondition.cs index 43c06efad3..ce2cb47073 100644 --- a/Content.Server/Store/Conditions/BuyerDepartmentCondition.cs +++ b/Content.Server/Store/Conditions/BuyerDepartmentCondition.cs @@ -30,14 +30,12 @@ public sealed partial class BuyerDepartmentCondition : ListingCondition var prototypeManager = IoCManager.Resolve(); var ent = args.EntityManager; - var minds = ent.System(); - // this is for things like surplus crate - if (!minds.TryGetMind(args.Buyer, out var mindId, out _)) - return true; + if (!ent.TryGetComponent(args.Buyer, out var _)) + return true; // inanimate objects don't have minds var jobs = ent.System(); - jobs.MindTryGetJob(mindId, out var job); + jobs.MindTryGetJob(args.Buyer, out var job); if (Blacklist != null && job != null) { diff --git a/Content.Server/Store/Conditions/BuyerJobCondition.cs b/Content.Server/Store/Conditions/BuyerJobCondition.cs index 1ff4a97c33..eb452e0dcf 100644 --- a/Content.Server/Store/Conditions/BuyerJobCondition.cs +++ b/Content.Server/Store/Conditions/BuyerJobCondition.cs @@ -27,14 +27,12 @@ public sealed partial class BuyerJobCondition : ListingCondition public override bool Condition(ListingConditionArgs args) { var ent = args.EntityManager; - var minds = ent.System(); - // this is for things like surplus crate - if (!minds.TryGetMind(args.Buyer, out var mindId, out _)) - return true; + if (!ent.TryGetComponent(args.Buyer, out var _)) + return true; // inanimate objects don't have minds var jobs = ent.System(); - jobs.MindTryGetJob(mindId, out var job); + jobs.MindTryGetJob(args.Buyer, out var job); if (Blacklist != null) { diff --git a/Content.Server/Store/Conditions/BuyerSpeciesCondition.cs b/Content.Server/Store/Conditions/BuyerSpeciesCondition.cs index 1df4fce177..a4f1227ecc 100644 --- a/Content.Server/Store/Conditions/BuyerSpeciesCondition.cs +++ b/Content.Server/Store/Conditions/BuyerSpeciesCondition.cs @@ -2,6 +2,7 @@ using Content.Shared.Humanoid; using Content.Shared.Store; using Content.Shared.Humanoid.Prototypes; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.Set; +using Content.Shared.Mind; namespace Content.Server.Store.Conditions; @@ -27,7 +28,10 @@ public sealed partial class BuyerSpeciesCondition : ListingCondition { var ent = args.EntityManager; - if (!ent.TryGetComponent(args.Buyer, out var appearance)) + if (!ent.TryGetComponent(args.Buyer, out var mind)) + return true; // needed to obtain body entityuid to check for humanoid appearance + + if (!ent.TryGetComponent(mind.OwnedEntity, out var appearance)) return true; // inanimate or non-humanoid entities should be handled elsewhere, main example being surplus crates if (Blacklist != null) diff --git a/Content.Server/Store/Systems/StoreSystem.cs b/Content.Server/Store/Systems/StoreSystem.cs index 7bdf550301..a57895364d 100644 --- a/Content.Server/Store/Systems/StoreSystem.cs +++ b/Content.Server/Store/Systems/StoreSystem.cs @@ -10,6 +10,7 @@ using JetBrains.Annotations; using Robust.Shared.Prototypes; using Robust.Shared.Utility; using System.Linq; +using Content.Shared.Mind; namespace Content.Server.Store.Systems; @@ -69,10 +70,13 @@ public sealed partial class StoreSystem : EntitySystem if (!component.OwnerOnly) return; - component.AccountOwner ??= args.User; + if (!_mind.TryGetMind(args.User, out var mind, out _)) + return; + + component.AccountOwner ??= mind; DebugTools.Assert(component.AccountOwner != null); - if (component.AccountOwner == args.User) + if (component.AccountOwner == mind) return; _popup.PopupEntity(Loc.GetString("store-not-account-owner", ("store", uid)), uid, args.User); diff --git a/Content.Server/Traitor/Uplink/UplinkSystem.cs b/Content.Server/Traitor/Uplink/UplinkSystem.cs index 4c0a990b14..f30d2d7b4c 100644 --- a/Content.Server/Traitor/Uplink/UplinkSystem.cs +++ b/Content.Server/Traitor/Uplink/UplinkSystem.cs @@ -5,6 +5,7 @@ using Content.Shared.FixedPoint; using Content.Shared.Hands.EntitySystems; using Content.Shared.Implants; using Content.Shared.Inventory; +using Content.Shared.Mind; using Content.Shared.PDA; using Content.Shared.Store; using Content.Shared.Store.Components; @@ -19,6 +20,7 @@ public sealed class UplinkSystem : EntitySystem [Dependency] private readonly IPrototypeManager _proto = default!; [Dependency] private readonly StoreSystem _store = default!; [Dependency] private readonly SharedSubdermalImplantSystem _subdermalImplant = default!; + [Dependency] private readonly SharedMindSystem _mind = default!; [ValidatePrototypeId] public const string TelecrystalCurrencyPrototype = "Telecrystal"; @@ -61,8 +63,12 @@ public sealed class UplinkSystem : EntitySystem /// private void SetUplink(EntityUid user, EntityUid uplink, FixedPoint2 balance, bool giveDiscounts) { + if (!_mind.TryGetMind(user, out var mind, out _)) + return; + var store = EnsureComp(uplink); - store.AccountOwner = user; + + store.AccountOwner = mind; store.Balance.Clear(); _store.TryAddCurrency(new Dictionary { { TelecrystalCurrencyPrototype, balance } }, @@ -70,10 +76,10 @@ public sealed class UplinkSystem : EntitySystem store); var uplinkInitializedEvent = new StoreInitializedEvent( - TargetUser: user, + TargetUser: mind, Store: uplink, UseDiscounts: giveDiscounts, - Listings: _store.GetAvailableListings(user, uplink, store) + Listings: _store.GetAvailableListings(mind, uplink, store) .ToArray()); RaiseLocalEvent(ref uplinkInitializedEvent); } diff --git a/Content.Shared/Store/Components/StoreComponent.cs b/Content.Shared/Store/Components/StoreComponent.cs index e5171dec41..19d13e6d05 100644 --- a/Content.Shared/Store/Components/StoreComponent.cs +++ b/Content.Shared/Store/Components/StoreComponent.cs @@ -37,10 +37,10 @@ public sealed partial class StoreComponent : Component public HashSet> CurrencyWhitelist = new(); /// - /// The person who "owns" the store/account. Used if you want the listings to be fixed + /// The person/mind who "owns" the store/account. Used if you want the listings to be fixed /// regardless of who activated it. I.E. role specific items for uplinks. /// - [ViewVariables(VVAccess.ReadWrite)] + [DataField] public EntityUid? AccountOwner = null; /// diff --git a/Resources/Prototypes/Magic/mindswap_spell.yml b/Resources/Prototypes/Magic/mindswap_spell.yml index 19b3d41e70..bc2a8d11be 100644 --- a/Resources/Prototypes/Magic/mindswap_spell.yml +++ b/Resources/Prototypes/Magic/mindswap_spell.yml @@ -9,6 +9,7 @@ whitelist: components: - Body + - MindContainer canTargetSelf: false interactOnMiss: false sound: !type:SoundPathSpecifier