/obj/item/extinguisher name = "fire extinguisher" desc = "A traditional red fire extinguisher." icon = 'icons/obj/items_and_weapons.dmi' icon_state = "fire_extinguisher0" item_state = "fire_extinguisher" hitsound = 'sound/weapons/smash.ogg' flags_1 = CONDUCT_1 throwforce = 10 w_class = WEIGHT_CLASS_NORMAL throw_speed = 2 throw_range = 7 force = 10 materials = list(MAT_METAL = 90) attack_verb = list("slammed", "whacked", "bashed", "thunked", "battered", "bludgeoned", "thrashed") dog_fashion = /datum/dog_fashion/back resistance_flags = FIRE_PROOF container_type = AMOUNT_VISIBLE var/max_water = 50 var/last_use = 1 var/chem = "water" var/safety = TRUE var/refilling = FALSE var/tanktype = /obj/structure/reagent_dispensers/watertank var/sprite_name = "fire_extinguisher" var/power = 5 //Maximum distance launched water will travel var/precision = FALSE //By default, turfs picked from a spray are random, set to 1 to make it always have at least one water effect per row var/cooling_power = 2 //Sets the cooling_temperature of the water reagent datum inside of the extinguisher when it is refilled /obj/item/extinguisher/mini name = "pocket fire extinguisher" desc = "A light and compact fibreglass-framed model fire extinguisher." icon_state = "miniFE0" item_state = "miniFE" hitsound = null //it is much lighter, after all. flags_1 = null //doesn't CONDUCT_1 throwforce = 2 w_class = WEIGHT_CLASS_SMALL force = 3 materials = list(MAT_METAL = 50, MAT_GLASS = 40) max_water = 30 sprite_name = "miniFE" dog_fashion = null /obj/item/extinguisher/mini/family name = "pocket fire extinguisher" desc = "A old fashen pocket fire extinguisher that has been modified with a larger water tank, and a small high-power sprayer. It feels cool to the touch and has a small humming to it..." icon_state = "miniFE0" item_state = "miniFE" throwforce = 1 w_class = WEIGHT_CLASS_SMALL force = 2 max_water = 40 power = 7 cooling_power = 3 /obj/item/extinguisher/Initialize() . = ..() create_reagents(max_water) reagents.add_reagent(chem, max_water) /obj/item/extinguisher/advanced name = "advanced fire extinguisher" desc = "Used to stop thermonuclear fires from spreading inside your engine." icon_state = "foam_extinguisher0" //item_state = "foam_extinguisher" needs sprite dog_fashion = null chem = "firefighting_foam" tanktype = /obj/structure/reagent_dispensers/foamtank sprite_name = "foam_extinguisher" precision = TRUE /obj/item/extinguisher/suicide_act(mob/living/carbon/user) if (!safety && (reagents.total_volume >= 1)) user.visible_message("[user] puts the nozzle to [user.p_their()] mouth. It looks like [user.p_theyre()] trying to extinguish the spark of life!") afterattack(user,user) return OXYLOSS else if (safety && (reagents.total_volume >= 1)) user.visible_message("[user] puts the nozzle to [user.p_their()] mouth... The safety's still on!") return SHAME else user.visible_message("[user] puts the nozzle to [user.p_their()] mouth... [src] is empty!") return SHAME /obj/item/extinguisher/attack_self(mob/user) safety = !safety src.icon_state = "[sprite_name][!safety]" to_chat(user, "The safety is [safety ? "on" : "off"].") return /obj/item/extinguisher/attack(mob/M, mob/user) if(user.a_intent == INTENT_HELP && !safety) //If we're on help intent and going to spray people, don't bash them. return FALSE else return ..() /obj/item/extinguisher/attack_obj(obj/O, mob/living/user) if(AttemptRefill(O, user)) refilling = TRUE return FALSE else return ..() /obj/item/extinguisher/examine(mob/user) ..() to_chat(user, "The safety is [safety ? "on" : "off"].") if(reagents.total_volume) to_chat(user, "Alt-click to empty it.") /obj/item/extinguisher/proc/AttemptRefill(atom/target, mob/user) if(istype(target, tanktype) && target.Adjacent(user)) var/safety_save = safety safety = TRUE if(reagents.total_volume == reagents.maximum_volume) to_chat(user, "\The [src] is already full!") safety = safety_save return 1 var/obj/structure/reagent_dispensers/W = target //will it work? 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, 1, -6) for(var/datum/reagent/water/R in reagents.reagent_list) R.cooling_temperature = cooling_power else to_chat(user, "\The [W] is empty!") safety = safety_save return 1 else return 0 /obj/item/extinguisher/afterattack(atom/target, mob/user , flag) . = ..() // Make it so the extinguisher doesn't spray yourself when you click your inventory items if (target.loc == user) return //TODO; Add support for reagents in water. if(refilling) refilling = FALSE return if (!safety) if (src.reagents.total_volume < 1) to_chat(usr, "\The [src] is empty!") return if (world.time < src.last_use + 12) return src.last_use = world.time playsound(src.loc, 'sound/effects/extinguish.ogg', 75, 1, -3) var/direction = get_dir(src,target) if(user.buckled && isobj(user.buckled) && !user.buckled.anchored) var/obj/B = user.buckled var/movementdirection = turn(direction,180) addtimer(CALLBACK(src, /obj/item/extinguisher/proc/move_chair, B, movementdirection), 1) else user.newtonian_move(turn(direction, 180)) //Get all the turfs that can be shot at 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.Add(T3,T4) var/list/water_particles=list() for(var/a=0, a<5, a++) var/obj/effect/particle_effect/water/W = new /obj/effect/particle_effect/water(get_turf(src)) var/my_target = pick(the_targets) water_particles[W] = my_target // If precise, remove turf from targets so it won't be picked more than once if(precision) the_targets -= my_target var/datum/reagents/R = new/datum/reagents(5) W.reagents = R R.my_atom = W reagents.trans_to(W,1) //Make em move dat ass, hun addtimer(CALLBACK(src, /obj/item/extinguisher/proc/move_particles, water_particles), 2) //Particle movement loop /obj/item/extinguisher/proc/move_particles(var/list/particles, var/repetition=0) //Check if there's anything in here first if(!particles || particles.len == 0) return // Second loop: Get all the water particles and make them move to their target for(var/obj/effect/particle_effect/water/W in particles) var/turf/my_target = particles[W] if(!W) continue step_towards(W,my_target) if(!W.reagents) continue W.reagents.reaction(get_turf(W)) for(var/A in get_turf(W)) W.reagents.reaction(A) if(W.loc == my_target) break if(repetition < power) repetition++ addtimer(CALLBACK(src, /obj/item/extinguisher/proc/move_particles, particles, repetition), 2) //Chair movement loop /obj/item/extinguisher/proc/move_chair(var/obj/B, var/movementdirection, var/repetition=0) step(B, movementdirection) var/timer_seconds switch(repetition) if(0 to 2) timer_seconds = 1 if(3 to 4) timer_seconds = 2 if(5 to 8) timer_seconds = 3 else return repetition++ addtimer(CALLBACK(src, /obj/item/extinguisher/proc/move_chair, B, movementdirection, repetition), timer_seconds) /obj/item/extinguisher/screwdriver_act(mob/user, obj/item/tool) if(!user.canUseTopic(src, BE_CLOSE, ismonkey(user))) return EmptyExtinguisher(user) /obj/item/extinguisher/proc/EmptyExtinguisher(var/mob/user) if(loc == user && reagents.total_volume) reagents.clear_reagents() var/turf/T = get_turf(loc) if(isopenturf(T)) var/turf/open/theturf = T theturf.MakeSlippery(TURF_WET_WATER, min_wet_time = 10 SECONDS, wet_time_to_add = 5 SECONDS) user.visible_message("[user] empties out \the [src] onto the floor using the release valve.", "You quietly empty out \the [src] using its release valve.")