Fixed issue 775.

Fixed issue 767.

The fix for issue 767 was to standardise spray bottle code (to some extent). If any issues come up with spray bottles, pepper spray, or chem sprayers, report them to me.
Cyborgs now recharge their pacid and lube, as the size of their bottles was quartered.

Changed the flash item_state to "flashbang", as it looks exactly like a flash.

There's some more grammar and text clean up too, mostly with crates and closets.

Finally, fixed some pipes in virology, and changed the librarian's den so the bookcases are at the top.

git-svn-id: http://tgstation13.googlecode.com/svn/trunk@4394 316c924e-a436-60f5-8080-3fe189b3f50e
This commit is contained in:
petethegoat@gmail.com
2012-08-13 18:24:34 +00:00
parent 4b72ada290
commit f657677a99
22 changed files with 7220 additions and 7376 deletions

View File

@@ -1899,21 +1899,6 @@
// Hydroponics Tools // Hydroponics Tools
// ************************************* // *************************************
/obj/item/weapon/plantbgone // -- Skie
desc = "<I>Kill those pesky weeds!</I>"
icon = 'icons/obj/hydroponics.dmi'
name = "bottle of Plant-B-Gone"
icon_state = "plantbgone"
item_state = "plantbgone"
flags = TABLEPASS | OPENCONTAINER | FPRINT | USEDELAY
slot_flags = SLOT_BELT
throwforce = 3
w_class = 2.0
throw_speed = 2
throw_range = 10
var/empty = 0
/obj/item/weapon/weedspray // -- Skie /obj/item/weapon/weedspray // -- Skie
desc = "It's a toxic mixture, in spray form, to kill small weeds." desc = "It's a toxic mixture, in spray form, to kill small weeds."
icon = 'icons/obj/hydroponics.dmi' icon = 'icons/obj/hydroponics.dmi'

View File

@@ -62,7 +62,7 @@
return return
/atom/proc/attackby(obj/item/weapon/W as obj, mob/user as mob) /atom/proc/attackby(obj/item/weapon/W as obj, mob/user as mob)
if (!(istype(W, /obj/item/weapon/grab) ) && !(istype(W, /obj/item/weapon/plastique)) && !(istype(W, /obj/item/weapon/cleaner)) && !(istype(W, /obj/item/weapon/chemsprayer)) && !(istype(W, /obj/item/weapon/pepperspray)) && !(istype(W, /obj/item/weapon/plantbgone)) && !(istype(W, /obj/item/weapon/packageWrap)) && !istype(W, /obj/item/device/detective_scanner)) if (!(istype(W, /obj/item/weapon/grab) ) && !(istype(W, /obj/item/weapon/plastique)) && !(istype(W, /obj/item/weapon/reagent_containers/spray)) && !(istype(W, /obj/item/weapon/packageWrap)) && !istype(W, /obj/item/device/detective_scanner))
for(var/mob/O in viewers(src, null)) for(var/mob/O in viewers(src, null))
if ((O.client && !( O.blinded ))) if ((O.client && !( O.blinded )))
O << "\red <B>[src] has been hit by [user] with [W]</B>" O << "\red <B>[src] has been hit by [user] with [W]</B>"

View File

@@ -1,6 +1,6 @@
/obj/machinery/nuclearbomb /obj/machinery/nuclearbomb
name = "\improper Nuclear Fission Explosive"
desc = "Uh oh. RUN!!!!" desc = "Uh oh. RUN!!!!"
name = "Nuclear Fission Explosive"
icon = 'icons/obj/stationobjs.dmi' icon = 'icons/obj/stationobjs.dmi'
icon_state = "nuclearbomb0" icon_state = "nuclearbomb0"
density = 1 density = 1

View File

@@ -689,7 +689,7 @@ obj/machinery/hydroponics/attackby(var/obj/item/O as obj, var/mob/user as mob)
user << "-Nutrition level: \blue [src.nutrilevel]/10" user << "-Nutrition level: \blue [src.nutrilevel]/10"
user << "" user << ""
else if (istype(O, /obj/item/weapon/plantbgone)) else if (istype(O, /obj/item/weapon/reagent_containers/spray/plantbgone))
if(src.planted && src.myseed) if(src.planted && src.myseed)
src.health -= rand(5,20) src.health -= rand(5,20)

View File

