From: DrSmugleaf Date: Wed, 12 Apr 2023 00:20:47 +0000 (-0700) Subject: Remove inventory component references (#15249) X-Git-Url: https://git.smokeofanarchy.ru/gitweb.cgi?a=commitdiff_plain;h=98b4af8df0faea98baa384bfee8516b21bd19daa;p=space-station-14.git Remove inventory component references (#15249) --- diff --git a/Content.Client/Clothing/ClientClothingSystem.cs b/Content.Client/Clothing/ClientClothingSystem.cs index e2e96bcc30..e289fb8b47 100644 --- a/Content.Client/Clothing/ClientClothingSystem.cs +++ b/Content.Client/Clothing/ClientClothingSystem.cs @@ -1,7 +1,6 @@ using System.Diagnostics.CodeAnalysis; using System.Linq; using Content.Client.Inventory; -using Content.Client.Humanoid; using Content.Shared.Clothing; using Content.Shared.Clothing.Components; using Content.Shared.Clothing.EntitySystems; @@ -53,12 +52,12 @@ public sealed class ClientClothingSystem : ClothingSystem SubscribeLocalEvent(OnGetVisuals); - SubscribeLocalEvent(OnVisualsChanged); + SubscribeLocalEvent(OnVisualsChanged); SubscribeLocalEvent(OnDidUnequip); - SubscribeLocalEvent(OnAppearanceUpdate); + SubscribeLocalEvent(OnAppearanceUpdate); } - private void OnAppearanceUpdate(EntityUid uid, ClientInventoryComponent component, ref AppearanceChangeEvent args) + private void OnAppearanceUpdate(EntityUid uid, InventoryComponent component, ref AppearanceChangeEvent args) { // May need to update jumpsuit stencils if the sex changed. Also required to properly set the stencil on init // when sex is first loaded from the profile. @@ -85,7 +84,7 @@ public sealed class ClientClothingSystem : ClothingSystem private void OnGetVisuals(EntityUid uid, ClothingComponent item, GetEquipmentVisualsEvent args) { - if (!TryComp(args.Equipee, out ClientInventoryComponent? inventory)) + if (!TryComp(args.Equipee, out InventoryComponent? inventory)) return; List? layers = null; @@ -170,7 +169,7 @@ public sealed class ClientClothingSystem : ClothingSystem return true; } - private void OnVisualsChanged(EntityUid uid, ClientInventoryComponent component, VisualsChangedEvent args) + private void OnVisualsChanged(EntityUid uid, InventoryComponent component, VisualsChangedEvent args) { if (!TryComp(args.Item, out ClothingComponent? clothing) || clothing.InSlot == null) return; @@ -180,22 +179,22 @@ public sealed class ClientClothingSystem : ClothingSystem private void OnDidUnequip(EntityUid uid, SpriteComponent component, DidUnequipEvent args) { - if (!TryComp(uid, out ClientInventoryComponent? inventory) || !TryComp(uid, out SpriteComponent? sprite)) + if (!TryComp(uid, out InventoryComponent? inventory) || !TryComp(uid, out InventorySlotsComponent? inventorySlots)) return; - if (!inventory.VisualLayerKeys.TryGetValue(args.Slot, out var revealedLayers)) + if (!inventorySlots.VisualLayerKeys.TryGetValue(args.Slot, out var revealedLayers)) return; // Remove old layers. We could also just set them to invisible, but as items may add arbitrary layers, this // may eventually bloat the player with lots of invisible layers. foreach (var layer in revealedLayers) { - sprite.RemoveLayer(layer); + component.RemoveLayer(layer); } revealedLayers.Clear(); } - public void InitClothing(EntityUid uid, ClientInventoryComponent? component = null, SpriteComponent? sprite = null) + public void InitClothing(EntityUid uid, InventoryComponent? component = null, SpriteComponent? sprite = null) { if (!Resolve(uid, ref sprite, ref component) || !_inventorySystem.TryGetSlots(uid, out var slots, component)) return; @@ -217,10 +216,14 @@ public sealed class ClientClothingSystem : ClothingSystem } private void RenderEquipment(EntityUid equipee, EntityUid equipment, string slot, - ClientInventoryComponent? inventory = null, SpriteComponent? sprite = null, ClothingComponent? clothingComponent = null) + InventoryComponent? inventory = null, SpriteComponent? sprite = null, ClothingComponent? clothingComponent = null, + InventorySlotsComponent? inventorySlots = null) { - if(!Resolve(equipee, ref inventory, ref sprite) || !Resolve(equipment, ref clothingComponent, false)) + if (!Resolve(equipee, ref inventory, ref sprite, ref inventorySlots) || + !Resolve(equipment, ref clothingComponent, false)) + { return; + } if (slot == "jumpsuit" && sprite.LayerMapTryGet(HumanoidVisualLayers.StencilMask, out var suitLayer)) { @@ -243,7 +246,7 @@ public sealed class ClientClothingSystem : ClothingSystem // Remove old layers. We could also just set them to invisible, but as items may add arbitrary layers, this // may eventually bloat the player with lots of invisible layers. - if (inventory.VisualLayerKeys.TryGetValue(slot, out var revealedLayers)) + if (inventorySlots.VisualLayerKeys.TryGetValue(slot, out var revealedLayers)) { foreach (var key in revealedLayers) { @@ -254,11 +257,11 @@ public sealed class ClientClothingSystem : ClothingSystem else { revealedLayers = new(); - inventory.VisualLayerKeys[slot] = revealedLayers; + inventorySlots.VisualLayerKeys[slot] = revealedLayers; } var ev = new GetEquipmentVisualsEvent(equipee, slot); - RaiseLocalEvent(equipment, ev, false); + RaiseLocalEvent(equipment, ev); if (ev.Layers.Count == 0) { diff --git a/Content.Client/Inventory/ClientInventoryComponent.cs b/Content.Client/Inventory/ClientInventoryComponent.cs deleted file mode 100644 index 833b0c7bea..0000000000 --- a/Content.Client/Inventory/ClientInventoryComponent.cs +++ /dev/null @@ -1,23 +0,0 @@ -using Content.Shared.Inventory; - -namespace Content.Client.Inventory -{ - /// - /// A character UI which shows items the user has equipped within his inventory - /// - [RegisterComponent] - [ComponentReference(typeof(InventoryComponent))] - [Access(typeof(ClientInventorySystem))] - public sealed class ClientInventoryComponent : InventoryComponent - { - [DataField("speciesId")] public string? SpeciesId { get; set; } - [ViewVariables] - public readonly Dictionary SlotData = new (); - /// - /// Data about the current layers that have been added to the players sprite due to the items in each equipment slot. - /// - [ViewVariables] - [Access(typeof(ClientInventorySystem), Other = AccessPermissions.ReadWriteExecute)] // FIXME Friends - public readonly Dictionary> VisualLayerKeys = new(); - } -} diff --git a/Content.Client/Inventory/ClientInventorySystem.cs b/Content.Client/Inventory/ClientInventorySystem.cs index 37d3c6f42d..afd15a272d 100644 --- a/Content.Client/Inventory/ClientInventorySystem.cs +++ b/Content.Client/Inventory/ClientInventorySystem.cs @@ -32,25 +32,25 @@ namespace Content.Client.Inventory public Action? EntitySlotUpdate = null; public Action? OnSlotAdded = null; public Action? OnSlotRemoved = null; - public Action? OnLinkInventory = null; + public Action? OnLinkInventorySlots = null; public Action? OnUnlinkInventory = null; public Action? OnSpriteUpdate = null; - private readonly Queue<(ClientInventoryComponent comp, EntityEventArgs args)> _equipEventsQueue = new(); + private readonly Queue<(InventorySlotsComponent comp, EntityEventArgs args)> _equipEventsQueue = new(); public override void Initialize() { UpdatesOutsidePrediction = true; base.Initialize(); - SubscribeLocalEvent(OnPlayerAttached); - SubscribeLocalEvent(OnPlayerDetached); + SubscribeLocalEvent(OnPlayerAttached); + SubscribeLocalEvent(OnPlayerDetached); - SubscribeLocalEvent(OnShutdown); + SubscribeLocalEvent(OnShutdown); - SubscribeLocalEvent((_, comp, args) => + SubscribeLocalEvent((_, comp, args) => _equipEventsQueue.Enqueue((comp, args))); - SubscribeLocalEvent((_, comp, args) => + SubscribeLocalEvent((_, comp, args) => _equipEventsQueue.Enqueue((comp, args))); SubscribeLocalEvent(OnUseInHand); @@ -86,7 +86,7 @@ namespace Content.Client.Inventory QuickEquip(uid, component, args); } - private void OnDidUnequip(ClientInventoryComponent component, DidUnequipEvent args) + private void OnDidUnequip(InventorySlotsComponent component, DidUnequipEvent args) { UpdateSlot(args.Equipee, component, args.Slot); if (args.Equipee != _playerManager.LocalPlayer?.ControlledEntity) @@ -95,7 +95,7 @@ namespace Content.Client.Inventory OnSpriteUpdate?.Invoke(update); } - private void OnDidEquip(ClientInventoryComponent component, DidEquipEvent args) + private void OnDidEquip(InventorySlotsComponent component, DidEquipEvent args) { UpdateSlot(args.Equipee, component, args.Slot); if (args.Equipee != _playerManager.LocalPlayer?.ControlledEntity) @@ -106,7 +106,7 @@ namespace Content.Client.Inventory OnSpriteUpdate?.Invoke(update); } - private void OnShutdown(EntityUid uid, ClientInventoryComponent component, ComponentShutdown args) + private void OnShutdown(EntityUid uid, InventoryComponent component, ComponentShutdown args) { if (component.Owner != _playerManager.LocalPlayer?.ControlledEntity) return; @@ -114,18 +114,18 @@ namespace Content.Client.Inventory OnUnlinkInventory?.Invoke(); } - private void OnPlayerDetached(EntityUid uid, ClientInventoryComponent component, PlayerDetachedEvent args) + private void OnPlayerDetached(EntityUid uid, InventorySlotsComponent component, PlayerDetachedEvent args) { OnUnlinkInventory?.Invoke(); } - private void OnPlayerAttached(EntityUid uid, ClientInventoryComponent component, PlayerAttachedEvent args) + private void OnPlayerAttached(EntityUid uid, InventorySlotsComponent component, PlayerAttachedEvent args) { if (TryGetSlots(uid, out var definitions)) { foreach (var definition in definitions) { - if (!TryGetSlotContainer(uid, definition.Name, out var container, out _, component)) + if (!TryGetSlotContainer(uid, definition.Name, out var container, out _)) continue; if (!component.SlotData.TryGetValue(definition.Name, out var data)) @@ -138,7 +138,7 @@ namespace Content.Client.Inventory } } - OnLinkInventory?.Invoke(component); + OnLinkInventorySlots?.Invoke(component); } public override void Shutdown() @@ -150,18 +150,21 @@ namespace Content.Client.Inventory protected override void OnInit(EntityUid uid, InventoryComponent component, ComponentInit args) { base.OnInit(uid, component, args); - _clothingVisualsSystem.InitClothing(uid, (ClientInventoryComponent) component); + _clothingVisualsSystem.InitClothing(uid, component); - if (!_prototypeManager.TryIndex(component.TemplateId, out InventoryTemplatePrototype? invTemplate)) + if (!_prototypeManager.TryIndex(component.TemplateId, out InventoryTemplatePrototype? invTemplate) || + !TryComp(uid, out InventorySlotsComponent? inventorySlots)) + { return; + } foreach (var slot in invTemplate.Slots) { - TryAddSlotDef(uid, (ClientInventoryComponent)component, slot); + TryAddSlotDef(uid, inventorySlots, slot); } } - public void ReloadInventory(ClientInventoryComponent? component = null) + public void ReloadInventory(InventorySlotsComponent? component = null) { var player = _playerManager.LocalPlayer?.ControlledEntity; if (player == null || !Resolve(player.Value, ref component, false)) @@ -170,10 +173,10 @@ namespace Content.Client.Inventory } OnUnlinkInventory?.Invoke(); - OnLinkInventory?.Invoke(component); + OnLinkInventorySlots?.Invoke(component); } - public void SetSlotHighlight(EntityUid owner, ClientInventoryComponent component, string slotName, bool state) + public void SetSlotHighlight(EntityUid owner, InventorySlotsComponent component, string slotName, bool state) { var oldData = component.SlotData[slotName]; var newData = component.SlotData[slotName] = new SlotData(oldData, state); @@ -181,7 +184,7 @@ namespace Content.Client.Inventory EntitySlotUpdate?.Invoke(newData); } - public void UpdateSlot(EntityUid owner, ClientInventoryComponent component, string slotName, + public void UpdateSlot(EntityUid owner, InventorySlotsComponent component, string slotName, bool? blocked = null, bool? highlight = null) { var oldData = component.SlotData[slotName]; @@ -200,7 +203,7 @@ namespace Content.Client.Inventory EntitySlotUpdate?.Invoke(newData); } - public bool TryAddSlotDef(EntityUid owner, ClientInventoryComponent component, SlotDefinition newSlotDef) + public bool TryAddSlotDef(EntityUid owner, InventorySlotsComponent component, SlotDefinition newSlotDef) { SlotData newSlotData = newSlotDef; //convert to slotData if (!component.SlotData.TryAdd(newSlotDef.Name, newSlotData)) @@ -211,7 +214,7 @@ namespace Content.Client.Inventory return true; } - public void RemoveSlotDef(EntityUid owner, ClientInventoryComponent component, SlotData slotData) + public void RemoveSlotDef(EntityUid owner, InventorySlotsComponent component, SlotData slotData) { if (component.SlotData.Remove(slotData.SlotName)) { @@ -220,7 +223,7 @@ namespace Content.Client.Inventory } } - public void RemoveSlotDef(EntityUid owner, ClientInventoryComponent component, string slotName) + public void RemoveSlotDef(EntityUid owner, InventorySlotsComponent component, string slotName) { if (!component.SlotData.TryGetValue(slotName, out var slotData)) return; diff --git a/Content.Client/Inventory/InventorySlotsComponent.cs b/Content.Client/Inventory/InventorySlotsComponent.cs new file mode 100644 index 0000000000..91d03dd715 --- /dev/null +++ b/Content.Client/Inventory/InventorySlotsComponent.cs @@ -0,0 +1,19 @@ +namespace Content.Client.Inventory; + +/// +/// A character UI which shows items the user has equipped within his inventory +/// +[RegisterComponent] +[Access(typeof(ClientInventorySystem))] +public sealed class InventorySlotsComponent : Component +{ + [ViewVariables] + public readonly Dictionary SlotData = new (); + + /// + /// Data about the current layers that have been added to the players sprite due to the items in each equipment slot. + /// + [ViewVariables] + [Access(typeof(ClientInventorySystem), Other = AccessPermissions.ReadWriteExecute)] // FIXME Friends + public readonly Dictionary> VisualLayerKeys = new(); +} diff --git a/Content.Client/UserInterface/Systems/Inventory/InventoryUIController.cs b/Content.Client/UserInterface/Systems/Inventory/InventoryUIController.cs index 8f4ace97d1..e7ad70b058 100644 --- a/Content.Client/UserInterface/Systems/Inventory/InventoryUIController.cs +++ b/Content.Client/UserInterface/Systems/Inventory/InventoryUIController.cs @@ -28,7 +28,7 @@ public sealed class InventoryUIController : UIController, IOnStateEntered _slotGroups = new(); private StrippingWindow? _strippingWindow; @@ -105,7 +105,7 @@ public sealed class InventoryUIController : UIController, IOnStateEntered(player, out var hands) || hands.ActiveHandEntity is not { } held || !_entities.TryGetComponent(held, out SpriteComponent? sprite) || - !_inventorySystem.TryGetSlotContainer(player.Value, control.SlotName, out var container, out var slotDef, _playerInventory)) + !_inventorySystem.TryGetSlotContainer(player.Value, control.SlotName, out var container, out var slotDef)) { control.ClearHover(); return; @@ -274,7 +274,7 @@ public sealed class InventoryUIController : UIController, IOnStateEntered(hoverEntity); - var fits = _inventorySystem.CanEquip(player.Value, held, control.SlotName, out _, slotDef, _playerInventory) && + var fits = _inventorySystem.CanEquip(player.Value, held, control.SlotName, out _, slotDef) && container.CanInsert(held, _entities); hoverSprite.CopyFrom(sprite); @@ -305,7 +305,7 @@ public sealed class InventoryUIController : UIController, IOnStateEntered { // Spawn everything. - var mapMan = IoCManager.Resolve(); var invSystem = IoCManager.Resolve().GetEntitySystem(); var entMgr = IoCManager.Resolve(); var container = entMgr.SpawnEntity(null, coordinates); - entMgr.EnsureComponent(container); + entMgr.EnsureComponent(container); entMgr.EnsureComponent(container); var child = entMgr.SpawnEntity(null, coordinates); diff --git a/Content.Server/Entry/IgnoredComponents.cs b/Content.Server/Entry/IgnoredComponents.cs index 906dcdcdaf..eae00c7502 100644 --- a/Content.Server/Entry/IgnoredComponents.cs +++ b/Content.Server/Entry/IgnoredComponents.cs @@ -19,6 +19,7 @@ namespace Content.Server.Entry "CableVisualizer", "UIFragment", "PDABorderColor", + "InventorySlots", }; } } diff --git a/Content.Server/Inventory/ServerInventoryComponent.cs b/Content.Server/Inventory/ServerInventoryComponent.cs deleted file mode 100644 index 00430919d0..0000000000 --- a/Content.Server/Inventory/ServerInventoryComponent.cs +++ /dev/null @@ -1,7 +0,0 @@ -using Content.Shared.Inventory; - -namespace Content.Server.Inventory; - -[RegisterComponent] -[ComponentReference(typeof(InventoryComponent))] -public sealed class ServerInventoryComponent : InventoryComponent { } diff --git a/Content.Shared/Inventory/InventoryComponent.cs b/Content.Shared/Inventory/InventoryComponent.cs index c118dc92f8..eac41555c7 100644 --- a/Content.Shared/Inventory/InventoryComponent.cs +++ b/Content.Shared/Inventory/InventoryComponent.cs @@ -1,9 +1,14 @@ -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; +using Robust.Shared.GameStates; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; namespace Content.Shared.Inventory; -public abstract class InventoryComponent : Component +[RegisterComponent, NetworkedComponent] +[Access(typeof(InventorySystem))] +public sealed class InventoryComponent : Component { [DataField("templateId", customTypeSerializer: typeof(PrototypeIdSerializer))] public string TemplateId { get; } = "human"; + + [DataField("speciesId")] public string? SpeciesId { get; set; } } diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml index 5bd5deb20b..afbb9f001d 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml @@ -687,6 +687,7 @@ flavorKind: station-event-random-sentience-flavor-primate - type: Inventory templateId: monkey + - type: InventorySlots - type: Fixtures fixtures: - shape: @@ -1384,6 +1385,7 @@ - type: Inventory speciesId: possum templateId: pet + - type: InventorySlots - type: Strippable - type: UserInterface interfaces: @@ -1438,6 +1440,7 @@ - type: Inventory speciesId: possum #close enough templateId: pet + - type: InventorySlots - type: Strippable - type: UserInterface interfaces: @@ -1492,6 +1495,7 @@ - type: Inventory speciesId: fox templateId: pet + - type: InventorySlots - type: Strippable - type: UserInterface interfaces: @@ -1547,6 +1551,7 @@ - type: Inventory speciesId: dog templateId: pet + - type: InventorySlots - type: Strippable - type: UserInterface interfaces: @@ -1659,6 +1664,7 @@ - type: Inventory speciesId: puppy templateId: pet + - type: InventorySlots - type: DamageStateVisuals states: Alive: @@ -1698,6 +1704,7 @@ - type: Inventory speciesId: cat templateId: pet + - type: InventorySlots - type: Strippable - type: UserInterface interfaces: @@ -1840,6 +1847,7 @@ - type: Inventory speciesId: sloth templateId: pet + - type: InventorySlots - type: Strippable - type: UserInterface interfaces: @@ -1894,6 +1902,7 @@ - type: Inventory speciesId: fox #close enough templateId: pet + - type: InventorySlots - type: Strippable - type: UserInterface interfaces: @@ -2055,6 +2064,7 @@ - type: Inventory speciesId: pig templateId: pet + - type: InventorySlots - type: Strippable - type: UserInterface interfaces: diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml b/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml index 83f4c5963a..4e69648088 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml @@ -182,6 +182,7 @@ - type: Inventory speciesId: cat templateId: pet + - type: InventorySlots - type: Strippable - type: UserInterface interfaces: @@ -239,6 +240,7 @@ - type: Inventory speciesId: puppy templateId: pet + - type: InventorySlots - type: Strippable - type: UserInterface interfaces: @@ -336,6 +338,7 @@ - type: Inventory speciesId: dog templateId: pet + - type: InventorySlots - type: Strippable - type: UserInterface interfaces: diff --git a/Resources/Prototypes/Entities/Mobs/Player/silicon.yml b/Resources/Prototypes/Entities/Mobs/Player/silicon.yml index 7a12adb345..c5e911ff0a 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/silicon.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/silicon.yml @@ -78,6 +78,7 @@ group: Drone - type: Inventory templateId: drone + - type: InventorySlots - type: Strippable - type: UserInterface interfaces: diff --git a/Resources/Prototypes/Entities/Mobs/Species/base.yml b/Resources/Prototypes/Entities/Mobs/Species/base.yml index fea68b0c2a..5f080adb30 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/base.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/base.yml @@ -86,6 +86,7 @@ - type: Blindable # Other - type: Inventory + - type: InventorySlots - type: Clickable - type: InteractionOutline - type: Icon @@ -309,6 +310,7 @@ components: - type: Hands - type: Inventory + - type: InventorySlots - type: ContainerContainer - type: Icon sprite: Mobs/Species/Human/parts.rsi diff --git a/Resources/Prototypes/Entities/Mobs/Species/diona.yml b/Resources/Prototypes/Entities/Mobs/Species/diona.yml index fb5840889a..b9615302eb 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/diona.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/diona.yml @@ -39,6 +39,7 @@ - MobLayer - type: Inventory templateId: diona + - type: InventorySlots - type: MovementSpeedModifier baseWalkSpeed : 1.5 baseSprintSpeed : 3.5 @@ -60,5 +61,6 @@ components: - type: Inventory templateId: diona + - type: InventorySlots - type: HumanoidAppearance species: Diona diff --git a/Resources/Prototypes/Entities/Mobs/Species/vox.yml b/Resources/Prototypes/Entities/Mobs/Species/vox.yml index 151a4111de..c4f957f799 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/vox.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/vox.yml @@ -96,6 +96,7 @@ # canColorFacialHair: false - type: Inventory speciesId: vox + - type: InventorySlots - type: Butcherable butcheringType: Spike spawned: