Fix wielding two-handed items with only one hand (#40966)

* fix

* review
This commit is contained in:
slarticodefast
2025-10-24 09:25:42 +02:00
committed by GitHub
parent 1894ff8065
commit da5e72d43e
2 changed files with 16 additions and 2 deletions

View File

@@ -419,6 +419,9 @@ public abstract partial class SharedHandsSystem
return GetHeldItem(ent, handId) == null; return GetHeldItem(ent, handId) == null;
} }
/// <summary>
/// Counts the number of hands on this entity.
/// </summary>
public int GetHandCount(Entity<HandsComponent?> ent) public int GetHandCount(Entity<HandsComponent?> ent)
{ {
if (!Resolve(ent, ref ent.Comp, false)) if (!Resolve(ent, ref ent.Comp, false))
@@ -427,6 +430,9 @@ public abstract partial class SharedHandsSystem
return ent.Comp.Hands.Count; return ent.Comp.Hands.Count;
} }
/// <summary>
/// Counts the number of hands that are empty.
/// </summary>
public int CountFreeHands(Entity<HandsComponent?> ent) public int CountFreeHands(Entity<HandsComponent?> ent)
{ {
if (!Resolve(ent, ref ent.Comp, false)) if (!Resolve(ent, ref ent.Comp, false))
@@ -442,11 +448,19 @@ public abstract partial class SharedHandsSystem
return free; return free;
} }
public int CountFreeableHands(Entity<HandsComponent> hands) /// <summary>
/// Counts the number of hands that are empty or can be emptied by dropping an item.
/// Unremoveable items will cause a hand to not be freeable.
/// </summary>
/// <param name="except">The hand this entity is in will be ignored when counting.</param>
public int CountFreeableHands(Entity<HandsComponent> hands, EntityUid? except = null)
{ {
var freeable = 0; var freeable = 0;
foreach (var name in hands.Comp.Hands.Keys) foreach (var name in hands.Comp.Hands.Keys)
{ {
if (except != null && GetHeldItem(hands.AsNullable(), name) == except)
continue;
if (HandIsEmpty(hands.AsNullable(), name) || CanDropHeld(hands, name)) if (HandIsEmpty(hands.AsNullable(), name) || CanDropHeld(hands, name))
freeable++; freeable++;
} }

View File

@@ -259,7 +259,7 @@ public abstract class SharedWieldableSystem : EntitySystem
return false; return false;
} }
if (_hands.CountFreeableHands((user, hands)) < component.FreeHandsRequired) if (_hands.CountFreeableHands((user, hands), except: uid) < component.FreeHandsRequired)
{ {
if (!quiet) if (!quiet)
{ {