mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-01-15 19:46:38 +00:00
## About The Pull Request The proc `can_perform_action()` now - Accepts atoms & not just movables without runtiming. Fixes #83985 - It now uses `CanReach()` instead of `Adjacent()`. Allows you to - Check if the target object is placed on top & not hidden - Is the object inside another storage atom & such - Properly checks for recursive locs. Before we were passing the direct atom & not the type to `recursive_loc_check()` causing this proc to always return true & giving us false positives. Now this proc has been adjusted to accept both type paths & real atoms - Removes `can_perform_turf_action()` since its now obsolete ## Changelog 🆑 fix: no more runtimes when dragging turfs onto other stuff code: most actions now properly check for recursive locs & better adjacency /🆑
110 lines
3.0 KiB
Plaintext
110 lines
3.0 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
|
|
|
|
// This means the action has been processed even though nothing happened
|
|
if(!can_perform_action(target, target.interaction_flags_click | SILENT_ADJACENCY))
|
|
return TRUE
|
|
|
|
// If it has a custom click_alt that returns success/block, done.
|
|
return target.click_ctrl(src) & CLICK_ACTION_ANY
|
|
|
|
/**
|
|
* Ctrl click
|
|
* For most objects, pull
|
|
*/
|
|
/mob/living/base_click_ctrl(atom/target)
|
|
SHOULD_NOT_OVERRIDE(TRUE)
|
|
|
|
. = ..()
|
|
if(. || world.time < next_move || !CanReach(target))
|
|
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
|