2021-10-27 09:24:18 +01:00
using System ;
using System.Linq ;
using Content.Shared.Fluids ;
using JetBrains.Annotations ;
using Robust.Client.GameObjects ;
using Robust.Shared.GameObjects ;
using Robust.Shared.IoC ;
using Robust.Shared.Log ;
using Robust.Shared.Maths ;
using Robust.Shared.Random ;
using Robust.Shared.Serialization.Manager.Attributes ;
namespace Content.Client.Fluids
{
[UsedImplicitly]
2022-02-16 00:23:23 -07:00
public sealed class PuddleVisualizer : AppearanceVisualizer
2021-10-27 09:24:18 +01:00
{
[Dependency] private readonly IRobustRandom _random = default ! ;
// Whether the underlying solution color should be used
[DataField("recolor")] public bool Recolor ;
2021-12-05 18:09:01 +01:00
public override void InitializeEntity ( EntityUid entity )
2021-10-27 09:24:18 +01:00
{
base . InitializeEntity ( entity ) ;
2021-12-03 15:53:09 +01:00
if ( ! IoCManager . Resolve < IEntityManager > ( ) . TryGetComponent ( entity , out SpriteComponent ? spriteComponent ) )
2021-10-27 09:24:18 +01:00
{
2021-12-03 15:53:09 +01:00
Logger . Warning ( $"Missing SpriteComponent for PuddleVisualizer on entityUid = {entity}" ) ;
2021-10-27 09:24:18 +01:00
return ;
}
IoCManager . InjectDependencies ( this ) ;
var maxStates = spriteComponent . BaseRSI ? . ToArray ( ) ;
if ( maxStates is not { Length : > 0 } ) return ;
var variant = _random . Next ( 0 , maxStates . Length - 1 ) ;
spriteComponent . LayerSetState ( 0 , maxStates [ variant ] . StateId ) ;
spriteComponent . Rotation = Angle . FromDegrees ( _random . Next ( 0 , 359 ) ) ;
}
public override void OnChangeData ( AppearanceComponent component )
{
base . OnChangeData ( component ) ;
2021-12-05 18:09:01 +01:00
var entities = IoCManager . Resolve < IEntityManager > ( ) ;
2021-10-27 09:24:18 +01:00
if ( component . TryGetData < float > ( PuddleVisuals . VolumeScale , out var volumeScale ) & &
2021-12-05 18:09:01 +01:00
entities . TryGetComponent < SpriteComponent > ( component . Owner , out var spriteComponent ) )
2021-10-27 09:24:18 +01:00
{
2022-02-04 20:26:11 -06:00
component . TryGetData < bool > ( PuddleVisuals . ForceWetFloorSprite , out var forceWetFloorSprite ) ;
2021-10-27 09:24:18 +01:00
var cappedScale = Math . Min ( 1.0f , volumeScale * 0.75f + 0.25f ) ;
2022-02-04 20:26:11 -06:00
UpdateVisual ( component , spriteComponent , cappedScale , forceWetFloorSprite ) ;
2021-10-27 09:24:18 +01:00
}
}
2022-02-04 20:26:11 -06:00
private void UpdateVisual ( AppearanceComponent component , SpriteComponent spriteComponent , float cappedScale , bool forceWetFloorSprite )
2021-10-27 09:24:18 +01:00
{
Color newColor ;
if ( Recolor & & component . TryGetData < Color > ( PuddleVisuals . SolutionColor , out var solutionColor ) )
{
newColor = solutionColor . WithAlpha ( cappedScale ) ;
}
else
{
newColor = spriteComponent . Color . WithAlpha ( cappedScale ) ;
}
spriteComponent . Color = newColor ;
2022-02-04 20:26:11 -06:00
if ( forceWetFloorSprite )
{
//Change the puddle's sprite to the wet floor sprite
2022-03-17 11:42:25 -07:00
spriteComponent . LayerSetState ( 0 , "sparkles" , "Fluids/wet_floor_sparkles.rsi" ) ;
2022-02-04 20:26:11 -06:00
spriteComponent . Color = spriteComponent . Color . WithAlpha ( 0.25f ) ; //should be mostly transparent.
}
else
{
2022-03-17 11:42:25 -07:00
spriteComponent . LayerSetState ( 0 , "smear-0" , "Fluids/smear.rsi" ) ; // TODO: need a way to implement the random smears again when the mop creates new puddles.
2022-02-04 20:26:11 -06:00
}
2021-10-27 09:24:18 +01:00
}
}
2021-12-03 14:05:23 +01:00
}