Mopping Puddle Dilution and Wet Floor Sparkles (#6273)
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user