From c860fbb168c4a0afdaad798a4e4a4f37ce626cb3 Mon Sep 17 00:00:00 2001 From: Wildkins Date: Thu, 15 Apr 2021 08:30:40 -0400 Subject: [PATCH] Fix hypospray + autoinjector checks (#11660) --- code/modules/mob/living/carbon/human/human.dm | 6 +-- .../reagents/reagent_containers/borghydro.dm | 42 ++++++++----------- .../reagents/reagent_containers/hypospray.dm | 33 ++++++++------- html/changelogs/johnwildkins-hypofix.yml | 5 +++ 4 files changed, 44 insertions(+), 42 deletions(-) create mode 100644 html/changelogs/johnwildkins-hypofix.yml diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 2b336c0be14..934b891e04c 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1514,7 +1514,7 @@ #define BASE_INJECTION_MOD 1 // x1 multiplier with no effects #define SUIT_INJECTION_MOD 2 // x2 multiplier if target is wearing spacesuit -/mob/living/carbon/human/can_inject(var/mob/user, var/error_msg, var/target_zone) +/mob/living/carbon/human/can_inject(var/mob/user, var/error_msg, var/target_zone, var/handle_coverage = TRUE) . = BASE_INJECTION_MOD if(!target_zone) @@ -1533,7 +1533,7 @@ else if (affecting.status & ORGAN_ROBOT) . = INJECTION_FAIL fail_msg = "That limb is robotic." - else + else if (handle_coverage) . *= get_bp_coverage(target_zone) if(isvaurca(src) && . == SUIT_INJECTION_MOD) user.visible_message("[user] begins hunting for an injection port on \the [src]'s carapace.") @@ -2049,4 +2049,4 @@ if (istype(E, /obj/item/organ/internal/eyes/night)) var/obj/item/organ/internal/eyes/night/N = E if(N.night_vision ) - N.disable_night_vision() \ No newline at end of file + N.disable_night_vision() diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm index 128c77c30a1..bf61cccaa35 100644 --- a/code/modules/reagents/reagent_containers/borghydro.dm +++ b/code/modules/reagents/reagent_containers/borghydro.dm @@ -56,40 +56,32 @@ reagent_volumes[T] = min(reagent_volumes[T] + 5, volume) return 1 -/obj/item/reagent_containers/hypospray/borghypo/afterattack(var/mob/living/M, var/mob/user, proximity) - - if(!proximity) +/obj/item/reagent_containers/hypospray/borghypo/inject(var/mob/living/M, var/mob/user, proximity) + if(!proximity || !istype(M)) return - if(!istype(M)) - return ..() - if(!reagent_volumes[reagent_ids[mode]]) to_chat(user,"The injector is empty.") return - var/mob/living/carbon/human/H = M - if(istype(H)) - var/obj/item/organ/external/affected = H.get_organ(user.zone_sel.selecting) - if(!affected) - to_chat(user,"\The [H] is missing that limb!") - return - else if(affected.status & ORGAN_ROBOT) - to_chat(user,"You cannot inject a robotic limb.") - return + user.visible_message("[user] injects [M] with their hypospray!", "You inject [M] with your hypospray!", "You hear a hissing noise.") + to_chat(M,"You feel a tiny prick!") - if (M.can_inject(user, 1)) - user.visible_message("[user] injects [M] with their hypospray!", "You inject [M] with your hypospray!", "You hear a hissing noise.") - to_chat(M,"You feel a tiny prick!") - - if(M.reagents) - var/t = min(amount_per_transfer_from_this, reagent_volumes[reagent_ids[mode]]) - M.reagents.add_reagent(reagent_ids[mode], t) - reagent_volumes[reagent_ids[mode]] -= t - admin_inject_log(user, M, src, reagent_ids[mode], reagents.get_temperature(), t) - to_chat(user,"[t] units injected. [reagent_volumes[reagent_ids[mode]]] units remaining.") + if(M.reagents) + var/t = min(amount_per_transfer_from_this, reagent_volumes[reagent_ids[mode]]) + M.reagents.add_reagent(reagent_ids[mode], t) + reagent_volumes[reagent_ids[mode]] -= t + admin_inject_log(user, M, src, reagent_ids[mode], reagents.get_temperature(), t) + to_chat(user,"[t] units injected. [reagent_volumes[reagent_ids[mode]]] units remaining.") return +/obj/item/reagent_containers/hypospray/borghypo/afterattack(atom/target, mob/user, proximity) + if (!proximity) + return + + if (!isliving(target)) + return ..() + /obj/item/reagent_containers/hypospray/borghypo/attack_self(mob/user as mob) //Change the mode var/t = "" for(var/i = 1 to reagent_ids.len) diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index 0663e0d2bae..5900f1b4117 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -50,14 +50,16 @@ if(isliving(M)) var/mob/living/L = M var/inj_time = time - inj_time *= L.can_inject(user, TRUE) - if(!inj_time) + var/mod_time = L.can_inject(user, TRUE, target_zone, armorcheck) + if(!mod_time) return + else if(inj_time <= 0 && mod_time > 1) + inj_time = (1 SECOND) * mod_time + else + inj_time *= mod_time user.visible_message(SPAN_WARNING("\The [user] is trying to inject \the [L] with \the [src]!"), SPAN_NOTICE("You are trying to inject \the [L] with \the [src].")) - if(armorcheck && L.get_blocked_ratio(target_zone, BRUTE, damage = 10)) - inj_time += 6 SECONDS - if(!do_mob(user, L, inj_time)) - return 1 + if(do_mob(user, L, inj_time)) + inject(M, user, M.Adjacent(user)) /obj/item/reagent_containers/hypospray/update_icon() cut_overlays() @@ -73,12 +75,8 @@ filling.color = reagents.get_color() add_overlay(filling) -/obj/item/reagent_containers/hypospray/afterattack(var/mob/M, var/mob/user, proximity) - - if (!istype(M)) - return ..() - - if(!proximity) +/obj/item/reagent_containers/hypospray/proc/inject(var/mob/M, var/mob/user, proximity) + if(!proximity || !istype(M)) return if(!reagents.total_volume) @@ -101,6 +99,13 @@ update_icon() return TRUE +/obj/item/reagent_containers/hypospray/afterattack(atom/target, mob/user, proximity) + if (!proximity) + return + + if (!isliving(target)) + return ..() + /obj/item/reagent_containers/hypospray/autoinjector name = "autoinjector" desc = "A rapid and safe way to administer small amounts of drugs by untrained or trained personnel." @@ -132,7 +137,7 @@ return FALSE . = ..() -/obj/item/reagent_containers/hypospray/autoinjector/afterattack(mob/M, mob/user, proximity) +/obj/item/reagent_containers/hypospray/autoinjector/inject(mob/M, mob/user, proximity) . = ..() if(.) spent = TRUE @@ -230,7 +235,7 @@ item_state = "combat_hypo" icon_state = "combat_hypo" volume = 20 - armorcheck = 0 + armorcheck = FALSE time = 0 reagents_to_add = list(/decl/reagent/oxycomorphine = 5, /decl/reagent/synaptizine = 5, /decl/reagent/hyperzine = 5, /decl/reagent/arithrazine = 5) diff --git a/html/changelogs/johnwildkins-hypofix.yml b/html/changelogs/johnwildkins-hypofix.yml new file mode 100644 index 00000000000..b4a997652ed --- /dev/null +++ b/html/changelogs/johnwildkins-hypofix.yml @@ -0,0 +1,5 @@ +author: JohnWildkins +delete-after: True + +changes: + - bugfix: "Hyposprays and autoinjectors should now account for armor coverage properly, and prevent injection on invalid targets (incl. robotic limbs)."