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]")