From 46f1a09018d7cadd3bf49a6aa385ef7d92e3595f Mon Sep 17 00:00:00 2001
From: larentoun <31931237+larentoun@users.noreply.github.com>
Date: Thu, 6 Jun 2024 23:24:26 +0300
Subject: [PATCH] Only one IV bag at a time (#25805)
* single iv bag
* add to traits.dm
* comment for called signal
---
code/__HELPERS/trait_helpers.dm | 1 +
code/_globalvars/traits.dm | 1 +
code/modules/reagents/reagent_containers/iv_bag.dm | 11 +++++++++++
3 files changed, 13 insertions(+)
diff --git a/code/__HELPERS/trait_helpers.dm b/code/__HELPERS/trait_helpers.dm
index 85eff70a89a..21d632a2e45 100644
--- a/code/__HELPERS/trait_helpers.dm
+++ b/code/__HELPERS/trait_helpers.dm
@@ -234,6 +234,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define TRAIT_ABSTRACT_HANDS "abstract_hands" // Mobs with this trait can only pick up abstract items.
#define TRAIT_SLOW_GRABBER "slow_grabber" // Adds a 1.5 * CLICK_CD_MELEE delay to upgrading into a aggressive grab.
#define TRAIT_LANGUAGE_LOCKED "language_locked" // cant add/remove languages until removed (excludes babel because fuck everything i guess)
+#define TRAIT_HAS_IV_BAG "iv_bag" // Used to check if there is an active IV bag. Currently blocks another IV bags from being inserted.
//***** MIND TRAITS *****/
#define TRAIT_HOLY "is_holy" // The mob is holy in regards to religion
diff --git a/code/_globalvars/traits.dm b/code/_globalvars/traits.dm
index cf78a9c78dd..48c993c8bf2 100644
--- a/code/_globalvars/traits.dm
+++ b/code/_globalvars/traits.dm
@@ -97,6 +97,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_ABSTRACT_HANDS" = TRAIT_ABSTRACT_HANDS,
"TRAIT_SLOW_GRABBER" = TRAIT_SLOW_GRABBER,
"TRAIT_LANGUAGE_LOCKED" = TRAIT_LANGUAGE_LOCKED,
+ "TRAIT_HAS_IV_BAG" = TRAIT_HAS_IV_BAG
),
/datum/mind = list(
diff --git a/code/modules/reagents/reagent_containers/iv_bag.dm b/code/modules/reagents/reagent_containers/iv_bag.dm
index d2d0de9697f..9bee791230f 100644
--- a/code/modules/reagents/reagent_containers/iv_bag.dm
+++ b/code/modules/reagents/reagent_containers/iv_bag.dm
@@ -41,11 +41,19 @@
..()
update_icon(UPDATE_OVERLAYS)
+/obj/item/reagent_containers/iv_bag/proc/on_examine(datum/source, mob/examiner, list/examine_list)
+ SIGNAL_HANDLER // COMSIG_PARENT_EXAMINE
+ examine_list += "[source.p_they(TRUE)] [source.p_have()] an active IV bag."
+
/obj/item/reagent_containers/iv_bag/proc/begin_processing(mob/target)
injection_target = target
+ ADD_TRAIT(injection_target, TRAIT_HAS_IV_BAG, UID())
+ RegisterSignal(injection_target, COMSIG_PARENT_EXAMINE, PROC_REF(on_examine))
START_PROCESSING(SSobj, src)
/obj/item/reagent_containers/iv_bag/proc/end_processing()
+ REMOVE_TRAIT(injection_target, TRAIT_HAS_IV_BAG, UID())
+ UnregisterSignal(injection_target, COMSIG_PARENT_EXAMINE)
injection_target = null
STOP_PROCESSING(SSobj, src)
@@ -106,6 +114,9 @@
else // Inserting the needle
if(!L.can_inject(user, TRUE))
return
+ if(HAS_TRAIT(target, TRAIT_HAS_IV_BAG))
+ to_chat(user, "[target] already [target.p_have()] another IV bag inserted into [target.p_them()]!")
+ return
if(amount_per_transfer_from_this > 10) // We only want to be able to transfer 1, 5, or 10 units to people. Higher numbers are for transfering to other containers
to_chat(user, "The IV bag can only be used on someone with a transfer amount of 1, 5 or 10.")
return