Files
Bubberstation/code/_onclick/click_ctrl.dm
SyncIt21 9c9a5d28ff 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
/🆑
2024-06-25 16:06:59 -07:00

109 lines
2.9 KiB
Plaintext

/**
* Ctrl click
*/
/mob/proc/CtrlClickOn(atom/A)
base_click_ctrl(A)
/**
* ### Base proc for ctrl click interaction left click.
*
* If you wish to add custom `click_ctrl` behavior for a single type, use that proc.
*/
/mob/proc/base_click_ctrl(atom/target)
SHOULD_NOT_OVERRIDE(TRUE)
// Check if they've hooked in to prevent src from ctrl clicking anything
if(SEND_SIGNAL(src, COMSIG_MOB_CTRL_CLICKED, target) & COMSIG_MOB_CANCEL_CLICKON)
return TRUE
// If it has a signal handler that returns a click action, done.
if(SEND_SIGNAL(target, COMSIG_CLICK_CTRL, src) & CLICK_ACTION_ANY)
return TRUE
// If it has a custom click_alt that returns success/block, done.
if(can_perform_action(target, target.interaction_flags_click | SILENT_ADJACENCY))
return target.click_ctrl(src) & CLICK_ACTION_ANY
return FALSE
/**
* Ctrl click
* For most objects, pull
*/
/mob/living/base_click_ctrl(atom/target)
SHOULD_NOT_OVERRIDE(TRUE)
. = ..()
if(. || world.time < next_move || !can_perform_action(target, NOT_INSIDE_TARGET | SILENT_ADJACENCY))
return
. = TRUE
if(grab(target))
changeNext_move(CLICK_CD_MELEE)
return
pulled(target)
/**
* Ctrl mouse wheel click
* Except for tagging datumns same as control click
*/
/mob/proc/CtrlMiddleClickOn(atom/A)
if(check_rights_for(client, R_ADMIN))
client.toggle_tag_datum(A)
return
CtrlClickOn(A)
/**
* ## Custom ctrl click interaction
* Override this to change default ctrl click behavior. Return `CLICK_ACTION_SUCCESS`, `CLICK_ACTION_BLOCKING` or `NONE`.
*
* ### Guard clauses
* Consider adding `interaction_flags_click` before adding unique guard clauses.
*
* ### Return flags
* Forgetting your return will cause the default ctrl click behavior to occur thereafter.
*
* Returning any value besides NONE will stop the attack chain and thus stop the object from getting pulled/grabbed
**/
/atom/proc/click_ctrl(mob/user)
SHOULD_CALL_PARENT(FALSE)
return NONE
/**
* Control+Shift click
* Unused except for AI
*/
/mob/proc/CtrlShiftClickOn(atom/A)
base_click_ctrl_shift(A)
/**
* ### Base proc for ctrl shift click interaction left click.
*
* If you wish to add custom `click_ctrl_shift` behavior for a single type, use that proc.
*/
/mob/proc/base_click_ctrl_shift(atom/target)
SHOULD_NOT_OVERRIDE(TRUE)
// Check if they've hooked in to prevent src from ctrl clicking anything
if(SEND_SIGNAL(src, COMSIG_MOB_CTRL_SHIFT_CLICKED, target) & COMSIG_MOB_CANCEL_CLICKON)
return
// If it has a signal handler that returns a click action, done.
if(SEND_SIGNAL(target, COMSIG_CLICK_CTRL_SHIFT, src) & CLICK_ACTION_ANY)
return
// Proceed with ctrl shift click
if(can_perform_action(target, target.interaction_flags_click | SILENT_ADJACENCY))
target.click_ctrl_shift(src)
/**
* ## Custom ctrl shift click interaction
*
* ### Guard clauses
* Consider adding `interaction_flags_click` before adding unique guard clauses.
**/
/atom/proc/click_ctrl_shift(mob/user)
SHOULD_CALL_PARENT(FALSE)
return NONE