Fix some food mispredicts (#16183)
This commit is contained in:
@@ -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)
|
||||||
@@ -264,11 +277,11 @@ namespace Content.Server.Nutrition.EntitySystems
|
|||||||
}
|
}
|
||||||
|
|
||||||
args.Repeat = !forceFeed;
|
args.Repeat = !forceFeed;
|
||||||
|
|
||||||
if (TryComp<StackComponent>(uid, out var stack))
|
if (TryComp<StackComponent>(uid, out var stack))
|
||||||
{
|
{
|
||||||
//Not deleting whole stack piece will make troubles with grinding object
|
//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);
|
_stack.SetCount(uid, stack.Count - 1);
|
||||||
_solutionContainerSystem.TryAddSolution(uid, solution, split);
|
_solutionContainerSystem.TryAddSolution(uid, solution, split);
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user