Mopping Puddle Dilution and Wet Floor Sparkles (#6273)

This commit is contained in:
Willhelm53
2022-02-04 20:26:11 -06:00
committed by GitHub
parent 3d3a3c857b
commit 4d3a381962
10 changed files with 87 additions and 20 deletions

View File

@@ -16,7 +16,11 @@ namespace Content.Server.Chemistry.TileReactions
[DataDefinition]
public class CleanTileReaction : ITileReaction
{
/// <summary>
/// Multiplier used in CleanTileReaction.
/// 1 (default) means normal consumption rate of the cleaning reagent.
/// 0 means no consumption of the cleaning reagent, i.e. the reagent is inexhaustible.
/// </summary>
[DataField("cleanAmountMultiplier")]
public float CleanAmountMultiplier { get; private set; } = 1.0f;
@@ -29,7 +33,7 @@ namespace Content.Server.Chemistry.TileReactions
{
if (entMan.TryGetComponent(entity, out CleanableComponent? cleanable))
{
var next = (amount + cleanable.CleanAmount) * CleanAmountMultiplier;
var next = amount + (cleanable.CleanAmount * CleanAmountMultiplier);
// Nothing left?
if (reactVolume < next)
break;

View File

@@ -27,7 +27,7 @@ namespace Content.Server.Fluids.Components
[Dependency] private readonly IEntityManager _entities = default!;
public const string SolutionName = "mop";
/// <summary>
/// Used to prevent do_after spam if we're currently mopping.
/// </summary>
@@ -71,10 +71,16 @@ namespace Content.Server.Fluids.Components
public FixedPoint2 PickupAmount { get; } = FixedPoint2.New(10);
/// <summary>
/// After cleaning a floor tile, leave this much reagent as a puddle. I.e., leave behind a wet floor.
/// When using the mop on an empty floor tile, leave this much reagent as a new puddle.
/// </summary>
[DataField("residueAmount")]
public FixedPoint2 ResidueAmount { get; } = FixedPoint2.New(5);
public FixedPoint2 ResidueAmount { get; } = FixedPoint2.New(10); // Should be higher than MopLowerLimit
/// <summary>
/// To leave behind a wet floor, the mop will be unable to take from puddles with a volume less than this amount.
/// </summary>
[DataField("mopLowerLimit")]
public FixedPoint2 MopLowerLimit { get; } = FixedPoint2.New(5);
[DataField("pickup_sound")]
private SoundSpecifier _pickupSound = new SoundPathSpecifier("/Audio/Effects/Fluids/slosh.ogg");
@@ -117,6 +123,14 @@ namespace Content.Server.Fluids.Components
!solutionSystem.TryGetSolution((puddleComponent).Owner, puddleComponent.SolutionName, out var puddleSolution))
return false;
// if the puddle is too small for the mop to effectively take any more solution
if (puddleSolution.TotalVolume <= MopLowerLimit)
{
// Transfers solution from the mop to the puddle
solutionSystem.TryAddSolution(target, puddleSolution, solutionSystem.SplitSolution(Owner, contents, FixedPoint2.Min(ResidueAmount,CurrentVolume)));
return true;
}
// if the mop is full
if(AvailableVolume <= 0)
{
@@ -141,28 +155,28 @@ namespace Content.Server.Fluids.Components
puddleComponent.Deleted)
return false;
// The volume the mop will take from the puddle
FixedPoint2 transferAmount;
// does the puddle actually have reagents? it might not if its a weird cosmetic entity.
if (puddleSolution.TotalVolume == 0)
transferAmount = FixedPoint2.Min(PickupAmount, AvailableVolume);
else
{
transferAmount = FixedPoint2.Min(PickupAmount, puddleSolution.TotalVolume, AvailableVolume);
// is the puddle cleaned?
bool isCleaned = (puddleSolution.TotalVolume - transferAmount <= 0);
if ((puddleSolution.TotalVolume - transferAmount) < MopLowerLimit) // If the transferAmount would bring the puddle below the MopLowerLimit
transferAmount = puddleSolution.TotalVolume - MopLowerLimit; // Then the transferAmount should bring the puddle down to the MopLowerLimit exactly
}
// Transfers solution from the puddle to the mop
solutionSystem.TryAddSolution(Owner, contents, solutionSystem.SplitSolution(target, puddleSolution, transferAmount));
if (isCleaned)
{
// deletes the puddle
_entities.DeleteEntity(puddleComponent.Owner);
}
SoundSystem.Play(Filter.Pvs(Owner), _pickupSound.GetSound(), Owner);
// if the mop became full after that puddle, let the player know.
if(AvailableVolume <= 0)
Owner.PopupMessage(eventArgs.User, Loc.GetString("mop-component-mop-is-now-full-message"));
return true;
}
}

View File

@@ -68,8 +68,14 @@ namespace Content.Server.Fluids.EntitySystems
var volumeScale = puddleComponent.CurrentVolume.Float() / puddleComponent.OverflowVolume.Float();
var puddleSolution = _solutionContainerSystem.EnsureSolution(uid, puddleComponent.SolutionName);
// Puddles with volume below this threshold will have their sprite changed to a wet floor effect
var wetFloorEffectThreshold = FixedPoint2.New(5);
// "Does this puddle's sprite need changing to the wet floor effect sprite?"
bool changeToWetFloor = (puddleComponent.CurrentVolume <= wetFloorEffectThreshold);
appearanceComponent.SetData(PuddleVisuals.VolumeScale, volumeScale);
appearanceComponent.SetData(PuddleVisuals.SolutionColor, puddleSolution.Color);
appearanceComponent.SetData(PuddleVisuals.ForceWetFloorSprite, changeToWetFloor);
}
private void UpdateSlip(EntityUid entityUid, PuddleComponent puddleComponent)