private void OnEntRemoved(EntityUid uid, InventoryComponent component, EntRemovedFromContainerMessage args)
{
- if(!TryGetSlot(uid, args.Container.ID, out var slotDef, inventory: component))
+ if (!TryGetSlot(uid, args.Container.ID, out var slotDef, inventory: component))
return;
var unequippedEvent = new DidUnequipEvent(uid, args.Entity, slotDef);
private void OnEntInserted(EntityUid uid, InventoryComponent component, EntInsertedIntoContainerMessage args)
{
- if(!TryGetSlot(uid, args.Container.ID, out var slotDef, inventory: component))
- return;
+ if (!TryGetSlot(uid, args.Container.ID, out var slotDef, inventory: component))
+ return;
var equippedEvent = new DidEquipEvent(uid, args.Entity, slotDef);
RaiseLocalEvent(uid, equippedEvent, true);
RaiseLocalEvent(held.Value, new HandDeselectedEvent(actor));
- TryEquip(actor, actor, held.Value, ev.Slot, predicted: true, inventory: inventory, force: true, checkDoafter:true);
+ TryEquip(actor, actor, held.Value, ev.Slot, predicted: true, inventory: inventory, force: true, checkDoafter: true);
}
public bool TryEquip(EntityUid uid, EntityUid itemUid, string slot, bool silent = false, bool force = false, bool predicted = false,
ClothingComponent? clothing = null,
bool reparent = true,
bool checkDoafter = false)
+ {
+ var itemsDropped = 0;
+ return TryUnequip(actor, target, slot, out removedItem, ref itemsDropped,
+ silent, force, predicted, inventory, clothing, reparent, checkDoafter);
+ }
+
+ private bool TryUnequip(
+ EntityUid actor,
+ EntityUid target,
+ string slot,
+ [NotNullWhen(true)] out EntityUid? removedItem,
+ ref int itemsDropped,
+ bool silent = false,
+ bool force = false,
+ bool predicted = false,
+ InventoryComponent? inventory = null,
+ ClothingComponent? clothing = null,
+ bool reparent = true,
+ bool checkDoafter = false)
{
removedItem = null;
return false;
}
+ if (!_containerSystem.Remove(removedItem.Value, slotContainer, force: force, reparent: reparent))
+ return false;
+
+ // this is in order to keep track of whether this is the first instance of a recursion call
+ var firstRun = itemsDropped == 0;
+ ++itemsDropped;
+
foreach (var slotDef in inventory.Slots)
{
if (slotDef != slotDefinition && slotDef.DependsOn == slotDefinition.Name)
{
//this recursive call might be risky
- TryUnequip(actor, target, slotDef.Name, true, true, predicted, inventory, reparent: reparent);
+ TryUnequip(actor, target, slotDef.Name, out _, ref itemsDropped, true, true, predicted, inventory, reparent: reparent);
}
}
- if (!_containerSystem.Remove(removedItem.Value, slotContainer, force: force, reparent: reparent))
- return false;
+ // we check if any items were dropped, and make a popup if they were.
+ // the reason we check for > 1 is because the first item is always the one we are trying to unequip,
+ // whereas we only want to notify for extra dropped items.
+ if (!silent && _gameTiming.IsFirstTimePredicted && firstRun && itemsDropped > 1)
+ _popup.PopupClient(Loc.GetString("inventory-component-dropped-from-unequip", ("items", itemsDropped - 1)), target, target);
// TODO: Inventory needs a hot cleanup hoo boy
// Check if something else (AKA toggleable) dumped it into a container.
if ((containerSlot == null || slotDefinition == null) && !TryGetSlotContainer(target, slot, out containerSlot, out slotDefinition, inventory))
return false;
- if (containerSlot.ContainedEntity is not {} itemUid)
+ if (containerSlot.ContainedEntity is not { } itemUid)
return false;
if (!_containerSystem.CanRemove(itemUid, containerSlot))