From 5b6329ed25c7f23303977fc3e590d2b2d37e9cbd Mon Sep 17 00:00:00 2001 From: Contrabang <91113370+Contrabang@users.noreply.github.com> Date: Sun, 21 Jan 2024 15:44:50 -0500 Subject: [PATCH] Fire extinguishers and sprays only hit a tile once. (#23568) * lmaoooo lol even * yippee * DGamerL review * oops * sirryan review --- .../effects/effect_system/effects_water.dm | 16 ++ .../objects/items/weapons/extinguisher.dm | 155 ++++++++---------- .../reagents/reagent_containers/spray.dm | 4 +- 3 files changed, 89 insertions(+), 86 deletions(-) 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)