mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2025-12-13 19:22:20 +00:00
## 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
/🆑
92 lines
3.7 KiB
Plaintext
92 lines
3.7 KiB
Plaintext
/**
|
|
* # Obeys Commands Component
|
|
* Manages a list of pet command datums, allowing you to boss it around
|
|
* Creates a radial menu of pet commands when this creature is alt-clicked, if it has any
|
|
*/
|
|
/datum/component/obeys_commands
|
|
/// List of commands you can give to the owner of this component
|
|
var/list/available_commands = list()
|
|
|
|
/// The available_commands parameter should be passed as a list of typepaths
|
|
/datum/component/obeys_commands/Initialize(list/command_typepaths = list())
|
|
. = ..()
|
|
if (!isliving(parent))
|
|
return COMPONENT_INCOMPATIBLE
|
|
var/mob/living/living_parent = parent
|
|
if (!living_parent.ai_controller)
|
|
return COMPONENT_INCOMPATIBLE
|
|
if (!length(command_typepaths))
|
|
CRASH("Initialised obedience component with no commands.")
|
|
|
|
for (var/command_path in command_typepaths)
|
|
var/datum/pet_command/new_command = new command_path(parent)
|
|
available_commands[new_command.command_name] = new_command
|
|
|
|
/datum/component/obeys_commands/Destroy(force)
|
|
. = ..()
|
|
QDEL_NULL(available_commands)
|
|
|
|
/datum/component/obeys_commands/RegisterWithParent()
|
|
RegisterSignal(parent, COMSIG_LIVING_BEFRIENDED, PROC_REF(add_friend))
|
|
RegisterSignal(parent, COMSIG_LIVING_UNFRIENDED, PROC_REF(remove_friend))
|
|
RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine))
|
|
RegisterSignal(parent, COMSIG_CLICK_ALT, PROC_REF(display_menu))
|
|
|
|
/datum/component/obeys_commands/UnregisterFromParent()
|
|
UnregisterSignal(parent, list(COMSIG_LIVING_BEFRIENDED, COMSIG_LIVING_UNFRIENDED, COMSIG_ATOM_EXAMINE, COMSIG_CLICK_ALT))
|
|
|
|
/// Add someone to our friends list
|
|
/datum/component/obeys_commands/proc/add_friend(datum/source, mob/living/new_friend)
|
|
SIGNAL_HANDLER
|
|
|
|
for (var/command_name as anything in available_commands)
|
|
var/datum/pet_command/command = available_commands[command_name]
|
|
INVOKE_ASYNC(command, TYPE_PROC_REF(/datum/pet_command, add_new_friend), new_friend)
|
|
|
|
/// Remove someone from our friends list
|
|
/datum/component/obeys_commands/proc/remove_friend(datum/source, mob/living/old_friend)
|
|
SIGNAL_HANDLER
|
|
|
|
for (var/command_name as anything in available_commands)
|
|
var/datum/pet_command/command = available_commands[command_name]
|
|
INVOKE_ASYNC(command, TYPE_PROC_REF(/datum/pet_command, remove_friend), old_friend)
|
|
|
|
/// Add a note about whether they will follow the instructions of the inspecting mob
|
|
/datum/component/obeys_commands/proc/on_examine(mob/living/source, mob/user, list/examine_list)
|
|
SIGNAL_HANDLER
|
|
|
|
if (IS_DEAD_OR_INCAP(source))
|
|
return
|
|
if (!(user in source.ai_controller?.blackboard[BB_FRIENDS_LIST]))
|
|
return
|
|
examine_list += span_notice("[source.p_They()] seem[source.p_s()] happy to see you!")
|
|
|
|
/// Displays a radial menu of commands
|
|
/datum/component/obeys_commands/proc/display_menu(datum/source, mob/living/clicker)
|
|
SIGNAL_HANDLER
|
|
|
|
var/mob/living/living_parent = parent
|
|
if (IS_DEAD_OR_INCAP(living_parent) || !clicker.can_perform_action(living_parent))
|
|
return
|
|
if (!(clicker in living_parent.ai_controller?.blackboard[BB_FRIENDS_LIST]))
|
|
return // Not our friend, can't boss us around
|
|
|
|
INVOKE_ASYNC(src, PROC_REF(display_radial_menu), clicker)
|
|
return CLICK_ACTION_SUCCESS
|
|
|
|
/// Actually display the radial menu and then do something with the result
|
|
/datum/component/obeys_commands/proc/display_radial_menu(mob/living/clicker)
|
|
var/list/radial_options = list()
|
|
for (var/command_name as anything in available_commands)
|
|
var/datum/pet_command/command = available_commands[command_name]
|
|
var/datum/radial_menu_choice/choice = command.provide_radial_data()
|
|
if (!choice)
|
|
continue
|
|
radial_options += choice
|
|
|
|
var/pick = show_radial_menu(clicker, clicker, radial_options, tooltips = TRUE)
|
|
if (!pick)
|
|
return
|
|
var/datum/pet_command/picked_command = available_commands[pick]
|
|
picked_command.try_activate_command(clicker)
|