1+ using LaunchpadReloaded . Features ;
2+ using LaunchpadReloaded . Options . Roles . Crewmate ;
3+ using LaunchpadReloaded . Utilities ;
4+ using MiraAPI . GameOptions ;
5+ using MiraAPI . Modifiers ;
6+ using Reactor . Utilities ;
7+ using Reactor . Utilities . Extensions ;
8+ using System . Collections ;
9+ using System . Collections . Generic ;
10+ using UnityEngine ;
11+
12+ namespace LaunchpadReloaded . Modifiers ;
13+
14+ public class FootstepsModifier : BaseModifier
15+ {
16+ public override string ModifierName => "Footsteps" ;
17+
18+ public override bool HideOnUi => true ;
19+
20+ private Vector3 _lastPos ;
21+
22+ private Dictionary < GameObject , SpriteRenderer > _currentSteps = null ! ;
23+
24+ public override void OnActivate ( )
25+ {
26+ _currentSteps = new Dictionary < GameObject , SpriteRenderer > ( ) ;
27+ _lastPos = Player . transform . position ;
28+ }
29+
30+ public override void OnDeactivate ( )
31+ {
32+ foreach ( var obj in _currentSteps )
33+ {
34+ Coroutines . Start ( FootstepFadeout ( obj . Key , obj . Value ) ) ;
35+ }
36+ }
37+
38+ private static IEnumerator FootstepFadeout ( GameObject obj , SpriteRenderer rend )
39+ {
40+ yield return Helpers . FadeOut ( rend , 0.0001f , 0.05f ) ;
41+ obj . DestroyImmediate ( ) ;
42+ }
43+
44+ private static IEnumerator FootstepDisappear ( GameObject obj , SpriteRenderer rend )
45+ {
46+ yield return new WaitForSeconds ( OptionGroupSingleton < DetectiveOptions > . Instance . FootstepsDuration ) ;
47+ yield return FootstepFadeout ( obj , rend ) ;
48+ }
49+
50+ private bool _lastFlip ;
51+
52+ public override void FixedUpdate ( )
53+ {
54+ if ( Vector3 . Distance ( _lastPos , Player . transform . position ) < 1 )
55+ {
56+ return ;
57+ }
58+
59+ var angle = Mathf . Atan2 ( Player . MyPhysics . Velocity . y , Player . MyPhysics . Velocity . x ) * Mathf . Rad2Deg ;
60+
61+ var footstep = new GameObject ( "Footstep" )
62+ {
63+ transform =
64+ {
65+ parent = ShipStatus . Instance . transform ,
66+ position = new Vector3 ( Player . transform . position . x , Player . transform . position . y , - 2f ) ,
67+ rotation = Quaternion . AngleAxis ( angle - 90 , Vector3 . forward )
68+ }
69+ } ;
70+
71+ var sprite = footstep . AddComponent < SpriteRenderer > ( ) ;
72+ sprite . sprite = LaunchpadAssets . Footstep . LoadAsset ( ) ;
73+ sprite . material = LaunchpadAssets . GradientMaterial . LoadAsset ( ) ;
74+ footstep . layer = LayerMask . NameToLayer ( "Players" ) ;
75+
76+ if ( _lastFlip == false )
77+ {
78+ _lastFlip = true ;
79+ sprite . flipX = true ;
80+ }
81+ else
82+ {
83+ _lastFlip = false ;
84+ sprite . flipX = false ;
85+ }
86+
87+ sprite . transform . localScale = new Vector3 ( 0.06f , 0.06f , 0.06f ) ;
88+ Player . SetPlayerMaterialColors ( sprite ) ;
89+
90+ _currentSteps . Add ( footstep , sprite ) ;
91+ _lastPos = Player . transform . position ;
92+ Coroutines . Start ( FootstepDisappear ( footstep , sprite ) ) ;
93+ }
94+
95+ public override void OnDeath ( DeathReason reason )
96+ {
97+ ModifierComponent ! . RemoveModifier ( this ) ;
98+ }
99+ }
0 commit comments