@@ -78,7 +78,7 @@
user << "\red It's broken!" user << "\red It's broken!"
return 1 return 1
else if(src.dirty==100) // The microwave is all dirty so can't be used! else if(src.dirty==100) // The microwave is all dirty so can't be used!
if(istype(O, /obj/item/weapon/cleaner)) // If they're trying to clean it then let them if(istype(O, /obj/item/weapon/reagent_containers/spray/cleaner)) // If they're trying to clean it then let them
user.visible_message( \ user.visible_message( \
"\blue [user] starts to clean the microwave.", \ "\blue [user] starts to clean the microwave.", \
"\blue You start to clean the microwave." \ "\blue You start to clean the microwave." \

View File

@@ -1,5 +1,5 @@
/obj/machinery/recharge_station /obj/machinery/recharge_station
name = "Cyborg Recharging Station" name = "cyborg recharging station"
icon = 'icons/obj/objects.dmi' icon = 'icons/obj/objects.dmi'
icon_state = "borgcharger0" icon_state = "borgcharger0"
density = 1 density = 1
@@ -55,7 +55,7 @@
R.cell.charge = R.cell.maxcharge R.cell.charge = R.cell.maxcharge
return return
else else
R.cell.charge += 200 R.cell.charge = min(R.cell.charge + 200, R.cell.maxcharge)
return return
go_out() go_out()
@@ -102,7 +102,7 @@
//Service //Service
if(istype(O,/obj/item/weapon/reagent_containers/food/condiment/enzyme)) if(istype(O,/obj/item/weapon/reagent_containers/food/condiment/enzyme))
if(O.reagents.get_reagent_amount("enzyme") < 50) if(O.reagents.get_reagent_amount("enzyme") < 50)
O.reagents.add_reagent("enzyme", 1) O.reagents.add_reagent("enzyme", 2)
//Medical //Medical
if(istype(O,/obj/item/weapon/reagent_containers/glass/bottle/robot)) if(istype(O,/obj/item/weapon/reagent_containers/glass/bottle/robot))
var/obj/item/weapon/reagent_containers/glass/bottle/robot/B = O var/obj/item/weapon/reagent_containers/glass/bottle/robot/B = O
@@ -117,6 +117,15 @@
if(R.module) if(R.module)
R.module.respawn_consumable(R) R.module.respawn_consumable(R)
//Emagged items for janitor and medical borg
if(R.module.emag)
if(istype(R.module.emag, /obj/item/weapon/reagent_containers/spray))
var/obj/item/weapon/reagent_containers/spray/S = R.module.emag
if(S.name == "Polyacid spray")
S.reagents.add_reagent("pacid", 2)
else if(S.name == "Lube spray")
S.reagents.add_reagent("lube", 2)
verb verb
move_eject() move_eject()

View File

@@ -152,11 +152,11 @@
if(istype(W, /obj/item/weapon/weldingtool)) if(istype(W, /obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/WT = W var/obj/item/weapon/weldingtool/WT = W
if(!WT.remove_fuel(0,user)) if(!WT.remove_fuel(0,user))
user << "\blue You need more welding fuel to complete this task." user << "<span class='notice'>You need more welding fuel to complete this task.</span>"
return return
new /obj/item/stack/sheet/metal(src.loc) new /obj/item/stack/sheet/metal(src.loc)
for(var/mob/M in viewers(src)) for(var/mob/M in viewers(src))
M.show_message("\red [src] has been cut apart by [user.name] with the weldingtool.", 3, "\red You hear welding.", 2) M.show_message("<span class='notice'>\The [src] has been cut apart by [user] with \the [WT].</span>", 3, "You hear welding.", 2)
del(src) del(src)
return return
@@ -173,11 +173,11 @@
else if(istype(W, /obj/item/weapon/weldingtool)) else if(istype(W, /obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/WT = W var/obj/item/weapon/weldingtool/WT = W
if(!WT.remove_fuel(0,user)) if(!WT.remove_fuel(0,user))
user << "\blue You need more welding fuel to complete this task." user << "<span class='notice'>You need more welding fuel to complete this task.</span>"
return return
src.welded =! src.welded src.welded =! src.welded
for(var/mob/M in viewers(src)) for(var/mob/M in viewers(src))
M.show_message("\red [src] has been [welded?"welded shut":"unwelded"] by [user.name].", 3, "\red You hear welding.", 2) M.show_message("<span class='warning'>[src] has been [welded?"welded shut":"unwelded"] by [user.name].</span>", 3, "You hear welding.", 2)
else else
src.attack_hand(user) src.attack_hand(user)
return return
@@ -201,7 +201,7 @@
return return
step_towards(O, src.loc) step_towards(O, src.loc)
if(user != O) if(user != O)
user.show_viewers("\red [user] stuffs [O] into [src]!") user.show_viewers("<span class='danger'>[user] stuffs [O] into [src]!</span>")
src.add_fingerprint(user) src.add_fingerprint(user)
return return
@@ -210,7 +210,7 @@
return return
if(!src.open()) if(!src.open())
user << "\blue It won't budge!" user << "<span class='notice'>It won't budge!</span>"
if(!lastbang) if(!lastbang)
lastbang = 1 lastbang = 1
for (var/mob/M in hearers(src, null)) for (var/mob/M in hearers(src, null))
@@ -226,7 +226,7 @@
src.add_fingerprint(user) src.add_fingerprint(user)
if(!src.toggle()) if(!src.toggle())
usr << "\blue It won't budge!" usr << "<span class='notice'>It won't budge!</span>"
/obj/structure/closet/verb/verb_toggleopen() /obj/structure/closet/verb/verb_toggleopen()
set src in oview(1) set src in oview(1)
@@ -239,4 +239,4 @@
if(ishuman(usr)) if(ishuman(usr))
src.attack_hand(usr) src.attack_hand(usr)
else else
usr << "\red This mob type can't use this verb." usr << "<span class='warning'>This mob type can't use this verb.</span>"

View File

@@ -29,13 +29,13 @@
src.locked = !src.locked src.locked = !src.locked
for(var/mob/O in viewers(user, 3)) for(var/mob/O in viewers(user, 3))
if((O.client && !( O.blinded ))) if((O.client && !( O.blinded )))
O << "\blue The locker has been [src.locked ? null : "un"]locked by [user]." O << "<span class='notice'>The locker has been [locked ? null : "un"]locked by [user].</span>"
if(src.locked) if(src.locked)
src.icon_state = src.icon_locked src.icon_state = src.icon_locked
else else
src.icon_state = src.icon_closed src.icon_state = src.icon_closed
else else
user << "\red Access Denied" user << "<span class='notice'>Access Denied</span>"
/obj/structure/closet/secure_closet/attackby(obj/item/weapon/W as obj, mob/user as mob) /obj/structure/closet/secure_closet/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(src.opened) if(src.opened)
@@ -43,12 +43,12 @@
if(src.large) if(src.large)
src.MouseDrop_T(W:affecting, user) //act like they were dragged onto the closet src.MouseDrop_T(W:affecting, user) //act like they were dragged onto the closet
else else
user << "The locker is too small to stuff [W] into!" user << "<span class='notice'>The locker is too small to stuff [W] into!</span>"
user.drop_item() user.drop_item()
if(W) if(W)
W.loc = src.loc W.loc = src.loc
else if(src.broken) else if(src.broken)
user << "\red It appears to be broken." user << "<span class='notice'>The locker appears to be broken.</span>"
return return
else if((istype(W, /obj/item/weapon/card/emag)||istype(W, /obj/item/weapon/melee/energy/blade)) && !src.broken) else if((istype(W, /obj/item/weapon/card/emag)||istype(W, /obj/item/weapon/melee/energy/blade)) && !src.broken)
broken = 1 broken = 1
@@ -63,10 +63,10 @@
playsound(src.loc, 'blade1.ogg', 50, 1) playsound(src.loc, 'blade1.ogg', 50, 1)
playsound(src.loc, "sparks", 50, 1) playsound(src.loc, "sparks", 50, 1)
for(var/mob/O in viewers(user, 3)) for(var/mob/O in viewers(user, 3))
O.show_message("\blue The locker has been sliced open by [user] with an energy blade!", 1, "\red You hear metal being sliced and sparks flying.", 2) O.show_message("<span class='warning'>The locker has been sliced open by [user] with an energy blade!</span>", 1, "You hear metal being sliced and sparks flying.", 2)
else else
for(var/mob/O in viewers(user, 3)) for(var/mob/O in viewers(user, 3))
O.show_message("\blue The locker has been broken by [user] with an electromagnetic card!", 1, "You hear a faint electrical spark.", 2) O.show_message("<span class='warning'>The locker has been broken by [user] with an electromagnetic card!</span>", 1, "You hear a faint electrical spark.", 2)
else else
togglelock(user) togglelock(user)
@@ -87,7 +87,7 @@
src.icon_state = src.icon_opened src.icon_state = src.icon_opened
src.opened = 1 src.opened = 1
else else
user << "\blue It's welded shut!" user << "<span class='notice'>The locker is welded shut!</span>"
if(world.time > lastbang+5) if(world.time > lastbang+5)
lastbang = world.time lastbang = world.time
for(var/mob/M in hearers(src, null)) for(var/mob/M in hearers(src, null))
@@ -121,4 +121,4 @@
if (!opened) if (!opened)
togglelock(usr) togglelock(usr)
else else
usr << "\red This mob type can't use this verb." usr << "<span class='warning'>This mob type can't use this verb.</span>"

View File

@@ -120,7 +120,7 @@
new /obj/item/clothing/glasses/sunglasses/sechud(src) new /obj/item/clothing/glasses/sunglasses/sechud(src)
new /obj/item/weapon/storage/flashbang_kit(src) new /obj/item/weapon/storage/flashbang_kit(src)
new /obj/item/weapon/storage/belt/security(src) new /obj/item/weapon/storage/belt/security(src)
new /obj/item/weapon/pepperspray(src) new /obj/item/weapon/reagent_containers/spray/pepper(src)
new /obj/item/weapon/melee/baton(src) new /obj/item/weapon/melee/baton(src)
new /obj/item/weapon/gun/energy/taser(src) new /obj/item/weapon/gun/energy/taser(src)
return return
@@ -150,7 +150,7 @@
new /obj/item/device/radio/headset/headset_sec(src) new /obj/item/device/radio/headset/headset_sec(src)
new /obj/item/weapon/storage/belt/security(src) new /obj/item/weapon/storage/belt/security(src)
new /obj/item/device/flash(src) new /obj/item/device/flash(src)
new /obj/item/weapon/pepperspray(src) new /obj/item/weapon/reagent_containers/spray/pepper(src)
new /obj/item/weapon/grenade/flashbang(src) new /obj/item/weapon/grenade/flashbang(src)
new /obj/item/weapon/melee/baton(src) new /obj/item/weapon/melee/baton(src)
new /obj/item/weapon/gun/energy/taser(src) new /obj/item/weapon/gun/energy/taser(src)

View File

@@ -188,8 +188,8 @@
density = 1*/ density = 1*/
New() New()
..() ..()
new /obj/item/weapon/plantbgone(src) new /obj/item/weapon/reagent_containers/spray/plantbgone(src)
new /obj/item/weapon/plantbgone(src) new /obj/item/weapon/reagent_containers/spray/plantbgone(src)
new /obj/item/weapon/minihoe(src) new /obj/item/weapon/minihoe(src)
// new /obj/item/weapon/weedspray(src) // new /obj/item/weapon/weedspray(src)
// new /obj/item/weapon/weedspray(src) // new /obj/item/weapon/weedspray(src)
@@ -264,20 +264,20 @@
/obj/structure/closet/crate/secure/attack_hand(mob/user as mob) /obj/structure/closet/crate/secure/attack_hand(mob/user as mob)
if(locked && !broken) if(locked && !broken)
if (allowed(user)) if (allowed(user))
user << "\blue You unlock the [src]." user << "<span class='notice'>You unlock \the [src].</span>"
src.locked = 0 src.locked = 0
overlays = null overlays = null
overlays += greenlight overlays += greenlight
return return
else else
user << "\red It's locked." user << "<span class='notice'>\The [src] is locked.</span>"
return return
else else
..() ..()
/obj/structure/closet/crate/secure/attackby(obj/item/weapon/W as obj, mob/user as mob) /obj/structure/closet/crate/secure/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W, /obj/item/weapon/card) && src.allowed(user) && !locked && !opened && !broken) if(istype(W, /obj/item/weapon/card) && src.allowed(user) && !locked && !opened && !broken)
user << "\red You lock the [src]." user << "<span class='notice'>You lock \the [src].</span>"
src.locked = 1 src.locked = 1
overlays = null overlays = null
overlays += redlight overlays += redlight
@@ -290,7 +290,7 @@
playsound(src.loc, "sparks", 60, 1) playsound(src.loc, "sparks", 60, 1)
src.locked = 0 src.locked = 0
src.broken = 1 src.broken = 1
user << "\blue You unlock the [src]." user << "<span class='notice'>You unlock \the [src].</span>"
return return
return ..() return ..()

View File

@@ -783,7 +783,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
P.overlays = null P.overlays = null
P.overlays += image('icons/obj/pda.dmi', "pda-r") P.overlays += image('icons/obj/pda.dmi', "pda-r")
else else
U << "ERROR: Server isn't responding." U << "<span class='notice'>ERROR: Server isn't responding.</span>"
/obj/item/device/pda/verb/verb_remove_id() /obj/item/device/pda/verb/verb_remove_id()
@@ -795,9 +795,9 @@ var/global/list/obj/item/device/pda/PDAs = list()
if(id) if(id)
remove_id() remove_id()
else else
usr << "\blue This PDA does not have an ID in it." usr << "<span class='notice'>This PDA does not have an ID in it.</span>"
else else
usr << "\blue You cannot do this while restrained." usr << "<span class='notice'>You cannot do this while restrained.</span>"
/obj/item/device/pda/verb/verb_remove_pen() /obj/item/device/pda/verb/verb_remove_pen()
@@ -812,13 +812,13 @@ var/global/list/obj/item/device/pda/PDAs = list()
var/mob/M = loc var/mob/M = loc
if(M.get_active_hand() == null) if(M.get_active_hand() == null)
M.put_in_hands(O) M.put_in_hands(O)
usr << "<span class='notify'>You remove \the [O] from \the [src].</span>" usr << "<span class='notice'>You remove \the [O] from \the [src].</span>"
return return
O.loc = get_turf(src) O.loc = get_turf(src)
else else
usr << "\blue This PDA does not have a pen in it." usr << "<span class='notice'>This PDA does not have a pen in it.</span>"
else else
usr << "\blue You cannot do this while restrained." usr << "<span class='notice'>You cannot do this while restrained.</span>"
/obj/item/device/pda/proc/id_check(mob/user as mob, choice as num)//To check for IDs; 1 for in-pda use, 2 for out of pda use. /obj/item/device/pda/proc/id_check(mob/user as mob, choice as num)//To check for IDs; 1 for in-pda use, 2 for out of pda use.
if(choice == 1) if(choice == 1)
@@ -843,26 +843,30 @@ var/global/list/obj/item/device/pda/PDAs = list()
// access to status display signals // access to status display signals
/obj/item/device/pda/attackby(obj/item/C as obj, mob/user as mob) /obj/item/device/pda/attackby(obj/item/C as obj, mob/user as mob)
..() ..()
if (istype(C, /obj/item/weapon/cartridge) && isnull(src.cartridge)) if(istype(C, /obj/item/weapon/cartridge) && !cartridge)
user.drop_item() user.drop_item()
C.loc = src C.loc = src
user << "<span class='notify'>You insert [C] into [src].</span>" user << "<span class='notice'>You insert [C] into [src].</span>"
cartridge = C cartridge = C
if(C:radio) if(C:radio)
C:radio.hostpda = src C:radio.hostpda = src
else if (istype(C, /obj/item/weapon/card/id) && C:registered_name) else if(istype(C, /obj/item/weapon/card/id))
var/obj/item/weapon/card/id/idcard = C
if(!idcard.registered_name)
user << "<span class='notice'>\The [src] rejects the ID.</span>"
return
if(!owner) if(!owner)
owner = C:registered_name owner = idcard.registered_name
ownjob = C:assignment ownjob = idcard.assignment
name = "PDA-[owner] ([ownjob])" name = "PDA-[owner] ([ownjob])"
user << "<span class='notify'>Card scanned.</span>" user << "<span class='notice'>Card scanned.</span>"
else else
//Basic safety check. If either both objects are held by user or PDA is on ground and card is in hand. //Basic safety check. If either both objects are held by user or PDA is on ground and card is in hand.
if(((src in user.contents) && (C in user.contents)) || (istype(loc, /turf) && in_range(src, user) && (C in user.contents)) ) if(((src in user.contents) && (C in user.contents)) || (istype(loc, /turf) && in_range(src, user) && (C in user.contents)) )
if(!(user.stat || user.restrained()) )//If they can still act. if(!(user.stat || user.restrained()) )//If they can still act.
id_check(user, 2) id_check(user, 2)
user << "<span class='notify'>You put the ID into the [src.name]'s slot.</span>" user << "<span class='notice'>You put the ID into \the [src]'s slot.</span>"
updateSelfDialog()//Update self dialog on success. updateSelfDialog()//Update self dialog on success.
return //Return in case of failed check or when successful. return //Return in case of failed check or when successful.
updateSelfDialog()//For the non-input related code. updateSelfDialog()//For the non-input related code.
@@ -870,16 +874,16 @@ var/global/list/obj/item/device/pda/PDAs = list()
user.drop_item() user.drop_item()
C.loc = src C.loc = src
pai = C pai = C
user << "<span class='notify'>You slot \the [C] into [src].</span>" user << "<span class='notice'>You slot \the [C] into [src].</span>"
updateUsrDialog() updateUsrDialog()
else if(istype(C, /obj/item/weapon/pen)) else if(istype(C, /obj/item/weapon/pen))
var/obj/item/weapon/pen/O = locate() in src var/obj/item/weapon/pen/O = locate() in src
if(O) if(O)
user << "<span class='notify'>There is already a pen in \the [src].</span>" user << "<span class='notice'>There is already a pen in \the [src].</span>"
else else
user.drop_item() user.drop_item()
C.loc = src C.loc = src
user << "<span class='notify'>You slide \the [C] into \the [src].</span>" user << "<span class='notice'>You slide \the [C] into \the [src].</span>"
return return
/obj/item/device/pda/attack(mob/living/C as mob, mob/living/user as mob) /obj/item/device/pda/attack(mob/living/C as mob, mob/living/user as mob)

View File

@@ -2,12 +2,12 @@
name = "flash" name = "flash"
desc = "Used for blinding and being an asshole." desc = "Used for blinding and being an asshole."
icon_state = "flash" icon_state = "flash"
item_state = "flashbang" //looks exactly like a flash (and nothing like a flashbang)
throwforce = 5 throwforce = 5
w_class = 1.0 w_class = 1.0
throw_speed = 4 throw_speed = 4
throw_range = 10 throw_range = 10
flags = FPRINT | TABLEPASS| CONDUCT flags = FPRINT | TABLEPASS| CONDUCT
item_state = "electronic"
origin_tech = "magnets=2;combat=1" origin_tech = "magnets=2;combat=1"
var/times_used = 0 //Number of times it's been used. var/times_used = 0 //Number of times it's been used.
@@ -16,7 +16,7 @@
/obj/item/device/flash/proc/clown_check(var/mob/user) /obj/item/device/flash/proc/clown_check(var/mob/user)
if(user && (CLUMSY in user.mutations) && prob(50)) if(user && (CLUMSY in user.mutations) && prob(50))
user << "\red The Flash slips out of your hand." user << "\red \The [src] slips out of your hand."
user.drop_item() user.drop_item()
return 0 return 0
return 1 return 1
@@ -42,7 +42,7 @@
if(!clown_check(user)) return if(!clown_check(user)) return
if(broken) if(broken)
user.show_message("<span class='warning'>The [src.name] is broken.</span>", 2) user << "<span class='warning'>\The [src] is broken.</span>"
return return
flash_recharge() flash_recharge()
@@ -59,7 +59,7 @@
return return
times_used++ times_used++
else //can only use it 5 times a minute else //can only use it 5 times a minute
user.show_message("<span class='warning'>*click* *click*</span>", 2) user << "<span class='warning'>*click* *click*</span>"
return return
playsound(src.loc, 'flash.ogg', 100, 1) playsound(src.loc, 'flash.ogg', 100, 1)
var/flashfail = 0 var/flashfail = 0
@@ -111,16 +111,13 @@
flick("flash2", src) flick("flash2", src)
if(!issilicon(M)) if(!issilicon(M))
for(var/mob/O in viewers(user, null)) user.visible_message("<span class='disarm'>[user] blinds [M] with the flash!</span>")
O.show_message("<span class='disarm'>[user] blinds [M] with the flash!</span>")
else else
for(var/mob/O in viewers(user, null)) user.visible_message("<span class='notice'>[user] overloads [M]'s sensors with the flash!</span>")
O.show_message("<span class='notice'>[user] overloads [M]'s sensors with the flash!</span>")
else else
for(var/mob/O in viewers(user, null)) user.visible_message("<span class='notice'>[user] fails to blind [M] with the flash!</span>")
O.show_message("<span class='notice'>[user] fails to blind [M] with the flash!</span>")
return return

View File

@@ -4,7 +4,7 @@
w_class = 2.0 w_class = 2.0
icon = 'icons/obj/grenade.dmi' icon = 'icons/obj/grenade.dmi'
icon_state = "grenade" icon_state = "grenade"
item_state = "grenade" item_state = "flashbang"
throw_speed = 4 throw_speed = 4
throw_range = 20 throw_range = 20
flags = FPRINT | TABLEPASS | CONDUCT flags = FPRINT | TABLEPASS | CONDUCT

View File

@@ -10,82 +10,37 @@ Craftables (Cob pipes, potato batteries, pumpkinheads)
// Plant-B-Gone // Plant-B-Gone
/obj/item/weapon/plantbgone/New() /obj/item/weapon/reagent_containers/spray/plantbgone // -- Skie
var/datum/reagents/R = new/datum/reagents(100) // 100 units of solution name = "Plant-B-Gone"
reagents = R desc = "Kills those pesky weeds!"
R.my_atom = src icon = 'icons/obj/hydroponics.dmi'
R.add_reagent("plantbgone", 100) icon_state = "plantbgone"
item_state = "plantbgone"
volume = 100
/obj/item/weapon/plantbgone/attack(mob/living/carbon/human/M as mob, mob/user as mob)
return
/obj/item/weapon/plantbgone/afterattack(atom/A as mob|obj, mob/user as mob) /obj/item/weapon/reagent_containers/spray/plantbgone/New()
..()
reagents.add_reagent("plantbgone", 100)
if (istype(A, /obj/item/weapon/storage/backpack ))
return
else if (locate (/obj/structure/table, src.loc))
return
else if (src.reagents.total_volume < 1)
src.empty = 1
user << "\blue Add more Plant-B-Gone mixture!"
return
else
src.empty = 0
/obj/item/weapon/reagent_containers/spray/plantbgone/afterattack(atom/A as mob|obj, mob/user as mob)
if (istype(A, /obj/machinery/hydroponics)) // We are targeting hydrotray if (istype(A, /obj/machinery/hydroponics)) // We are targeting hydrotray
return return
else if (istype(A, /obj/effect/blob)) // blob damage in blob code if (istype(A, /obj/effect/blob)) // blob damage in blob code
return return
else
var/obj/effect/decal/D = new/obj/effect/decal/(get_turf(src)) // Targeting elsewhere
D.name = "chemicals"
D.icon = 'icons/obj/chemical.dmi'
D.icon_state = "weedpuff"
D.create_reagents(5)
src.reagents.trans_to(D, 5) // 5 units of solution used at a time => 20 uses
playsound(src.loc, 'spray3.ogg', 50, 1, -6)
spawn(0)
for(var/i=0, i<3, i++) // Max range = 3 tiles
step_towards(D,A) // Moves towards target as normally (not thru walls)
D.reagents.reaction(get_turf(D))
for(var/atom/T in get_turf(D))
D.reagents.reaction(T)
sleep(4)
del(D)
if((src.reagents.has_reagent("pacid")) || (src.reagents.has_reagent("lube"))) // Messages admins if someone sprays polyacid or space lube from a Plant-B-Gone bottle.
message_admins("[key_name_admin(user)] fired Polyacid/Space lube from a PlantBGone bottle.") // Polymorph
log_game("[key_name(user)] fired Polyacid/Space lube from a PlantBGone bottle.")
return
/obj/item/weapon/plantbgone/examine()
set src in usr
..() ..()
if(!(usr in view(2)) && usr!=src.loc) return
usr << "\blue The Plant-B-Gone bottle contains:"
if(reagents && reagents.reagent_list.len)
for(var/datum/reagent/R in reagents.reagent_list)
usr << "\blue [R.volume] units of [R.name]"
else
usr << "\blue Nothing."
return
// Sunflower // Sunflower
/obj/item/weapon/grown/sunflower/attack(mob/M as mob, mob/user as mob) /obj/item/weapon/grown/sunflower/attack(mob/M as mob, mob/user as mob)
M << "<font color='green'><b> [user] smacks you with a sunflower!</font><font color='yellow'><b>FLOWER POWER<b></font>" M << "<font color='green'><b> [user] smacks you with a sunflower!</font><font color='yellow'><b>FLOWER POWER<b></font>"
user << "<font color='green'> Your sunflower's </font><font color='yellow'><b>FLOWER POWER</b></font><font color='green'> strikes [M]</font>" user << "<font color='green'> Your sunflower's </font><font color='yellow'><b>FLOWER POWER</b></font><font color='green'> strikes [M]</font>"
// Nettle
// Nettle
/obj/item/weapon/grown/nettle/pickup(mob/living/carbon/human/user as mob) /obj/item/weapon/grown/nettle/pickup(mob/living/carbon/human/user as mob)
if(!user.gloves) if(!user.gloves)
user << "\red The nettle burns your bare hand!" user << "\red The nettle burns your bare hand!"
@@ -110,7 +65,6 @@ Craftables (Cob pipes, potato batteries, pumpkinheads)
// Deathnettle // Deathnettle
/obj/item/weapon/grown/deathnettle/pickup(mob/living/carbon/human/user as mob) /obj/item/weapon/grown/deathnettle/pickup(mob/living/carbon/human/user as mob)
if(!user.gloves) if(!user.gloves)
if(istype(user, /mob/living/carbon/human)) if(istype(user, /mob/living/carbon/human))
@@ -151,8 +105,8 @@ Craftables (Cob pipes, potato batteries, pumpkinheads)
potency = newValue potency = newValue
force = round((5+potency/2.5), 1) force = round((5+potency/2.5), 1)
//Crafting
//Crafting
/obj/item/weapon/corncob/attackby(obj/item/weapon/W as obj, mob/user as mob) /obj/item/weapon/corncob/attackby(obj/item/weapon/W as obj, mob/user as mob)
..() ..()
if(istype(W, /obj/item/weapon/circular_saw) || istype(W, /obj/item/weapon/hatchet) || istype(W, /obj/item/weapon/kitchen/utensil/knife)) if(istype(W, /obj/item/weapon/circular_saw) || istype(W, /obj/item/weapon/hatchet) || istype(W, /obj/item/weapon/kitchen/utensil/knife))

View File

@@ -0,0 +1,90 @@
/obj/item/weapon/mop
desc = "The world of janitalia wouldn't be complete without a mop."
name = "mop"
icon = 'icons/obj/janitor.dmi'
icon_state = "mop"
var/mopping = 0
var/mopcount = 0
force = 3.0
throwforce = 10.0
throw_speed = 5
throw_range = 10
w_class = 3.0
flags = FPRINT | TABLEPASS
attack_verb = list("mopped", "bashed", "bludgeoned", "whacked")
/obj/item/weapon/mop/New()
var/datum/reagents/R = new/datum/reagents(5)
reagents = R
R.my_atom = src
obj/item/weapon/mop/proc/clean(turf/simulated/A as turf)
src.reagents.reaction(A,1,10)
A.clean_blood()
for(var/obj/effect/O in A)
if( istype(O,/obj/effect/rune) || istype(O,/obj/effect/decal/cleanable) || istype(O,/obj/effect/overlay) )
del(O)
/obj/effect/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W, /obj/item/weapon/mop))
return
..()
/obj/item/weapon/mop/afterattack(atom/A, mob/user as mob)
if (src.reagents.total_volume < 1 || mopcount >= 5)
user << "\blue Your mop is dry!"
return
if (istype(A, /turf/simulated))
for(var/mob/O in viewers(user, null))
O.show_message("\red <B>[user] begins to clean \the [A]</B>", 1)
sleep(40)
if(A)
clean(A)
user << "\blue You have finished mopping!"
mopcount++
else if (istype(A, /obj/effect/decal/cleanable) || istype(A, /obj/effect/overlay) || istype(A, /obj/effect/rune))
for(var/mob/O in viewers(user, null))
O.show_message("\red <B>[user] begins to clean \the [get_turf(A)]</B>", 1)
sleep(40)
if(A)
clean(get_turf(A))
user << "\blue You have finished mopping!"
mopcount++
if(mopcount >= 5) //Okay this stuff is an ugly hack and i feel bad about it.
spawn(5)
src.reagents.clear_reagents()
mopcount = 0
return
/*
* Hope it's okay to stick this shit here: it basically just turns a hexadecimal color into rgb
*/
/proc/GetColors(hex)
hex = uppertext(hex)
var/hi1 = text2ascii(hex, 2)
var/lo1 = text2ascii(hex, 3)
var/hi2 = text2ascii(hex, 4)
var/lo2 = text2ascii(hex, 5)
var/hi3 = text2ascii(hex, 6)
var/lo3 = text2ascii(hex, 7)
return list(((hi1>= 65 ? hi1-55 : hi1-48)<<4) | (lo1 >= 65 ? lo1-55 : lo1-48),
((hi2 >= 65 ? hi2-55 : hi2-48)<<4) | (lo2 >= 65 ? lo2-55 : lo2-48),
((hi3 >= 65 ? hi3-55 : hi3-48)<<4) | (lo3 >= 65 ? lo3-55 : lo3-48))

View File

@@ -1,428 +0,0 @@
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32
/obj/item/weapon/cleaner
desc = "Space Cleaner!"
icon = 'icons/obj/janitor.dmi'
name = "space cleaner"
icon_state = "cleaner"
item_state = "cleaner"
flags = TABLEPASS|OPENCONTAINER|FPRINT|USEDELAY
slot_flags = SLOT_BELT
throwforce = 3
w_class = 2.0
throw_speed = 2
throw_range = 10
/obj/item/weapon/cleaner/New()
var/datum/reagents/R = new/datum/reagents(250)
reagents = R
R.my_atom = src
R.add_reagent("cleaner", 250)
/obj/item/weapon/cleaner/attack(mob/living/carbon/human/M as mob, mob/user as mob)
return
/obj/item/weapon/cleaner/afterattack(atom/A as mob|obj, mob/user as mob)
if (istype(A, /obj/item/weapon/storage ))
return
if (istype(A, /obj/effect/proc_holder/spell ))
return
else if (src.reagents.total_volume < 1)
user << "\blue [src] is empty!"
return
var/obj/effect/decal/D = new/obj/effect/decal(get_turf(src))
D.create_reagents(5)
src.reagents.trans_to(D, 5)
var/list/rgbcolor = list(0,0,0)
var/finalcolor
for(var/datum/reagent/re in D.reagents.reagent_list) // natural color mixing bullshit/algorithm
if(!finalcolor)
rgbcolor = GetColors(re.color)
finalcolor = re.color
else
var/newcolor[3]
var/prergbcolor[3]
prergbcolor = rgbcolor
newcolor = GetColors(re.color)
rgbcolor[1] = (prergbcolor[1]+newcolor[1])/2
rgbcolor[2] = (prergbcolor[2]+newcolor[2])/2
rgbcolor[3] = (prergbcolor[3]+newcolor[3])/2
finalcolor = rgb(rgbcolor[1], rgbcolor[2], rgbcolor[3])
// This isn't a perfect color mixing system, the more reagents that are inside,
// the darker it gets until it becomes absolutely pitch black! I dunno, maybe
// that's pretty realistic? I don't do a whole lot of color-mixing anyway.
// If you add brighter colors to it it'll eventually get lighter, though.
D.name = "chemicals"
D.icon = 'icons/obj/chempuff.dmi'
D.icon += finalcolor
playsound(src.loc, 'spray2.ogg', 50, 1, -6)
spawn(0)
for(var/i=0, i<3, i++)
step_towards(D,A)
D.reagents.reaction(get_turf(D))
for(var/atom/T in get_turf(D))
D.reagents.reaction(T)
sleep(3)
del(D)
if(isrobot(user)) //Cyborgs can clean forever if they keep charged
var/mob/living/silicon/robot/janitor = user
janitor.cell.charge -= 20
var/refill = src.reagents.get_master_reagent_id()
spawn(600)
src.reagents.add_reagent(refill, 10)
if(src.reagents.has_reagent("pacid"))
message_admins("[key_name_admin(user)] fired Polyacid from a Cleaner bottle.")
log_game("[key_name(user)] fired Polyacid from a Cleaner bottle.")
if(src.reagents.has_reagent("lube"))
message_admins("[key_name_admin(user)] fired Space lube from a Cleaner bottle.")
log_game("[key_name(user)] fired Space lube from a Cleaner bottle.")
return
/obj/item/weapon/cleaner/examine()
set src in usr
for(var/datum/reagent/R in reagents.reagent_list)
usr << text("\icon[] [] units of [] left!", src, round(R.volume), R.name)
//usr << text("\icon[] [] units of cleaner left!", src, src.reagents.total_volume)
..()
return
/obj/item/weapon/chemsprayer//Another copy paste with a tiny change it seems
desc = "A utility used to spray large amounts of reagent in a given area."
icon = 'icons/obj/gun.dmi'
name = "chem sprayer"
icon_state = "chemsprayer"
item_state = "chemsprayer"
flags = TABLEPASS|OPENCONTAINER|FPRINT|USEDELAY
slot_flags = SLOT_BELT
throwforce = 3
w_class = 3.0
throw_speed = 2
throw_range = 10
origin_tech = "combat=3;materials=3;engineering=3"
/obj/item/weapon/chemsprayer/New()
var/datum/reagents/R = new/datum/reagents(600)
reagents = R
R.my_atom = src
/obj/item/weapon/chemsprayer/attack(mob/living/carbon/human/M as mob, mob/user as mob)
return
/obj/item/weapon/chemsprayer/afterattack(atom/A as mob|obj, mob/user as mob)
if (istype(A, /obj/item/weapon/storage ))
return
if (istype(A, /obj/effect/proc_holder/spell ))
return
else if (src.reagents.total_volume < 1)
user << "\blue [src] is empty!"
return
playsound(src.loc, 'spray2.ogg', 50, 1, -6)
var/Sprays[3]
for(var/i=1, i<=3, i++) // intialize sprays
if(src.reagents.total_volume < 1) break
var/obj/effect/decal/D = new/obj/effect/decal(get_turf(src))
D.name = "chemicals"
D.icon = 'icons/obj/chempuff.dmi'
D.create_reagents(5)
src.reagents.trans_to(D, 5)
var/rgbcolor[3]
var/finalcolor
for(var/datum/reagent/re in D.reagents.reagent_list)
if(!finalcolor)
rgbcolor = GetColors(re.color)
finalcolor = re.color
else
var/newcolor[3]
var/prergbcolor[3]
prergbcolor = rgbcolor
newcolor = GetColors(re.color)
rgbcolor[1] = (prergbcolor[1]+newcolor[1])/2
rgbcolor[2] = (prergbcolor[2]+newcolor[2])/2
rgbcolor[3] = (prergbcolor[3]+newcolor[3])/2
finalcolor = rgb(rgbcolor[1], rgbcolor[2], rgbcolor[3])
D.icon += finalcolor
Sprays[i] = D
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<=Sprays.len, i++)
spawn()
var/obj/effect/decal/D = Sprays[i]
if(!D) continue
// Spreads the sprays a little bit
var/turf/my_target = pick(the_targets)
the_targets -= my_target
for(var/j=1, j<=rand(6,8), j++)
step_towards(D, my_target)
D.reagents.reaction(get_turf(D))
for(var/atom/t in get_turf(D))
D.reagents.reaction(t)
sleep(2)
del(D)
sleep(1)
if(isrobot(user)) //Cyborgs can clean forever if they keep charged
var/mob/living/silicon/robot/janitor = user
janitor.cell.charge -= 20
var/refill = src.reagents.get_master_reagent_id()
spawn(600)
src.reagents.add_reagent(refill, 10)
if((src.reagents.has_reagent("pacid")) || (src.reagents.has_reagent("lube"))) // Messages admins if someone sprays polyacid or space lube from a Chem Sprayer.
message_admins("[key_name_admin(user)] fired Polyacid/Space lube from a Chem Sprayer.") // Polymorph
log_game("[key_name(user)] fired Polyacid/Space lube from a Chem Sprayer.")
return
//A direct copy paste of the cleaner, fantastic.
/obj/item/weapon/pepperspray
desc = "Manufactured by UhangInc., used to blind and down an opponent quickly. It has three spray settings, and is currently set to 'low'."
icon = 'icons/obj/weapons.dmi'
name = "pepperspray"
icon_state = "pepperspray"
item_state = "pepperspray"
flags = TABLEPASS|FPRINT|USEDELAY
slot_flags = SLOT_BELT
throwforce = 3
w_class = 2.0
throw_speed = 2
throw_range = 10
var/setting = 1
/obj/item/weapon/pepperspray/New()
var/datum/reagents/R = new/datum/reagents(45)
reagents = R
R.my_atom = src
R.add_reagent("condensedcapsaicin", 45)
/obj/item/weapon/pepperspray/attack(mob/living/carbon/human/M as mob, mob/user as mob)
return
/obj/item/weapon/pepperspray/attack_self( mob/user as mob)
src.setting += 1
switch ( src.setting )
if (2)
user << "You change the spray to 'medium'."
src.desc = "Manufactured by UhangInc., used to blind and down an opponent quickly. It has three spray settings, and is currently set to 'medium'."
if (3)
user << "You change the spray to 'high'."
src.desc = "Manufactured by UhangInc., used to blind and down an opponent quickly. It has three spray settings, and is currently set to 'high'."
if (4)
src.setting = 1
user << "You change the spray to 'low'."
src.desc = "Manufactured by UhangInc., used to blind and down an opponent quickly. It has three spray settings, and is currently set to 'low'."
return
/obj/item/weapon/pepperspray/afterattack(atom/A as mob|obj, mob/user as mob)
if ( A == src )
return
if ( src.setting < 1 || src.setting > 3 ) // Stop var editing from breaking some maths further down
src.setting = 1
if (istype(A, /obj/item/weapon/storage ))
return
if (istype(A, /obj/effect/proc_holder/spell ))
return
else if (istype(A, /obj/structure/reagent_dispensers/peppertank) && get_dist(src,A) <= 1)
A.reagents.trans_to(src, 45)
user << "\blue Pepper spray refilled"
playsound(src.loc, 'refill.ogg', 50, 1, -6)
return
else if (src.reagents.total_volume < 1)
user << "\blue [src] is empty!"
return
playsound(src.loc, 'spray2.ogg', 50, 1, -6)
var/Sprays[1] // BubbleWrap - single spray
for(var/i=1, i<=1, i++) // intialize sprays
if(src.reagents.total_volume < 1) break
var/obj/effect/decal/D = new/obj/effect/decal(get_turf(src))
D.name = "chemicals"
D.icon = 'icons/obj/chempuff.dmi'
var/xfer_volume = round(45/(4-src.setting)) // Use more spray per spray on higher settings
D.create_reagents(xfer_volume)
src.reagents.trans_to(D, xfer_volume)
var/rgbcolor[3]
var/finalcolor
for(var/datum/reagent/re in D.reagents.reagent_list)
if(!finalcolor)
rgbcolor = GetColors(re.color)
finalcolor = re.color
else
var/newcolor[3]
var/prergbcolor[3]
prergbcolor = rgbcolor
newcolor = GetColors(re.color)
rgbcolor[1] = (prergbcolor[1]+newcolor[1])/2
rgbcolor[2] = (prergbcolor[2]+newcolor[2])/2
rgbcolor[3] = (prergbcolor[3]+newcolor[3])/2
finalcolor = rgb(rgbcolor[1], rgbcolor[2], rgbcolor[3])
D.icon += finalcolor
Sprays[i] = D
//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<=Sprays.len, i++)
spawn()
var/obj/effect/decal/D = Sprays[i]
if(!D) continue
// Spreads the sprays a little bit
var/turf/my_target = get_turf(A) //pick(the_targets)
//the_targets -= my_target
var/list/affected = new() // BubbleWrap
for(var/j=1, j<=rand(6,8), j++)
step_towards(D, my_target)
D.reagents.reaction(get_turf(D))
for(var/atom/t in get_turf(D))
if ( !(t in affected) ) // Only spray each person once, removes chat spam
D.reagents.reaction(t)
affected += t
sleep(2)
del(D)
sleep(1)
if(isrobot(user)) //Cyborgs can clean forever if they keep charged
var/mob/living/silicon/robot/janitor = user
janitor.cell.charge -= 20
var/refill = src.reagents.get_master_reagent_id()
spawn(600)
src.reagents.add_reagent(refill, 45)
return
/obj/item/weapon/pepperspray/examine()
set src in usr
usr << "\icon[src] [src.reagents.total_volume] units of spray left!"
..()
return
// MOP
/obj/item/weapon/mop
desc = "The world of janitalia wouldn't be complete without a mop."
name = "mop"
icon = 'icons/obj/janitor.dmi'
icon_state = "mop"
var/mopping = 0
var/mopcount = 0
force = 3.0
throwforce = 10.0
throw_speed = 5
throw_range = 10
w_class = 3.0
flags = FPRINT | TABLEPASS
attack_verb = list("mopped", "bashed", "bludgeoned", "whacked")
/obj/item/weapon/mop/New()
var/datum/reagents/R = new/datum/reagents(5)
reagents = R
R.my_atom = src
obj/item/weapon/mop/proc/clean(turf/simulated/A as turf)
src.reagents.reaction(A,1,10)
A.clean_blood()
for(var/obj/effect/O in A)
if( istype(O,/obj/effect/rune) || istype(O,/obj/effect/decal/cleanable) || istype(O,/obj/effect/overlay) )
del(O)
/obj/effect/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W, /obj/item/weapon/mop))
return
..()
/obj/item/weapon/mop/afterattack(atom/A, mob/user as mob)
if (src.reagents.total_volume < 1 || mopcount >= 5)
user << "\blue Your mop is dry!"
return
if (istype(A, /turf/simulated))
for(var/mob/O in viewers(user, null))
O.show_message("\red <B>[user] begins to clean \the [A]</B>", 1)
sleep(40)
if(A)
clean(A)
user << "\blue You have finished mopping!"
mopcount++
else if (istype(A, /obj/effect/decal/cleanable) || istype(A, /obj/effect/overlay) || istype(A, /obj/effect/rune))
for(var/mob/O in viewers(user, null))
O.show_message("\red <B>[user] begins to clean \the [get_turf(A)]</B>", 1)
sleep(40)
if(A)
clean(get_turf(A))
user << "\blue You have finished mopping!"
mopcount++
if(mopcount >= 5) //Okay this stuff is an ugly hack and i feel bad about it.
spawn(5)
src.reagents.clear_reagents()
mopcount = 0
return
/*
* Hope it's okay to stick this shit here: it basically just turns a hexadecimal color into rgb
*/
/proc/GetColors(hex)
hex = uppertext(hex)
var/hi1 = text2ascii(hex, 2)
var/lo1 = text2ascii(hex, 3)
var/hi2 = text2ascii(hex, 4)
var/lo2 = text2ascii(hex, 5)
var/hi3 = text2ascii(hex, 6)
var/lo3 = text2ascii(hex, 7)
return list(((hi1>= 65 ? hi1-55 : hi1-48)<<4) | (lo1 >= 65 ? lo1-55 : lo1-48),
((hi2 >= 65 ? hi2-55 : hi2-48)<<4) | (lo2 >= 65 ? lo2-55 : lo2-48),
((hi3 >= 65 ? hi3-55 : hi3-48)<<4) | (lo3 >= 65 ? lo3-55 : lo3-48))

