From b43845d267fc52b7e0c66a93a08534161df685ce Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Sat, 13 Feb 2021 11:13:50 +0100 Subject: [PATCH] [MIRROR] Syringe toggle has been replaced with left-click to inject, right-click to draw. You can also now change transfer amount. (#3345) * Syringe toggle has been replaced with left-click to inject, right-click to draw. You can also now change transfer amount. (#56865) * Syringe toggle has been replaced with left-click to inject, right-click to draw. You can also now change transfer amount. Co-authored-by: Mothblocks <35135081+Jared-Fogle@users.noreply.github.com> --- code/__DEFINES/misc.dm | 3 - code/modules/hydroponics/hydroponics.dm | 14 +- code/modules/reagents/reagent_containers.dm | 5 + .../reagents/reagent_containers/syringes.dm | 208 ++++++++---------- code/modules/unit_tests/metabolizing.dm | 10 +- code/modules/unit_tests/reagent_mod_expose.dm | 3 +- icons/obj/syringe.dmi | Bin 9073 -> 9004 bytes 7 files changed, 100 insertions(+), 143 deletions(-) diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 9404b57df8f..f8ed791c3f4 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -410,9 +410,6 @@ GLOBAL_LIST_INIT(pda_styles, sortList(list(MONO, VT, ORBITRON, SHARE))) #define MAX_PROC_DEPTH 195 // 200 proc calls deep and shit breaks, this is a bit lower to give some safety room -#define SYRINGE_DRAW 0 -#define SYRINGE_INJECT 1 - //gold slime core spawning #define NO_SPAWN 0 #define HOSTILE_SPAWN 1 diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index 08714ae174a..be938ea3a18 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -520,12 +520,6 @@ if(IS_EDIBLE(O) || istype(O, /obj/item/reagent_containers)) // Syringe stuff (and other reagent containers now too) var/obj/item/reagent_containers/reagent_source = O - if(istype(reagent_source, /obj/item/reagent_containers/syringe)) - var/obj/item/reagent_containers/syringe/syr = reagent_source - if(syr.mode != 1) - to_chat(user, "You can't get any extract out of this plant." ) - return - if(!reagent_source.reagents.total_volume) to_chat(user, "[reagent_source] is empty!") return 1 @@ -548,8 +542,6 @@ if(istype(reagent_source, /obj/item/reagent_containers/syringe/)) var/obj/item/reagent_containers/syringe/syr = reagent_source visi_msg="[user] injects [target] with [syr]" - if(syr.reagents.total_volume <= syr.amount_per_transfer_from_this) - syr.mode = 0 // Beakers, bottles, buckets, etc. if(reagent_source.is_drainable()) playsound(loc, 'sound/effects/slosh.ogg', 25, TRUE) @@ -741,6 +733,12 @@ else return ..() +/obj/machinery/hydroponics/attackby_secondary(obj/item/weapon, mob/user, params) + if (istype(weapon, /obj/item/reagent_containers/syringe)) + to_chat(user, "You can't get any extract out of this plant.") + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + return SECONDARY_ATTACK_CALL_NORMAL + /obj/machinery/hydroponics/can_be_unfasten_wrench(mob/user, silent) if (!unwrenchable) // case also covered by NODECONSTRUCT checks in default_unfasten_wrench return CANT_UNFASTEN diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index 6ccfb9729c8..36c4982b97c 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -35,6 +35,11 @@ /obj/item/reagent_containers/Destroy() return ..() +/obj/item/reagent_containers/attack(mob/living/M, mob/living/user, params) + if (!user.combat_mode) + return + return ..() + /obj/item/reagent_containers/proc/on_reagents_del(datum/reagents/reagents) SIGNAL_HANDLER UnregisterSignal(reagents, list(COMSIG_REAGENTS_NEW_REAGENT, COMSIG_REAGENTS_ADD_REAGENT, COMSIG_REAGENTS_DEL_REAGENT, COMSIG_REAGENTS_REM_REAGENT, COMSIG_PARENT_QDELETING)) diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index a13f550ac3e..417d42a605a 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -8,9 +8,8 @@ icon_state = "0" worn_icon_state = "pen" amount_per_transfer_from_this = 5 - possible_transfer_amounts = list() + possible_transfer_amounts = list(5, 10, 15) volume = 15 - var/mode = SYRINGE_DRAW var/busy = FALSE // needed for delayed drawing of blood var/proj_piercing = 0 //does it pierce through thick clothes when shot with syringe gun custom_materials = list(/datum/material/iron=10, /datum/material/glass=20) @@ -18,138 +17,109 @@ custom_price = PAYCHECK_EASY * 0.5 sharpness = SHARP_POINTY -/obj/item/reagent_containers/syringe/Initialize() - . = ..() - if(list_reagents) //syringe starts in inject mode if its already got something inside - mode = SYRINGE_INJECT - update_icon() - -/obj/item/reagent_containers/syringe/ComponentInitialize() - . = ..() - AddElement(/datum/element/update_icon_updates_onmob) - -/obj/item/reagent_containers/syringe/pickup(mob/user) - ..() - update_icon() - -/obj/item/reagent_containers/syringe/dropped(mob/user) - ..() - update_icon() - -/obj/item/reagent_containers/syringe/attack_self(mob/user) - mode = !mode - update_icon() - -//ATTACK HAND IGNORING PARENT RETURN VALUE -/obj/item/reagent_containers/syringe/attack_hand() - . = ..() - update_icon() - -/obj/item/reagent_containers/syringe/attack_paw(mob/user) - return attack_hand(user) - /obj/item/reagent_containers/syringe/attackby(obj/item/I, mob/user, params) return -/obj/item/reagent_containers/syringe/afterattack(atom/target, mob/user , proximity) - . = ..() +/obj/item/reagent_containers/syringe/proc/try_syringe(atom/target, mob/user, proximity) if(busy) - return + return FALSE if(!proximity) - return + return FALSE if(!target.reagents) - return + return FALSE - var/mob/living/L if(isliving(target)) - L = target - if(!L.try_inject(user, injection_flags = INJECT_TRY_SHOW_ERROR_MESSAGE)) - return + var/mob/living/living_target = target + if(!living_target.try_inject(user, injection_flags = INJECT_TRY_SHOW_ERROR_MESSAGE)) + return FALSE // chance of monkey retaliation SEND_SIGNAL(target, COMSIG_LIVING_TRY_SYRINGE, user) + return TRUE - switch(mode) - if(SYRINGE_DRAW) +/obj/item/reagent_containers/syringe/afterattack(atom/target, mob/user, proximity) + . = ..() - if(reagents.total_volume >= reagents.maximum_volume) - to_chat(user, "The syringe is full.") + if (!try_syringe(target, user, proximity)) + return + + var/contained = reagents.log_list() + log_combat(user, target, "attempted to inject", src, addition="which had [contained]") + + if(!reagents.total_volume) + to_chat(user, "[src] is empty! Right-click to draw.") + return + + if(!isliving(target) && !target.is_injectable(user)) + to_chat(user, "You cannot directly fill [target]!") + return + + if(target.reagents.total_volume >= target.reagents.maximum_volume) + to_chat(user, "[target] is full.") + return + + if(isliving(target)) + var/mob/living/living_target = target + if(!living_target.try_inject(user, injection_flags = INJECT_TRY_SHOW_ERROR_MESSAGE)) + return + if(living_target != user) + living_target.visible_message("[user] is trying to inject [living_target]!", \ + "[user] is trying to inject you!") + if(!do_mob(user, living_target, 3 SECONDS, extra_checks = CALLBACK(living_target, /mob/living/proc/try_inject, user, null, INJECT_TRY_SHOW_ERROR_MESSAGE))) return - - if(L) //living mob - var/drawn_amount = reagents.maximum_volume - reagents.total_volume - if(target != user) - target.visible_message("[user] is trying to take a blood sample from [target]!", \ - "[user] is trying to take a blood sample from you!") - busy = TRUE - if(!do_mob(user, target, extra_checks=CALLBACK(L, /mob/living/proc/try_inject, user, null, INJECT_TRY_SHOW_ERROR_MESSAGE))) - busy = FALSE - return - if(reagents.total_volume >= reagents.maximum_volume) - return - busy = FALSE - if(L.transfer_blood_to(src, drawn_amount)) - user.visible_message("[user] takes a blood sample from [L].") - else - to_chat(user, "You are unable to draw any blood from [L]!") - - else //if not mob - if(!target.reagents.total_volume) - to_chat(user, "[target] is empty!") - return - - if(!target.is_drawable(user)) - to_chat(user, "You cannot directly remove reagents from [target]!") - return - - var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this, transfered_by = user) // transfer from, transfer to - who cares? - - to_chat(user, "You fill [src] with [trans] units of the solution. It now contains [reagents.total_volume] units.") - if (reagents.total_volume >= reagents.maximum_volume) - mode=!mode - update_icon() - - if(SYRINGE_INJECT) - // Always log attemped injections for admins - var/contained = reagents.log_list() - log_combat(user, target, "attempted to inject", src, addition="which had [contained]") - if(!reagents.total_volume) - to_chat(user, "[src] is empty!") return - - if(!L && !target.is_injectable(user)) //only checks on non-living mobs, due to how can_inject() handles - to_chat(user, "You cannot directly fill [target]!") + if(living_target.reagents.total_volume >= living_target.reagents.maximum_volume) return + living_target.visible_message("[user] injects [living_target] with the syringe!", \ + "[user] injects you with the syringe!") - if(target.reagents.total_volume >= target.reagents.maximum_volume) - to_chat(user, "[target] is full.") - return + if (living_target == user) + living_target.log_message("injected themselves ([contained]) with [name]", LOG_ATTACK, color="orange") + else + log_combat(user, living_target, "injected", src, addition="which had [contained]") + reagents.trans_to(target, amount_per_transfer_from_this, transfered_by = user, methods = INJECT) + to_chat(user, "You inject [amount_per_transfer_from_this] units of the solution. The syringe now contains [reagents.total_volume] units.") - if(L) //living mob - if(!L.try_inject(user, injection_flags = INJECT_TRY_SHOW_ERROR_MESSAGE)) - return - if(L != user) - L.visible_message("[user] is trying to inject [L]!", \ - "[user] is trying to inject you!") - if(!do_mob(user, L, extra_checks=CALLBACK(L, /mob/living/proc/try_inject, user, null, INJECT_TRY_SHOW_ERROR_MESSAGE))) - return - if(!reagents.total_volume) - return - if(L.reagents.total_volume >= L.reagents.maximum_volume) - return - L.visible_message("[user] injects [L] with the syringe!", \ - "[user] injects you with the syringe!") +/obj/item/reagent_containers/syringe/afterattack_secondary(atom/target, mob/user, proximity_flag, click_parameters) + if (!try_syringe(target, user, proximity_flag)) + return SECONDARY_ATTACK_CONTINUE_CHAIN - if(L != user) - log_combat(user, L, "injected", src, addition="which had [contained]") - else - L.log_message("injected themselves ([contained]) with [src.name]", LOG_ATTACK, color="orange") - reagents.trans_to(target, amount_per_transfer_from_this, transfered_by = user, methods = INJECT) - to_chat(user, "You inject [amount_per_transfer_from_this] units of the solution. The syringe now contains [reagents.total_volume] units.") - if (reagents.total_volume <= 0 && mode==SYRINGE_INJECT) - mode = SYRINGE_DRAW - update_icon() + if(reagents.total_volume >= reagents.maximum_volume) + to_chat(user, "[src] is full.") + return SECONDARY_ATTACK_CONTINUE_CHAIN + + if(isliving(target)) + var/mob/living/living_target = target + var/drawn_amount = reagents.maximum_volume - reagents.total_volume + if(target != user) + target.visible_message("[user] is trying to take a blood sample from [target]!", \ + "[user] is trying to take a blood sample from you!") + busy = TRUE + if(!do_mob(user, target, 3 SECONDS, extra_checks = CALLBACK(living_target, /mob/living/proc/try_inject, user, null, INJECT_TRY_SHOW_ERROR_MESSAGE))) + busy = FALSE + return SECONDARY_ATTACK_CONTINUE_CHAIN + if(reagents.total_volume >= reagents.maximum_volume) + return SECONDARY_ATTACK_CONTINUE_CHAIN + busy = FALSE + if(living_target.transfer_blood_to(src, drawn_amount)) + user.visible_message("[user] takes a blood sample from [living_target].") + else + to_chat(user, "You are unable to draw any blood from [living_target]!") + else + if(!target.reagents.total_volume) + to_chat(user, "[target] is empty!") + return SECONDARY_ATTACK_CONTINUE_CHAIN + + if(!target.is_drawable(user)) + to_chat(user, "You cannot directly remove reagents from [target]!") + return SECONDARY_ATTACK_CONTINUE_CHAIN + + var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this, transfered_by = user) // transfer from, transfer to - who cares? + + to_chat(user, "You fill [src] with [trans] units of the solution. It now contains [reagents.total_volume] units.") + + return SECONDARY_ATTACK_CONTINUE_CHAIN /* * On accidental consumption, inject the eater with 2/3rd of the syringe and reveal it @@ -177,14 +147,6 @@ var/mutable_appearance/filling_overlay = mutable_appearance('icons/obj/reagentfillings.dmi', "syringe[rounded_vol]") filling_overlay.color = mix_color_from_reagents(reagents.reagent_list) . += filling_overlay - if(ismob(loc)) - var/injoverlay - switch(mode) - if (SYRINGE_DRAW) - injoverlay = "draw" - if (SYRINGE_INJECT) - injoverlay = "inject" - . += injoverlay ///Used by update_icon() and update_overlays() /obj/item/reagent_containers/syringe/proc/get_rounded_vol() @@ -258,12 +220,14 @@ name = "bluespace syringe" desc = "An advanced syringe that can hold 60 units of chemicals." amount_per_transfer_from_this = 20 + possible_transfer_amounts = list(10, 20, 30, 40, 50, 60) volume = 60 /obj/item/reagent_containers/syringe/piercing name = "piercing syringe" desc = "A diamond-tipped syringe that pierces armor when launched at high velocity. It can hold up to 10 units." volume = 10 + possible_transfer_amounts = list(5, 10) proj_piercing = 1 /obj/item/reagent_containers/syringe/spider_extract diff --git a/code/modules/unit_tests/metabolizing.dm b/code/modules/unit_tests/metabolizing.dm index f7b689574c6..36c12693426 100644 --- a/code/modules/unit_tests/metabolizing.dm +++ b/code/modules/unit_tests/metabolizing.dm @@ -72,10 +72,7 @@ syringe.volume = meth.addiction_threshold syringe.amount_per_transfer_from_this = meth.addiction_threshold syringe.reagents.add_reagent(meth.type, meth.addiction_threshold) - - syringe.mode = SYRINGE_INJECT - syringe_user.set_combat_mode(TRUE) - syringe.afterattack(syringe_user, syringe_user, TRUE) + syringe.melee_attack_chain(syringe_user, syringe_user) syringe_user.Life() @@ -90,10 +87,7 @@ // One half pill pill_two.reagents.add_reagent(meth.type, (meth.addiction_threshold * 0.5) + 1) pill_two.attack(pill_syringe_user, pill_syringe_user) - - pill_syringe_user.set_combat_mode(TRUE) - syringe.mode = SYRINGE_INJECT - syringe.afterattack(pill_syringe_user, pill_syringe_user, TRUE) + syringe.melee_attack_chain(pill_syringe_user, pill_syringe_user) // Set the metabolism efficiency to 1.0 so it transfers all reagents to the body in one go. pill_belly = pill_syringe_user.getorganslot(ORGAN_SLOT_STOMACH) diff --git a/code/modules/unit_tests/reagent_mod_expose.dm b/code/modules/unit_tests/reagent_mod_expose.dm index 3fe02e044d4..d893fef405f 100644 --- a/code/modules/unit_tests/reagent_mod_expose.dm +++ b/code/modules/unit_tests/reagent_mod_expose.dm @@ -50,8 +50,7 @@ // INJECT syringe.reagents.add_reagent(/datum/reagent/method_patch_test, 1) - syringe.mode = SYRINGE_INJECT - syringe.afterattack(human, human, TRUE) + syringe.melee_attack_chain(human, human) TEST_ASSERT_EQUAL(human.health, 80, "Human health did not update after injection from syringe") /datum/unit_test/reagent_mob_expose/Destroy() diff --git a/icons/obj/syringe.dmi b/icons/obj/syringe.dmi index df2e20cf5f18d5814ee9bfee3e74074e5717ccec..2981293d1a8377949e0c007acfba836b92f79b7f 100644 GIT binary patch literal 9004 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