Fix drinking and eating with a mask on (#15468)
This commit is contained in:
@@ -297,12 +297,20 @@ namespace Content.Server.Nutrition.EntitySystems
|
|||||||
if (args.Handled || args.Cancelled || component.Deleted)
|
if (args.Handled || args.Cancelled || component.Deleted)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!TryComp<BodyComponent>(args.Args.Target, out var body))
|
if (!TryComp<BodyComponent>(args.Target, out var body))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!_solutionContainerSystem.TryGetSolution(args.Used, args.Solution, out var solution))
|
if (!_solutionContainerSystem.TryGetSolution(args.Used, args.Solution, out var solution))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
// TODO this should really be checked every tick.
|
||||||
|
if (_foodSystem.IsMouthBlocked(args.Target.Value))
|
||||||
|
return;
|
||||||
|
|
||||||
|
// TODO this should really be checked every tick.
|
||||||
|
if (!_interactionSystem.InRangeUnobstructed(args.User, args.Target.Value))
|
||||||
|
return;
|
||||||
|
|
||||||
var transferAmount = FixedPoint2.Min(component.TransferAmount, solution.Volume);
|
var transferAmount = FixedPoint2.Min(component.TransferAmount, solution.Volume);
|
||||||
var drained = _solutionContainerSystem.Drain(uid, solution, transferAmount);
|
var drained = _solutionContainerSystem.Drain(uid, solution, transferAmount);
|
||||||
var forceDrink = args.User != args.Target;
|
var forceDrink = args.User != args.Target;
|
||||||
@@ -311,17 +319,17 @@ namespace Content.Server.Nutrition.EntitySystems
|
|||||||
if (transferAmount <= 0)
|
if (transferAmount <= 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!_bodySystem.TryGetBodyOrganComponents<StomachComponent>(args.Args.Target.Value, out var stomachs, body))
|
if (!_bodySystem.TryGetBodyOrganComponents<StomachComponent>(args.Target.Value, out var stomachs, body))
|
||||||
{
|
{
|
||||||
_popupSystem.PopupEntity(forceDrink ? Loc.GetString("drink-component-try-use-drink-cannot-drink-other") : Loc.GetString("drink-component-try-use-drink-had-enough"), args.Args.Target.Value, args.Args.User);
|
_popupSystem.PopupEntity(forceDrink ? Loc.GetString("drink-component-try-use-drink-cannot-drink-other") : Loc.GetString("drink-component-try-use-drink-had-enough"), args.Target.Value, args.User);
|
||||||
|
|
||||||
if (HasComp<RefillableSolutionComponent>(args.Args.Target.Value))
|
if (HasComp<RefillableSolutionComponent>(args.Target.Value))
|
||||||
{
|
{
|
||||||
_puddleSystem.TrySpillAt(args.Args.User, drained, out _);
|
_puddleSystem.TrySpillAt(args.User, drained, out _);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
_solutionContainerSystem.Refill(args.Args.Target.Value, solution, drained);
|
_solutionContainerSystem.Refill(args.Target.Value, solution, drained);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -330,12 +338,12 @@ namespace Content.Server.Nutrition.EntitySystems
|
|||||||
//All stomachs are full or can't handle whatever solution we have.
|
//All stomachs are full or can't handle whatever solution we have.
|
||||||
if (firstStomach == null)
|
if (firstStomach == null)
|
||||||
{
|
{
|
||||||
_popupSystem.PopupEntity(Loc.GetString("drink-component-try-use-drink-had-enough"), args.Args.Target.Value, args.Args.Target.Value);
|
_popupSystem.PopupEntity(Loc.GetString("drink-component-try-use-drink-had-enough"), args.Target.Value, args.Target.Value);
|
||||||
|
|
||||||
if (forceDrink)
|
if (forceDrink)
|
||||||
{
|
{
|
||||||
_popupSystem.PopupEntity(Loc.GetString("drink-component-try-use-drink-had-enough-other"), args.Args.Target.Value, args.Args.User);
|
_popupSystem.PopupEntity(Loc.GetString("drink-component-try-use-drink-had-enough-other"), args.Target.Value, args.User);
|
||||||
_puddleSystem.TrySpillAt(args.Args.Target.Value, drained, out _);
|
_puddleSystem.TrySpillAt(args.Target.Value, drained, out _);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
_solutionContainerSystem.TryAddSolution(uid, solution, drained);
|
_solutionContainerSystem.TryAddSolution(uid, solution, drained);
|
||||||
@@ -347,38 +355,38 @@ namespace Content.Server.Nutrition.EntitySystems
|
|||||||
|
|
||||||
if (forceDrink)
|
if (forceDrink)
|
||||||
{
|
{
|
||||||
var targetName = Identity.Entity(args.Args.Target.Value, EntityManager);
|
var targetName = Identity.Entity(args.Target.Value, EntityManager);
|
||||||
var userName = Identity.Entity(args.Args.User, EntityManager);
|
var userName = Identity.Entity(args.User, EntityManager);
|
||||||
|
|
||||||
_popupSystem.PopupEntity(Loc.GetString("drink-component-force-feed-success", ("user", userName), ("flavors", flavors)), args.Args.Target.Value, args.Args.Target.Value);
|
_popupSystem.PopupEntity(Loc.GetString("drink-component-force-feed-success", ("user", userName), ("flavors", flavors)), args.Target.Value, args.Target.Value);
|
||||||
|
|
||||||
_popupSystem.PopupEntity(
|
_popupSystem.PopupEntity(
|
||||||
Loc.GetString("drink-component-force-feed-success-user", ("target", targetName)),
|
Loc.GetString("drink-component-force-feed-success-user", ("target", targetName)),
|
||||||
args.Args.User, args.Args.User);
|
args.User, args.User);
|
||||||
|
|
||||||
// log successful forced drinking
|
// log successful forced drinking
|
||||||
_adminLogger.Add(LogType.ForceFeed, LogImpact.Medium, $"{ToPrettyString(uid):user} forced {ToPrettyString(args.Args.User):target} to drink {ToPrettyString(component.Owner):drink}");
|
_adminLogger.Add(LogType.ForceFeed, LogImpact.Medium, $"{ToPrettyString(uid):user} forced {ToPrettyString(args.User):target} to drink {ToPrettyString(component.Owner):drink}");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
_popupSystem.PopupEntity(
|
_popupSystem.PopupEntity(
|
||||||
Loc.GetString("drink-component-try-use-drink-success-slurp-taste", ("flavors", flavors)), args.Args.User,
|
Loc.GetString("drink-component-try-use-drink-success-slurp-taste", ("flavors", flavors)), args.User,
|
||||||
args.Args.User);
|
args.User);
|
||||||
_popupSystem.PopupEntity(
|
_popupSystem.PopupEntity(
|
||||||
Loc.GetString("drink-component-try-use-drink-success-slurp"), args.Args.User, Filter.PvsExcept(args.Args.User), true);
|
Loc.GetString("drink-component-try-use-drink-success-slurp"), args.User, Filter.PvsExcept(args.User), true);
|
||||||
|
|
||||||
// log successful voluntary drinking
|
// log successful voluntary drinking
|
||||||
_adminLogger.Add(LogType.Ingestion, LogImpact.Low, $"{ToPrettyString(args.Args.User):target} drank {ToPrettyString(uid):drink}");
|
_adminLogger.Add(LogType.Ingestion, LogImpact.Low, $"{ToPrettyString(args.User):target} drank {ToPrettyString(uid):drink}");
|
||||||
}
|
}
|
||||||
|
|
||||||
_audio.PlayPvs(_audio.GetSound(component.UseSound), args.Args.Target.Value, AudioParams.Default.WithVolume(-2f));
|
_audio.PlayPvs(_audio.GetSound(component.UseSound), args.Target.Value, AudioParams.Default.WithVolume(-2f));
|
||||||
|
|
||||||
_reaction.DoEntityReaction(args.Args.Target.Value, solution, ReactionMethod.Ingestion);
|
_reaction.DoEntityReaction(args.Target.Value, solution, ReactionMethod.Ingestion);
|
||||||
//TODO: Grab the stomach UIDs somehow without using Owner
|
//TODO: Grab the stomach UIDs somehow without using Owner
|
||||||
_stomachSystem.TryTransferSolution(firstStomach.Value.Comp.Owner, drained, firstStomach.Value.Comp);
|
_stomachSystem.TryTransferSolution(firstStomach.Value.Comp.Owner, drained, firstStomach.Value.Comp);
|
||||||
|
|
||||||
var comp = EnsureComp<ForensicsComponent>(uid);
|
var comp = EnsureComp<ForensicsComponent>(uid);
|
||||||
if (TryComp<DnaComponent>(args.Args.Target, out var dna))
|
if (TryComp<DnaComponent>(args.Target, out var dna))
|
||||||
comp.DNAs.Add(dna.DNA);
|
comp.DNAs.Add(dna.DNA);
|
||||||
|
|
||||||
if (!forceDrink && solution.Volume > 0)
|
if (!forceDrink && solution.Volume > 0)
|
||||||
|
|||||||
@@ -156,13 +156,13 @@ namespace Content.Server.Nutrition.EntitySystems
|
|||||||
|
|
||||||
private void OnDoAfter(EntityUid uid, FoodComponent component, ConsumeDoAfterEvent args)
|
private void OnDoAfter(EntityUid uid, FoodComponent component, ConsumeDoAfterEvent args)
|
||||||
{
|
{
|
||||||
if (args.Cancelled || args.Handled || component.Deleted || args.Args.Target == null)
|
if (args.Cancelled || args.Handled || component.Deleted || args.Target == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!TryComp<BodyComponent>(args.Args.Target.Value, out var body))
|
if (!TryComp<BodyComponent>(args.Target.Value, out var body))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!_bodySystem.TryGetBodyOrganComponents<StomachComponent>(args.Args.Target.Value, out var stomachs, body))
|
if (!_bodySystem.TryGetBodyOrganComponents<StomachComponent>(args.Target.Value, out var stomachs, body))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!_solutionContainerSystem.TryGetSolution(args.Used, args.Solution, out var solution))
|
if (!_solutionContainerSystem.TryGetSolution(args.Used, args.Solution, out var solution))
|
||||||
@@ -171,6 +171,14 @@ namespace Content.Server.Nutrition.EntitySystems
|
|||||||
if (!TryGetRequiredUtensils(args.User, component, out var utensils))
|
if (!TryGetRequiredUtensils(args.User, component, out var utensils))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
// TODO this should really be checked every tick.
|
||||||
|
if (IsMouthBlocked(args.Target.Value))
|
||||||
|
return;
|
||||||
|
|
||||||
|
// TODO this should really be checked every tick.
|
||||||
|
if (!_interactionSystem.InRangeUnobstructed(args.User, args.Target.Value))
|
||||||
|
return;
|
||||||
|
|
||||||
var forceFeed = args.User != args.Target;
|
var forceFeed = args.User != args.Target;
|
||||||
|
|
||||||
args.Handled = true;
|
args.Handled = true;
|
||||||
@@ -184,41 +192,41 @@ namespace Content.Server.Nutrition.EntitySystems
|
|||||||
if (firstStomach == null)
|
if (firstStomach == null)
|
||||||
{
|
{
|
||||||
_solutionContainerSystem.TryAddSolution(uid, solution, split);
|
_solutionContainerSystem.TryAddSolution(uid, solution, split);
|
||||||
_popupSystem.PopupEntity(forceFeed ? Loc.GetString("food-system-you-cannot-eat-any-more-other") : Loc.GetString("food-system-you-cannot-eat-any-more"), args.Args.Target.Value, args.Args.User);
|
_popupSystem.PopupEntity(forceFeed ? Loc.GetString("food-system-you-cannot-eat-any-more-other") : Loc.GetString("food-system-you-cannot-eat-any-more"), args.Target.Value, args.User);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
_reaction.DoEntityReaction(args.Args.Target.Value, solution, ReactionMethod.Ingestion);
|
_reaction.DoEntityReaction(args.Target.Value, solution, ReactionMethod.Ingestion);
|
||||||
_stomachSystem.TryTransferSolution(firstStomach.Value.Comp.Owner, split, firstStomach.Value.Comp);
|
_stomachSystem.TryTransferSolution(firstStomach.Value.Comp.Owner, split, firstStomach.Value.Comp);
|
||||||
|
|
||||||
var flavors = args.FlavorMessage;
|
var flavors = args.FlavorMessage;
|
||||||
|
|
||||||
if (forceFeed)
|
if (forceFeed)
|
||||||
{
|
{
|
||||||
var targetName = Identity.Entity(args.Args.Target.Value, EntityManager);
|
var targetName = Identity.Entity(args.Target.Value, EntityManager);
|
||||||
var userName = Identity.Entity(args.Args.User, EntityManager);
|
var userName = Identity.Entity(args.User, EntityManager);
|
||||||
_popupSystem.PopupEntity(Loc.GetString("food-system-force-feed-success", ("user", userName), ("flavors", flavors)),
|
_popupSystem.PopupEntity(Loc.GetString("food-system-force-feed-success", ("user", userName), ("flavors", flavors)),
|
||||||
uid, uid);
|
uid, uid);
|
||||||
|
|
||||||
_popupSystem.PopupEntity(Loc.GetString("food-system-force-feed-success-user", ("target", targetName)), args.Args.User, args.Args.User);
|
_popupSystem.PopupEntity(Loc.GetString("food-system-force-feed-success-user", ("target", targetName)), args.User, args.User);
|
||||||
|
|
||||||
// log successful force feed
|
// log successful force feed
|
||||||
_adminLogger.Add(LogType.ForceFeed, LogImpact.Medium, $"{ToPrettyString(uid):user} forced {ToPrettyString(args.Args.User):target} to eat {ToPrettyString(uid):food}");
|
_adminLogger.Add(LogType.ForceFeed, LogImpact.Medium, $"{ToPrettyString(uid):user} forced {ToPrettyString(args.User):target} to eat {ToPrettyString(uid):food}");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
_popupSystem.PopupEntity(Loc.GetString(component.EatMessage, ("food", uid), ("flavors", flavors)), args.Args.User, args.Args.User);
|
_popupSystem.PopupEntity(Loc.GetString(component.EatMessage, ("food", uid), ("flavors", flavors)), args.User, args.User);
|
||||||
|
|
||||||
// log successful voluntary eating
|
// log successful voluntary eating
|
||||||
_adminLogger.Add(LogType.Ingestion, LogImpact.Low, $"{ToPrettyString(args.Args.User):target} ate {ToPrettyString(uid):food}");
|
_adminLogger.Add(LogType.Ingestion, LogImpact.Low, $"{ToPrettyString(args.User):target} ate {ToPrettyString(uid):food}");
|
||||||
}
|
}
|
||||||
|
|
||||||
_audio.Play(component.UseSound, Filter.Pvs(args.Args.Target.Value), args.Args.Target.Value, true, AudioParams.Default.WithVolume(-1f));
|
_audio.Play(component.UseSound, Filter.Pvs(args.Target.Value), args.Target.Value, true, AudioParams.Default.WithVolume(-1f));
|
||||||
|
|
||||||
// Try to break all used utensils
|
// Try to break all used utensils
|
||||||
foreach (var utensil in utensils)
|
foreach (var utensil in utensils)
|
||||||
{
|
{
|
||||||
_utensilSystem.TryBreak(utensil, args.Args.User);
|
_utensilSystem.TryBreak(utensil, args.User);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (component.UsesRemaining > 0)
|
if (component.UsesRemaining > 0)
|
||||||
@@ -233,7 +241,7 @@ namespace Content.Server.Nutrition.EntitySystems
|
|||||||
EntityManager.QueueDeleteEntity(uid);
|
EntityManager.QueueDeleteEntity(uid);
|
||||||
|
|
||||||
else
|
else
|
||||||
DeleteAndSpawnTrash(component, uid, args.Args.User);
|
DeleteAndSpawnTrash(component, uid, args.User);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void DeleteAndSpawnTrash(FoodComponent component, EntityUid food, EntityUid? user = null)
|
private void DeleteAndSpawnTrash(FoodComponent component, EntityUid food, EntityUid? user = null)
|
||||||
|
|||||||
Reference in New Issue
Block a user