Merge remote-tracking branch 'upstream/dev-freeze' into dev

This commit is contained in:
PsiOmega
2015-05-22 08:39:07 +02:00
224 changed files with 3659 additions and 3235 deletions
@@ -3,7 +3,6 @@
var/total_volume = 0
var/maximum_volume = 100
var/atom/my_atom = null
var/reacting = 0 // Reacting right now
/datum/reagents/New(var/max = 100)
maximum_volume = max
+7 -7
View File
@@ -587,12 +587,12 @@
var/limit = 10
var/list/holdingitems = list()
var/list/sheet_reagents = list(
/obj/item/stack/sheet/mineral/iron = "iron",
/obj/item/stack/sheet/mineral/uranium = "uranium",
/obj/item/stack/sheet/mineral/phoron = "phoron",
/obj/item/stack/sheet/mineral/gold = "gold",
/obj/item/stack/sheet/mineral/silver = "silver",
/obj/item/stack/sheet/mineral/mhydrogen = "hydrogen"
/obj/item/stack/material/iron = "iron",
/obj/item/stack/material/uranium = "uranium",
/obj/item/stack/material/phoron = "phoron",
/obj/item/stack/material/gold = "gold",
/obj/item/stack/material/silver = "silver",
/obj/item/stack/material/mhydrogen = "hydrogen"
)
/obj/machinery/reagentgrinder/New()
@@ -798,4 +798,4 @@
if (beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
break
#undef REAGENTS_PER_SHEET
#undef REAGENTS_PER_SHEET
+194 -148
View File
@@ -24,212 +24,258 @@ About the Holder:
The holder (reagents datum) is the datum that holds a list of all reagents
currently in the object.It also has all the procs needed to manipulate reagents
remove_any(var/amount)
This proc removes reagents from the holder until the passed amount
is matched. It'll try to remove some of ALL reagents contained.
Vars:
list/datum/reagent/reagent_list
List of reagent datums.
trans_to(var/obj/target, var/amount)
This proc equally transfers the contents of the holder to another
objects holder. You need to pass it the object (not the holder) you want
to transfer to and the amount you want to transfer. Its return value is the
actual amount transfered (if one of the objects is full/empty)
total_volume
Total volume of all reagents.
trans_id_to(var/obj/target, var/reagent, var/amount)
Same as above but only for a specific reagent in the reagent list.
If the specified amount is greater than what is available, it will use
the amount of the reagent that is available. If no reagent exists, returns null.
maximum_volume
Maximum volume.
metabolize(var/mob/M)
This proc is called by the mobs life proc. It simply calls on_mob_life for
all contained reagents. You shouldnt have to use this one directly.
atom/my_atom
Reference to the object that contains this.
handle_reactions()
This proc check all recipes and, on a match, uses them.
It will also call the recipe's on_reaction proc (for explosions or w/e).
Currently, this proc is automatically called by trans_to.
- Modified from the original to preserve reagent data across reactions (originally for xenoarchaeology)
Procs:
isolate_reagent(var/reagent)
Pass it a reagent id and it will remove all reagents but that one.
It's that simple.
get_free_space()
Returns the remaining free volume in the holder.
del_reagent(var/reagent)
Completely remove the reagent with the matching id.
get_master_reagent()
Returns the reference to the reagent with the largest volume
reaction_fire(exposed_temp)
Simply calls the reaction_fire procs of all contained reagents.
get_master_reagent_name()
Ditto, but returns the name.
get_master_reagent_id()
Ditto, but returns ID.
update_total()
This one simply updates the total volume of the holder.
(the volume of all reagents added together)
Updates total volume, called automatically.
handle_reactions()
Checks reagents and triggers any reactions that happen. Usually called automatically.
add_reagent(var/id, var/amount, var/data = null, var/safety = 0)
Adds [amount] units of [id] reagent. [data] will be passed to reagent's mix_data() or initialize_data(). If [safety] is 0, handle_reactions() will be called. Returns 1 if successful, 0 otherwise.
remove_reagent(var/id, var/amount, var/safety = 0)
Ditto, but removes reagent. Returns 1 if successful, 0 otherwise.
del_reagent(var/id)
Removes all of the reagent.
has_reagent(var/id, var/amount = 0)
Checks if holder has at least [amount] of [id] reagent. Returns 1 if the reagent is found and volume is above [amount]. Returns 0 otherwise.
clear_reagents()
This proc removes ALL reagents from the holder.
Removes all reagents.
reaction(var/atom/A, var/method=TOUCH, var/volume_modifier=0)
This proc calls the appropriate reaction procs of the reagents.
I.e. if A is an object, it will call the reagents reaction_obj
proc. The method var is used for reaction on mobs. It simply tells
us if the mob TOUCHed the reagent or if it INGESTed the reagent.
Since the volume can be checked in a reagents proc, you might want to
use the volume_modifier var to modifiy the passed value without actually
changing the volume of the reagents.
If you're not sure if you need to use this the answer is very most likely 'No'.
You'll want to use this proc whenever an atom first comes in
contact with the reagents of a holder. (in the 'splash' part of a beaker i.e.)
More on the reaction in the reagent part of this readme.
get_reagent_amount(var/id)
Returns reagent volume. Returns 0 if reagent is not found.
add_reagent(var/reagent, var/amount, var/data)
Attempts to add X of the matching reagent to the holder.
You wont use this much. Mostly in new procs for pre-filled
objects.
get_data(var/id)
Returns get_data() of the reagent.
remove_reagent(var/reagent, var/amount)
The exact opposite of the add_reagent proc.
- Modified from original to return the reagent's data, in order to preserve reagent data across reactions (originally for xenoarchaeology)
get_reagents()
Returns a string containing all reagent ids and volumes, e.g. "carbon(4),nittrogen(5)".
has_reagent(var/reagent, var/amount)
Returns 1 if the holder contains this reagent.
Or 0 if not.
If you pass it an amount it will additionally check
if the amount is matched. This is optional.
remove_any(var/amount = 1)
Removes up to [amount] of reagents from [src]. Returns actual amount removed.
get_reagent_amount(var/reagent)
Returns the amount of the matching reagent inside the
holder. Returns 0 if the reagent is missing.
trans_to_holder(var/datum/reagents/target, var/amount = 1, var/multiplier = 1, var/copy = 0)
Transfers [amount] reagents from [src] to [target], multiplying them by [multiplier]. Returns actual amount removed from [src] (not amount transferred to [target]). If [copy] is 1, copies reagents instead.
Important variables:
touch(var/atom/target)
Not recommended to use. Calls touch_mob(target), touch_turf(target), or touch_obj(target), depending on target's type.
total_volume
This variable contains the total volume of all reagents in this holder.
touch_mob(var/mob/target)
Calls each reagent's touch_mob(target).
reagent_list
This is a list of all contained reagents. More specifically, references
to the reagent datums.
touch_turf(var/turf/target)
Calls each reagent's touch_turf(target).
maximum_volume
This is the maximum volume of the holder.
touch_obj(var/obj/target)
Calls each reagent's touch_obj(target).
my_atom
This is the atom the holder is 'in'. Useful if you need to find the location.
(i.e. for explosions)
trans_to(var/atom/target, var/amount = 1, var/multiplier = 1, var/copy = 0)
Checks the type of [target], calling splash_mob(target, amount), trans_to_turf(target, amount, multiplier, copy), or trans_to_obj(target, amount, multiplier, copy).
trans_id_to(var/atom/target, var/id, var/amount = 1)
Transfers [amount] of [id] to [target]. Returns amount transferred.
splash_mob(var/mob/target, var/amount = 1, var/clothes = 1)
Checks mob's clothing if [clothes] is 1 and transfers [amount] reagents to mob's skin.
trans_to_mob(var/mob/target, var/amount = 1, var/type = CHEM_BLOOD, var/multiplier = 1, var/copy = 0)
Transfers [amount] reagents to the mob's appropriate holder, depending on [type]. Ignores protection.
trans_to_turf(var/turf/target, var/amount = 1, var/multiplier = 1, var/copy = 0)
Turfs don't currently have any reagents. Puts [amount] reagents into a temporary holder, calls touch_turf(target) from it, and deletes it.
trans_to_obj(var/turf/target, var/amount = 1, var/multiplier = 1, var/copy = 0)
If target has reagents, transfers [amount] to it. Otherwise, same as trans_to_turf().
/atom/proc/create_reagents(var/max_vol)
Creates a new reagent datum.
About Reagents:
Reagents are all the things you can mix and fille in bottles etc. This can be anything from
rejuvs over water to ... iron. Each reagent also has a few procs - i'll explain those below.
rejuvs over water to... iron.
reaction_mob(var/mob/M, var/method=TOUCH)
This is called by the holder's reation proc.
This version is only called when the reagent
reacts with a mob. The method var can be either
TOUCH or INGEST. You'll want to put stuff like
acid-facemelting in here.
reaction_obj(var/obj/O)
This is called by the holder's reation proc.
This version is called when the reagents reacts
with an object. You'll want to put stuff like
object melting in here ... or something. i dunno.
reaction_turf(var/turf/T)
This is called by the holder's reaction proc.
This version is called when the reagents reacts
with a turf. You'll want to put stuff like extra
slippery floors for lube or something in here.
on_mob_life(var/mob/M)
This proc is called everytime the mobs life proc executes.
This is the place where you put damage for toxins ,
drowsyness for sleep toxins etc etc.
You'll want to call the parents proc by using ..() .
If you don't, the chemical will stay in the mob forever -
unless you write your own piece of code to slowly remove it.
(Should be pretty easy, 1 line of code)
Important variables:
holder
This variable contains a reference to the holder the chemical is 'in'
volume
This is the volume of the reagent.
id
The id of the reagent
Vars:
name
The name of the reagent.
Name that shows up in-game.
data
This var can be used for whatever the fuck you want. I used it for the sleep
toxins to make them work slowly instead of instantly. You could also use this
for DNA in a blood reagent or ... well whatever you want.
id
ID that is used for internal tracking. MUST BE UNIQUE.
description
Description that shows up in-game.
datum/reagents/holder
Reference to holder.
reagent_state
Could be GAS, LIQUID, or SOLID. Affects nothing. Reserved for future use.
list/data
Use varies by reagent. Custom variable. For example, blood stores blood group and viruses.
volume
Current volume.
metabolism
How quickly reagent is processed in mob's bloodstream; by default aslo affects ingest and touch metabolism.
ingest_met
How quickly reagent is processed when ingested; [metabolism] is used if zero.
touch_met
Ditto when touching.
dose
How much of the reagent has been processed, limited by [max_dose]. Used for reagents with varying effects (e.g. ethanol or rezadone) and overdosing.
max_dose
Maximum amount of reagent that has ever been in a mob. Exists so dose won't grow infinitely when small amounts of reagent are added over time.
overdose
If [dose] is bigger than [overdose], overdose() proc is called every tick.
scannable
If set to 1, will show up on health analyzers by name.
affects_dead
If set to 1, will affect dead players. Used by Adminordrazine.
glass_icon_state
Used by drinks. icon_state of the glass when this reagent is the master reagent.
glass_name
Ditto for glass name.
glass_desc
Ditto for glass desciption.
glass_center_of_mass
Used for glass placement on tables.
color
This is a hexadecimal color that represents the reagent outside of containers,
you define it as "#RRGGBB", or, red green blue. You can also define it using the
rgb() proc, which returns a hexadecimal value too. The color is black by default.
"#RRGGBB" or "#RRGGBBAA" where A is alpha channel.
A good website for color calculations: http://www.psyclops.com/tools/rgb/
color_weight
How much reagent affects color of holder. Used by paint.
Procs:
remove_self(var/amount)
Removes [amount] of itself.
touch_mob(var/mob/M)
Called when reagent is in another holder and not splashing the mob. Can be used with noncarbons.
touch_obj(var/obj/O)
How reagent reacts with objects.
touch_turf(var/turf/T)
How reagent reacts with turfs.
on_mob_life(var/mob/living/carbon/M, var/alien, var/location)
Makes necessary checks and calls one of affect procs.
affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
How reagent affects mob when injected. [removed] is the amount of reagent that has been removed this tick. [alien] is the mob's reagent flag.
affect_ingest(var/mob/living/carbon/M, var/alien, var/removed)
Ditto, ingested. Defaults to affect_blood with halved dose.
affect_touch(var/mob/living/carbon/M, var/alien, var/removed)
Ditto, touching.
overdose(var/mob/living/carbon/M, var/alien)
Called when dose is above overdose. Defaults to M.adjustToxLoss(REM).
initialize_data(var/newdata)
Called when reagent is created. Defaults to setting [data] to [newdata].
mix_data(var/newdata, var/newamount)
Called when [newamount] of reagent with [newdata] data is added to the current reagent. Used by paint.
get_data()
Returns data. Can be overriden.
About Recipes:
Recipes are simple datums that contain a list of required reagents and a result.
They also have a proc that is called when the recipe is matched.
on_reaction(var/datum/reagents/holder, var/created_volume)
This proc is called when the recipe is matched.
You'll want to add explosions etc here.
To find the location you'll have to do something
like get_turf(holder.my_atom)
Vars:
name & id
Should be pretty obvious.
name
Name of the reaction, currently unused.
id
ID of the reaction, must be unique.
result
This var contains the id of the resulting reagent.
ID of the resulting reagent. Can be null.
required_reagents
This is a list of ids of the required reagents.
Each id also needs an associated value that gives us the minimum required amount
of that reagent. The handle_reaction proc can detect mutiples of the same recipes
so for most cases you want to set the required amount to 1.
list/required_reagents
Reagents that are required for the reaction and are used up during it.
required_catalysts (Added May 2011)
This is a list of the ids of the required catalysts.
Functionally similar to required_reagents, it is a list of reagents that are required
for the reaction. However, unlike required_reagents, catalysts are NOT consumed.
They mearly have to be present in the container.
list/catalysts
Ditto, but not used up.
list/inhibitors
Opposite, prevent the reaction from happening.
result_amount
This is the amount of the resulting reagent this recipe will produce.
I recommend you set this to the total volume of all required reagent.
Amount of resulting reagent.
required_container
The container the recipe has to take place in in order to happen. Leave this blank/null
if you want the reaction to happen anywhere.
mix_message
Message that is shown to mobs when reaction happens.
required_other
Basically like a reagent's data variable. You can set extra requirements for a
reaction with this.
Procs:
can_happen(var/datum/reagents/holder)
Customizable. If it returns 0, reaction will not happen. Defaults to always returning 1. Used by slime core reactions.
on_reaction(var/datum/reagents/holder, var/created_volume)
Called when reaction happens. Used by explosives.
send_data(var/datum/reagents/T)
Sets resulting reagent's data. Used by blood paint.
About the Tools:
By default, all atom have a reagents var - but its empty. if you want to use an object for the chem.
system you'll need to add something like this in its new proc:
var/datum/reagents/R = new/datum/reagents(100) <<<<< create a new datum , 100 is the maximum_volume of the new holder datum.
reagents = R <<<<< assign the new datum to the objects reagents var
R.my_atom = src <<<<< set the holders my_atom to src so that we know where we are.
This can also be done by calling a convenience proc:
atom/proc/create_reagents(var/max_volume)
/atom/proc/create_reagents(var/max_volume)
Other important stuff:
+32 -32
View File
@@ -439,7 +439,7 @@
result_amount = 1
/datum/chemical_reaction/phoronsolidification/on_reaction(var/datum/reagents/holder, var/created_volume)
new /obj/item/stack/sheet/mineral/phoron(get_turf(holder.my_atom), created_volume)
new /obj/item/stack/material/phoron(get_turf(holder.my_atom), created_volume)
return
/datum/chemical_reaction/plastication
@@ -450,7 +450,7 @@
result_amount = 1
/datum/chemical_reaction/plastication/on_reaction(var/datum/reagents/holder, var/created_volume)
new /obj/item/stack/sheet/mineral/plastic(get_turf(holder.my_atom), created_volume)
new /obj/item/stack/material/plastic(get_turf(holder.my_atom), created_volume)
return
/* Grenade reactions */
@@ -884,7 +884,7 @@
if(T.Uses <= 0)
T.visible_message("\icon[T]<span class='notice'>\The [T]'s power is consumed in the reaction.</span>")
T.name = "used slime extract"
T.desc = "This extract has been used up."
T.desc = "This extract has been used up."
//Grey
/datum/chemical_reaction/slime/spawn
@@ -934,10 +934,10 @@
required = /obj/item/slime_extract/metal
/datum/chemical_reaction/slime/metal/on_reaction(var/datum/reagents/holder)
var/obj/item/stack/sheet/metal/M = new /obj/item/stack/sheet/metal
var/obj/item/stack/material/steel/M = new /obj/item/stack/material/steel
M.amount = 15
M.loc = get_turf(holder.my_atom)
var/obj/item/stack/sheet/plasteel/P = new /obj/item/stack/sheet/plasteel
var/obj/item/stack/material/plasteel/P = new /obj/item/stack/material/plasteel
P.amount = 5
P.loc = get_turf(holder.my_atom)
..()
@@ -1104,7 +1104,7 @@
/datum/chemical_reaction/slime/plasma/on_reaction(var/datum/reagents/holder)
..()
var/obj/item/stack/sheet/mineral/phoron/P = new /obj/item/stack/sheet/mineral/phoron
var/obj/item/stack/material/phoron/P = new /obj/item/stack/material/phoron
P.amount = 10
P.loc = get_turf(holder.my_atom)
@@ -1145,7 +1145,7 @@
var/obj/item/weapon/slimepotion/P = new /obj/item/weapon/slimepotion
P.loc = get_turf(holder.my_atom)
//Black
//Black
/datum/chemical_reaction/slime/mutate2
name = "Advanced Mutation Toxin"
id = "mutationtoxin2"
@@ -1154,7 +1154,7 @@
result_amount = 1
required = /obj/item/slime_extract/black
//Oil
//Oil
/datum/chemical_reaction/slime/explosion
name = "Slime Explosion"
id = "m_explosion"
@@ -1167,7 +1167,7 @@
/datum/chemical_reaction/slime/explosion/on_reaction(var/datum/reagents/holder)
..()
sleep(50)
explosion(get_turf(holder.my_atom), 1, 3, 6)
explosion(get_turf(holder.my_atom), 1, 3, 6)
//Light Pink
/datum/chemical_reaction/slime/potion2
@@ -1266,32 +1266,32 @@
var/location = get_turf(holder.my_atom)
for(var/i = 1, i <= created_volume, i++)
new /obj/item/weapon/reagent_containers/food/snacks/sliceable/cheesewheel(location)
return
/datum/chemical_reaction/meatball
name = "Meatball"
id = "meatball"
result = null
required_reagents = list("protein" = 3, "flour" = 5)
result_amount = 3
return
/datum/chemical_reaction/meatball
name = "Meatball"
id = "meatball"
result = null
required_reagents = list("protein" = 3, "flour" = 5)
result_amount = 3
/datum/chemical_reaction/meatball/on_reaction(var/datum/reagents/holder, var/created_volume)
var/location = get_turf(holder.my_atom)
for(var/i = 1, i <= created_volume, i++)
new /obj/item/weapon/reagent_containers/food/snacks/meatball(location)
return
/datum/chemical_reaction/dough
name = "Dough"
id = "dough"
result = null
required_reagents = list("egg" = 3, "flour" = 10)
result_amount = 1
for(var/i = 1, i <= created_volume, i++)
new /obj/item/weapon/reagent_containers/food/snacks/meatball(location)
return
/datum/chemical_reaction/dough
name = "Dough"
id = "dough"
result = null
required_reagents = list("egg" = 3, "flour" = 10)
result_amount = 1
/datum/chemical_reaction/dough/on_reaction(var/datum/reagents/holder, var/created_volume)
var/location = get_turf(holder.my_atom)
for(var/i = 1, i <= created_volume, i++)
new /obj/item/weapon/reagent_containers/food/snacks/dough(location)
for(var/i = 1, i <= created_volume, i++)
new /obj/item/weapon/reagent_containers/food/snacks/dough(location)
return
/datum/chemical_reaction/syntiflesh
@@ -1941,4 +1941,4 @@ datum
required_reagents = list("density_separated_sample" = 5)
result_amount = 4
requires_heating = 1
*/
*/
@@ -16,7 +16,7 @@
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!
new/obj/item/weapon/material/shard(target.loc) // Create a glass shard at the target's location!
B.icon_state = src.icon_state
var/icon/I = new('icons/obj/drinks.dmi', src.icon_state)
@@ -1,6 +1,6 @@
/obj/item/weapon/reagent_containers/food/snacks/breadslice/attackby(obj/item/W as obj, mob/user as mob)
if(istype(W,/obj/item/weapon/shard) || istype(W,/obj/item/weapon/reagent_containers/food/snacks))
if(istype(W,/obj/item/weapon/material/shard) || istype(W,/obj/item/weapon/reagent_containers/food/snacks))
var/obj/item/weapon/reagent_containers/food/snacks/csandwich/S = new(get_turf(src))
S.attackby(W,user)
qdel(src)
@@ -25,7 +25,7 @@
if(src.contents.len > sandwich_limit)
user << "\red If you put anything else on \the [src] it's going to collapse."
return
else if(istype(W,/obj/item/weapon/shard))
else if(istype(W,/obj/item/weapon/material/shard))
user << "\blue You hide [W] in \the [src]."
user.drop_item()
W.loc = src
@@ -87,7 +87,7 @@
var/obj/item/shard
for(var/obj/item/O in contents)
if(istype(O,/obj/item/weapon/shard))
if(istype(O,/obj/item/weapon/material/shard))
shard = O
break
@@ -48,12 +48,12 @@
if(H.species.flags & IS_SYNTHETIC)
H << "<span class='danger'>You have a monitor for a head, where do you think you're going to put that?</span>"
return
var/obj/item/blocked = H.check_mouth_coverage()
if(blocked)
user << "<span class='warning'>\The [blocked] is in the way!</span>"
return
if (fullness <= 50)
M << "<span class='danger'>You hungrily chew out a piece of [src] and gobble it!</span>"
if (fullness > 50 && fullness <= 150)
@@ -71,7 +71,7 @@
if(H.species.flags & IS_SYNTHETIC)
user << "<span class='danger'>They have a monitor for a head, where do you think you're going to put that?</span>"
return
var/obj/item/blocked = H.check_mouth_coverage()
if(blocked)
user << "<span class='warning'>\The [blocked] is in the way!</span>"
@@ -128,8 +128,8 @@
return
// Eating with forks
if(istype(W,/obj/item/weapon/kitchen/utensil))
var/obj/item/weapon/kitchen/utensil/U = W
if(istype(W,/obj/item/weapon/material/kitchen/utensil))
var/obj/item/weapon/material/kitchen/utensil/U = W
if(!U.reagents)
U.create_reagents(5)
@@ -186,9 +186,9 @@
var/reagents_per_slice = reagents.total_volume/slices_num
for(var/i=1 to (slices_num-slices_lost))
var/obj/slice = new slice_path (src.loc)
var/obj/slice = new slice_path (src.loc)
reagents.trans_to_obj(slice, reagents_per_slice)
qdel(src)
qdel(src)
return
/obj/item/weapon/reagent_containers/food/snacks/proc/is_sliceable()
@@ -2819,7 +2819,7 @@
// Dough + rolling pin = flat dough
/obj/item/weapon/reagent_containers/food/snacks/dough/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W,/obj/item/weapon/kitchen/rollingpin))
if(istype(W,/obj/item/weapon/material/kitchen/rollingpin))
new /obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough(src)
user << "You flatten the dough."
qdel(src)
@@ -2964,7 +2964,7 @@
// potato + knife = raw sticks
/obj/item/weapon/reagent_containers/food/snacks/grown/potato/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W,/obj/item/weapon/kitchen/utensil/knife))
if(istype(W,/obj/item/weapon/material/kitchen/utensil/knife))
new /obj/item/weapon/reagent_containers/food/snacks/rawsticks(src)
user << "You cut the potato."
qdel(src)
@@ -10,7 +10,7 @@
src.bitesize = 3
/obj/item/weapon/reagent_containers/food/snacks/meat/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W,/obj/item/weapon/kitchenknife))
if(istype(W,/obj/item/weapon/material/knife))
new /obj/item/weapon/reagent_containers/food/snacks/rawcutlet(src)
new /obj/item/weapon/reagent_containers/food/snacks/rawcutlet(src)
new /obj/item/weapon/reagent_containers/food/snacks/rawcutlet(src)