diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index f24e6bf8e4f..39a9aac4a34 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -212,9 +212,9 @@ sleep(1) //done throwing, either because it hit something or it finished moving - src.throwing = 0 - if(isobj(src)) + if(isobj(src) && throwing) src.throw_impact(get_turf(src),thrower) + src.throwing = 0 return 1 diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm index aec6f12fe03..d249433ca94 100644 --- a/code/game/objects/effects/spawners/lootdrop.dm +++ b/code/game/objects/effects/spawners/lootdrop.dm @@ -101,6 +101,7 @@ /obj/item/weapon/paper/crumpled = 1, /obj/item/weapon/pen = 1, /obj/item/weapon/reagent_containers/spray/pestspray = 1, + /obj/item/weapon/reagent_containers/glass/rag = 3, /obj/item/weapon/stock_parts/cell = 3, /obj/item/weapon/storage/belt/utility = 2, /obj/item/weapon/storage/box = 2, diff --git a/code/game/objects/items/weapons/extinguisher.dm b/code/game/objects/items/weapons/extinguisher.dm index 842ba36ad9d..1193c16ef60 100644 --- a/code/game/objects/items/weapons/extinguisher.dm +++ b/code/game/objects/items/weapons/extinguisher.dm @@ -158,4 +158,13 @@ sleep(2) else - return ..() \ No newline at end of file + return ..() + +/obj/item/weapon/extinguisher/AltClick(mob/user) + EmptyExtinguisher(user) + +/obj/item/weapon/extinguisher/proc/EmptyExtinguisher(var/mob/user) + if(loc == user) + reagents.clear_reagents() + user << "You quietly empty out the [src]." + return \ No newline at end of file diff --git a/code/game/objects/structures/crates_lockers/closets/job_closets.dm b/code/game/objects/structures/crates_lockers/closets/job_closets.dm index 1d37c9d78ed..e2dabf7d022 100644 --- a/code/game/objects/structures/crates_lockers/closets/job_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/job_closets.dm @@ -21,6 +21,8 @@ new /obj/item/clothing/head/soft/black(src) new /obj/item/clothing/shoes/sneakers/black(src) new /obj/item/clothing/shoes/sneakers/black(src) + new /obj/item/weapon/reagent_containers/glass/rag(src) + new /obj/item/weapon/reagent_containers/glass/rag(src) /obj/structure/closet/chefcloset name = "\proper chef's closet" @@ -45,6 +47,7 @@ new /obj/item/clothing/suit/toggle/chef(src) new /obj/item/clothing/under/rank/chef(src) new /obj/item/clothing/head/chefhat(src) + new /obj/item/weapon/reagent_containers/glass/rag(src) /obj/structure/closet/jcloset name = "custodial closet" diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm index d58893a791f..02e4fa663ad 100644 --- a/code/modules/crafting/recipes.dm +++ b/code/modules/crafting/recipes.dm @@ -30,6 +30,15 @@ time = 80 category = CAT_WEAPON +/datum/table_recipe/molotov + name = "Molotov" + result = /obj/item/weapon/reagent_containers/food/drinks/bottle/molotov + reqs = list(/obj/item/weapon/reagent_containers/glass/rag = 1, + /obj/item/weapon/reagent_containers/food/drinks/bottle = 1) + parts = list(/obj/item/weapon/reagent_containers/food/drinks/bottle = 1) + time = 80 + category = CAT_WEAPON + /datum/table_recipe/stunprod name = "Stunprod" result = /obj/item/weapon/melee/baton/cattleprod diff --git a/code/modules/detectivework/footprints_and_rag.dm b/code/modules/detectivework/footprints_and_rag.dm index 73849b4b366..dcb47bfc000 100644 --- a/code/modules/detectivework/footprints_and_rag.dm +++ b/code/modules/detectivework/footprints_and_rag.dm @@ -17,17 +17,23 @@ amount_per_transfer_from_this = 5 possible_transfer_amounts = list(5) volume = 5 + spillable = 0 + +/obj/item/weapon/reagent_containers/glass/rag/attack() + return /obj/item/weapon/reagent_containers/glass/rag/afterattack(atom/A as obj|turf|area, mob/user as mob,proximity) if(!proximity) return if(ismob(A) && A.reagents && reagents.total_volume) - if(user.a_intent == "harm") - src.reagents.reaction(A, TOUCH) - src.reagents.clear_reagents() - else - reagents.trans_to(A, reagents.total_volume) - user.visible_message("[user] has smothered \the [A] with \the [src]!", "You smother \the [A] with \the [src]!", "You hear some struggling and muffled cries of surprise.") + if(do_mob(user, A)) + if(user.a_intent == "harm") + src.reagents.reaction(A, TOUCH) + src.reagents.clear_reagents() + else + reagents.trans_to(A, reagents.total_volume) + user.visible_message("[user] has smothered \the [A] with \the [src]!", "You smother \the [A] with \the [src]!", "You hear some struggling and muffled cries of surprise.") + return else if(istype(A) && src in user) user.visible_message("[user] starts to wipe down [A] with [src]!", "You start to wipe down [A] with [src]...") if(do_after(user,30, target = A)) diff --git a/code/modules/food&drinks/drinks/drinks/bottle.dm b/code/modules/food&drinks/drinks/drinks/bottle.dm index 7b806842aab..350fde62692 100644 --- a/code/modules/food&drinks/drinks/drinks/bottle.dm +++ b/code/modules/food&drinks/drinks/drinks/bottle.dm @@ -11,14 +11,22 @@ var/const/duration = 13 //Directly relates to the 'weaken' duration. Lowered by armor (i.e. helmets) var/isGlass = 1 //Whether the 'bottle' is made of glass or not so that milk cartons dont shatter when someone gets hit by it -/obj/item/weapon/reagent_containers/food/drinks/bottle/proc/smash(mob/living/target as mob, mob/living/user as mob) +/obj/item/weapon/reagent_containers/food/drinks/bottle/throw_impact(atom/target,mob/thrower) + ..(target,thrower) + SplashReagents(target) + smash(target,thrower,1) + return + +/obj/item/weapon/reagent_containers/food/drinks/bottle/proc/smash(mob/living/target as mob, mob/living/user as mob, var/ranged = 0) //Creates a shattering noise and replaces the bottle with a broken_bottle - user.drop_item() - var/obj/item/weapon/broken_bottle/B = new /obj/item/weapon/broken_bottle(user.loc) - user.put_in_active_hand(B) - if(prob(33)) - new/obj/item/weapon/shard(target.loc) // Create a glass shard at the target's location! + var/new_location = get_turf(loc) + var/obj/item/weapon/broken_bottle/B = new /obj/item/weapon/broken_bottle(new_location) + if(ranged) + B.loc = new_location + else + user.drop_item() + user.put_in_active_hand(B) B.icon_state = src.icon_state var/icon/I = new('icons/obj/drinks.dmi', src.icon_state) @@ -26,8 +34,15 @@ I.SwapColor(rgb(255, 0, 220, 255), rgb(0, 0, 0, 0)) B.icon = I - playsound(src, "shatter", 70, 1) - user.put_in_active_hand(B) + if(isGlass) + if(prob(33)) + new/obj/item/weapon/shard(new_location) + playsound(src, "shatter", 70, 1) + else + B.name = "broken carton" + B.force = 0 + B.throwforce = 0 + B.desc = "A carton with the bottom half burst open. Might give you a papercut." src.transfer_fingerprints_to(B) qdel(src) @@ -100,19 +115,23 @@ add_logs(user, target, "attacked", src) //The reagents in the bottle splash all over the target, thanks for the idea Nodrak - if(src.reagents) - for(var/mob/O in viewers(user, null)) - O.show_message(text("The contents of \the [src] splashes all over [target]!"), 1) - src.reagents.reaction(target, TOUCH) + SplashReagents(target) //Finally, smash the bottle. This kills (del) the bottle. src.smash(target, user) return +/obj/item/weapon/reagent_containers/food/drinks/bottle/proc/SplashReagents(var/mob/M) + if(src.reagents.total_volume) + for(var/mob/O in viewers(M, null)) + O.show_message(text("The contents of \the [src] splashes all over [M]!"), 1) + reagents.reaction(M, TOUCH) + reagents.clear_reagents() + return + //Keeping this here for now, I'll ask if I should keep it here. /obj/item/weapon/broken_bottle - name = "Broken Bottle" desc = "A bottle with a sharp broken bottom." icon = 'icons/obj/drinks.dmi' @@ -243,3 +262,62 @@ item_state = "carton" isGlass = 0 list_reagents = list("limejuice" = 100) + + +////////////////////////// MOLOTOV /////////////////////// +/obj/item/weapon/reagent_containers/food/drinks/bottle/molotov + name = "Molotov cocktail" + desc = "A throwing weapon used to ignite things, typically filled with an accelerant. Recommended highly by rioters and revolutionaries. Light and toss." + icon_state = "vodkabottle" + list_reagents = list() + var/list/accelerants = list( /datum/reagent/consumable/ethanol,/datum/reagent/fuel,/datum/reagent/clf3,/datum/reagent/phlogiston, + /datum/reagent/napalm,/datum/reagent/hellwater,/datum/reagent/toxin/plasma,/datum/reagent/toxin/spore_burning) + var/active = 0 + +/obj/item/weapon/reagent_containers/food/drinks/bottle/molotov/CheckParts() + var/obj/item/weapon/reagent_containers/food/drinks/bottle/B = locate() in contents + if(B) + icon_state = B.icon_state + B.reagents.copy_to(src,100) + if(!B.isGlass) + desc += " You're not sure if making this out of a carton was the brightest idea." + isGlass = 0 + return + +/obj/item/weapon/reagent_containers/food/drinks/bottle/molotov/throw_impact(atom/target,mob/thrower) + var/firestarter = 0 + for(var/datum/reagent/R in reagents.reagent_list) + for(var/A in accelerants) + if(istype(R,A)) + firestarter = 1 + break + SplashReagents(target) + if(firestarter && active) + target.fire_act() + new /obj/effect/hotspot(get_turf(target)) + ..() + +/obj/item/weapon/reagent_containers/food/drinks/bottle/molotov/attackby(obj/item/I, mob/user, params) + if(is_hot(I)) + active = 1 + user << "You light the [src] on fire." + overlays += fire_overlay + if(!isGlass) + spawn(50) + var/counter + var/target = src.loc + for(counter = 0, counter<2, counter++) + if(istype(target, /obj/item/weapon/storage)) + var/obj/item/weapon/storage/S = target + target = S.loc + if(istype(target, /atom)) + var/atom/A = target + SplashReagents(A) + A.fire_act() + qdel(src) + +/obj/item/weapon/reagent_containers/food/drinks/bottle/molotov/attack_self(mob/user) + if(active && isGlass) + user << "You snuff out the flame on [src]." + overlays -= fire_overlay + active = 0 \ No newline at end of file diff --git a/code/modules/hydroponics/biogenerator.dm b/code/modules/hydroponics/biogenerator.dm index bec34b1c197..86e560b5d49 100644 --- a/code/modules/hydroponics/biogenerator.dm +++ b/code/modules/hydroponics/biogenerator.dm @@ -153,11 +153,12 @@ dat += "Weed Killer: Makex5 ([50/efficiency])
" dat += "Pest Killer: Makex5 ([50/efficiency])
" dat += "" - dat += "

Leather:

" + dat += "

Leather and Cloth:

" dat += "
" dat += "Wallet: Make ([100/efficiency])
" dat += "Book bag: Make ([200/efficiency])
" dat += "Plant bag: Make ([200/efficiency])
" + dat += "Rag: Make ([200/efficiency])
" dat += "Mining satchel: Make ([200/efficiency])
" dat += "Chemistry bag: Make ([200/efficiency])
" dat += "Botanical gloves: Make ([250/efficiency])
" @@ -275,6 +276,9 @@ if("chbag") if (check_cost(200/efficiency)) return 0 else new/obj/item/weapon/storage/bag/chemistry(src.loc) + if("rag") + if (check_cost(200/efficiency)) return 0 + else new/obj/item/weapon/reagent_containers/glass/rag(src.loc) if("gloves") if (check_cost(250/efficiency)) return 0 else new/obj/item/clothing/gloves/botanic_leather(src.loc)