Files
Bubberstation/code/datums/components/toggle_suit.dm
SkyratBot 5513052ab8 [MIRROR] Some alt & ctrl click improvements (#28391)
* Some alt & ctrl click improvements (#84203)

## About The Pull Request
Improved code quality of both so they resemble each other. Some of the
new specs are as follows

1. Moved` COMSIG_CLICK_ALT` & `COMSIG_CLICK_ALT_SECONDARY` up i.e.
before `can_perform_action()` making them pure hooks not bound by any
action checks giving components full control over them
2. Removed range check(`CAN_I_SEE`) & view check(`is_blind()`) out of
the base alt click proc. They now only apply to living mobs and don't
apply to ghosts(ghosts don't get blind & see everything) & revenants
(the range check still applies for revenants though).

This was actually a bug because these 2 checks were only meant to see if
the loot panel could be opened (as stated in
https://github.com/tgstation/tgstation/pull/83736#discussion_r1628097941)
but because they are at the top of the proc they also apply to all alt
click actions which is not intended. Also, by moving these checks down
to mob subtype levels some of the snowflake checks like this
7579e0e173/code/_onclick/click_alt.dm (L23)
can be removed. We should not check for subtypes within the parent type
proc but instead have subtypes override their parent procs to implement
custom behaviour
3. Removed redundant signals like` COMSIG_XENO_SLIME_CLICK_ALT` in
favour of just `COMSIG_MOB_ALTCLICKON`
4. While looking for alt click signal overrides I found alt click for
style meter was run timing, that's fixed now

## Changelog
🆑
fix: alt click runtime no more when using style meter
code: improved alt & ctrl click code
/🆑

* Some alt & ctrl click improvements

---------

Co-authored-by: SyncIt21 <110812394+SyncIt21@users.noreply.github.com>
2024-06-26 09:40:04 +05:30

99 lines
3.2 KiB
Plaintext

/*
* Simple component for allowing a user to change an atom's appearance on alt-click.
* When toggled, changes the atom's icon_state between [base_icon_state] and [base_icon_state]_t.
*/
/datum/component/toggle_icon
/// Whether the icon is toggled
var/toggled = FALSE
/// The base icon state we do operations on.
var/base_icon_state
/// The noun of what was "toggled" displayed to the user. EX: "Toggled the item's [buttons]"
var/toggle_noun
/datum/component/toggle_icon/Initialize(toggle_noun = "buttons")
if(!isatom(parent))
return COMPONENT_INCOMPATIBLE
var/atom/atom_parent = parent
atom_parent.flags_1 |= HAS_CONTEXTUAL_SCREENTIPS_1
src.toggle_noun = toggle_noun
src.base_icon_state = atom_parent.base_icon_state || atom_parent.icon_state
/datum/component/toggle_icon/RegisterWithParent()
RegisterSignal(parent, COMSIG_CLICK_ALT, PROC_REF(on_click_alt))
RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine))
RegisterSignal(parent, COMSIG_ATOM_REQUESTING_CONTEXT_FROM_ITEM, PROC_REF(on_adding_context))
/datum/component/toggle_icon/UnregisterFromParent()
UnregisterSignal(parent, list(COMSIG_CLICK_ALT, COMSIG_ATOM_EXAMINE, COMSIG_ATOM_REQUESTING_CONTEXT_FROM_ITEM))
/*
* Signal proc for COMSIG_CLICK_ALT.
* If the user is living, adjacent to the source,
* and has arms / is not incapacitated, call do_icon_toggle.
*
* source - the atom being clicked on
* user - the mob doing the click
*/
/datum/component/toggle_icon/proc/on_click_alt(atom/source, mob/living/living_user)
SIGNAL_HANDLER
if(!isliving(living_user) || !living_user.can_perform_action(source))
return
if(living_user.usable_hands <= 0)
source.balloon_alert(living_user, "you don't have hands!")
return
do_icon_toggle(source, living_user)
return CLICK_ACTION_SUCCESS
/*
* Signal proc for COMSIG_ATOM_EXAMINE.
* Lets the user know they can toggle the parent open or closed.
*
* source - the atom being examined (parent)
* user - the mob examining it
* examine_list - the list of things within the examine output
*/
/datum/component/toggle_icon/proc/on_examine(atom/source, mob/user, list/examine_list)
SIGNAL_HANDLER
examine_list += span_notice("Alt-click on [source] to toggle the [toggle_noun].")
/*
* Signal proc for COMSIG_ATOM_REQUESTING_CONTEXT_FROM_ITEM.
* Adds usage context for toggling the parent open or closed.
*
* source - the atom context is requested from (parent)
* context - the list of usage contexts set
* held_item - the item held by the requesting mob
* user - the mob requesting context
*/
/datum/component/toggle_icon/proc/on_adding_context(atom/source, list/context, obj/item/held_item, mob/user)
SIGNAL_HANDLER
context[SCREENTIP_CONTEXT_ALT_LMB] = "Toggle [toggle_noun]"
return CONTEXTUAL_SCREENTIP_SET
/*
* Actually do the toggle of the icon.
* Swaps the icon from [base_icon_state] to [base_icon_state]_t.
*
* source - the atom being toggled
* user - the mob doing the toggling
*/
/datum/component/toggle_icon/proc/do_icon_toggle(atom/source, mob/living/user)
source.balloon_alert(user, "toggled [toggle_noun]")
toggled = !toggled
if(toggled)
source.icon_state = "[base_icon_state]_t"
else
source.icon_state = base_icon_state
if(isitem(source))
var/obj/item/item_source = source
item_source.update_slot_icon()