View File

@@ -0,0 +1,239 @@
/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 = TABLEPASS|OPENCONTAINER|FPRINT|USEDELAY
slot_flags = SLOT_BELT
throwforce = 3
w_class = 2.0
throw_speed = 2
throw_range = 10
amount_per_transfer_from_this = 5
volume = 250
possible_transfer_amounts = null
/obj/item/weapon/reagent_containers/spray/afterattack(atom/A as mob|obj, mob/user as mob)
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))
return
if(istype(A, /obj/effect/proc_holder/spell))
return
if(istype(A, /obj/structure/reagent_dispensers)) //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, A:amount_per_transfer_from_this)
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='notice'>\The [src] is empty!</span>"
return
var/obj/effect/decal/D = new/obj/effect/decal(get_turf(src))
D.create_reagents(amount_per_transfer_from_this)
reagents.trans_to(D, amount_per_transfer_from_this)
var/list/rgbcolor = list(0,0,0)
var/finalcolor
for(var/datum/reagent/re in D.reagents.reagent_list) // natural color mixing bullshit/algorithm
if(!finalcolor)
rgbcolor = GetColors(re.color)
finalcolor = re.color
else
var/newcolor[3]
var/prergbcolor[3]
prergbcolor = rgbcolor
newcolor = GetColors(re.color)
rgbcolor[1] = (prergbcolor[1]+newcolor[1])/2
rgbcolor[2] = (prergbcolor[2]+newcolor[2])/2
rgbcolor[3] = (prergbcolor[3]+newcolor[3])/2
finalcolor = rgb(rgbcolor[1], rgbcolor[2], rgbcolor[3])
// This isn't a perfect color mixing system, the more reagents that are inside,
// the darker it gets until it becomes absolutely pitch black! I dunno, maybe
// that's pretty realistic? I don't do a whole lot of color-mixing anyway.
// If you add brighter colors to it it'll eventually get lighter, though.
D.name = "chemicals"
D.icon = 'icons/obj/chempuff.dmi'
D.icon += finalcolor
spawn(0)
for(var/i=0, i<3, i++)
step_towards(D,A)
D.reagents.reaction(get_turf(D))
for(var/atom/T in get_turf(D))
D.reagents.reaction(T)
sleep(3)
del(D)
playsound(src.loc, 'spray2.ogg', 50, 1, -6)
if(reagents.has_reagent("sacid"))
message_admins("[key_name_admin(user)] fired sulphuric acid from a spray bottle.")
log_game("[key_name(user)] fired sulphuric acid from a spray bottle.")
if(reagents.has_reagent("pacid"))
message_admins("[key_name_admin(user)] fired Polyacid from a spray bottle.")
log_game("[key_name(user)] fired Polyacid from a spray bottle.")
if(reagents.has_reagent("lube"))
message_admins("[key_name_admin(user)] fired Space lube from a spray bottle.")
log_game("[key_name(user)] fired Space lube from a spray bottle.")
return
/obj/item/weapon/reagent_containers/spray/examine()
set src in usr
..()
// usr << "\icon[src] This is \the [src]!"
// usr << desc
for(var/datum/reagent/R in reagents.reagent_list)
usr << "[round(R.volume)] units of [R.name] left."
return
//space cleaner
/obj/item/weapon/reagent_containers/spray/cleaner
name = "space cleaner"
desc = "BLAM!-brand non-foaming space cleaner!"
/obj/item/weapon/reagent_containers/spray/cleaner/New()
..()
reagents.add_reagent("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
amount_per_transfer_from_this = 10
/obj/item/weapon/reagent_containers/spray/pepper/New()
..()
reagents.add_reagent("condensedcapsaicin", 40)
//chemsprayer
/obj/item/weapon/reagent_containers/spray/chemsprayer
name = "chem sprayer"
desc = "A utility used to spray large amounts of reagent in a given area."
icon = 'icons/obj/gun.dmi'
icon_state = "chemsprayer"
item_state = "chemsprayer"
throwforce = 3
w_class = 3.0
volume = 600
origin_tech = "combat=3;materials=3;engineering=3"
//this is a big copypasta clusterfuck, but it's still better than it used to be!
/obj/item/weapon/reagent_containers/spray/chemsprayer/afterattack(atom/A as mob|obj, mob/user as mob)
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))
return
if(istype(A, /obj/effect/proc_holder/spell))
return
if(istype(A, /obj/structure/reagent_dispensers)) //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, A:amount_per_transfer_from_this)
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='notice'>\The [src] is empty!</span>"
return
var/Sprays[3]
for(var/i=1, i<=3, i++) // intialize sprays
if(src.reagents.total_volume < 1) break
var/obj/effect/decal/D = new/obj/effect/decal(get_turf(src))
D.name = "chemicals"
D.icon = 'icons/obj/chempuff.dmi'
D.create_reagents(amount_per_transfer_from_this)
src.reagents.trans_to(D, amount_per_transfer_from_this)
var/rgbcolor[3]
var/finalcolor
for(var/datum/reagent/re in D.reagents.reagent_list)
if(!finalcolor)
rgbcolor = GetColors(re.color)
finalcolor = re.color
else
var/newcolor[3]
var/prergbcolor[3]
prergbcolor = rgbcolor
newcolor = GetColors(re.color)
rgbcolor[1] = (prergbcolor[1]+newcolor[1])/2
rgbcolor[2] = (prergbcolor[2]+newcolor[2])/2
rgbcolor[3] = (prergbcolor[3]+newcolor[3])/2
finalcolor = rgb(rgbcolor[1], rgbcolor[2], rgbcolor[3])
D.icon += finalcolor
Sprays[i] = D
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<=Sprays.len, i++)
spawn()
var/obj/effect/decal/D = Sprays[i]
if(!D) continue
// Spreads the sprays a little bit
var/turf/my_target = pick(the_targets)
the_targets -= my_target
for(var/j=1, j<=rand(6,8), j++)
step_towards(D, my_target)
D.reagents.reaction(get_turf(D))
for(var/atom/t in get_turf(D))
D.reagents.reaction(t)
sleep(2)
del(D)
playsound(src.loc, 'spray2.ogg', 50, 1, -6)
if(reagents.has_reagent("sacid"))
message_admins("[key_name_admin(user)] fired sulphuric acid from a chem sprayer.")
log_game("[key_name(user)] fired sulphuric acid from a chem sprayer.")
if(reagents.has_reagent("pacid"))
message_admins("[key_name_admin(user)] fired Polyacid from a chem sprayer.")
log_game("[key_name(user)] fired Polyacid from a chem sprayer.")
if(reagents.has_reagent("lube"))
message_admins("[key_name_admin(user)] fired Space lube from a chem sprayer.")
log_game("[key_name(user)] fired Space lube from a chem sprayer.")
return
//looking for plant-b-gone? it's in code/game/objects/items/weapons/hydroponics.dm

