mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-01-13 10:23:15 +00:00
The stream mode launches a chem puff that does not react with objects or turfs on its trajectory, it only reacts with standing mobs in its way, the puff doesn't go through the mob and is immediately deleted after reacting, or with the things on the last tile it can reach. This mode is the initial mode for the nukeops chemsprayer (but the mode can still be toggled if you want to spray things on many tiles). Also the chemsprayer always spray 10 units per use now, and its range in spray mode is reduced to 4 tiles (so player aren't confused by the puff doing nothing when they aim very far and the amount transfered to each tile encountered is very low(amount is divided by range)) Fixes the chem puff appearing behind mobs it passes through.
211 lines
8.0 KiB
Plaintext
211 lines
8.0 KiB
Plaintext
/obj/item/weapon/reagent_containers/spray
|
|
name = "spray bottle"
|
|
desc = "A spray bottle, with an unscrewable top."
|
|
icon = 'icons/obj/janitor.dmi'
|
|
icon_state = "cleaner"
|
|
item_state = "cleaner"
|
|
flags = OPENCONTAINER | NOBLUDGEON
|
|
slot_flags = SLOT_BELT
|
|
throwforce = 0
|
|
w_class = 2
|
|
throw_speed = 3
|
|
throw_range = 7
|
|
var/stream_mode = 0 //whether we use the more focused mode
|
|
var/current_range = 3 //the range of tiles the sprayer will reach.
|
|
var/spray_range = 3 //the range of tiles the sprayer will reach when in spray mode.
|
|
var/stream_range = 1 //the range of tiles the sprayer will reach when in stream mode.
|
|
var/stream_amount = 10 //the amount of reagents transfered when in stream mode.
|
|
amount_per_transfer_from_this = 5
|
|
volume = 250
|
|
possible_transfer_amounts = list()
|
|
|
|
|
|
/obj/item/weapon/reagent_containers/spray/afterattack(atom/A as mob|obj, mob/user)
|
|
if(istype(A, /obj/item/weapon/storage) || istype(A, /obj/structure/table) || istype(A, /obj/structure/rack) || istype(A, /obj/structure/closet) \
|
|
|| istype(A, /obj/item/weapon/reagent_containers) || istype(A, /obj/structure/sink) || istype(A, /obj/structure/janitorialcart) || istype(A, /obj/machinery/hydroponics))
|
|
return
|
|
|
|
if(istype(A, /obj/effect/proc_holder/spell))
|
|
return
|
|
|
|
if(istype(A, /obj/structure/reagent_dispensers) && get_dist(src,A) <= 1) //this block copypasted from reagent_containers/glass, for lack of a better solution
|
|
if(!A.reagents.total_volume && A.reagents)
|
|
user << "<span class='notice'>\The [A] is empty.</span>"
|
|
return
|
|
|
|
if(reagents.total_volume >= reagents.maximum_volume)
|
|
user << "<span class='notice'>\The [src] is full.</span>"
|
|
return
|
|
|
|
var/trans = A.reagents.trans_to(src, 50) //transfer 50u , using the spray's transfer amount would take too long to refill
|
|
user << "<span class='notice'>You fill \the [src] with [trans] units of the contents of \the [A].</span>"
|
|
return
|
|
|
|
if(reagents.total_volume < amount_per_transfer_from_this)
|
|
user << "<span class='warning'>\The [src] is empty!</span>"
|
|
return
|
|
|
|
spray(A)
|
|
|
|
playsound(src.loc, 'sound/effects/spray2.ogg', 50, 1, -6)
|
|
user.changeNext_move(CLICK_CD_RANGE*2)
|
|
user.newtonian_move(get_dir(A, user))
|
|
var/turf/T = get_turf(src)
|
|
if(reagents.has_reagent("sacid"))
|
|
message_admins("[key_name_admin(user)] fired sulphuric acid from \a [src] at (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[T.x];Y=[T.y];Z=[T.z]'>[get_area(src)] ([T.x], [T.y], [T.z])</a>).")
|
|
log_game("[key_name(user)] fired sulphuric acid from \a [src] at [get_area(src)] ([T.x], [T.y], [T.z]).")
|
|
if(reagents.has_reagent("facid"))
|
|
message_admins("[key_name_admin(user)] fired Fluacid from \a [src] at (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[T.x];Y=[T.y];Z=[T.z]'>[get_area(src)] ([T.x], [T.y], [T.z])</a>).")
|
|
log_game("[key_name(user)] fired Fluacid from \a [src] at [get_area(src)] ([T.x], [T.y], [T.z]).")
|
|
if(reagents.has_reagent("lube"))
|
|
message_admins("[key_name_admin(user)] fired Space lube from \a [src] at (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[T.x];Y=[T.y];Z=[T.z]'>[get_area(src)] ([T.x], [T.y], [T.z])</a>).")
|
|
log_game("[key_name(user)] fired Space lube from \a [src] at [get_area(src)] ([T.x], [T.y], [T.z]).")
|
|
return
|
|
|
|
|
|
/obj/item/weapon/reagent_containers/spray/proc/spray(atom/A)
|
|
var/range = max(min(spray_range, get_dist(src, A)), 1)
|
|
var/obj/effect/decal/chempuff/D = new /obj/effect/decal/chempuff(get_turf(src))
|
|
D.create_reagents(amount_per_transfer_from_this)
|
|
var/puff_reagent_left = range //how many turf, mob or dense objet we can react with before we consider the chem puff consumed
|
|
if(stream_mode)
|
|
reagents.trans_to(D, amount_per_transfer_from_this)
|
|
puff_reagent_left = 1
|
|
else
|
|
reagents.trans_to(D, amount_per_transfer_from_this, 1/range)
|
|
D.color = mix_color_from_reagents(D.reagents.reagent_list)
|
|
var/wait_step = max(round(2+3/range), 2)
|
|
spawn(0)
|
|
var/range_left = range
|
|
for(var/i=0, i<range, i++)
|
|
range_left--
|
|
step_towards(D,A)
|
|
sleep(wait_step)
|
|
|
|
for(var/atom/T in get_turf(D))
|
|
if(T == D || T.invisibility) //we ignore the puff itself and stuff below the floor
|
|
continue
|
|
if(puff_reagent_left <= 0)
|
|
break
|
|
|
|
if(stream_mode)
|
|
if(ismob(T))
|
|
var/mob/M = T
|
|
if(!M.lying || !range_left)
|
|
D.reagents.reaction(M, VAPOR)
|
|
puff_reagent_left -= 1
|
|
else if(!range_left)
|
|
D.reagents.reaction(T, VAPOR)
|
|
else
|
|
D.reagents.reaction(T, VAPOR)
|
|
if(ismob(T))
|
|
puff_reagent_left -= 1
|
|
|
|
if(puff_reagent_left > 0 && (!stream_mode || !range_left))
|
|
D.reagents.reaction(get_turf(D), VAPOR)
|
|
puff_reagent_left -= 1
|
|
|
|
if(puff_reagent_left <= 0) // we used all the puff so we delete it.
|
|
qdel(D)
|
|
return
|
|
qdel(D)
|
|
|
|
/obj/item/weapon/reagent_containers/spray/attack_self(mob/user)
|
|
stream_mode = !stream_mode
|
|
if(stream_mode)
|
|
amount_per_transfer_from_this = stream_amount
|
|
current_range = stream_range
|
|
else
|
|
amount_per_transfer_from_this = initial(amount_per_transfer_from_this)
|
|
current_range = spray_range
|
|
user << "<span class='notice'>You switch the nozzle setting to [stream_mode ? "\"stream\"":"\"spray\""]. You'll now use [amount_per_transfer_from_this] units per use.</span>"
|
|
|
|
/obj/item/weapon/reagent_containers/spray/verb/empty()
|
|
|
|
set name = "Empty Spray Bottle"
|
|
set category = "Object"
|
|
set src in usr
|
|
if(usr.incapacitated())
|
|
return
|
|
if (alert(usr, "Are you sure you want to empty that?", "Empty Bottle:", "Yes", "No") != "Yes")
|
|
return
|
|
if(isturf(usr.loc) && src.loc == usr)
|
|
usr << "<span class='notice'>You empty \the [src] onto the floor.</span>"
|
|
reagents.reaction(usr.loc)
|
|
src.reagents.clear_reagents()
|
|
|
|
//space cleaner
|
|
/obj/item/weapon/reagent_containers/spray/cleaner
|
|
name = "space cleaner"
|
|
desc = "BLAM!-brand non-foaming space cleaner!"
|
|
list_reagents = list("cleaner" = 250)
|
|
|
|
//pepperspray
|
|
/obj/item/weapon/reagent_containers/spray/pepper
|
|
name = "pepperspray"
|
|
desc = "Manufactured by UhangInc, used to blind and down an opponent quickly."
|
|
icon = 'icons/obj/weapons.dmi'
|
|
icon_state = "pepperspray"
|
|
item_state = "pepperspray"
|
|
volume = 40
|
|
stream_range = 4
|
|
amount_per_transfer_from_this = 5
|
|
list_reagents = list("condensedcapsaicin" = 40)
|
|
|
|
//water flower
|
|
/obj/item/weapon/reagent_containers/spray/waterflower
|
|
name = "water flower"
|
|
desc = "A seemingly innocent sunflower...with a twist."
|
|
icon = 'icons/obj/hydroponics/harvest.dmi'
|
|
icon_state = "sunflower"
|
|
item_state = "sunflower"
|
|
amount_per_transfer_from_this = 1
|
|
volume = 10
|
|
list_reagents = list("water" = 10)
|
|
|
|
/obj/item/weapon/reagent_containers/spray/waterflower/attack_self(mob/user) //Don't allow changing how much the flower sprays
|
|
return
|
|
|
|
//chemsprayer
|
|
/obj/item/weapon/reagent_containers/spray/chemsprayer
|
|
name = "chem sprayer"
|
|
desc = "A utility used to spray large amounts of reagents in a given area."
|
|
icon = 'icons/obj/guns/projectile.dmi'
|
|
icon_state = "chemsprayer"
|
|
item_state = "chemsprayer"
|
|
throwforce = 0
|
|
w_class = 3
|
|
stream_mode = 1
|
|
current_range = 7
|
|
spray_range = 4
|
|
stream_range = 7
|
|
amount_per_transfer_from_this = 10
|
|
volume = 600
|
|
origin_tech = "combat=3;materials=3;engineering=3"
|
|
|
|
|
|
/obj/item/weapon/reagent_containers/spray/chemsprayer/spray(atom/A)
|
|
var/direction = get_dir(src, A)
|
|
var/turf/T = get_turf(A)
|
|
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)
|
|
|
|
for(var/i=1, i<=3, i++) // intialize sprays
|
|
if(reagents.total_volume < 1)
|
|
return
|
|
..(the_targets[i])
|
|
|
|
/obj/item/weapon/reagent_containers/spray/chemsprayer/bioterror
|
|
list_reagents = list("sodium_thiopental" = 100, "coniine" = 100, "venom" = 100, "condensedcapsaicin" = 100, "initropidril" = 100, "polonium" = 100)
|
|
|
|
// Plant-B-Gone
|
|
/obj/item/weapon/reagent_containers/spray/plantbgone // -- Skie
|
|
name = "Plant-B-Gone"
|
|
desc = "Kills those pesky weeds!"
|
|
icon = 'icons/obj/hydroponics/equipment.dmi'
|
|
icon_state = "plantbgone"
|
|
item_state = "plantbgone"
|
|
volume = 100
|
|
list_reagents = list("plantbgone" = 100)
|