From e861304e672fc05e3da3dfe3ea93c92f77b0162a Mon Sep 17 00:00:00 2001 From: SyncIt21 <110812394+SyncIt21@users.noreply.github.com> Date: Sun, 24 May 2026 15:14:24 +0530 Subject: [PATCH] Omnitool fix & Engi Omnitool qol (#95752) ## About The Pull Request - Large tank welding tool is now merged with engi omnitool. The welding tank is shared across both omnitools so no extra fuel or such. Gives you greater versatility in switching between tools without requiring you to return the welding tool back to storage or bringing another omnitool into an extra module slot and frees up a storage slot in storage. Plus it just makes sense, completes the full set of tools an engi omnitool should be having. - Examining an omnitool also displays the examine of the internal tool it is using. So examining the engi-omnitool with the multitool selected will reveal what's in its buffer & examining it with the welding tool will display how much welding fuel is left etc ## Changelog :cl: qol: merged large welding tool tank with engi omnitool for engiborg fix: examining the omnitool will reveal details about its internal tool such as multitool buffer, welding fuel left etc /:cl: --- .../signals_mob/signals_mob_silicon.dm | 2 + code/game/objects/items/robot/items/tools.dm | 91 +++++++++++++++++-- .../objects/items/robot/robot_upgrades.dm | 20 +--- .../items/tools/engineering/weldingtool.dm | 6 +- .../mob/living/silicon/robot/inventory.dm | 3 + .../mob/living/silicon/robot/robot_model.dm | 2 - 6 files changed, 93 insertions(+), 31 deletions(-) diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_silicon.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_silicon.dm index f68b0840205..86381d4ec22 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_silicon.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_silicon.dm @@ -15,3 +15,5 @@ #define COMSIG_SILICON_AI_VACATE_APC "AI_vacate_apc" ///called when an AI's control is toggled #define COMSIG_SILICON_AI_SET_CONTROL_DISABLED "AI_set_control_disabled" +///called when borg module is activated/deactivated +#define COMSIG_SILICON_MODULE_ACTIVATION "borg_module_select" diff --git a/code/game/objects/items/robot/items/tools.dm b/code/game/objects/items/robot/items/tools.dm index 41e73a1bf79..23fe0c97edf 100644 --- a/code/game/objects/items/robot/items/tools.dm +++ b/code/game/objects/items/robot/items/tools.dm @@ -187,13 +187,20 @@ return ..() /obj/item/borg/cyborg_omnitool/add_context(atom/source, list/context, obj/item/held_item, mob/user) - . = ..() + . = NONE if (!issilicon(user)) return + var/mob/living/silicon/robot/as_cyborg = user if (!(src in as_cyborg.held_items)) context[SCREENTIP_CONTEXT_RMB] = "Select Tool" - return CONTEXTUAL_SCREENTIP_SET + return CONTEXTUAL_SCREENTIP_SET + +/obj/item/borg/cyborg_omnitool/examine(mob/user) + . = ..() + if(reference) + var/obj/item/tool = get_proxy_attacker_for(src, usr) + . += tool.examine(user) /** * Sets the new internal tool to be used @@ -202,8 +209,6 @@ * * obj/item/ref - typepath for the new internal omnitool */ /obj/item/borg/cyborg_omnitool/proc/set_internal_tool(obj/item/tool) - SHOULD_NOT_OVERRIDE(TRUE) - for(var/obj/item/internal_tool as anything in omni_toolkit) if(internal_tool == tool) reference = internal_tool @@ -237,11 +242,14 @@ //if all else fails just make a new one from scratch tool = new reference(user) + //assign the upgraded toolspeed, if engi omnitool upgrade was applied. + tool.toolspeed = initial(tool.toolspeed) - upgraded * 0.3 //the internal tool is considered part of the tool itself, so don't let it be dropped. tool.item_flags |= ABSTRACT ADD_TRAIT(tool, TRAIT_NODROP, INNATE_TRAIT) + //store tool for future use atoms[reference] = tool - tool.toolspeed = initial(tool.toolspeed) - upgraded * 0.3 //and finally assign the upgraded toolspeed, if any. + return tool /obj/item/borg/cyborg_omnitool/attack_self(mob/user) @@ -270,7 +278,8 @@ var/mob/living/silicon/robot/user = usr if (!(src in user.held_items)) attack_self(user) - return ..() + . = ..() + user.select_module(user.held_items.Find(src)) /obj/item/borg/cyborg_omnitool/update_icon_state() if (reference) @@ -318,15 +327,77 @@ /obj/item/screwdriver/cyborg, /obj/item/crowbar/cyborg, /obj/item/multitool/cyborg, + /obj/item/weldingtool/largetank/cyborg, ) +/obj/item/borg/cyborg_omnitool/engineering/Initialize(mapload) + . = ..() + RegisterSignal(src, COMSIG_SILICON_MODULE_ACTIVATION, PROC_REF(welder_toggle)) + +/obj/item/borg/cyborg_omnitool/engineering/add_context(atom/source, list/context, obj/item/held_item, mob/user) + . = ..() + if (!issilicon(user) || tool_behaviour != TOOL_WELDER) + return + + context[SCREENTIP_CONTEXT_CTRL_LMB] = "Toggle welder" + return CONTEXTUAL_SCREENTIP_SET + /obj/item/borg/cyborg_omnitool/engineering/examine(mob/user) . = ..() + if(tool_behaviour == TOOL_WELDER) + . += span_notice("Use [EXAMINE_HINT("Ctrl Click")] to toggle welder") - if(tool_behaviour == TOOL_MULTITOOL) - for(var/obj/item/multitool/tool in atoms) - . += "Its multitool buffer contains [tool.buffer]" - break +/obj/item/borg/cyborg_omnitool/engineering/update_overlays() + . = ..() + if(tool_behaviour == TOOL_WELDER) + var/obj/item/weldingtool/tool = atoms[/obj/item/weldingtool/largetank/cyborg] + if(tool?.welding) + . |= tool.update_overlays() + +/obj/item/borg/cyborg_omnitool/engineering/set_internal_tool(obj/item/tool) + if(tool_behaviour == TOOL_WELDER) + welder_toggle(src, FALSE) + + . = ..() + + if(tool_behaviour == TOOL_WELDER) + welder_toggle(src, TRUE) + +/obj/item/borg/cyborg_omnitool/engineering/item_ctrl_click(mob/user) + . = NONE + if(tool_behaviour == TOOL_WELDER) + var/mob/living/silicon/robot/borgy = loc + if(!istype(borgy) || borgy.module_active != src) + return + + welder_toggle(src, null) + return CLICK_ACTION_SUCCESS + +///Reflects internal welder icon onto the omnitool +/obj/item/borg/cyborg_omnitool/engineering/proc/welder_update(source) + PRIVATE_PROC(TRUE) + SIGNAL_HANDLER + + update_appearance(UPDATE_OVERLAYS) + +///Toggles welder on/off when module slot is selected/deselected +/obj/item/borg/cyborg_omnitool/engineering/proc/welder_toggle(datum/omnitool, state) + PRIVATE_PROC(TRUE) + SIGNAL_HANDLER + + if(tool_behaviour == TOOL_WELDER) + var/obj/item/weldingtool/tool = get_proxy_attacker_for(src, usr) + if(isnull(state)) + state = !tool.welding + if(state == tool.welding) + return + + if(state) + RegisterSignal(tool, COMSIG_ATOM_UPDATE_APPEARANCE, PROC_REF(welder_update)) + tool.switched_on(usr) + else + tool.switched_off() + UnregisterSignal(tool, COMSIG_ATOM_UPDATE_APPEARANCE) /obj/item/borg/cyborg_omnitool/botany name = "botanical omni-toolset" diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index b5f2d7b78ce..3d9e29418a1 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -459,10 +459,6 @@ if(!.) return . ADD_TRAIT(cyborg, TRAIT_FASTMED, REF(src)) - for(var/obj/item/borg/cyborg_omnitool/medical/omnitool_upgrade in cyborg.model.modules) - if(omnitool_upgrade.upgraded) - to_chat(user, span_warning("This unit is already equipped with an omnitool upgrade!")) - return FALSE for(var/obj/item/borg/cyborg_omnitool/medical/omnitool in cyborg.model.modules) omnitool.set_upgraded(TRUE) @@ -471,7 +467,7 @@ if(!.) return . REMOVE_TRAIT(cyborg, TRAIT_FASTMED, REF(src)) - for(var/obj/item/borg/cyborg_omnitool/omnitool in cyborg.model.modules) + for(var/obj/item/borg/cyborg_omnitool/medical/omnitool in cyborg.model.modules) omnitool.set_upgraded(FALSE) /obj/item/borg/upgrade/engineering_omnitool @@ -486,24 +482,16 @@ /obj/item/borg/upgrade/engineering_omnitool/action(mob/living/silicon/robot/cyborg, mob/living/user = usr) . = ..() if(!.) - return . - for(var/obj/item/borg/cyborg_omnitool/engineering/omnitool_upgrade in cyborg.model.modules) - if(omnitool_upgrade.upgraded) - to_chat(user, span_warning("This unit is already equipped with an omnitool upgrade!")) - return FALSE + return for(var/obj/item/borg/cyborg_omnitool/engineering/omnitool in cyborg.model.modules) omnitool.set_upgraded(TRUE) - for(var/obj/item/weldingtool/largetank/cyborg/welder in cyborg.model.modules) - welder.toolspeed = initial(welder.toolspeed) - 0.3 /obj/item/borg/upgrade/engineering_omnitool/deactivate(mob/living/silicon/robot/cyborg, mob/living/user = usr) . = ..() if(!.) - return . - for(var/obj/item/borg/cyborg_omnitool/omnitool in cyborg.model.modules) + return + for(var/obj/item/borg/cyborg_omnitool/engineering/omnitool in cyborg.model.modules) omnitool.set_upgraded(FALSE) - for(var/obj/item/weldingtool/largetank/cyborg/welder in cyborg.model.modules) - welder.toolspeed = initial(welder.toolspeed) /obj/item/borg/upgrade/defib name = "medical cyborg defibrillator" diff --git a/code/game/objects/items/tools/engineering/weldingtool.dm b/code/game/objects/items/tools/engineering/weldingtool.dm index e61fc068e21..35cdccdce8b 100644 --- a/code/game/objects/items/tools/engineering/weldingtool.dm +++ b/code/game/objects/items/tools/engineering/weldingtool.dm @@ -261,13 +261,13 @@ START_PROCESSING(SSobj, src) else balloon_alert(user, "no fuel!") - switched_off(user) + switched_off() else playsound(loc, deactivation_sound, 50, TRUE) - switched_off(user) + switched_off() /// Switches the welder off -/obj/item/weldingtool/proc/switched_off(mob/user) +/obj/item/weldingtool/proc/switched_off() set_welding(FALSE) force = 3 diff --git a/code/modules/mob/living/silicon/robot/inventory.dm b/code/modules/mob/living/silicon/robot/inventory.dm index 30790c176b5..ecab5e952ce 100644 --- a/code/modules/mob/living/silicon/robot/inventory.dm +++ b/code/modules/mob/living/silicon/robot/inventory.dm @@ -274,6 +274,7 @@ if(module && module_active != held_items[module_num]) module.icon_state = "[module.base_icon_state] +a" module_active = held_items[module_num] + SEND_SIGNAL(module_active, COMSIG_SILICON_MODULE_ACTIVATION, TRUE) return TRUE /** @@ -285,6 +286,8 @@ var/atom/movable/screen/robot/module_slot/module = hud_used?.screen_objects[HUD_KEY_CYBORG_MODULE(module_num)] if(module) module.icon_state = module.base_icon_state + if(module_active) + SEND_SIGNAL(module_active, COMSIG_SILICON_MODULE_ACTIVATION, FALSE) module_active = null return TRUE diff --git a/code/modules/mob/living/silicon/robot/robot_model.dm b/code/modules/mob/living/silicon/robot/robot_model.dm index 72032c2104a..deee0d54305 100644 --- a/code/modules/mob/living/silicon/robot/robot_model.dm +++ b/code/modules/mob/living/silicon/robot/robot_model.dm @@ -389,7 +389,6 @@ /obj/item/construction/rcd/borg, /obj/item/pipe_dispenser, /obj/item/extinguisher, - /obj/item/weldingtool/largetank/cyborg, /obj/item/borg/cyborg_omnitool/engineering, /obj/item/borg/cyborg_omnitool/engineering, /obj/item/t_scanner, @@ -961,7 +960,6 @@ /obj/item/pipe_dispenser, /obj/item/restraints/handcuffs/cable/zipties, /obj/item/extinguisher, - /obj/item/weldingtool/largetank/cyborg, /obj/item/analyzer, /obj/item/borg/cyborg_omnitool/engineering, /obj/item/borg/cyborg_omnitool/engineering,