View File

@@ -1,6 +1,6 @@
/obj/item/clothing/suit/armor /obj/item/clothing/suit/armor
allowed = list(/obj/item/weapon/gun/energy,/obj/item/weapon/pepperspray,/obj/item/weapon/gun/projectile,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs) allowed = list(/obj/item/weapon/gun/energy,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/weapon/gun/projectile,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs)
body_parts_covered = UPPER_TORSO|LOWER_TORSO body_parts_covered = UPPER_TORSO|LOWER_TORSO
flags = FPRINT | TABLEPASS flags = FPRINT | TABLEPASS

View File

@@ -9,7 +9,7 @@
icon_state = "apron" icon_state = "apron"
item_state = "apron" item_state = "apron"
body_parts_covered = UPPER_TORSO|LOWER_TORSO body_parts_covered = UPPER_TORSO|LOWER_TORSO
allowed = list (/obj/item/weapon/plantbgone,/obj/item/device/analyzer/plant_analyzer,/obj/item/seeds,/obj/item/nutrient,/obj/item/weapon/minihoe) allowed = list (/obj/item/weapon/reagent_containers/spray/plantbgone,/obj/item/device/analyzer/plant_analyzer,/obj/item/seeds,/obj/item/nutrient,/obj/item/weapon/minihoe)
//Captain //Captain
/obj/item/clothing/suit/captunic /obj/item/clothing/suit/captunic

