diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 29e5bd25e14..aede1e69a72 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -107,37 +107,11 @@ s_store, ) -/// Returns items which are currently visible on the mob -/mob/living/carbon/human/proc/get_visible_items() - var/static/list/visible_slots = list( - ITEM_SLOT_OCLOTHING, - ITEM_SLOT_ICLOTHING, - ITEM_SLOT_GLOVES, - ITEM_SLOT_EYES, - ITEM_SLOT_EARS, - ITEM_SLOT_MASK, - ITEM_SLOT_HEAD, - ITEM_SLOT_FEET, - ITEM_SLOT_ID, - ITEM_SLOT_BELT, - ITEM_SLOT_BACK, - ITEM_SLOT_NECK, - ITEM_SLOT_HANDS, - ITEM_SLOT_BACKPACK, - ITEM_SLOT_SUITSTORE, - ITEM_SLOT_HANDCUFFED, - ITEM_SLOT_LEGCUFFED, - ) - var/list/obscured = check_obscured_slots() - var/list/visible_items = list() - for (var/slot in visible_slots) - if (obscured & slot) - continue - var/obj/item/equipped = get_item_by_slot(slot) - if (equipped) - visible_items += equipped - for (var/obj/item/held in held_items) - visible_items += held +/mob/living/carbon/human/get_visible_items() + var/list/visible_items = ..() + var/obj/item/clothing/under/under = w_uniform + if(istype(under) && length(under.attached_accessories) && (under in visible_items)) + visible_items += under.attached_accessories return visible_items //This is an UNSAFE proc. Use mob_can_equip() before calling this one! Or rather use equip_to_slot_if_possible() or advanced_equip_to_slot_if_possible() diff --git a/code/modules/mob/living/carbon/inventory.dm b/code/modules/mob/living/carbon/inventory.dm index 2c6649dced8..e0a24d0ab51 100644 --- a/code/modules/mob/living/carbon/inventory.dm +++ b/code/modules/mob/living/carbon/inventory.dm @@ -49,6 +49,39 @@ legcuffed, ) +/// Returns items which are currently visible on the mob +/mob/living/carbon/proc/get_visible_items() + var/static/list/visible_slots = list( + ITEM_SLOT_OCLOTHING, + ITEM_SLOT_ICLOTHING, + ITEM_SLOT_GLOVES, + ITEM_SLOT_EYES, + ITEM_SLOT_EARS, + ITEM_SLOT_MASK, + ITEM_SLOT_HEAD, + ITEM_SLOT_FEET, + ITEM_SLOT_ID, + ITEM_SLOT_BELT, + ITEM_SLOT_BACK, + ITEM_SLOT_NECK, + ITEM_SLOT_HANDS, + ITEM_SLOT_BACKPACK, + ITEM_SLOT_SUITSTORE, + ITEM_SLOT_HANDCUFFED, + ITEM_SLOT_LEGCUFFED, + ) + var/list/obscured = check_obscured_slots() + var/list/visible_items = list() + for (var/slot in visible_slots) + if (obscured & slot) + continue + var/obj/item/equipped = get_item_by_slot(slot) + if (equipped) + visible_items += equipped + for (var/obj/item/held in held_items) + visible_items += held + return visible_items + /mob/living/carbon/proc/equip_in_one_of_slots(obj/item/equipping, list/slots, qdel_on_fail = TRUE, indirect_action = FALSE) for(var/slot in slots) if(equip_to_slot_if_possible(equipping, slots[slot], disable_warning = TRUE, indirect_action = indirect_action)) diff --git a/code/modules/wiremod/core/marker.dm b/code/modules/wiremod/core/marker.dm index ecd68be413c..50d4324c154 100644 --- a/code/modules/wiremod/core/marker.dm +++ b/code/modules/wiremod/core/marker.dm @@ -32,6 +32,13 @@ if(marked_atom || !user.Adjacent(target) || is_right_clicking) return ..() + if(isliving(target)) + INVOKE_ASYNC(src, PROC_REF(mark_mob_or_contents), user, target) + return TRUE + + mark_target(target) + +/obj/item/multitool/circuit/proc/mark_target(atom/target) say("Marked [target].") marked_atom = target RegisterSignal(marked_atom, COMSIG_QDELETING, PROC_REF(cleanup_marked_atom)) @@ -40,6 +47,51 @@ playsound(src.loc, 'sound/misc/compiler-stage2.ogg', 30, TRUE) return TRUE +/// Allow users to mark items equipped by the target that are visible. +/obj/item/multitool/circuit/proc/mark_mob_or_contents(mob/user, mob/living/target) + var/list/visible_items + var/mob/living/carbon/carbon_target + if(iscarbon(target)) + carbon_target = target + visible_items = carbon_target.get_visible_items() + else + visible_items = target.get_equipped_items() + + visible_items -= src // the multitool cannot mark itself. + + if(!length(visible_items)) + mark_target(target) + return + + var/list/selectable_targets = list() + var/datum/radial_menu_choice/mob_choice = new + mob_choice.image = image(icon = 'icons/hud/radial.dmi', icon_state = "radial_mob") + mob_choice.name = target.name + selectable_targets[REF(target)] = mob_choice + for(var/obj/item/item as anything in visible_items) + var/datum/radial_menu_choice/item_choice = new + + var/mutable_appearance/item_appearance = new(item) + item_appearance.layer = FLOAT_LAYER + item_appearance.plane = FLOAT_PLANE + + item_choice.name = item.name + item_choice.image = item_appearance + selectable_targets[REF(item)] = item_choice + + var/picked_ref = show_radial_menu(user, src, selectable_targets, uniqueid = TRUE, radius = 38, custom_check = CALLBACK(src, PROC_REF(check_menu), user, target), tooltips = TRUE) + if(!picked_ref) + return + + var/atom/movable/chosen = locate(picked_ref) + if(chosen == target || (chosen in (carbon_target ? carbon_target.get_visible_items() : target.get_equipped_items()))) + mark_target(chosen) + else + balloon_alert(user, "cannot mark entity") + +/obj/item/multitool/circuit/proc/check_menu(mob/user, mob/living/target) + return !marked_atom && user.is_holding(src) && user.Adjacent(target) + /obj/item/multitool/circuit/update_overlays() . = ..() cut_overlays() diff --git a/icons/hud/radial.dmi b/icons/hud/radial.dmi index 42d5c451018..90813b4d7d2 100644 Binary files a/icons/hud/radial.dmi and b/icons/hud/radial.dmi differ