diff --git a/code/modules/food_and_drinks/food/condiment.dm b/code/modules/food_and_drinks/food/condiment.dm index cf77fdd2735..2b29a8a7f90 100644 --- a/code/modules/food_and_drinks/food/condiment.dm +++ b/code/modules/food_and_drinks/food/condiment.dm @@ -40,6 +40,7 @@ var/originalname = "condiment" //Can't use initial(name) for this. This stores the name set by condimasters. /obj/item/reagent_containers/condiment/mob_act(mob/target, mob/living/user) + . = TRUE if(!reagents || !reagents.total_volume) to_chat(user, "None of [src] left, oh no!") return diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index ea5d0ab56d4..fd7526af744 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -17,8 +17,10 @@ new_attack_chain = TRUE /obj/item/reagent_containers/interact_with_atom(atom/target, mob/living/user, list/modifiers) - if(isliving(target) && mob_act(target, user)) - return ITEM_INTERACT_COMPLETE + if(isliving(target)) + user.changeNext_move(CLICK_CD_MELEE) + if(mob_act(target, user)) + return ITEM_INTERACT_COMPLETE if(normal_act(target, user)) return ITEM_INTERACT_COMPLETE return ..() diff --git a/code/modules/reagents/reagent_containers/dropper.dm b/code/modules/reagents/reagent_containers/dropper.dm index 12b0c30cdb8..b054040b05a 100644 --- a/code/modules/reagents/reagent_containers/dropper.dm +++ b/code/modules/reagents/reagent_containers/dropper.dm @@ -11,6 +11,8 @@ amount_per_transfer_from_this = 1 possible_transfer_amounts = list(1, 2, 3, 4, 5) volume = 5 + /// How long it takes to drip the contents into someone's eyes. + var/mob_drip_delay = 3 SECONDS /obj/item/reagent_containers/dropper/on_reagent_change() if(!reagents.total_volume) @@ -19,6 +21,7 @@ icon_state = "[initial(icon_state)]1" /obj/item/reagent_containers/dropper/mob_act(mob/target, mob/living/user) + . = TRUE var/to_transfer = 0 if(iscarbon(target)) var/mob/living/carbon/C = target @@ -26,7 +29,7 @@ return if(user != C) visible_message("[user] begins to drip something into [C]'s eyes!") - if(!do_mob(user, C, 30)) + if(!do_mob(user, C, mob_drip_delay)) return if(ishuman(target)) var/mob/living/carbon/human/H = target @@ -63,7 +66,6 @@ to_chat(user, "You transfer [to_transfer] units of the solution.") /obj/item/reagent_containers/dropper/normal_act(atom/target, mob/living/user) - . = FALSE var/to_transfer = 0 if(!target.reagents) return diff --git a/code/modules/reagents/reagent_containers/glass_containers.dm b/code/modules/reagents/reagent_containers/glass_containers.dm index 3e3b7c39141..015c52008d9 100644 --- a/code/modules/reagents/reagent_containers/glass_containers.dm +++ b/code/modules/reagents/reagent_containers/glass_containers.dm @@ -28,6 +28,7 @@ . += "[src] can hold up to [reagents.maximum_volume] units." /obj/item/reagent_containers/glass/mob_act(mob/target, mob/living/user) + . = TRUE if(!is_open_container()) return diff --git a/code/modules/reagents/reagent_containers/patch.dm b/code/modules/reagents/reagent_containers/patch.dm index 387cc0d557e..e211fbc04a6 100644 --- a/code/modules/reagents/reagent_containers/patch.dm +++ b/code/modules/reagents/reagent_containers/patch.dm @@ -12,6 +12,12 @@ var/instant_application = FALSE var/needs_to_apply_reagents = TRUE +/obj/item/reagent_containers/patch/interact_with_atom(atom/target, mob/living/user, list/modifiers) + if(isnull(target.reagents)) + return + + return ..() + /obj/item/reagent_containers/patch/mob_act(mob/target, mob/living/user) apply(target, user) return ITEM_INTERACT_COMPLETE diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index 912bd0993c6..39e768046d9 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -53,6 +53,12 @@ qdel(src) return TRUE +/obj/item/reagent_containers/pill/interact_with_atom(atom/target, mob/living/user, list/modifiers) + if(isnull(target.reagents)) + return + + return ..() + /obj/item/reagent_containers/pill/mob_act(mob/target, mob/living/user) apply(target, user) return TRUE diff --git a/code/tests/attack_chain/test_attack_chain_reagent_containers.dm b/code/tests/attack_chain/test_attack_chain_reagent_containers.dm index 2e64bc8d116..073a9822b59 100644 --- a/code/tests/attack_chain/test_attack_chain_reagent_containers.dm +++ b/code/tests/attack_chain/test_attack_chain_reagent_containers.dm @@ -199,6 +199,8 @@ var/datum/test_puppeteer/player = new(src) var/datum/test_puppeteer/target = player.spawn_puppet_nearby() + var/obj/structure/table/table = player.spawn_obj_nearby(/obj/structure/table) + // Pills var/obj/pill = player.spawn_obj_in_hand(/obj/item/reagent_containers/pill/salicylic) player.click_on_self() @@ -214,6 +216,9 @@ pill = player.spawn_obj_in_hand(/obj/item/reagent_containers/pill/salicylic) player.use_item_in_hand() TEST_ASSERT_LAST_CHATLOG(player, "You swallow [pill].") + pill = player.spawn_obj_in_hand(/obj/item/reagent_containers/pill/salicylic) + player.click_on(table) + TEST_ASSERT(pill in get_turf(table), "pill not placed on table") // Patches var/obj/item/reagent_containers/patch/patch = player.spawn_obj_in_hand(/obj/item/reagent_containers/patch/silver_sulf) @@ -230,10 +235,16 @@ beaker.reagents.add_reagent("sanguine_reagent", 10) player.click_on(clonepod) TEST_ASSERT_LAST_CHATLOG(player, "You transfer 10 units of the solution to [clonepod].") - var/obj/structure/table/table = player.spawn_obj_nearby(/obj/structure/table) player.click_on(table) TEST_ASSERT(beaker in get_turf(table), "beaker not placed on table") + // Pill bottles + var/obj/pill_bottle = player.spawn_obj_in_hand(/obj/item/storage/pill_bottle) + player.puppet.swap_hand() + pill = player.spawn_obj_in_hand(/obj/item/reagent_containers/pill/salicylic) + player.click_on(pill_bottle) + TEST_ASSERT_LAST_CHATLOG(player, "You put [pill] into [pill_bottle].") + /datum/game_test/attack_chain_syringes/Run() var/datum/test_puppeteer/player = new(src) var/datum/test_puppeteer/target = player.spawn_puppet_nearby() @@ -333,3 +344,15 @@ autoinjector = player.spawn_obj_in_hand(/obj/item/reagent_containers/hypospray/autoinjector/stimpack) player.click_on(target) TEST_ASSERT_ANY_CHATLOG(player, "You inject [target] with [autoinjector]") + +/datum/game_test/attack_chain_droppers/Run() + var/datum/test_puppeteer/player = new(src) + var/datum/test_puppeteer/target = player.spawn_puppet_nearby() + var/obj/item/reagent_containers/dropper/dropper = player.spawn_obj_in_hand(/obj/item/reagent_containers/dropper) + dropper.mob_drip_delay = 0 + var/obj/item/beaker = player.spawn_obj_nearby(/obj/item/reagent_containers/glass/beaker/waterbottle) + player.click_on(beaker) + TEST_ASSERT_LAST_CHATLOG(player, "You fill [dropper] with 1 units of the solution.") + player.click_on(target) + TEST_ASSERT_ANY_CHATLOG(player, "[player.puppet] drips something into [target.puppet]'s eyes") + TEST_ASSERT_NOT_CHATLOG(player, "You cannot directly remove reagents from [target.puppet]")