View File

@@ -65,12 +65,9 @@
src.modules += new /obj/item/weapon/reagent_containers/robodropper(src) src.modules += new /obj/item/weapon/reagent_containers/robodropper(src)
src.modules += new /obj/item/weapon/reagent_containers/syringe(src) src.modules += new /obj/item/weapon/reagent_containers/syringe(src)
src.modules += new /obj/item/weapon/extinguisher/mini(src) src.modules += new /obj/item/weapon/extinguisher/mini(src)
src.emag = new /obj/item/weapon/cleaner(src) src.emag = new /obj/item/weapon/reagent_containers/spray(src)
var/datum/reagents/R = new/datum/reagents(1000) src.emag.reagents.add_reagent("pacid", 250)
src.emag.reagents = R
R.my_atom = src.emag
R.add_reagent("pacid", 1000)
src.emag.name = "Polyacid spray" src.emag.name = "Polyacid spray"
return return
@@ -152,12 +149,9 @@
src.modules += new /obj/item/weapon/trashbag(src) src.modules += new /obj/item/weapon/trashbag(src)
src.modules += new /obj/item/weapon/mop(src) src.modules += new /obj/item/weapon/mop(src)
src.modules += new /obj/item/device/lightreplacer(src) src.modules += new /obj/item/device/lightreplacer(src)
src.emag = new /obj/item/weapon/cleaner(src) src.emag = new /obj/item/weapon/reagent_containers/spray(src)
var/datum/reagents/R = new/datum/reagents(1000) src.emag.reagents.add_reagent("lube", 250)
src.emag.reagents = R
R.my_atom = src.emag
R.add_reagent("lube", 1000)
src.emag.name = "Lube spray" src.emag.name = "Lube spray"
return return

