DoAfter Refactor Fixes (#14278)

* Doafterfixes

* Injector blocker
This commit is contained in:
keronshb
2023-02-26 00:33:06 -05:00
committed by GitHub
parent 0d6f64e6d0
commit ec739c24da
13 changed files with 148 additions and 54 deletions

View File

@@ -217,7 +217,7 @@ namespace Content.Server.Nutrition.EntitySystems
private bool TryDrink(EntityUid user, EntityUid target, DrinkComponent drink, EntityUid item)
{
if (!EntityManager.HasComponent<BodyComponent>(target))
if (!EntityManager.HasComponent<BodyComponent>(target) || drink.ForceDrink)
return false;
if (!drink.Opened)
@@ -241,9 +241,9 @@ namespace Content.Server.Nutrition.EntitySystems
if (!_interactionSystem.InRangeUnobstructed(user, item, popup: true))
return true;
var forceDrink = user != target;
drink.ForceDrink = user != target;
if (forceDrink)
if (drink.ForceDrink)
{
var userName = Identity.Entity(user, EntityManager);
@@ -264,7 +264,7 @@ namespace Content.Server.Nutrition.EntitySystems
var drinkData = new DrinkData(drinkSolution, flavors);
var doAfterEventArgs = new DoAfterEventArgs(user, forceDrink ? drink.ForceFeedDelay : drink.Delay,
var doAfterEventArgs = new DoAfterEventArgs(user, drink.ForceDrink ? drink.ForceFeedDelay : drink.Delay,
target: target, used: item)
{
BreakOnUserMove = moveBreak,
@@ -286,6 +286,14 @@ namespace Content.Server.Nutrition.EntitySystems
/// </summary>
private void OnDoAfter(EntityUid uid, DrinkComponent component, DoAfterEvent<DrinkData> args)
{
//Special cancel if they're force feeding someone.
//Allows self to drink multiple times but prevents force feeding drinks to others rapidly.
if (args.Cancelled && component.ForceDrink)
{
component.ForceDrink = false;
return;
}
if (args.Handled || args.Cancelled || component.Deleted)
return;
@@ -295,11 +303,11 @@ namespace Content.Server.Nutrition.EntitySystems
var transferAmount = FixedPoint2.Min(component.TransferAmount, args.AdditionalData.DrinkSolution.Volume);
var drained = _solutionContainerSystem.Drain(uid, args.AdditionalData.DrinkSolution, transferAmount);
var forceDrink = args.Args.Target.Value != args.Args.User;
//var forceDrink = args.Args.Target.Value != args.Args.User;
if (!_bodySystem.TryGetBodyOrganComponents<StomachComponent>(args.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(component.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);
if (HasComp<RefillableSolutionComponent>(args.Args.Target.Value))
{
@@ -320,7 +328,7 @@ namespace Content.Server.Nutrition.EntitySystems
{
_popupSystem.PopupEntity(Loc.GetString("drink-component-try-use-drink-had-enough"), args.Args.Target.Value, args.Args.Target.Value);
if (forceDrink)
if (component.ForceDrink)
{
_popupSystem.PopupEntity(Loc.GetString("drink-component-try-use-drink-had-enough-other"), args.Args.Target.Value, args.Args.User);
_spillableSystem.SpillAt(args.Args.Target.Value, drained, "PuddleSmear");
@@ -334,7 +342,7 @@ namespace Content.Server.Nutrition.EntitySystems
var flavors = args.AdditionalData.FlavorMessage;
if (forceDrink)
if (component.ForceDrink)
{
var targetName = Identity.Entity(args.Args.Target.Value, EntityManager);
var userName = Identity.Entity(args.Args.User, EntityManager);
@@ -366,6 +374,7 @@ namespace Content.Server.Nutrition.EntitySystems
//TODO: Grab the stomach UIDs somehow without using Owner
_stomachSystem.TryTransferSolution(firstStomach.Value.Comp.Owner, drained, firstStomach.Value.Comp);
component.ForceDrink = false;
args.Handled = true;
}

View File

@@ -86,8 +86,8 @@ namespace Content.Server.Nutrition.EntitySystems
if (food == user || EntityManager.TryGetComponent<MobStateComponent>(food, out var mobState) && _mobStateSystem.IsAlive(food, mobState)) // Suppresses eating alive mobs
return false;
// Target can't be fed
if (!EntityManager.HasComponent<BodyComponent>(target))
// Target can't be fed or they're already forcefeeding
if (!EntityManager.HasComponent<BodyComponent>(target) || foodComp.ForceFeed)
return false;
if (!_solutionContainerSystem.TryGetSolution(food, foodComp.SolutionName, out var foodSolution))
@@ -111,9 +111,9 @@ namespace Content.Server.Nutrition.EntitySystems
if (!_interactionSystem.InRangeUnobstructed(user, food, popup: true))
return true;
var forceFeed = user != target;
foodComp.ForceFeed = user != target;
if (forceFeed)
if (foodComp.ForceFeed)
{
var userName = Identity.Entity(user, EntityManager);
_popupSystem.PopupEntity(Loc.GetString("food-system-force-feed", ("user", userName)),
@@ -128,16 +128,16 @@ namespace Content.Server.Nutrition.EntitySystems
_adminLogger.Add(LogType.Ingestion, LogImpact.Low, $"{ToPrettyString(target):target} is eating {ToPrettyString(food):food} {SolutionContainerSystem.ToPrettyString(foodSolution)}");
}
var moveBreak = user != target;
var foodData = new FoodData(foodSolution, flavors, utensils);
var doAfterEventArgs = new DoAfterEventArgs(user, forceFeed ? foodComp.ForceFeedDelay : foodComp.Delay, target: target, used: food)
var doAfterEventArgs = new DoAfterEventArgs(user, foodComp.ForceFeed ? foodComp.ForceFeedDelay : foodComp.Delay, target: target, used: food)
{
BreakOnUserMove = moveBreak,
RaiseOnTarget = foodComp.ForceFeed,
RaiseOnUser = !foodComp.ForceFeed,
BreakOnUserMove = foodComp.ForceFeed,
BreakOnDamage = true,
BreakOnStun = true,
BreakOnTargetMove = moveBreak,
BreakOnTargetMove = foodComp.ForceFeed,
MovementThreshold = 0.01f,
DistanceThreshold = 1.0f,
NeedHand = true
@@ -151,6 +151,13 @@ namespace Content.Server.Nutrition.EntitySystems
private void OnDoAfter(EntityUid uid, FoodComponent component, DoAfterEvent<FoodData> args)
{
//Prevents the target from being force fed food but allows the user to chow down
if (args.Cancelled && component.ForceFeed)
{
component.ForceFeed = false;
return;
}
if (args.Cancelled || args.Handled || component.Deleted || args.Args.Target == null)
return;
@@ -166,13 +173,11 @@ namespace Content.Server.Nutrition.EntitySystems
//TODO: Get the stomach UID somehow without nabbing owner
var firstStomach = stomachs.FirstOrNull(stomach => _stomachSystem.CanTransferSolution(stomach.Comp.Owner, split));
var forceFeed = args.Args.Target.Value != args.Args.User;
// No stomach so just popup a message that they can't eat.
if (firstStomach == null)
{
_solutionContainerSystem.TryAddSolution(uid, args.AdditionalData.FoodSolution, 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(component.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);
args.Handled = true;
return;
}
@@ -182,7 +187,7 @@ namespace Content.Server.Nutrition.EntitySystems
var flavors = args.AdditionalData.FlavorMessage;
if (forceFeed)
if (component.ForceFeed)
{
var targetName = Identity.Entity(args.Args.Target.Value, EntityManager);
var userName = Identity.Entity(args.Args.User, EntityManager);