diff --git a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm
index 8466b7755d..e774cf4250 100644
--- a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm
+++ b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm
@@ -315,7 +315,7 @@
bloodsuckerdatum.handle_eat_human_food(food_nutrition)
-/datum/antagonist/bloodsucker/proc/handle_eat_human_food(food_nutrition, masquerade_override) // Called from snacks.dm and drinks.dm
+/datum/antagonist/bloodsucker/proc/handle_eat_human_food(food_nutrition, puke_blood = TRUE, masquerade_override) // Called from snacks.dm and drinks.dm
set waitfor = FALSE
if(!owner.current || !iscarbon(owner.current))
return
@@ -355,8 +355,12 @@
C.Stun(13)
if(3)
to_chat(C, "You purge the food of the living from your viscera! You've never felt worse.")
- C.vomit(foodInGut * 4, foodInGut * 2, 0) // (var/lost_nutrition = 10, var/blood = 0, var/stun = 1, var/distance = 0, var/message = 1, var/toxic = 0)
- C.blood_volume = max(0, C.blood_volume - foodInGut * 2)
+ //Puke blood only if puke_blood is true, and loose some blood, else just puke normally.
+ if(puke_blood)
+ C.blood_volume = max(0, C.blood_volume - foodInGut * 2)
+ C.vomit(foodInGut * 4, foodInGut * 2, 0)
+ else
+ C.vomit(foodInGut * 4, FALSE, 0)
C.Stun(30)
//C.Dizzy(50)
foodInGut = 0
diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm
index 4aabd82d6a..bd6c37973f 100644
--- a/code/modules/reagents/chemistry/reagents.dm
+++ b/code/modules/reagents/chemistry/reagents.dm
@@ -221,3 +221,13 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent())
rs += "[R.name], [R.volume]"
return rs.Join(" | ")
+
+//For easy bloodsucker disgusting and blood removal
+/datum/reagent/proc/disgust_bloodsucker(mob/living/carbon/C, disgust, blood_change, blood_puke = TRUE, force)
+ if(isvamp(C))
+ var/datum/antagonist/bloodsucker/bloodsuckerdatum = C.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER)
+ if(disgust)
+ bloodsuckerdatum.handle_eat_human_food(disgust, blood_puke, force)
+ if(blood_change)
+ bloodsuckerdatum.AddBloodVolume(blood_change)
+
diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm
index 422652fc49..816ed0fb65 100644
--- a/code/modules/reagents/chemistry/reagents/other_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm
@@ -27,8 +27,16 @@
L.ForceContractDisease(D)
if(data["blood_type"] == "SY")
- disgust_bloodsucker(L, FALSE, -5, TRUE)
-
+ //Synthblood is very disgusting to bloodsuckers. They will puke it out to expel it, unless they have masquarade on
+ if(reac_volume > 3)
+ disgust_bloodsucker(L, 5, FALSE, FALSE, TRUE)
+ //If theres more than 8 units, they will start expelling it, even if they are masquarading.
+ if(reac_volume > 6)
+ disgust_bloodsucker(L, 7, -5, TRUE, TRUE)
+ //If they have too much in them, they will also puke out their blood.
+ else
+ disgust_bloodsucker(L, 3, FALSE, FALSE, FALSE)
+
if(iscarbon(L))
var/mob/living/carbon/C = L
var/blood_id = C.get_blood_id()
@@ -40,10 +48,8 @@
L.add_blood_DNA(list(data["blood_DNA"] = data["blood_type"]))
/datum/reagent/blood/on_mob_life(mob/living/carbon/C) //Because lethals are preferred over stamina. damnifino.
- if((HAS_TRAIT(C, TRAIT_NOMARROW)))
- return //We dont want vampires getting toxed from blood
var/blood_id = C.get_blood_id()
- if((blood_id == /datum/reagent/blood || blood_id == /datum/reagent/blood/jellyblood))
+ if((blood_id == /datum/reagent/blood || blood_id == /datum/reagent/blood/jellyblood) && !HAS_TRAIT(C, TRAIT_NOMARROW))
if(!data || !(data["blood_type"] in get_safe_blood(C.dna.blood_type))) //we only care about bloodtype here because this is where the poisoning should be
C.adjustToxLoss(rand(2,8)*REM, TRUE, TRUE) //forced to ensure people don't use it to gain beneficial toxin as slime person
..()
@@ -152,18 +158,6 @@
taste_description = "sap" //Like tree sap?
pH = 7.45
-/datum/reagent/blood/tomato/reaction_mob(mob/living/L, method = TOUCH, reac_volume)
- ..()
- disgust_bloodsucker(L, reac_volume * 2, -5, TRUE)
-
-/datum/reagent/proc/disgust_bloodsucker(mob/living/carbon/C, disgust, blood_change, force)
- if(isvamp(C))
- var/datum/antagonist/bloodsucker/bloodsuckerdatum = C.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER)
- if(disgust)
- bloodsuckerdatum.handle_eat_human_food(disgust, force)
- if(blood_change)
- bloodsuckerdatum.AddBloodVolume(blood_change)
-
/datum/reagent/blood/jellyblood/on_mob_life(mob/living/carbon/M)
if(prob(10))
if(M.dna?.species?.exotic_bloodtype != "GEL")
diff --git a/code/modules/reagents/reagent_containers/blood_pack.dm b/code/modules/reagents/reagent_containers/blood_pack.dm
index fcf5f85ffb..e5bc026bbf 100644
--- a/code/modules/reagents/reagent_containers/blood_pack.dm
+++ b/code/modules/reagents/reagent_containers/blood_pack.dm
@@ -89,7 +89,7 @@
blood_type = "BUG"
/obj/item/reagent_containers/blood/attackby(obj/item/I, mob/user, params)
- if (istype(I, /obj/item/pen) || istype(I, /obj/item/toy/crayon))
+ if(istype(I, /obj/item/pen) || istype(I, /obj/item/toy/crayon))
if(!user.is_literate())
to_chat(user, "You scribble illegibly on the label of [src]!")
return
@@ -108,10 +108,13 @@
return ..()
/obj/item/reagent_containers/blood/attack(mob/living/carbon/C, mob/user, def_zone)
- if(user.a_intent == INTENT_HELP && reagents.total_volume > 0)
+ if(user.a_intent == INTENT_HELP && reagents.total_volume > 0 && iscarbon(C) && user.a_intent == INTENT_HELP)
+ if(C.is_mouth_covered())
+ to_chat(user, "You cant drink from the [src] while your mouth is covered.")
+ return
if(user != C)
- to_chat(user, "You force [C] to drink from the [src]")
- user.visible_message("[user] forces [C] to drink from the [src].")
+ user.visible_message("[user] forces [C] to drink from the [src].", \
+ "You force [C] to drink from the [src]")
if(!do_mob(user, C, 50))
return
else
@@ -121,13 +124,14 @@
to_chat(user, "You take a sip from the [src].")
user.visible_message("[user] puts the [src] up to their mouth.")
if(reagents.total_volume <= 0) // Safety: In case you spam clicked the blood bag on yourself, and it is now empty (below will divide by zero)
- return
+ return
var/gulp_size = 3
var/fraction = min(gulp_size / reagents.total_volume, 1)
reagents.reaction(C, INGEST, fraction) //checkLiked(fraction, M) // Blood isn't food, sorry.
reagents.trans_to(C, gulp_size)
reagents.remove_reagent(src, 2) //Inneficency, so hey, IVs are usefull.
- playsound(C.loc,'sound/items/drink.ogg', rand(10, 50), 1)
+ playsound(C.loc,'sound/items/drink.ogg', rand(10, 50), TRUE)
+ return
..()
/obj/item/reagent_containers/blood/bluespace
@@ -135,3 +139,14 @@
desc = "Contains blood used for transfusion, this one has been made with bluespace technology to hold much more blood. Must be attached to an IV drip."
icon_state = "bsbloodpack"
volume = 600 //its a blood bath!
+
+/obj/item/reagent_containers/blood/bluespace/attack(mob/living/carbon/C, mob/user, def_zone)
+ if(user.a_intent == INTENT_HELP)
+ if(user != C)
+ to_chat(user, "You cant force people to drink from the [src]. Nothing comes out.")
+ return
+ else
+ to_chat(user, "You try to suck on the [src], but nothing comes out.")
+ return
+ else
+ ..()