From 7d9aa01e8fe56cc14a2a6ab8ea404e7b93d6b4a3 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Mon, 3 Jan 2022 01:43:42 +0100 Subject: [PATCH] [MIRROR] modsuit update: you can now pin modules to your action buttons [MDB IGNORE] (#10398) * modsuit update: you can now pin modules to your action buttons (#63745) * modsuit update: you can now pin modules to your action buttons Co-authored-by: Fikou <23585223+Fikou@users.noreply.github.com> --- code/modules/mod/mod_actions.dm | 58 +++++++++++++++++++----- code/modules/mod/mod_activation.dm | 1 + code/modules/mod/mod_control.dm | 7 ++- code/modules/mod/mod_ui.dm | 8 +++- code/modules/mod/modules/_module.dm | 13 ++++++ tgui/packages/tgui/interfaces/MODsuit.js | 9 +++- 6 files changed, 78 insertions(+), 18 deletions(-) diff --git a/code/modules/mod/mod_actions.dm b/code/modules/mod/mod_actions.dm index 70d753561eb..f356a675771 100644 --- a/code/modules/mod/mod_actions.dm +++ b/code/modules/mod/mod_actions.dm @@ -27,16 +27,24 @@ return return ..() +/datum/action/item_action/mod/Trigger() + if(!IsAvailable()) + return FALSE + if(mod.malfunctioning && prob(75)) + mod.balloon_alert(usr, "button malfunctions!") + return FALSE + return TRUE + /datum/action/item_action/mod/deploy name = "Deploy MODsuit" desc = "Deploy/Conceal a part of the MODsuit." button_icon_state = "deploy" /datum/action/item_action/mod/deploy/Trigger() - if(!IsAvailable()) - return FALSE + . = ..() + if(!.) + return mod.choose_deploy(usr) - return TRUE /datum/action/item_action/mod/deploy/ai ai_action = TRUE @@ -47,10 +55,10 @@ button_icon_state = "activate" /datum/action/item_action/mod/activate/Trigger() - if(!IsAvailable()) - return FALSE + . = ..() + if(!.) + return mod.toggle_activate(usr) - return TRUE /datum/action/item_action/mod/activate/ai ai_action = TRUE @@ -61,10 +69,10 @@ button_icon_state = "module" /datum/action/item_action/mod/module/Trigger() - if(!IsAvailable()) - return FALSE + . = ..() + if(!.) + return mod.quick_module(usr) - return TRUE /datum/action/item_action/mod/module/ai ai_action = TRUE @@ -75,10 +83,36 @@ button_icon_state = "panel" /datum/action/item_action/mod/panel/Trigger() - if(!IsAvailable()) - return FALSE + . = ..() + if(!.) + return mod.ui_interact(usr) - return TRUE /datum/action/item_action/mod/panel/ai ai_action = TRUE + +/datum/action/item_action/mod/pinned_module + desc = "Activate the module." + var/obj/item/mod/module/module + var/mob/pinner + +/datum/action/item_action/mod/pinned_module/New(Target, obj/item/mod/module/linked_module, mob/user) + if(user == mod.ai) + ai_action = TRUE + ..() + module = linked_module + name = "Activate [capitalize(linked_module.name)]" + icon_icon = linked_module.icon + button_icon_state = linked_module.icon_state + pinner = user + +/datum/action/item_action/mod/pinned_module/Grant(mob/user) + if(user != pinner) + return + return ..() + +/datum/action/item_action/mod/pinned_module/Trigger() + . = ..() + if(!.) + return + module.on_select() diff --git a/code/modules/mod/mod_activation.dm b/code/modules/mod/mod_activation.dm index 447f1068550..6c5210fe91f 100644 --- a/code/modules/mod/mod_activation.dm +++ b/code/modules/mod/mod_activation.dm @@ -183,6 +183,7 @@ helmet.alternate_worn_layer = helmet.alternate_layer wearer.update_inv_head() wearer.update_inv_wear_mask() + wearer.update_inv_glasses() wearer.update_hair() /// Finishes the suit's activation, starts processing diff --git a/code/modules/mod/mod_control.dm b/code/modules/mod/mod_control.dm index e14c69320b8..ed48cdbfc97 100644 --- a/code/modules/mod/mod_control.dm +++ b/code/modules/mod/mod_control.dm @@ -244,17 +244,16 @@ return TRUE /obj/item/mod/control/allow_attack_hand_drop(mob/user) - var/mob/living/carbon/carbon_user = user - if(!istype(carbon_user) || src != carbon_user.back) + if(user != wearer) return ..() for(var/obj/item/part in mod_parts) if(part.loc != src) - balloon_alert(carbon_user, "retract parts first!") + balloon_alert(user, "retract parts first!") playsound(src, 'sound/machines/scanbuzz.ogg', 25, FALSE, SILENCED_SOUND_EXTRARANGE) return FALSE /obj/item/mod/control/MouseDrop(atom/over_object) - if(src != wearer?.back || !istype(over_object, /atom/movable/screen/inventory/hand)) + if(usr != wearer || !istype(over_object, /atom/movable/screen/inventory/hand)) return ..() for(var/obj/item/part in mod_parts) if(part.loc != src) diff --git a/code/modules/mod/mod_ui.dm b/code/modules/mod/mod_ui.dm index 1e719e93ebe..9a5eb6ec13d 100644 --- a/code/modules/mod/mod_ui.dm +++ b/code/modules/mod/mod_ui.dm @@ -4,7 +4,7 @@ ui = new(user, src, "MODsuit", name) ui.open() -/obj/item/mod/control/ui_data() +/obj/item/mod/control/ui_data(mob/user) var/data = list() data["interface_break"] = interface_break data["malfunctioning"] = malfunctioning @@ -25,6 +25,7 @@ description = module.desc, module_type = module.module_type, active = module.active, + pinned = module.pinned_to[user], idle_power = module.idle_power_cost, active_power = module.active_power_cost, use_power = module.use_power_cost, @@ -77,4 +78,9 @@ if(!module) return module.configure_edit(params["key"], params["value"]) + if("pin") + var/obj/item/mod/module/module = locate(params["ref"]) in modules + if(!module) + return + module.pin(usr) return TRUE diff --git a/code/modules/mod/modules/_module.dm b/code/modules/mod/modules/_module.dm index a310f955373..e3cb516bd14 100644 --- a/code/modules/mod/modules/_module.dm +++ b/code/modules/mod/modules/_module.dm @@ -33,6 +33,8 @@ var/cooldown_time = 0 /// The mouse button needed to use this module var/used_signal + /// List of mobs we are pinned to, linked with their action buttons + var/list/pinned_to = list() /// Timer for the cooldown COOLDOWN_DECLARE(cooldown_timer) @@ -250,3 +252,14 @@ if(ALT_CLICK) mod.selected_module.used_signal = COMSIG_MOB_ALTCLICKON RegisterSignal(mod.wearer, mod.selected_module.used_signal, /obj/item/mod/module.proc/on_special_click) + +/// Pins the module to the user's action buttons +/obj/item/mod/module/proc/pin(mob/user) + var/datum/action/item_action/mod/pinned_module/action = pinned_to[user] + if(action) + qdel(action) + pinned_to[user] = null + else + action = new(mod, src, user) + action.Grant(user) + pinned_to[user] = action diff --git a/tgui/packages/tgui/interfaces/MODsuit.js b/tgui/packages/tgui/interfaces/MODsuit.js index ebaa3d0ff39..5d67a4059fc 100644 --- a/tgui/packages/tgui/interfaces/MODsuit.js +++ b/tgui/packages/tgui/interfaces/MODsuit.js @@ -446,11 +446,18 @@ const ModuleSection = (props, context) => { disabled={!module.module_type} />