@@ -18,8 +18,36 @@ public override void Initialize()
1818 {
1919 base . Initialize ( ) ;
2020 SubscribeLocalEvent < DoorComponent , AppearanceChangeEvent > ( OnAppearanceChange ) ;
21+ // ES START
22+ // handle open/close state change on client after animation end, not when server says door is open
23+ SubscribeLocalEvent < DoorComponent , AnimationCompletedEvent > ( OnAnimationCompleted ) ;
2124 }
2225
26+ private void OnAnimationCompleted ( Entity < DoorComponent > entity , ref AnimationCompletedEvent args )
27+ {
28+ if ( ! TryComp < SpriteComponent > ( entity , out var sprite ) || args . Key != DoorComponent . OpenCloseKey )
29+ return ;
30+
31+ switch ( entity . Comp . State )
32+ {
33+ case DoorState . Open :
34+ foreach ( var ( layer , layerState ) in entity . Comp . OpenSpriteStates )
35+ {
36+ _sprite . LayerSetRsiState ( ( entity . Owner , sprite ) , layer , layerState ) ;
37+ }
38+
39+ break ;
40+ case DoorState . Closed :
41+ foreach ( var ( layer , layerState ) in entity . Comp . ClosedSpriteStates )
42+ {
43+ _sprite . LayerSetRsiState ( ( entity . Owner , sprite ) , layer , layerState ) ;
44+ }
45+
46+ break ;
47+ }
48+ }
49+ // ES END
50+
2351 protected override void OnComponentInit ( Entity < DoorComponent > ent , ref ComponentInit args )
2452 {
2553 var comp = ent . Comp ;
@@ -87,10 +115,13 @@ private void OnAppearanceChange(Entity<DoorComponent> entity, ref AppearanceChan
87115 state = DoorState . Closed ;
88116
89117 if ( AppearanceSystem . TryGetData < string > ( entity , PaintableVisuals . Prototype , out var prototype , args . Component ) )
90- UpdateSpriteLayers ( ( entity . Owner , args . Sprite ) , prototype ) ;
118+ UpdateSpriteLayers ( ( entity . Owner , args . Sprite ) , prototype ) ;
91119
92- if ( _animationSystem . HasRunningAnimation ( entity , DoorComponent . AnimationKey ) )
93- _animationSystem . Stop ( entity . Owner , DoorComponent . AnimationKey ) ;
120+ // ES START
121+ // dont stop all animations for no reason
122+ //if (_animationSystem.HasRunningAnimation(entity, DoorComponent.AnimationKey))
123+ // _animationSystem.Stop(entity.Owner, DoorComponent.AnimationKey);
124+ // ES END
94125
95126 // We are checking beforehand since some doors may not have an emagging visual layer, and we don't want LayerSetVisible to throw an error.
96127 if ( _sprite . TryGetLayer ( entity . Owner , DoorVisualLayers . BaseEmagging , out var _ , false ) )
@@ -106,13 +137,25 @@ private void UpdateAppearanceForDoorState(Entity<DoorComponent> entity, SpriteCo
106137 switch ( state )
107138 {
108139 case DoorState . Open :
140+ // ES START
141+ // If we are already animating the close just let that do its job
142+ if ( _animationSystem . HasRunningAnimation ( entity , DoorComponent . OpenCloseKey ) )
143+ return ;
144+ // ES END
145+
109146 foreach ( var ( layer , layerState ) in entity . Comp . OpenSpriteStates )
110147 {
111148 _sprite . LayerSetRsiState ( ( entity . Owner , sprite ) , layer , layerState ) ;
112149 }
113150
114151 return ;
115152 case DoorState . Closed :
153+ // ES START
154+ // If we are already animating the close just let that do its job
155+ if ( _animationSystem . HasRunningAnimation ( entity , DoorComponent . OpenCloseKey ) )
156+ return ;
157+ // ES END
158+
116159 foreach ( var ( layer , layerState ) in entity . Comp . ClosedSpriteStates )
117160 {
118161 _sprite . LayerSetRsiState ( ( entity . Owner , sprite ) , layer , layerState ) ;
@@ -123,24 +166,41 @@ private void UpdateAppearanceForDoorState(Entity<DoorComponent> entity, SpriteCo
123166 if ( entity . Comp . OpeningAnimationTime == TimeSpan . Zero )
124167 return ;
125168
126- _animationSystem . Play ( entity , ( Animation ) entity . Comp . OpeningAnimation , DoorComponent . AnimationKey ) ;
169+ // ES START
170+ // since we dont stop them earlier we check here
171+ if ( _animationSystem . HasRunningAnimation ( entity , DoorComponent . OpenCloseKey ) )
172+ return ;
173+ // ES END
174+
175+ _animationSystem . Play ( entity , ( Animation ) entity . Comp . OpeningAnimation , DoorComponent . OpenCloseKey ) ;
127176
128177 return ;
129178 case DoorState . Closing :
130179 if ( entity . Comp . ClosingAnimationTime == TimeSpan . Zero || entity . Comp . CurrentlyCrushing . Count != 0 )
131180 return ;
132181
133- _animationSystem . Play ( entity , ( Animation ) entity . Comp . ClosingAnimation , DoorComponent . AnimationKey ) ;
182+ // ES START
183+ // since we dont stop them earlier we check here
184+ if ( _animationSystem . HasRunningAnimation ( entity , DoorComponent . OpenCloseKey ) )
185+ return ;
186+ // ES END
187+
188+ _animationSystem . Play ( entity , ( Animation ) entity . Comp . ClosingAnimation , DoorComponent . OpenCloseKey ) ;
134189
135190 return ;
136191 case DoorState . Denying :
137- _animationSystem . Play ( entity , ( Animation ) entity . Comp . DenyingAnimation , DoorComponent . AnimationKey ) ;
192+ // ES START
193+ // AnimationKey -> DenyKey
194+ _animationSystem . Play ( entity , ( Animation ) entity . Comp . DenyingAnimation , DoorComponent . DenyKey ) ;
195+ // ES END
138196
139197 return ;
140198 case DoorState . Emagging :
141- // We are checking beforehand since some doors may not have an emagging visual layer.
199+ // ES START
200+ // AnimationKey -> DenyKey
142201 if ( _sprite . TryGetLayer ( entity . Owner , DoorVisualLayers . BaseEmagging , out var _ , false ) )
143- _animationSystem . Play ( entity , ( Animation ) entity . Comp . EmaggingAnimation , DoorComponent . AnimationKey ) ;
202+ _animationSystem . Play ( entity , ( Animation ) entity . Comp . EmaggingAnimation , DoorComponent . EmagKey ) ;
203+ // ES END
144204
145205 return ;
146206 }
0 commit comments