diff --git a/code/game/objects/structures/guncase.dm b/code/game/objects/structures/guncase.dm index c7073660865..7f8b1a45203 100644 --- a/code/game/objects/structures/guncase.dm +++ b/code/game/objects/structures/guncase.dm @@ -60,36 +60,57 @@ if(iscyborg(user) || isalien(user)) return if(contents.len && open) - ShowWindow(user) + show_menu(user) else open = !open update_icon() -/obj/structure/guncase/proc/ShowWindow(mob/user) - var/dat = {"
-

Stored Guns

- "} - if(LAZYLEN(contents)) - for(var/i in 1 to contents.len) - var/obj/item/I = contents[i] - dat += "[I.name]
" - dat += "
" +/** + * show_menu: Shows a radial menu to a user consisting of an available weaponry for taking + * + * Arguments: + * * user The mob to which we are showing the radial menu + */ +/obj/structure/guncase/proc/show_menu(mob/user) + if(!LAZYLEN(contents)) + return - var/datum/browser/popup = new(user, "gunlocker", "
[name]
", 350, 300) - popup.set_content(dat) - popup.open(FALSE) + var/list/display_names = list() + var/list/items = list() + for(var/i in 1 to length(contents)) + var/obj/item/thing = contents[i] + display_names["[thing.name] ([i])"] = REF(thing) + var/image/item_image = image(icon = thing.icon, icon_state = thing.icon_state) + if(length(thing.overlays)) + item_image.copy_overlays(thing) + items += list("[thing.name] ([i])" = item_image) -/obj/structure/guncase/Topic(href, href_list) - if(href_list["retrieve"]) - var/obj/item/O = locate(href_list["retrieve"]) in contents - if(!O || !istype(O)) - return - if(!usr.canUseTopic(src, BE_CLOSE) || !open) - return - if(ishuman(usr)) - if(!usr.put_in_hands(O)) - O.forceMove(get_turf(src)) - update_icon() + var/pick = show_radial_menu(user, src, items, custom_check = CALLBACK(src, .proc/check_menu, user), radius = 36, require_near = TRUE) + if(!pick) + return + + var/weapon_reference = display_names[pick] + var/obj/item/weapon = locate(weapon_reference) in contents + if(!istype(weapon)) + return + if(!user.put_in_hands(weapon)) + weapon.forceMove(get_turf(src)) + update_icon() + +/** + * check_menu: Checks if we are allowed to interact with a radial menu + * + * Arguments: + * * user The mob interacting with a menu + */ +/obj/structure/guncase/proc/check_menu(mob/living/carbon/human/user) + if(!open) + return FALSE + if(!istype(user)) + return FALSE + if(user.incapacitated()) + return FALSE + return TRUE /obj/structure/guncase/handle_atom_del(atom/A) update_icon()