Skip to content

Commit

Permalink
[MIRROR] Enforces checks on dual wielding items (#1568) (#2507)
Browse files Browse the repository at this point in the history
* Enforces checks on dual wielding items (#82130)

## About The Pull Request
- Fixes #82043

The issue goes deeper than just the chainsaw. The problem is we are
dropping our item too early if the dual handed checks fail. This doesn't
fully stop the equipping process and still causes the action buttons to
be added as if the equipping process succeeded

The solution is too unequip/drop the item and reverse all steps related
to the equipping process after it has fully completed inside
`COMSIG_ITEM_POST_EQUIPPED` to properly reverse the effects of equipping
and also cancel further actions by returning `COMPONENT_EQUIPPED_FAILED`

## Changelog
:cl:
fix: failing to equip a dual handed item should properly clear out all
status effects related to equipping it, for e.g. remove the action
button from chainsaw
/:cl:

* Enforces checks on dual wielding items

---------

Co-authored-by: NovaBot <[email protected]>
Co-authored-by: SyncIt21 <[email protected]>
  • Loading branch information
3 people authored Mar 24, 2024
1 parent 65bfa48 commit 380ffc3
Showing 1 changed file with 9 additions and 7 deletions.
16 changes: 9 additions & 7 deletions code/datums/components/twohanded.dm
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@

// register signals withthe parent item
/datum/component/two_handed/RegisterWithParent()
RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, PROC_REF(on_equip))
RegisterSignal(parent, COMSIG_ITEM_POST_EQUIPPED, PROC_REF(on_equip))
RegisterSignal(parent, COMSIG_ITEM_DROPPED, PROC_REF(on_drop))
RegisterSignal(parent, COMSIG_ITEM_ATTACK_SELF, PROC_REF(on_attack_self))
RegisterSignal(parent, COMSIG_ITEM_ATTACK, PROC_REF(on_attack))
Expand All @@ -135,7 +135,7 @@
// Remove all siginals registered to the parent item
/datum/component/two_handed/UnregisterFromParent()
UnregisterSignal(parent, list(
COMSIG_ITEM_EQUIPPED,
COMSIG_ITEM_POST_EQUIPPED,
COMSIG_ITEM_DROPPED,
COMSIG_ITEM_ATTACK_SELF,
COMSIG_ITEM_ATTACK,
Expand Down Expand Up @@ -191,30 +191,32 @@
/datum/component/two_handed/proc/wield(mob/living/carbon/user)
if(wielded)
return

var/atom/atom_parent = parent
if(HAS_TRAIT(user, TRAIT_NO_TWOHANDING))
if(require_twohands)
atom_parent.balloon_alert(user, "too weak to wield!")
user.dropItemToGround(parent, force = TRUE)
else
atom_parent.balloon_alert(user, "too weak to wield with both hands!")
return
return COMPONENT_EQUIPPED_FAILED
if(user.get_inactive_held_item())
if(require_twohands)
atom_parent.balloon_alert(user, "can't carry in one hand!")
user.dropItemToGround(parent, force = TRUE)
else
atom_parent.balloon_alert(user, "holding something in other hand!")
return
return COMPONENT_EQUIPPED_FAILED
if(user.usable_hands < 2)
if(require_twohands)
user.dropItemToGround(parent, force=TRUE)
user.dropItemToGround(parent, force = TRUE)
atom_parent.balloon_alert(user, "not enough hands!")
return
return COMPONENT_EQUIPPED_FAILED

// wield update status
if(SEND_SIGNAL(parent, COMSIG_TWOHANDED_WIELD, user) & COMPONENT_TWOHANDED_BLOCK_WIELD)
return // blocked wield from item
user.dropItemToGround(parent, force = TRUE)
return COMPONENT_EQUIPPED_FAILED // blocked wield from item
wielded = TRUE
ADD_TRAIT(parent, TRAIT_WIELDED, REF(src))
RegisterSignal(user, COMSIG_MOB_SWAPPING_HANDS, PROC_REF(on_swapping_hands))
Expand Down

0 comments on commit 380ffc3

Please sign in to comment.