Guest User

Untitled

a guest
Apr 24th, 2018
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.97 KB | None | 0 0
  1. ////////////////////////////////////////////////////////////////////////////////
  2. /// Syringes.
  3. ////////////////////////////////////////////////////////////////////////////////
  4. #define SYRINGE_DRAW 0
  5. #define SYRINGE_INJECT 1
  6.  
  7. /obj/item/weapon/reagent_containers/syringe
  8. name = "Syringe"
  9. desc = "A syringe."
  10. icon = 'syringe.dmi'
  11. item_state = "syringe_0"
  12. icon_state = "0"
  13. amount_per_transfer_from_this = 5
  14. possible_transfer_amounts = null //list(5,10,15)
  15. volume = 15
  16. var/mode = SYRINGE_DRAW
  17.  
  18. on_reagent_change()
  19. update_icon()
  20.  
  21. pickup(mob/user)
  22. ..()
  23. update_icon()
  24.  
  25. dropped(mob/user)
  26. ..()
  27. update_icon()
  28.  
  29. attack_self(mob/user as mob)
  30. /*
  31. switch(mode)
  32. if(SYRINGE_DRAW)
  33. mode = SYRINGE_INJECT
  34. if(SYRINGE_INJECT)
  35. mode = SYRINGE_DRAW
  36. */
  37. mode = !mode
  38. update_icon()
  39.  
  40. attack_hand()
  41. ..()
  42. update_icon()
  43.  
  44. attack_paw()
  45. return attack_hand()
  46.  
  47. attackby(obj/item/I as obj, mob/user as mob)
  48. return
  49.  
  50. afterattack(obj/target, mob/user , flag)
  51. if(!target.reagents) return
  52.  
  53. switch(mode)
  54. if(SYRINGE_DRAW)
  55.  
  56. if(reagents.total_volume >= reagents.maximum_volume)
  57. user << "\red The syringe is full."
  58. return
  59.  
  60. if(ismob(target))//Blood!
  61. if(istype(target, /mob/living/carbon/metroid))
  62. user << "\red You are unable to locate any blood."
  63. return
  64. if(src.reagents.has_reagent("blood"))
  65. user << "\red There is already a blood sample in this syringe"
  66. return
  67. 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.
  68. var/amount = src.reagents.maximum_volume - src.reagents.total_volume
  69. var/mob/living/carbon/T = target
  70. var/datum/reagent/B = new /datum/reagent/blood
  71. if(!T.dna)
  72. usr << "You are unable to locate any blood. (To be specific, your target seems to be missing their DNA datum)"
  73. return
  74. if(T.mutations & HUSK) //target done been et, no more blood in him
  75. user << "\red You are unable to locate any blood."
  76. return
  77. B.holder = src
  78. B.volume = amount
  79. //set reagent data
  80. B.data["donor"] = T
  81. /*
  82. if(T.virus && T.virus.spread_type != SPECIAL)
  83. B.data["virus"] = new T.virus.type(0)
  84. */
  85.  
  86.  
  87.  
  88. for(var/datum/disease/D in T.viruses)
  89. if(!B.data["viruses"])
  90. B.data["viruses"] = list()
  91.  
  92.  
  93. B.data["viruses"] += new D.type
  94.  
  95. if(B.data["virus2"])
  96. if(T.virus2)
  97. B.data["virus2"] = T.virus2.getcopy()
  98.  
  99. B.data["blood_DNA"] = copytext(T.dna.unique_enzymes,1,0)
  100. if(T.resistances&&T.resistances.len)
  101. B.data["resistances"] = T.resistances.Copy()
  102. if(istype(target, /mob/living/carbon/human))//I wish there was some hasproperty operation...
  103. var/mob/living/carbon/human/HT = target
  104. B.data["blood_type"] = copytext(HT.b_type,1,0)
  105. var/list/temp_chem = list()
  106. for(var/datum/reagent/R in target.reagents.reagent_list)
  107. temp_chem += R.name
  108. temp_chem[R.name] = R.volume
  109. B.data["trace_chem"] = list2params(temp_chem)
  110. //debug
  111. //for(var/D in B.data)
  112. // world << "Data [D] = [B.data[D]]"
  113. //debug
  114. src.reagents.reagent_list += B
  115. src.reagents.update_total()
  116. src.on_reagent_change()
  117. src.reagents.handle_reactions()
  118. user << "\blue You take a blood sample from [target]"
  119. for(var/mob/O in viewers(4, user))
  120. O.show_message("\red [user] takes a blood sample from [target].", 1)
  121.  
  122. else //if not mob
  123. if(!target.reagents.total_volume)
  124. user << "\red [target] is empty."
  125. return
  126.  
  127. if(!target.is_open_container() && !istype(target,/obj/structure/reagent_dispensers) && !istype(target,/obj/item/metroid_core))
  128. user << "\red You cannot directly remove reagents from this object."
  129. return
  130.  
  131. var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this) // transfer from, transfer to - who cares?
  132.  
  133. user << "\blue You fill the syringe with [trans] units of the solution."
  134. if (reagents.total_volume >= reagents.maximum_volume)
  135. mode=!mode
  136. update_icon()
  137.  
  138. if(SYRINGE_INJECT)
  139. if(!reagents.total_volume)
  140. user << "\red The Syringe is empty."
  141. return
  142. if(istype(target, /obj/item/weapon/implantcase/chem))
  143. return
  144.  
  145. if(!target.is_open_container() && !ismob(target) && !istype(target, /obj/item/weapon/reagent_containers/food) && !istype(target, /obj/item/metroid_core))
  146. user << "\red You cannot directly fill this object."
  147. return
  148. if(target.reagents.total_volume >= target.reagents.maximum_volume)
  149. user << "\red [target] is full."
  150. return
  151.  
  152. if(istype(target, /obj/item/metroid_core))
  153. var/obj/item/metroid_core/core = target
  154. core.Flush = 30 // reset flush counter
  155.  
  156. if(ismob(target) && target != user)
  157. for(var/mob/O in viewers(world.view, user))
  158. O.show_message(text("\red <B>[] is trying to inject []!</B>", user, target), 1)
  159. if(!do_mob(user, target)) return
  160. for(var/mob/O in viewers(world.view, user))
  161. O.show_message(text("\red [] injects [] with the syringe!", user, target), 1)
  162. src.reagents.reaction(target, INGEST)
  163. if(ismob(target) && target == user)
  164. src.reagents.reaction(target, INGEST)
  165. spawn(5)
  166. var/trans = src.reagents.trans_to(target, amount_per_transfer_from_this)
  167. user << "\blue You inject [trans] units of the solution. The syringe now contains [src.reagents.total_volume] units."
  168. if (reagents.total_volume >= reagents.maximum_volume && mode==SYRINGE_INJECT)
  169. mode = SYRINGE_DRAW
  170. update_icon()
  171.  
  172. return
  173.  
  174. update_icon()
  175. var/rounded_vol = round(reagents.total_volume,5)
  176. if(ismob(loc))
  177. var/mode_t
  178. switch(mode)
  179. if (SYRINGE_DRAW)
  180. mode_t = "d"
  181. if (SYRINGE_INJECT)
  182. mode_t = "i"
  183. icon_state = "[mode_t][rounded_vol]"
  184. else
  185. icon_state = "[rounded_vol]"
  186. item_state = "syringe_[rounded_vol]"
Add Comment
Please, Sign In to add comment