]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Fix some food mispredicts (#16183)
authorLeon Friedrich <60421075+ElectroJr@users.noreply.github.com>
Sun, 7 May 2023 02:58:20 +0000 (14:58 +1200)
committerGitHub <noreply@github.com>
Sun, 7 May 2023 02:58:20 +0000 (12:58 +1000)
Content.Server/Nutrition/EntitySystems/FoodSystem.cs
Content.Server/Nutrition/EntitySystems/UtensilSystem.cs

index 566b557b7ee249e7a194d6972a91ed05e775c38b..31b78b1080a1528826f0253eb7002860c2d96cba 100644 (file)
@@ -51,6 +51,8 @@ namespace Content.Server.Nutrition.EntitySystems
         [Dependency] private readonly SharedAudioSystem _audio = default!;
         [Dependency] private readonly StackSystem _stack = default!;
 
+        public const float MaxFeedDistance = 1.0f;
+
         public override void Initialize()
         {
             base.Initialize();
@@ -71,8 +73,8 @@ namespace Content.Server.Nutrition.EntitySystems
             if (ev.Handled)
                 return;
 
-            ev.Handled = true;
-            TryFeed(ev.User, ev.User, uid, foodComponent);
+            var result = TryFeed(ev.User, ev.User, uid, foodComponent);
+            ev.Handled = result.Handled;
         }
 
         /// <summary>
@@ -83,25 +85,25 @@ namespace Content.Server.Nutrition.EntitySystems
             if (args.Handled || args.Target == null || !args.CanReach)
                 return;
 
-            args.Handled = true;
-            TryFeed(args.User, args.Target.Value, uid, foodComponent);
+            var result = TryFeed(args.User, args.Target.Value, uid, foodComponent);
+            args.Handled = result.Handled;
         }
 
-        public bool TryFeed(EntityUid user, EntityUid target, EntityUid food, FoodComponent foodComp)
+        public (bool Success, bool Handled) TryFeed(EntityUid user, EntityUid target, EntityUid food, FoodComponent foodComp)
         {
             //Suppresses self-eating
             if (food == user || TryComp<MobStateComponent>(food, out var mobState) && _mobStateSystem.IsAlive(food, mobState)) // Suppresses eating alive mobs
-                return false;
+                return (false, false);
 
             // Target can't be fed or they're already eating
             if (!TryComp<BodyComponent>(target, out var body))
-                return false;
+                return (false, false);
 
             if (!_solutionContainerSystem.TryGetSolution(food, foodComp.SolutionName, out var foodSolution) || foodSolution.Name == null)
-                return false;
+                return (false, false);
 
             if (!_bodySystem.TryGetBodyOrganComponents<StomachComponent>(target, out var stomachs, body))
-                return false;
+                return (false, false);
 
             var forceFeed = user != target;
 
@@ -111,7 +113,7 @@ namespace Content.Server.Nutrition.EntitySystems
                     forceFeed
                         ? Loc.GetString("food-system-cant-digest-other", ("entity", food))
                         : Loc.GetString("food-system-cant-digest", ("entity", food)), user, user);
-                return false;
+                return (false, true);
             }
 
             var flavors = _flavorProfileSystem.GetLocalizedFlavorsMessage(food, user, foodSolution);
@@ -120,17 +122,28 @@ namespace Content.Server.Nutrition.EntitySystems
             {
                 _popupSystem.PopupEntity(Loc.GetString("food-system-try-use-food-is-empty", ("entity", food)), user, user);
                 DeleteAndSpawnTrash(foodComp, food, user);
-                return false;
+                return (false, true);
             }
 
             if (IsMouthBlocked(target, user))
-                return false;
+                return (false, true);
 
             if (!_interactionSystem.InRangeUnobstructed(user, food, popup: true))
-                return true;
+                return (false, true);
+
+            if (!_interactionSystem.InRangeUnobstructed(user, target, MaxFeedDistance, popup: true))
+                return (false, true);
+
+            // TODO make do-afters account for fixtures in the range check.
+            if (!Transform(user).MapPosition.InRange(Transform(target).MapPosition, MaxFeedDistance))
+            {
+                var message = Loc.GetString("interaction-system-user-interaction-cannot-reach");
+                _popupSystem.PopupEntity(message, user, user);
+                return (false, true);
+            }
 
             if (!TryGetRequiredUtensils(user, foodComp, out _))
-                return true;
+                return (false, true);
 
             if (forceFeed)
             {
@@ -159,14 +172,14 @@ namespace Content.Server.Nutrition.EntitySystems
                 BreakOnDamage = true,
                 BreakOnTargetMove = forceFeed,
                 MovementThreshold = 0.01f,
-                DistanceThreshold = 1.0f,
+                DistanceThreshold = MaxFeedDistance,
                 // Mice and the like can eat without hands.
                 // TODO maybe set this based on some CanEatWithoutHands event or component?
                 NeedHand = forceFeed,
             };
 
             _doAfterSystem.TryStartDoAfter(doAfterArgs);
-            return true;
+            return (true, true);
         }
 
         private void OnDoAfter(EntityUid uid, FoodComponent component, ConsumeDoAfterEvent args)
@@ -264,11 +277,11 @@ namespace Content.Server.Nutrition.EntitySystems
             }
 
             args.Repeat = !forceFeed;
+
             if (TryComp<StackComponent>(uid, out var stack))
             {
                 //Not deleting whole stack piece will make troubles with grinding object
-                if (stack.Count > 1) 
+                if (stack.Count > 1)
                 {
                     _stack.SetCount(uid, stack.Count - 1);
                     _solutionContainerSystem.TryAddSolution(uid, solution, split);
index 4b2ab316a13d5f8b1ec7eed06737acf46a3f78cc..0f1576658bd314681eb467dce5c9de0bab310c4d 100644 (file)
@@ -32,24 +32,24 @@ namespace Content.Server.Nutrition.EntitySystems
             if (ev.Target == null || !ev.CanReach)
                 return;
 
-            if (TryUseUtensil(ev.User, ev.Target.Value, component))
-                ev.Handled = true;
+            var result = TryUseUtensil(ev.User, ev.Target.Value, component);
+            ev.Handled = result.Handled;
         }
 
-        private bool TryUseUtensil(EntityUid user, EntityUid target, UtensilComponent component)
+        public (bool Success, bool Handled) TryUseUtensil(EntityUid user, EntityUid target, UtensilComponent component)
         {
             if (!EntityManager.TryGetComponent(target, out FoodComponent? food))
-                return false;
+                return (false, true);
 
             //Prevents food usage with a wrong utensil
             if ((food.Utensil & component.Types) == 0)
             {
                 _popupSystem.PopupEntity(Loc.GetString("food-system-wrong-utensil", ("food", target), ("utensil", component.Owner)), user, user);
-                return false;
+                return (false, true);
             }
 
             if (!_interactionSystem.InRangeUnobstructed(user, target, popup: true))
-                return false;
+                return (false, true);
 
             return _foodSystem.TryFeed(user, user, target, food);
         }