Fix drinking and eating with a mask on (#15468)

This commit is contained in:
Leon Friedrich
2023-04-17 19:56:42 +12:00
committed by GitHub
parent 45336479c0
commit e81f47dc13
2 changed files with 51 additions and 35 deletions

View File

@@ -156,13 +156,13 @@ namespace Content.Server.Nutrition.EntitySystems
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;
if (!TryComp<BodyComponent>(args.Args.Target.Value, out var body))
if (!TryComp<BodyComponent>(args.Target.Value, out var body))
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;
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))
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;
args.Handled = true;
@@ -184,41 +192,41 @@ namespace Content.Server.Nutrition.EntitySystems
if (firstStomach == null)
{
_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;
}
_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);
var flavors = args.FlavorMessage;
if (forceFeed)
{
var targetName = Identity.Entity(args.Args.Target.Value, EntityManager);
var userName = Identity.Entity(args.Args.User, EntityManager);
var targetName = Identity.Entity(args.Target.Value, EntityManager);
var userName = Identity.Entity(args.User, EntityManager);
_popupSystem.PopupEntity(Loc.GetString("food-system-force-feed-success", ("user", userName), ("flavors", flavors)),
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
_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
{
_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
_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
foreach (var utensil in utensils)
{
_utensilSystem.TryBreak(utensil, args.Args.User);
_utensilSystem.TryBreak(utensil, args.User);
}
if (component.UsesRemaining > 0)
@@ -233,7 +241,7 @@ namespace Content.Server.Nutrition.EntitySystems
EntityManager.QueueDeleteEntity(uid);
else
DeleteAndSpawnTrash(component, uid, args.Args.User);
DeleteAndSpawnTrash(component, uid, args.User);
}
private void DeleteAndSpawnTrash(FoodComponent component, EntityUid food, EntityUid? user = null)