Reagent tank bucket transfer fix (#6313)

Co-authored-by: Leon Friedrich <60421075+ElectroJr@users.noreply.github.com>
This commit is contained in:
Willhelm53
2022-02-12 16:18:35 -06:00
committed by GitHub
parent 0e6aec0e56
commit 401f1f722c

View File

@@ -118,28 +118,24 @@ namespace Content.Server.Chemistry.Components
if (!eventArgs.CanReach || eventArgs.Target == null) if (!eventArgs.CanReach || eventArgs.Target == null)
return false; return false;
if (!_entities.HasComponent<SolutionContainerManagerComponent>(Owner))
return false;
var target = eventArgs.Target!.Value; var target = eventArgs.Target!.Value;
if (!_entities.HasComponent<SolutionContainerManagerComponent>(target))
//Special case for reagent tanks, because normally clicking another container will give solution, not take it.
if (CanReceive && !_entities.HasComponent<RefillableSolutionComponent>(target) // target must not be refillable (e.g. Reagent Tanks)
&& solutionsSys.TryGetDrainableSolution(target, out var targetDrain) // target must be drainable
&& _entities.TryGetComponent(Owner, out RefillableSolutionComponent refillComp)
&& solutionsSys.TryGetRefillableSolution(Owner, out var ownerRefill, refillable: refillComp))
{ {
return false;
}
var transferAmount = TransferAmount; // This is the player-configurable transfer amount of "Owner," not the target reagent tank.
if (CanReceive && _entities.TryGetComponent(target, out ReagentTankComponent? tank) if (_entities.TryGetComponent(Owner, out RefillableSolutionComponent? refill) && refill.MaxRefill != null) // Owner is the entity receiving solution from target.
&& solutionsSys.TryGetRefillableSolution(Owner, out var ownerRefill)
&& solutionsSys.TryGetDrainableSolution(target, out var targetDrain))
{
var tankTransferAmount = tank.TransferAmount;
if (_entities.TryGetComponent(Owner, out RefillableSolutionComponent? refill) && refill.MaxRefill != null)
{ {
tankTransferAmount = FixedPoint2.Min(tankTransferAmount, (FixedPoint2) refill.MaxRefill); transferAmount = FixedPoint2.Min(transferAmount, (FixedPoint2) refill.MaxRefill); // if the receiver has a smaller transfer limit, use that instead
} }
var transferred = DoTransfer(eventArgs.User, target, targetDrain, Owner, ownerRefill, tankTransferAmount); var transferred = DoTransfer(eventArgs.User, target, targetDrain, Owner, ownerRefill, transferAmount);
if (transferred > 0) if (transferred > 0)
{ {
var toTheBrim = ownerRefill.AvailableVolume == 0; var toTheBrim = ownerRefill.AvailableVolume == 0;
@@ -153,6 +149,7 @@ namespace Content.Server.Chemistry.Components
} }
} }
// if target is refillable, and owner is drainable
if (CanSend && solutionsSys.TryGetRefillableSolution(target, out var targetRefill) if (CanSend && solutionsSys.TryGetRefillableSolution(target, out var targetRefill)
&& solutionsSys.TryGetDrainableSolution(Owner, out var ownerDrain)) && solutionsSys.TryGetDrainableSolution(Owner, out var ownerDrain))
{ {