Fix some food mispredicts (#16183)

This commit is contained in:
Leon Friedrich
2023-05-07 14:58:20 +12:00
committed by GitHub
parent 8e05e26e6e
commit 65088ab7ef
2 changed files with 37 additions and 24 deletions

View File

@@ -51,6 +51,8 @@ namespace Content.Server.Nutrition.EntitySystems
[Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly SharedAudioSystem _audio = default!;
[Dependency] private readonly StackSystem _stack = default!; [Dependency] private readonly StackSystem _stack = default!;
public const float MaxFeedDistance = 1.0f;
public override void Initialize() public override void Initialize()
{ {
base.Initialize(); base.Initialize();
@@ -71,8 +73,8 @@ namespace Content.Server.Nutrition.EntitySystems
if (ev.Handled) if (ev.Handled)
return; return;
ev.Handled = true; var result = TryFeed(ev.User, ev.User, uid, foodComponent);
TryFeed(ev.User, ev.User, uid, foodComponent); ev.Handled = result.Handled;
} }
/// <summary> /// <summary>
@@ -83,25 +85,25 @@ namespace Content.Server.Nutrition.EntitySystems
if (args.Handled || args.Target == null || !args.CanReach) if (args.Handled || args.Target == null || !args.CanReach)
return; return;
args.Handled = true; var result = TryFeed(args.User, args.Target.Value, uid, foodComponent);
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 //Suppresses self-eating
if (food == user || TryComp<MobStateComponent>(food, out var mobState) && _mobStateSystem.IsAlive(food, mobState)) // Suppresses eating alive mobs 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 // Target can't be fed or they're already eating
if (!TryComp<BodyComponent>(target, out var body)) if (!TryComp<BodyComponent>(target, out var body))
return false; return (false, false);
if (!_solutionContainerSystem.TryGetSolution(food, foodComp.SolutionName, out var foodSolution) || foodSolution.Name == null) 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)) if (!_bodySystem.TryGetBodyOrganComponents<StomachComponent>(target, out var stomachs, body))
return false; return (false, false);
var forceFeed = user != target; var forceFeed = user != target;
@@ -111,7 +113,7 @@ namespace Content.Server.Nutrition.EntitySystems
forceFeed forceFeed
? Loc.GetString("food-system-cant-digest-other", ("entity", food)) ? Loc.GetString("food-system-cant-digest-other", ("entity", food))
: Loc.GetString("food-system-cant-digest", ("entity", food)), user, user); : Loc.GetString("food-system-cant-digest", ("entity", food)), user, user);
return false; return (false, true);
} }
var flavors = _flavorProfileSystem.GetLocalizedFlavorsMessage(food, user, foodSolution); 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); _popupSystem.PopupEntity(Loc.GetString("food-system-try-use-food-is-empty", ("entity", food)), user, user);
DeleteAndSpawnTrash(foodComp, food, user); DeleteAndSpawnTrash(foodComp, food, user);
return false; return (false, true);
} }
if (IsMouthBlocked(target, user)) if (IsMouthBlocked(target, user))
return false; return (false, true);
if (!_interactionSystem.InRangeUnobstructed(user, food, popup: 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 _)) if (!TryGetRequiredUtensils(user, foodComp, out _))
return true; return (false, true);
if (forceFeed) if (forceFeed)
{ {
@@ -159,14 +172,14 @@ namespace Content.Server.Nutrition.EntitySystems
BreakOnDamage = true, BreakOnDamage = true,
BreakOnTargetMove = forceFeed, BreakOnTargetMove = forceFeed,
MovementThreshold = 0.01f, MovementThreshold = 0.01f,
DistanceThreshold = 1.0f, DistanceThreshold = MaxFeedDistance,
// Mice and the like can eat without hands. // Mice and the like can eat without hands.
// TODO maybe set this based on some CanEatWithoutHands event or component? // TODO maybe set this based on some CanEatWithoutHands event or component?
NeedHand = forceFeed, NeedHand = forceFeed,
}; };
_doAfterSystem.TryStartDoAfter(doAfterArgs); _doAfterSystem.TryStartDoAfter(doAfterArgs);
return true; return (true, true);
} }
private void OnDoAfter(EntityUid uid, FoodComponent component, ConsumeDoAfterEvent args) private void OnDoAfter(EntityUid uid, FoodComponent component, ConsumeDoAfterEvent args)

View File

@@ -32,24 +32,24 @@ namespace Content.Server.Nutrition.EntitySystems
if (ev.Target == null || !ev.CanReach) if (ev.Target == null || !ev.CanReach)
return; return;
if (TryUseUtensil(ev.User, ev.Target.Value, component)) var result = TryUseUtensil(ev.User, ev.Target.Value, component);
ev.Handled = true; 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)) if (!EntityManager.TryGetComponent(target, out FoodComponent? food))
return false; return (false, true);
//Prevents food usage with a wrong utensil //Prevents food usage with a wrong utensil
if ((food.Utensil & component.Types) == 0) if ((food.Utensil & component.Types) == 0)
{ {
_popupSystem.PopupEntity(Loc.GetString("food-system-wrong-utensil", ("food", target), ("utensil", component.Owner)), user, user); _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)) if (!_interactionSystem.InRangeUnobstructed(user, target, popup: true))
return false; return (false, true);
return _foodSystem.TryFeed(user, user, target, food); return _foodSystem.TryFeed(user, user, target, food);
} }