/obj/structure/reagent_dispensers name = "Dispenser" desc = "..." icon = 'icons/obj/objects.dmi' icon_state = "watertank" density = 1 anchored = 0 pressure_resistance = 2*ONE_ATMOSPHERE var/tank_volume = 1000 //In units, how much the dispenser can hold var/reagent_id = "water" //The ID of the reagent that the dispenser uses var/lastrigger = "" // The last person to rig this fuel tank - Stored with the object. Only the last person matter for investigation /obj/structure/reagent_dispensers/attackby(obj/item/W, mob/user, params) return /obj/structure/reagent_dispensers/New() create_reagents(tank_volume) reagents.add_reagent(reagent_id, tank_volume) ..() /obj/structure/reagent_dispensers/examine(mob/user) if(!..(user, 2)) return if(reagents.total_volume) to_chat(user, "It has [reagents.total_volume] units left.") else to_chat(user, "It's empty.") /obj/structure/reagent_dispensers/proc/boom() visible_message("[src] ruptures!") chem_splash(loc, 5, list(reagents)) qdel(src) /obj/structure/reagent_dispensers/ex_act(severity) switch(severity) if(1) boom() if(2) if(prob(50)) boom() if(3) if(prob(5)) boom() /obj/structure/reagent_dispensers/blob_act() if(prob(50)) boom() //Dispensers /obj/structure/reagent_dispensers/watertank name = "water tank" desc = "A water tank." icon_state = "water" /obj/structure/reagent_dispensers/watertank/high name = "high-capacity water tank" desc = "A highly-pressurized water tank made to hold gargantuan amounts of water.." icon_state = "water_high" //I was gonna clean my room... tank_volume = 100000 /obj/structure/reagent_dispensers/fueltank name = "fuel tank" desc = "A tank full of industrial welding fuel. Do not consume." icon_state = "fuel" reagent_id = "fuel" var/obj/item/assembly_holder/rig = null var/accepts_rig = 1 /obj/structure/reagent_dispensers/fueltank/Destroy() QDEL_NULL(rig) return ..() /obj/structure/reagent_dispensers/fueltank/bullet_act(obj/item/projectile/P) ..() if(!QDELETED(src)) //wasn't deleted by the projectile's effects. if(!P.nodamage && ((P.damage_type == BURN) || (P.damage_type == BRUTE))) message_admins("[key_name_admin(P.firer)] triggered a fueltank explosion with [P.name] at [COORD(loc)] ") log_game("[key_name(P.firer)] triggered a fueltank explosion with [P.name] at [COORD(loc)]") investigate_log("[key_name(P.firer)] triggered a fueltank explosion with [P.name] at [COORD(loc)]", INVESTIGATE_BOMB) boom() /obj/structure/reagent_dispensers/fueltank/boom(var/rigtrigger = FALSE) // Prevent case where someone who rigged the tank is blamed for the explosion when the rig isn't what triggered the explosion if(rigtrigger == TRUE) // If the explosion is triggered by an assembly holder message_admins("A fueltank, last rigged by [lastrigger], exploded at [COORD(loc)]") // Then admin is informed of the last person who rigged the fuel tank log_game("A fueltank, last rigged by [lastrigger], exploded at [COORD(loc)]") investigate_log("A fueltank, last rigged by [lastrigger], exploded at [COORD(loc)]", INVESTIGATE_BOMB) explosion(loc, 0, 1, 5, 7, 10, flame_range = 5) qdel(src) /obj/structure/reagent_dispensers/fueltank/blob_act() boom() /obj/structure/reagent_dispensers/fueltank/ex_act() boom() /obj/structure/reagent_dispensers/fueltank/fire_act() boom() /obj/structure/reagent_dispensers/fueltank/tesla_act() ..() //extend the zap boom() /obj/structure/reagent_dispensers/fueltank/examine(mob/user) if(!..(user, 2)) return if(rig) to_chat(usr, "There is some kind of device rigged to the tank.") /obj/structure/reagent_dispensers/fueltank/attack_hand() if(rig) usr.visible_message("[usr] begins to detach [rig] from [src].", "You begin to detach [rig] from [src].") if(do_after(usr, 20, target = src)) usr.visible_message("[usr] detaches [rig] from [src].", "You detach [rig] from [src].") rig.forceMove(get_turf(usr)) rig = null lastrigger = null overlays.Cut() /obj/structure/reagent_dispensers/fueltank/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/assembly_holder) && accepts_rig) if(rig) to_chat(user, "There is another device in the way.") return ..() user.visible_message("[user] begins rigging [I] to [src].", "You begin rigging [I] to [src]") if(do_after(user, 20, target = src)) user.visible_message("[user] rigs [I] to [src].", "You rig [I] to [src].") var/obj/item/assembly_holder/H = I if(istype(H.a_left, /obj/item/assembly/igniter) || istype(H.a_right, /obj/item/assembly/igniter)) msg_admin_attack("[key_name_admin(user)] rigged [src.name] with [I.name] for explosion (JMP)", ATKLOG_FEW) log_game("[key_name(user)] rigged [src.name] with [I.name] for explosion at [COORD(loc)]") investigate_log("[key_name(user)] rigged [src.name] with [I.name] for explosion at [COORD(loc)]", INVESTIGATE_BOMB) lastrigger = "[key_name(user)]" rig = H user.drop_item() H.forceMove(src) var/icon/test = getFlatIcon(H) test.Shift(NORTH, 1) test.Shift(EAST, 6) overlays += test if(istype(I, /obj/item/weldingtool)) if(!reagents.has_reagent("fuel")) to_chat(user, "[src] is out of fuel!") return var/obj/item/weldingtool/W = I if(!W.welding) if(W.reagents.has_reagent("fuel", W.max_fuel)) to_chat(user, "Your [W] is already full!") return reagents.trans_to(W, W.max_fuel) user.visible_message("[user] refills [user.p_their()] [W].", "You refill [W].") playsound(src, 'sound/effects/refill.ogg', 50, 1) W.update_icon() else user.visible_message("[user] catastrophically fails at refilling [user.p_their()] [W]!", "That was stupid of you.") message_admins("[key_name_admin(user)] triggered a fueltank explosion at [COORD(loc)]") log_game("[key_name(user)] triggered a fueltank explosion at [COORD(loc)]") investigate_log("[key_name(user)] triggered a fueltank explosion at [COORD(loc)]", INVESTIGATE_BOMB) boom() else ..() /obj/structure/reagent_dispensers/fueltank/Move() ..() if(rig) rig.process_movement() /obj/structure/reagent_dispensers/fueltank/HasProximity(atom/movable/AM) if(rig) rig.HasProximity(AM) /obj/structure/reagent_dispensers/fueltank/Crossed(atom/movable/AM) if(rig) rig.Crossed(AM) /obj/structure/reagent_dispensers/fueltank/hear_talk(mob/living/M, msg) if(rig) rig.hear_talk(M, msg) /obj/structure/reagent_dispensers/fueltank/hear_message(mob/living/M, msg) if(rig) rig.hear_message(M, msg) /obj/structure/reagent_dispensers/fueltank/Bump() ..() if(rig) rig.process_movement() /obj/structure/reagent_dispensers/peppertank name = "pepper spray refiller" desc = "Contains condensed capsaicin for use in law \"enforcement.\"" icon_state = "pepper" anchored = 1 density = 0 reagent_id = "condensedcapsaicin" /obj/structure/reagent_dispensers/water_cooler name = "liquid cooler" desc = "A machine that dispenses liquid to drink." icon = 'icons/obj/vending.dmi' icon_state = "water_cooler" anchored = 1 tank_volume = 500 var/paper_cups = 25 //Paper cups left from the cooler /obj/structure/reagent_dispensers/water_cooler/examine(mob/user) if(!..(user, 2)) return to_chat(user, "There are [paper_cups ? paper_cups : "no"] paper cups left.") /obj/structure/reagent_dispensers/water_cooler/attack_hand(mob/living/user) if(!paper_cups) to_chat(user, "There aren't any cups left!") return user.visible_message("[user] takes a cup from [src].", "You take a paper cup from [src].") var/obj/item/reagent_containers/food/drinks/sillycup/S = new(get_turf(src)) user.put_in_hands(S) paper_cups-- /obj/structure/reagent_dispensers/water_cooler/attackby(obj/item/W, mob/living/user, params) add_fingerprint(user) user.changeNext_move(CLICK_CD_MELEE) if(iswrench(W)) if(anchored) playsound(loc, W.usesound, 100, 1) user.visible_message("[user] starts loosening [src]'s floor casters.", \ "You start loosening [src]'s floor casters...") if(do_after(user, 40 * W.toolspeed, target = src)) if(!loc || !anchored) return user.visible_message("[user] loosened [src]'s floor casters.", \ "You loosen [src]'s floor casters.") anchored = 0 else if(!isfloorturf(loc)) user.visible_message("A floor must be present to secure [src]!") return playsound(loc, W.usesound, 100, 1) user.visible_message("[user] start securing [src]'s floor casters...", \ "You start securing [src]'s floor casters...") if(do_after(user, 40 * W.toolspeed, target = src)) if(!loc || anchored) return user.visible_message("[user] has secured [src]'s floor casters.", \ "You have secured [src]'s floor casters.") anchored = 1 /obj/structure/reagent_dispensers/beerkeg name = "beer keg" desc = "Beer is liquid bread, it's good for you..." icon_state = "beer" reagent_id = "beer" /obj/structure/reagent_dispensers/beerkeg/blob_act() explosion(loc, 0, 3, 5, 7, 10) qdel(src) /obj/structure/reagent_dispensers/beerkeg/nuke name = "Nanotrasen-brand nuclear fission explosive" desc = "One of the more successful achievements of the Nanotrasen Corporate Warfare Division, their nuclear fission explosives are renowned for being cheap\ to produce and devestatingly effective. Signs explain that though this is just a model, every Nanotrasen station is equipped with one, just in case. \ All Captains carefully guard the disk needed to detonate them - at least, the sign says they do. There seems to be a tap on the back." icon = 'icons/obj/stationobjs.dmi' icon_state = "nuclearbomb0" /obj/structure/reagent_dispensers/virusfood name = "virus food dispenser" desc = "A dispenser of low-potency virus mutagenic." icon_state = "virus_food" anchored = 1 density = 0 reagent_id = "virusfood" /obj/structure/reagent_dispensers/spacecleanertank name = "space cleaner refiller" desc = "Refills space cleaner bottles." icon_state = "cleaner" anchored = 1 density = 0 tank_volume = 5000 reagent_id = "cleaner" /obj/structure/reagent_dispensers/fueltank/chem icon_state = "fuel_chem" anchored = 1 density = 0 accepts_rig = 0