diff --git a/code/game/objects/effects/effect_system/effects_water.dm b/code/game/objects/effects/effect_system/effects_water.dm
index 7c2f9d7a28b..ef5f1d02e0e 100644
--- a/code/game/objects/effects/effect_system/effects_water.dm
+++ b/code/game/objects/effects/effect_system/effects_water.dm
@@ -24,6 +24,22 @@
AM.water_act(life, COLD_WATER_TEMPERATURE, src)
return ..()
+/obj/effect/particle_effect/water/proc/extinguish_move(turf/target)
+ for(var/counter in 1 to 5)
+ if(!step_towards(src, target))
+ return
+ var/turf/current_turf = get_turf(src)
+ reagents.reaction(current_turf)
+ for(var/atom/atm in current_turf)
+ reagents.reaction(atm)
+ if(isliving(atm)) //For extinguishing mobs on fire
+ var/mob/living/M = atm
+ M.ExtinguishMob()
+
+ if(current_turf == target)
+ return
+ sleep(2)
+
/////////////////////////////////////////////
// GENERIC STEAM SPREAD SYSTEM
diff --git a/code/game/objects/items/weapons/extinguisher.dm b/code/game/objects/items/weapons/extinguisher.dm
index 563a66f93e5..90cdcd251e0 100644
--- a/code/game/objects/items/weapons/extinguisher.dm
+++ b/code/game/objects/items/weapons/extinguisher.dm
@@ -77,7 +77,7 @@
var/transferred = W.reagents.trans_to(src, max_water)
if(transferred > 0)
to_chat(user, "\The [src] has been refilled by [transferred] units.")
- playsound(src.loc, 'sound/effects/refill.ogg', 50, TRUE, -6)
+ playsound(loc, 'sound/effects/refill.ogg', 50, TRUE, -6)
for(var/datum/reagent/water/R in reagents.reagent_list)
R.cooling_temperature = cooling_power
else
@@ -86,7 +86,7 @@
return TRUE
-/obj/item/extinguisher/afterattack(atom/target, mob/user , flag)
+/obj/item/extinguisher/afterattack(atom/target, mob/user, flag)
. = ..()
//TODO; Add support for reagents in water.
if(target.loc == user)//No more spraying yourself when putting your extinguisher away
@@ -96,90 +96,75 @@
refilling = FALSE
return
- if(!safety)
- if(src.reagents.total_volume < 1)
- to_chat(usr, "\The [src] is empty.")
- return
-
- if(!COOLDOWN_FINISHED(src, last_use))
- return
-
- COOLDOWN_START(src, last_use, 2 SECONDS)
-
- if(reagents.chem_temp > 300 || reagents.chem_temp < 280)
- add_attack_logs(user, target, "Sprayed with superheated or cooled fire extinguisher at Temperature [reagents.chem_temp]K")
- playsound(src.loc, 'sound/effects/extinguish.ogg', 75, 1, -3)
-
- var/direction = get_dir(src,target)
-
- if(usr.buckled && isobj(usr.buckled) && !usr.buckled.anchored && !istype(usr.buckled, /obj/vehicle))
- spawn(0)
- var/obj/structure/chair/C = null
- if(istype(usr.buckled, /obj/structure/chair))
- C = usr.buckled
- var/obj/B = usr.buckled
- var/movementdirection = turn(direction,180)
- if(C) C.propelled = 4
- step(B, movementdirection)
- sleep(1)
- step(B, movementdirection)
- if(C) C.propelled = 3
- sleep(1)
- step(B, movementdirection)
- sleep(1)
- step(B, movementdirection)
- if(C) C.propelled = 2
- sleep(2)
- step(B, movementdirection)
- if(C) C.propelled = 1
- sleep(2)
- step(B, movementdirection)
- if(C) C.propelled = 0
- sleep(3)
- step(B, movementdirection)
- sleep(3)
- step(B, movementdirection)
- sleep(3)
- step(B, movementdirection)
-
- else user.newtonian_move(turn(direction, 180))
-
- var/turf/T = get_turf(target)
- var/turf/T1 = get_step(T,turn(direction, 90))
- var/turf/T2 = get_step(T,turn(direction, -90))
- var/list/the_targets = list(T,T1,T2)
- if(precision)
- var/turf/T3 = get_step(T1, turn(direction, 90))
- var/turf/T4 = get_step(T2,turn(direction, -90))
- the_targets = list(T,T1,T2,T3,T4)
-
- for(var/a=0, a<5, a++)
- spawn(0)
- var/obj/effect/particle_effect/water/W = new /obj/effect/particle_effect/water( get_turf(src) )
- var/turf/my_target = pick(the_targets)
- if(precision)
- the_targets -= my_target
- var/datum/reagents/R = new/datum/reagents(5)
- if(!W) return
- W.reagents = R
- R.my_atom = W
- if(!W || !src) return
- src.reagents.trans_to(W,1)
- for(var/b=0, b<5, b++)
- step_towards(W,my_target)
- if(!W || !W.reagents) return
- W.reagents.reaction(get_turf(W))
- for(var/atom/atm in get_turf(W))
- if(!W) return
- W.reagents.reaction(atm)
- if(isliving(atm)) //For extinguishing mobs on fire
- var/mob/living/M = atm
- M.ExtinguishMob()
-
- if(W.loc == my_target) break
- sleep(2)
- else
+ if(safety)
return ..()
+ if(reagents.total_volume < 1)
+ to_chat(user, "[src] is empty.")
+ return
+
+ if(!COOLDOWN_FINISHED(src, last_use))
+ return
+
+ COOLDOWN_START(src, last_use, 2 SECONDS)
+
+ if(reagents.chem_temp > 300 || reagents.chem_temp < 280)
+ add_attack_logs(user, target, "Sprayed with superheated or cooled fire extinguisher at Temperature [reagents.chem_temp]K")
+ playsound(loc, 'sound/effects/extinguish.ogg', 75, TRUE, -3)
+
+ var/direction = get_dir(src, target)
+
+ if(isobj(user.buckled) && !user.buckled.anchored && !istype(user.buckled, /obj/vehicle))
+ INVOKE_ASYNC(src, PROC_REF(buckled_speed_move), user.buckled, direction)
+ else
+ user.newtonian_move(turn(direction, 180))
+
+ var/turf/T = get_turf(target)
+ var/turf/T1 = get_step(T, turn(direction, 90))
+ var/turf/T2 = get_step(T, turn(direction, -90))
+ var/list/the_targets = list(T, T1, T2)
+ if(precision)
+ var/turf/T3 = get_step(T1, turn(direction, 90))
+ var/turf/T4 = get_step(T2, turn(direction, -90))
+ the_targets = list(T, T1, T2, T3, T4)
+
+ for(var/a in 1 to 5)
+ var/obj/effect/particle_effect/water/water = new /obj/effect/particle_effect/water(get_turf(src))
+ water.create_reagents(5)
+ reagents.trans_to(water, 1)
+ var/turf/new_target = pick(the_targets)
+ if(precision)
+ the_targets -= new_target
+ INVOKE_ASYNC(water, TYPE_PROC_REF(/obj/effect/particle_effect/water, extinguish_move), new_target)
/obj/item/extinguisher/cyborg_recharge(coeff, emagged)
reagents.check_and_add("water", max_water, 5 * coeff)
+
+/obj/item/extinguisher/proc/buckled_speed_move(obj/structure/chair/buckled_to, direction) // Buckled_to may not be a chair here, but we're assuming so because it makes it easier to typecheck
+ var/movementdirection = turn(direction, 180)
+ if(istype(buckled_to))
+ buckled_to.propelled = 4
+ step(buckled_to, movementdirection)
+ sleep(1)
+ step(buckled_to, movementdirection)
+ if(istype(buckled_to))
+ buckled_to.propelled = 3
+ sleep(1)
+ step(buckled_to, movementdirection)
+ sleep(1)
+ step(buckled_to, movementdirection)
+ if(istype(buckled_to))
+ buckled_to.propelled = 2
+ sleep(2)
+ step(buckled_to, movementdirection)
+ if(istype(buckled_to))
+ buckled_to.propelled = 1
+ sleep(2)
+ step(buckled_to, movementdirection)
+ if(istype(buckled_to))
+ buckled_to.propelled = 0
+ sleep(3)
+ step(buckled_to, movementdirection)
+ sleep(3)
+ step(buckled_to, movementdirection)
+ sleep(3)
+ step(buckled_to, movementdirection)
diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm
index a87cec73c93..e493a7c0c95 100644
--- a/code/modules/reagents/reagent_containers/spray.dm
+++ b/code/modules/reagents/reagent_containers/spray.dm
@@ -79,7 +79,9 @@
D.icon += mix_color_from_reagents(D.reagents.reagent_list)
for(var/i in 1 to spray_currentrange)
- step_towards(D, A)
+ if(!step_towards(D, A))
+ qdel(D)
+ return
D.reagents.reaction(get_turf(D))
for(var/atom/T in get_turf(D))
D.reagents.reaction(T)