* Start work on stripping.

* more strippable work

* Stripping works

* Nullable

* MORE NULLABLE

* nullable moment

* life is pain

* Interaction check.

* Update Content.Client/GameObjects/Components/HUD/Inventory/StrippableBoundUserInterface.cs

Co-authored-by: DrSmugleaf <DrSmugleaf@users.noreply.github.com>

* Update Content.Client/GameObjects/Components/HUD/Inventory/StrippableBoundUserInterface.cs

Co-authored-by: DrSmugleaf <DrSmugleaf@users.noreply.github.com>

* Update Content.Server/GameObjects/Components/GUI/HandsComponent.cs

Co-authored-by: DrSmugleaf <DrSmugleaf@users.noreply.github.com>

* Update Content.Server/GameObjects/Components/GUI/HandsComponent.cs

Co-authored-by: DrSmugleaf <DrSmugleaf@users.noreply.github.com>

* Update Content.Server/GameObjects/Components/GUI/HandsComponent.cs

Co-authored-by: DrSmugleaf <DrSmugleaf@users.noreply.github.com>

* Update Content.Server/GameObjects/Components/GUI/StrippableComponent.cs

Co-authored-by: DrSmugleaf <DrSmugleaf@users.noreply.github.com>

* Update Content.Server/GameObjects/Components/GUI/StrippableComponent.cs

Co-authored-by: DrSmugleaf <DrSmugleaf@users.noreply.github.com>

* Update Content.Server/GameObjects/Components/GUI/HandsComponent.cs

Co-authored-by: DrSmugleaf <DrSmugleaf@users.noreply.github.com>

* Update Content.Server/GameObjects/Components/GUI/StrippableComponent.cs

Co-authored-by: DrSmugleaf <DrSmugleaf@users.noreply.github.com>

* Update Content.Server/GameObjects/Components/GUI/StrippableComponent.cs

Co-authored-by: DrSmugleaf <DrSmugleaf@users.noreply.github.com>

* Update Content.Shared/GameObjects/Components/GUI/SharedStrippableComponent.cs

Co-authored-by: DrSmugleaf <DrSmugleaf@users.noreply.github.com>

* Update Content.Server/GameObjects/Components/GUI/StrippableComponent.cs

Co-authored-by: DrSmugleaf <DrSmugleaf@users.noreply.github.com>

* Rename InventoryComponent and HandsComponent's OnChanged event to OnItemChanged

* Apply suggestions from code review

Co-authored-by: DrSmugleaf <DrSmugleaf@users.noreply.github.com>

* Apply suggestions from code review

Co-authored-by: DrSmugleaf <DrSmugleaf@users.noreply.github.com>

* Apply suggestions from code review

Co-authored-by: DrSmugleaf <DrSmugleaf@users.noreply.github.com>

* Use static EquipmentSlotDefines

* Do not expose ContainerSlot on Inventory or Hands.

Co-authored-by: DrSmugleaf <DrSmugleaf@users.noreply.github.com>
This commit is contained in:
Víctor Aguilera Puerto
2020-08-15 20:33:42 +02:00
committed by GitHub
parent e047262289
commit c3df108b27
12 changed files with 700 additions and 32 deletions

View File

