mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2025-12-13 11:12:14 +00:00
## About The Pull Request this PR improves the UX of pet commands a bit. i decided to expand on their radial menu. You can now hold shift and hover over your pet to display a menu of commands which you can choose from. alternatively, you can still type out commands in chat https://github.com/user-attachments/assets/9da7f7ea-58a3-4fd6-b040-45cc05cda51d ## Why It's Good For The Game makes pet commands easier to give out when you're managing more than 1 pet. also fixes the fishing command not working. ## Changelog 🆑 qol: holding shift and hovering over your pet will display a list of commands you can click from fix: fixes the fishing pet command not working /🆑
91 lines
3.2 KiB
Plaintext
91 lines
3.2 KiB
Plaintext
/*
|
|
A derivative of radial menu which persists onscreen until closed and invokes a callback each time an element is clicked
|
|
*/
|
|
|
|
/atom/movable/screen/radial/persistent/center
|
|
name = "Close Menu"
|
|
icon_state = "radial_center"
|
|
|
|
/atom/movable/screen/radial/persistent/center/Click(location, control, params)
|
|
if(usr.client == parent.current_user)
|
|
parent.element_chosen(null, usr, params)
|
|
|
|
/atom/movable/screen/radial/persistent/center/MouseEntered(location, control, params)
|
|
. = ..()
|
|
icon_state = "radial_center_focus"
|
|
|
|
/atom/movable/screen/radial/persistent/center/MouseExited(location, control, params)
|
|
. = ..()
|
|
icon_state = "radial_center"
|
|
|
|
|
|
|
|
/datum/radial_menu/persistent
|
|
var/uniqueid
|
|
var/datum/callback/select_proc_callback
|
|
|
|
/datum/radial_menu/persistent/New()
|
|
close_button = new /atom/movable/screen/radial/persistent/center
|
|
close_button.set_parent(src)
|
|
|
|
|
|
/datum/radial_menu/persistent/element_chosen(choice_id, mob/user, params)
|
|
select_proc_callback.Invoke(choices_values[choice_id], params)
|
|
|
|
///Version of wait used by persistent radial menus.
|
|
/datum/radial_menu/persistent/wait()
|
|
while(!QDELETED(src))
|
|
if(custom_check_callback && next_check < world.time)
|
|
custom_check_callback.Invoke()
|
|
next_check = world.time + check_delay
|
|
stoplag(1)
|
|
|
|
/datum/radial_menu/persistent/proc/change_choices(list/newchoices, tooltips = FALSE, animate = FALSE, keep_same_page = FALSE)
|
|
if(!newchoices.len)
|
|
return
|
|
button_animation_flags = NONE
|
|
var/target_page = keep_same_page ? current_page : 1 //Stores the current_page value before it's set back to 1 on Reset()
|
|
Reset()
|
|
set_choices(newchoices,tooltips, set_page = target_page)
|
|
|
|
/datum/radial_menu/persistent/Destroy()
|
|
select_proc_callback = null
|
|
GLOB.radial_menus -= uniqueid
|
|
Reset()
|
|
hide()
|
|
. = ..()
|
|
|
|
/*
|
|
Creates a persistent radial menu and shows it to the user, anchored to anchor (or user if the anchor is currently in users screen).
|
|
Choices should be a list where list keys are movables or text used for element names and return value
|
|
and list values are movables/icons/images used for element icons
|
|
Select_proc is the proc to be called each time an element on the menu is clicked, and should accept the chosen element as its final argument
|
|
Clicking the center button will return a choice of null
|
|
*/
|
|
/proc/show_radial_menu_persistent(mob/user, atom/anchor, list/choices, datum/callback/select_proc, uniqueid, radius, tooltips = FALSE, radial_slice_icon = "radial_slice", datum/callback/custom_check)
|
|
if(!user || !anchor || !length(choices) || !select_proc)
|
|
return
|
|
if(!uniqueid)
|
|
uniqueid = "defmenu_[REF(user)]_[REF(anchor)]"
|
|
|
|
if(GLOB.radial_menus[uniqueid])
|
|
return
|
|
|
|
var/datum/radial_menu/persistent/menu = new
|
|
menu.uniqueid = uniqueid
|
|
GLOB.radial_menus[uniqueid] = menu
|
|
if(radius)
|
|
menu.radius = radius
|
|
menu.radial_slice_icon = radial_slice_icon
|
|
menu.select_proc_callback = select_proc
|
|
if(istype(custom_check))
|
|
menu.custom_check_callback = custom_check
|
|
menu.anchor = anchor
|
|
menu.check_screen_border(user) //Do what's needed to make it look good near borders or on hud
|
|
menu.set_choices(choices, tooltips)
|
|
menu.show_to(user)
|
|
if(menu.custom_check_callback)
|
|
menu.next_check = world.time + menu.check_delay
|
|
INVOKE_ASYNC(menu, TYPE_PROC_REF(/datum/radial_menu, wait))
|
|
return menu
|