Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ////////////////////////////////////////////////////////////////////////////////
- /// Syringes.
- ////////////////////////////////////////////////////////////////////////////////
- #define SYRINGE_DRAW 0
- #define SYRINGE_INJECT 1
- /obj/item/weapon/reagent_containers/syringe
- name = "Syringe"
- desc = "A syringe."
- icon = 'syringe.dmi'
- item_state = "syringe_0"
- icon_state = "0"
- amount_per_transfer_from_this = 5
- possible_transfer_amounts = null //list(5,10,15)
- volume = 15
- var/mode = SYRINGE_DRAW
- on_reagent_change()
- update_icon()
- pickup(mob/user)
- ..()
- update_icon()
- dropped(mob/user)
- ..()
- update_icon()
- attack_self(mob/user as mob)
- /*
- switch(mode)
- if(SYRINGE_DRAW)
- mode = SYRINGE_INJECT
- if(SYRINGE_INJECT)
- mode = SYRINGE_DRAW
- */
- mode = !mode
- update_icon()
- attack_hand()
- ..()
- update_icon()
- attack_paw()
- return attack_hand()
- attackby(obj/item/I as obj, mob/user as mob)
- return
- afterattack(obj/target, mob/user , flag)
- if(!target.reagents) return
- switch(mode)
- if(SYRINGE_DRAW)
- if(reagents.total_volume >= reagents.maximum_volume)
- user << "\red The syringe is full."
- return
- if(ismob(target))//Blood!
- if(istype(target, /mob/living/carbon/metroid))
- user << "\red You are unable to locate any blood."
- return
- if(src.reagents.has_reagent("blood"))
- user << "\red There is already a blood sample in this syringe"
- return
- if(istype(target, /mob/living/carbon))//maybe just add a blood reagent to all mobs. Then you can suck them dry...With hundreds of syringes. Jolly good idea.
- var/amount = src.reagents.maximum_volume - src.reagents.total_volume
- var/mob/living/carbon/T = target
- var/datum/reagent/B = new /datum/reagent/blood
- if(!T.dna)
- usr << "You are unable to locate any blood. (To be specific, your target seems to be missing their DNA datum)"
- return
- if(T.mutations & HUSK) //target done been et, no more blood in him
- user << "\red You are unable to locate any blood."
- return
- B.holder = src
- B.volume = amount
- //set reagent data
- B.data["donor"] = T
- /*
- if(T.virus && T.virus.spread_type != SPECIAL)
- B.data["virus"] = new T.virus.type(0)
- */
- for(var/datum/disease/D in T.viruses)
- if(!B.data["viruses"])
- B.data["viruses"] = list()
- B.data["viruses"] += new D.type
- if(B.data["virus2"])
- if(T.virus2)
- B.data["virus2"] = T.virus2.getcopy()
- B.data["blood_DNA"] = copytext(T.dna.unique_enzymes,1,0)
- if(T.resistances&&T.resistances.len)
- B.data["resistances"] = T.resistances.Copy()
- if(istype(target, /mob/living/carbon/human))//I wish there was some hasproperty operation...
- var/mob/living/carbon/human/HT = target
- B.data["blood_type"] = copytext(HT.b_type,1,0)
- var/list/temp_chem = list()
- for(var/datum/reagent/R in target.reagents.reagent_list)
- temp_chem += R.name
- temp_chem[R.name] = R.volume
- B.data["trace_chem"] = list2params(temp_chem)
- //debug
- //for(var/D in B.data)
- // world << "Data [D] = [B.data[D]]"
- //debug
- src.reagents.reagent_list += B
- src.reagents.update_total()
- src.on_reagent_change()
- src.reagents.handle_reactions()
- user << "\blue You take a blood sample from [target]"
- for(var/mob/O in viewers(4, user))
- O.show_message("\red [user] takes a blood sample from [target].", 1)
- else //if not mob
- if(!target.reagents.total_volume)
- user << "\red [target] is empty."
- return
- if(!target.is_open_container() && !istype(target,/obj/structure/reagent_dispensers) && !istype(target,/obj/item/metroid_core))
- user << "\red You cannot directly remove reagents from this object."
- return
- var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this) // transfer from, transfer to - who cares?
- user << "\blue You fill the syringe with [trans] units of the solution."
- if (reagents.total_volume >= reagents.maximum_volume)
- mode=!mode
- update_icon()
- if(SYRINGE_INJECT)
- if(!reagents.total_volume)
- user << "\red The Syringe is empty."
- return
- if(istype(target, /obj/item/weapon/implantcase/chem))
- return
- if(!target.is_open_container() && !ismob(target) && !istype(target, /obj/item/weapon/reagent_containers/food) && !istype(target, /obj/item/metroid_core))
- user << "\red You cannot directly fill this object."
- return
- if(target.reagents.total_volume >= target.reagents.maximum_volume)
- user << "\red [target] is full."
- return
- if(istype(target, /obj/item/metroid_core))
- var/obj/item/metroid_core/core = target
- core.Flush = 30 // reset flush counter
- if(ismob(target) && target != user)
- for(var/mob/O in viewers(world.view, user))
- O.show_message(text("\red <B>[] is trying to inject []!</B>", user, target), 1)
- if(!do_mob(user, target)) return
- for(var/mob/O in viewers(world.view, user))
- O.show_message(text("\red [] injects [] with the syringe!", user, target), 1)
- src.reagents.reaction(target, INGEST)
- if(ismob(target) && target == user)
- src.reagents.reaction(target, INGEST)
- spawn(5)
- var/trans = src.reagents.trans_to(target, amount_per_transfer_from_this)
- user << "\blue You inject [trans] units of the solution. The syringe now contains [src.reagents.total_volume] units."
- if (reagents.total_volume >= reagents.maximum_volume && mode==SYRINGE_INJECT)
- mode = SYRINGE_DRAW
- update_icon()
- return
- update_icon()
- var/rounded_vol = round(reagents.total_volume,5)
- if(ismob(loc))
- var/mode_t
- switch(mode)
- if (SYRINGE_DRAW)
- mode_t = "d"
- if (SYRINGE_INJECT)
- mode_t = "i"
- icon_state = "[mode_t][rounded_vol]"
- else
- icon_state = "[rounded_vol]"
- item_state = "syringe_[rounded_vol]"
Add Comment
Please, Sign In to add comment