@@ -33,9 +33,13 @@ namespace Content.Server.GameObjects.Components.GUI
#pragma warning restore 649
[ViewVariables]
private readonly Dictionary<Slots, ContainerSlot> SlotContainers = new Dictionary<Slots, ContainerSlot>();
private readonly Dictionary<Slots, ContainerSlot> _slotContainers = new Dictionary<Slots, ContainerSlot>();
private KeyValuePair<Slots, (EntityUid entity, bool fits)>? HoverEntity;
private KeyValuePair<Slots, (EntityUid entity, bool fits)>? _hoverEntity;
public IEnumerable<Slots> Slots => _slotContainers.Keys;
public event Action OnItemChanged;
public override void Initialize()
{
@@ -43,7 +47,7 @@ namespace Content.Server.GameObjects.Components.GUI
foreach (var slotName in InventoryInstance.SlotMasks)
{
if (slotName != Slots.NONE)
if (slotName != EquipmentSlotDefines.Slots.NONE)
{
AddSlot(slotName);
}
@@ -58,7 +62,7 @@ namespace Content.Server.GameObjects.Components.GUI
{
var multiplier = 1f;
foreach (var (slot, containerSlot) in SlotContainers)
foreach (var (slot, containerSlot) in _slotContainers)
{
foreach (var entity in containerSlot.ContainedEntities)
{
@@ -81,7 +85,7 @@ namespace Content.Server.GameObjects.Components.GUI
{
var multiplier = 1f;
foreach (var (slot, containerSlot) in SlotContainers)
foreach (var (slot, containerSlot) in _slotContainers)
{
foreach (var entity in containerSlot.ContainedEntities)
{
@@ -99,7 +103,7 @@ namespace Content.Server.GameObjects.Components.GUI
bool IEffectBlocker.CanSlip()
{
if(Owner.TryGetComponent(out InventoryComponent inventoryComponent) &&
inventoryComponent.TryGetSlotItem(Slots.SHOES, out ItemComponent shoes)
inventoryComponent.TryGetSlotItem(EquipmentSlotDefines.Slots.SHOES, out ItemComponent shoes)
)
{
return EffectBlockerSystem.CanSlip(shoes.Owner);
@@ -110,7 +114,7 @@ namespace Content.Server.GameObjects.Components.GUI
public override void OnRemove()
{
var slots = SlotContainers.Keys.ToList();
var slots = _slotContainers.Keys.ToList();
foreach (var slot in slots)
{
RemoveSlot(slot);
@@ -140,15 +144,15 @@ namespace Content.Server.GameObjects.Components.GUI
}
public T GetSlotItem<T>(Slots slot) where T : ItemComponent
{
if (!SlotContainers.ContainsKey(slot))
if (!_slotContainers.ContainsKey(slot))
{
return null;
}
var containedEntity = SlotContainers[slot].ContainedEntity;
var containedEntity = _slotContainers[slot].ContainedEntity;
if (containedEntity?.Deleted == true)
{
SlotContainers[slot] = null;
_slotContainers[slot] = null;
containedEntity = null;
Dirty();
}
@@ -169,7 +173,7 @@ namespace Content.Server.GameObjects.Components.GUI
/// </remarks>
/// <param name="slot">The slot to put the item in.</param>
/// <param name="item">The item to insert into the slot.</param>
/// <param name="reason">The translated reason why the item cannot be equiped, if this function returns false. Can be null.</param>
/// <param name="reason">The translated reason why the item cannot be equipped, if this function returns false. Can be null.</param>
/// <returns>True if the item was successfully inserted, false otherwise.</returns>
public bool Equip(Slots slot, ItemComponent item, out string reason)
{
@@ -184,7 +188,7 @@ namespace Content.Server.GameObjects.Components.GUI
return false;
}
var inventorySlot = SlotContainers[slot];
var inventorySlot = _slotContainers[slot];
if (!inventorySlot.Insert(item.Owner))
{
return false;
@@ -192,6 +196,8 @@ namespace Content.Server.GameObjects.Components.GUI
_entitySystemManager.GetEntitySystem<InteractionSystem>().EquippedInteraction(Owner, item.Owner, slot);
OnItemChanged?.Invoke();
Dirty();
return true;
@@ -239,7 +245,7 @@ namespace Content.Server.GameObjects.Components.GUI
reason = Loc.GetString("You can't equip this!");
}
return pass && SlotContainers[slot].CanInsert(item.Owner);
return pass && _slotContainers[slot].CanInsert(item.Owner);
}
public bool CanEquip(Slots slot, ItemComponent item) => CanEquip(slot, item, out var _);
@@ -258,7 +264,7 @@ namespace Content.Server.GameObjects.Components.GUI
return false;
}
var inventorySlot = SlotContainers[slot];
var inventorySlot = _slotContainers[slot];
var item = inventorySlot.ContainedEntity.GetComponent<ItemComponent>();
if (!inventorySlot.Remove(inventorySlot.ContainedEntity))
{
@@ -271,6 +277,8 @@ namespace Content.Server.GameObjects.Components.GUI
_entitySystemManager.GetEntitySystem<InteractionSystem>().UnequippedInteraction(Owner, item.Owner, slot);
OnItemChanged?.Invoke();
Dirty();
return true;
@@ -288,7 +296,7 @@ namespace Content.Server.GameObjects.Components.GUI
if (!ActionBlockerSystem.CanUnequip(Owner))
return false;
var InventorySlot = SlotContainers[slot];
var InventorySlot = _slotContainers[slot];
return InventorySlot.ContainedEntity != null && InventorySlot.CanRemove(InventorySlot.ContainedEntity);
}
@@ -307,7 +315,12 @@ namespace Content.Server.GameObjects.Components.GUI
}
Dirty();
return SlotContainers[slot] = ContainerManagerComponent.Create<ContainerSlot>(GetSlotString(slot), Owner);
_slotContainers[slot] = ContainerManagerComponent.Create<ContainerSlot>(GetSlotString(slot), Owner);
OnItemChanged?.Invoke();
return _slotContainers[slot];
}
/// <summary>
@@ -331,7 +344,10 @@ namespace Content.Server.GameObjects.Components.GUI
"Unable to remove slot as the contained clothing could not be dropped");
}
SlotContainers.Remove(slot);
_slotContainers.Remove(slot);
OnItemChanged?.Invoke();
Dirty();
}
@@ -342,7 +358,7 @@ namespace Content.Server.GameObjects.Components.GUI
/// <returns>True if the slot exists, false otherwise.</returns>
public bool HasSlot(Slots slot)
{
return SlotContainers.ContainsKey(slot);
return _slotContainers.ContainsKey(slot);
}
/// <summary>
@@ -354,7 +370,7 @@ namespace Content.Server.GameObjects.Components.GUI
// make sure this is one of our containers.
// Technically the correct way would be to enumerate the possible slot names
// comparing with this container, but I might as well put the dictionary to good use.
if (!(container is ContainerSlot slot) || !SlotContainers.ContainsValue(slot))
if (!(container is ContainerSlot slot) || !_slotContainers.ContainsValue(slot))
return;
if (entity.TryGetComponent(out ItemComponent itemComp))
@@ -362,6 +378,8 @@ namespace Content.Server.GameObjects.Components.GUI
itemComp.RemovedFromSlot();
}
OnItemChanged?.Invoke();
Dirty();
}
@@ -417,7 +435,7 @@ namespace Content.Server.GameObjects.Components.GUI
if (activeHand != null && GetSlotItem(msg.Inventoryslot) == null)
{
var canEquip = CanEquip(msg.Inventoryslot, activeHand, out var reason);
HoverEntity = new KeyValuePair<Slots, (EntityUid entity, bool fits)>(msg.Inventoryslot, (activeHand.Owner.Uid, canEquip));
_hoverEntity = new KeyValuePair<Slots, (EntityUid entity, bool fits)>(msg.Inventoryslot, (activeHand.Owner.Uid, canEquip));
Dirty();
}
@@ -476,7 +494,7 @@ namespace Content.Server.GameObjects.Components.GUI
public override ComponentState GetComponentState()
{
var list = new List<KeyValuePair<Slots, EntityUid>>();
foreach (var (slot, container) in SlotContainers)
foreach (var (slot, container) in _slotContainers)
{
if (container.ContainedEntity != null)
{
@@ -484,8 +502,8 @@ namespace Content.Server.GameObjects.Components.GUI
}
}
var hover = HoverEntity;
HoverEntity = null;
var hover = _hoverEntity;
_hoverEntity = null;
return new InventoryComponentState(list, hover);
}
@@ -497,7 +515,7 @@ namespace Content.Server.GameObjects.Components.GUI
return;
}
foreach (var slot in SlotContainers.Values.ToList())
foreach (var slot in _slotContainers.Values.ToList())
{
foreach (var entity in slot.ContainedEntities)
{