From 51cd537cf0396c41f1d7a94197ff7f8d77c9fc63 Mon Sep 17 00:00:00 2001 From: Fluffy <65877598+FluffyGhoster@users.noreply.github.com> Date: Thu, 4 Apr 2024 12:35:11 +0200 Subject: [PATCH] Recharger backpacks improvements (#18831) Recharger backpacks now intuitively handle the connection with a simple item-on-backpack click. Improved backend handling, cleanly handle ref dropping to gun, localized management of the backpack, DMdoc, you know the deal. Fixes #18538 --- code/game/objects/items/recharger_backpack.dm | 71 +++++++++++++------ code/modules/projectiles/guns/energy.dm | 29 +++++--- ...uffyghost-rechargebackpackimprovements.yml | 42 +++++++++++ 3 files changed, 110 insertions(+), 32 deletions(-) create mode 100644 html/changelogs/fluffyghost-rechargebackpackimprovements.yml diff --git a/code/game/objects/items/recharger_backpack.dm b/code/game/objects/items/recharger_backpack.dm index fcc66fd606c..e155833d294 100644 --- a/code/game/objects/items/recharger_backpack.dm +++ b/code/game/objects/items/recharger_backpack.dm @@ -17,6 +17,14 @@ //To update the icon based on the power cell charge we spawn with update_icon() +/obj/item/recharger_backpack/Destroy() + if(connected) + connected.disconnect() + + QDEL_NULL(powersupply) + + . = ..() + /obj/item/recharger_backpack/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) . = ..() if(powersupply) @@ -38,26 +46,17 @@ update_icon() else if(istype(attacking_item, /obj/item/gun/energy)) - connect(attacking_item) + var/obj/item/gun/energy/gun_attempting_to_connect = attacking_item + gun_attempting_to_connect.connect(src) else . = ..() -/obj/item/recharger_backpack/proc/connect(obj/item/gun/energy/newgun) - if(connected) - to_chat(usr, SPAN_WARNING("\The [src] already has an energy weapon connected!")) - return - - connected = newgun - -/obj/item/recharger_backpack/verb/disconnect() - set name = "Disconnect Energy Weapon" - set category = "Object" +/obj/item/recharger_backpack/AltClick(mob/user) if(!connected) to_chat(usr, SPAN_WARNING("\The [src] has no energy weapon connected!")) return - connected.disconnect() /obj/item/recharger_backpack/update_icon() @@ -87,21 +86,47 @@ item_state = "recharger_backpack" set_light(0) -/obj/item/recharger_backpack/Destroy() - if(connected) - connected.disconnect() - +/obj/item/recharger_backpack/get_cell() if(powersupply) - QDEL_NULL(powersupply) + return powersupply + return ..() - . = ..() +/** + * Connects a gun to the backpack + * + * * newgun - An `/obj/item/gun/energy` to connect to the backpack + * + * Returns `TRUE` if the connection was successful, `FALSE` otherwise + */ +/obj/item/recharger_backpack/proc/connect(obj/item/gun/energy/newgun) + if(connected) + to_chat(usr, SPAN_WARNING("\The [src] already has an energy weapon connected!")) + return FALSE + + connected = newgun + RegisterSignal(connected, COMSIG_QDELETING, PROC_REF(handle_weapon_qdel)) + return TRUE + +/** + * Disconnects a gun from the backpack + * + * * disconnecting_gun - An `/obj/item/gun/energy` to disconnect from the backpack + */ +/obj/item/recharger_backpack/proc/disconnect(obj/item/gun/energy/disconnecting_gun) + UnregisterSignal(connected, COMSIG_QDELETING) + connected = null + +///Handles the weapon connected to the backpack being deleted +/obj/item/recharger_backpack/proc/handle_weapon_qdel() + SIGNAL_HANDLER + connected = null + + +/*############### + SUBTYPES +###############*/ /obj/item/recharger_backpack/high/Initialize() . = ..() powersupply = new /obj/item/cell/high(src) update_icon() - -/obj/item/recharger_backpack/get_cell() - if(powersupply) - return powersupply - return ..() diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index f0f75bf22eb..d19f3bd52ed 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -140,22 +140,31 @@ return null /** -* Connects the energy gun to an external power supply -* -* * powersource - the power supply in question. Can either be /obj/item/rig_module/recharger or /obj/item/recharger_backpack. -*/ + * Connects the energy gun to an external power supply + * + * * powersource - the power supply in question. Can either be `/obj/item/rig_module/recharger` or `/obj/item/recharger_backpack`. + * + * Returns `TRUE` if the connection was successful, `FALSE` otherwise + */ /obj/item/gun/energy/proc/connect(obj/item/powersource) SHOULD_NOT_SLEEP(TRUE) + + //Validate that the type is allowed first of all + if(!is_type_in_list(powersource, list(/obj/item/rig_module/recharger, /obj/item/recharger_backpack))) + stack_trace("Wrong type to connect the energy gun to!") + return FALSE + + //If we're already connected with something, we can't connect with something else if(recharger) to_chat(usr, SPAN_WARNING("\The [src] is already connected to \the [recharger]!")) - return + return FALSE if(istype(powersource, /obj/item/rig_module/recharger)) var/obj/item/rig_module/recharger/rigcharge = powersource if(!rigcharge.holder || !rigcharge.holder.wearer) to_chat(usr, SPAN_WARNING("\The [rigcharge] must be installed in a rig and active!")) - return + return FALSE to_chat(usr, SPAN_NOTICE("You neatly plug \the [src] into \the [powersource].")) playsound(get_turf(src), 'sound/machines/click.ogg', 30, 0) @@ -164,12 +173,12 @@ self_recharge = TRUE use_external_power = TRUE - if(istype(powersource, /obj/item/recharger_backpack)) + else if(istype(powersource, /obj/item/recharger_backpack)) var/obj/item/recharger_backpack/back_charge = powersource if(!ismob(loc)) to_chat(usr, SPAN_WARNING("\The [back_charge] must be worn on the back before a weapon can be connected!")) - return + return FALSE to_chat(usr, SPAN_NOTICE("You neatly plug \the [src] into \the [powersource].")) playsound(get_turf(src), 'sound/machines/click.ogg', 30, 0) @@ -178,6 +187,8 @@ self_recharge = TRUE use_external_power = TRUE + return TRUE + ///Disconnects the energy gun from its external power source if one exists. /obj/item/gun/energy/proc/disconnect() @@ -200,7 +211,7 @@ var/obj/item/recharger_backpack/backcharger = recharger to_chat(usr, SPAN_NOTICE("With a snap, \the [src] is disconnected from \the [recharger].")) playsound(get_turf(src), 'sound/machines/click.ogg', 30, 0) - backcharger.connected = null + backcharger.disconnect(src) recharger = null self_recharge = initial(self_recharge) diff --git a/html/changelogs/fluffyghost-rechargebackpackimprovements.yml b/html/changelogs/fluffyghost-rechargebackpackimprovements.yml new file mode 100644 index 00000000000..958a0782419 --- /dev/null +++ b/html/changelogs/fluffyghost-rechargebackpackimprovements.yml @@ -0,0 +1,42 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# maptweak +# spellcheck (typo fixes) +# experiment +# balance +# admin +# backend +# security +# refactor +################################# + +# Your name. +author: FluffyGhost + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. +# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. +changes: + - bugfix: "Recharger backpacks now intuitively handle the connection with a simple item-on-backpack click." + - backend: "Improved backend handling, cleanly handle ref dropping to gun, localized management of the backpack, DMdoc, you know the deal."