diff --git a/Content.Server/Nutrition/EntitySystems/DrinkSystem.cs b/Content.Server/Nutrition/EntitySystems/DrinkSystem.cs index fc7f78a71d..e4ce6784af 100644 --- a/Content.Server/Nutrition/EntitySystems/DrinkSystem.cs +++ b/Content.Server/Nutrition/EntitySystems/DrinkSystem.cs @@ -297,12 +297,20 @@ namespace Content.Server.Nutrition.EntitySystems if (args.Handled || args.Cancelled || component.Deleted) return; - if (!TryComp(args.Args.Target, out var body)) + if (!TryComp(args.Target, out var body)) return; if (!_solutionContainerSystem.TryGetSolution(args.Used, args.Solution, out var solution)) 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 drained = _solutionContainerSystem.Drain(uid, solution, transferAmount); var forceDrink = args.User != args.Target; @@ -311,17 +319,17 @@ namespace Content.Server.Nutrition.EntitySystems if (transferAmount <= 0) return; - if (!_bodySystem.TryGetBodyOrganComponents(args.Args.Target.Value, out var stomachs, body)) + if (!_bodySystem.TryGetBodyOrganComponents(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(args.Args.Target.Value)) + if (HasComp(args.Target.Value)) { - _puddleSystem.TrySpillAt(args.Args.User, drained, out _); + _puddleSystem.TrySpillAt(args.User, drained, out _); return; } - _solutionContainerSystem.Refill(args.Args.Target.Value, solution, drained); + _solutionContainerSystem.Refill(args.Target.Value, solution, drained); return; } @@ -330,12 +338,12 @@ namespace Content.Server.Nutrition.EntitySystems //All stomachs are full or can't handle whatever solution we have. 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) { - _popupSystem.PopupEntity(Loc.GetString("drink-component-try-use-drink-had-enough-other"), args.Args.Target.Value, args.Args.User); - _puddleSystem.TrySpillAt(args.Args.Target.Value, drained, out _); + _popupSystem.PopupEntity(Loc.GetString("drink-component-try-use-drink-had-enough-other"), args.Target.Value, args.User); + _puddleSystem.TrySpillAt(args.Target.Value, drained, out _); } else _solutionContainerSystem.TryAddSolution(uid, solution, drained); @@ -347,38 +355,38 @@ namespace Content.Server.Nutrition.EntitySystems if (forceDrink) { - 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("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( Loc.GetString("drink-component-force-feed-success-user", ("target", targetName)), - args.Args.User, args.Args.User); + args.User, args.User); // 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 { _popupSystem.PopupEntity( - Loc.GetString("drink-component-try-use-drink-success-slurp-taste", ("flavors", flavors)), args.Args.User, - args.Args.User); + Loc.GetString("drink-component-try-use-drink-success-slurp-taste", ("flavors", flavors)), args.User, + args.User); _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 - _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 _stomachSystem.TryTransferSolution(firstStomach.Value.Comp.Owner, drained, firstStomach.Value.Comp); var comp = EnsureComp(uid); - if (TryComp(args.Args.Target, out var dna)) + if (TryComp(args.Target, out var dna)) comp.DNAs.Add(dna.DNA); if (!forceDrink && solution.Volume > 0) diff --git a/Content.Server/Nutrition/EntitySystems/FoodSystem.cs b/Content.Server/Nutrition/EntitySystems/FoodSystem.cs index 7874f35dce..7975f8898c 100644 --- a/Content.Server/Nutrition/EntitySystems/FoodSystem.cs +++ b/Content.Server/Nutrition/EntitySystems/FoodSystem.cs @@ -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(args.Args.Target.Value, out var body)) + if (!TryComp(args.Target.Value, out var body)) return; - if (!_bodySystem.TryGetBodyOrganComponents(args.Args.Target.Value, out var stomachs, body)) + if (!_bodySystem.TryGetBodyOrganComponents(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)