File diff suppressed because it is too large Load Diff

View File

@@ -704,12 +704,13 @@
#include "code\game\objects\items\weapons\kitchen.dm" #include "code\game\objects\items\weapons\kitchen.dm"
#include "code\game\objects\items\weapons\manuals.dm" #include "code\game\objects\items\weapons\manuals.dm"
#include "code\game\objects\items\weapons\medical.dm" #include "code\game\objects\items\weapons\medical.dm"
#include "code\game\objects\items\weapons\mops_cleaners.dm" #include "code\game\objects\items\weapons\mop.dm"
#include "code\game\objects\items\weapons\paint.dm" #include "code\game\objects\items\weapons\paint.dm"
#include "code\game\objects\items\weapons\paiwire.dm" #include "code\game\objects\items\weapons\paiwire.dm"
#include "code\game\objects\items\weapons\plant_bag.dm" #include "code\game\objects\items\weapons\plant_bag.dm"
#include "code\game\objects\items\weapons\RCD.dm" #include "code\game\objects\items\weapons\RCD.dm"
#include "code\game\objects\items\weapons\RSF.dm" #include "code\game\objects\items\weapons\RSF.dm"
#include "code\game\objects\items\weapons\spray.dm"
#include "code\game\objects\items\weapons\stunbaton.dm" #include "code\game\objects\items\weapons\stunbaton.dm"
#include "code\game\objects\items\weapons\stungloves.dm" #include "code\game\objects\items\weapons\stungloves.dm"
#include "code\game\objects\items\weapons\surgery_tools.dm" #include "code\game\objects\items\weapons\surgery_tools.dm"