1- namespace SZones ;
1+ using UnityEngine ;
2+
3+ namespace SZones ;
24
35public abstract partial class ZoneController : UnityBehaviour
46{
@@ -18,16 +20,16 @@ internal void Initialize(Zone zone)
1820 }
1921
2022 #region Entered State
21- protected readonly List < Collider > enteredColliders = new ( ) ;
23+ protected readonly HashSet < Collider > enteredColliders = new ( ) ;
2224 public virtual IReadOnlyCollection < Collider > EnteredColliders => enteredColliders ;
23- public virtual IReadOnlyCollection < GameObject > EnteredObjects => enteredColliders . Select ( x => x . gameObject ) . ToList ( ) ;
25+ public virtual IReadOnlyCollection < GameObject > EnteredObjects => enteredColliders . Select ( x => x ? . gameObject ) . Where ( x => x ) . ToList ( ) ;
2426 protected virtual bool SetEnterState ( Collider other , bool state )
2527 {
26- if ( ! other ) return state ;
27- var @object = other . gameObject ;
28-
2928 var entered = enteredColliders . Contains ( other ) ;
3029 if ( state == entered ) return state ;
30+ if ( ! other ) return state ;
31+
32+ var @object = other . gameObject ;
3133
3234 bool Set < T > ( Func < T , bool , bool > func ) => state = func ( @object . GetComponent < T > ( ) , state ) ;
3335 Set < Player > ( SetEnterState ) ;
@@ -51,10 +53,10 @@ protected virtual bool UpdateEnterState(Collider other)
5153 return SetEnterState ( other , state ) ;
5254 }
5355 protected virtual bool UpdateEnterState ( UnityComponent component ) => UpdateEnterState ( component ? . GetComponent < Collider > ( ) ) ;
54- protected virtual void OnTriggerEnter ( Collider other ) => SetEnterState ( other , true ) ;
56+ protected virtual void OnTriggerStay ( Collider other ) => SetEnterState ( other , true ) ;
5557 protected virtual void OnTriggerExit ( Collider other ) => SetEnterState ( other , false ) ;
5658
57- protected readonly List < CSteamID > enteredPlayers = new ( ) ;
59+ protected readonly HashSet < CSteamID > enteredPlayers = new ( ) ;
5860 public virtual IReadOnlyCollection < CSteamID > EnteredPlayers => enteredPlayers ;
5961
6062 protected bool SetEnterState ( SPlayer target , bool state ) => SetEnterState ( target ? . player , state ) ;
@@ -71,7 +73,7 @@ protected bool TrySetEnterState(CSteamID id, bool state)
7173 if ( IsInside ( id ) == state ) return false ;
7274
7375 if ( state ) enteredPlayers . Add ( id ) ;
74- else enteredPlayers . RemoveAll ( x => x == id ) ;
76+ else enteredPlayers . Remove ( id ) ;
7577
7678 return true ;
7779 }
@@ -107,16 +109,18 @@ protected void InvokeEventsSafe<T>(T value, bool state, StateUpdateHandler<T> en
107109 catch { }
108110 }
109111
110- protected virtual float UpdateCollidersDelay { get ; } = 0.2f ;
111- protected void UpdateStates ( IList < Collider > colliders )
112+ protected virtual float UpdateCollidersDelay { get ; } = conf . DefaultUpdateDelay ;
113+ protected virtual float LocateCollidersDelay { get ; } = conf . DefaultLocateDelay ;
114+ protected void UpdateStates ( ICollection < Collider > colliders )
112115 {
113116 List < UnityComponent > other = new ( ) ;
114117 for ( int i = 0 ; i < colliders . Count ; i ++ )
115118 {
116119 var collider = colliders . ElementAt ( i ) ;
117120 if ( ! collider )
118121 {
119- colliders . RemoveAt ( i -- ) ;
122+ colliders . Remove ( collider ) ;
123+ -- i ;
120124 continue ;
121125 }
122126
@@ -136,18 +140,14 @@ protected void UpdateStates(IList<Collider> colliders)
136140 foreach ( var component in other . Distinct ( ) )
137141 UpdateEnterState ( component ) ;
138142 }
139- protected void UpdateStates ( IList < CSteamID > playersIds )
143+ protected void UpdateStates ( ICollection < CSteamID > playersIds )
140144 {
141145 var ids = playersIds . ToList ( ) ;
142146 foreach ( var id in ids )
143147 {
144148 var player = PlayerTool . getPlayer ( id ) ;
145- if ( ! player ) goto notEntered ;
146- if ( ! ( IsPositionInside ( player ) || IsPositionInside ( player . GetComponent < Collider > ( ) ) ) ) goto notEntered ;
147-
148- continue ;
149- notEntered :
150- TrySetEnterState ( id , false ) ;
149+ if ( ! player ) TrySetEnterState ( id , false ) ;
150+ else UpdateEnterState ( player ) ;
151151 }
152152 }
153153 protected virtual void UpdateStates ( )
@@ -163,6 +163,29 @@ protected virtual IEnumerator UpdateEnteredCollidersRoutine()
163163 UpdateStates ( ) ;
164164 }
165165 }
166+ protected virtual IEnumerator LocateEnteredCollidersRoutine ( )
167+ {
168+ while ( true )
169+ {
170+ yield return new WaitForSeconds ( LocateCollidersDelay ) ;
171+ LocateEnteredColliders ( ) ;
172+ }
173+ }
174+ protected virtual void LocateEnteredColliders ( )
175+ {
176+ if ( Provider . clients is null ) return ;
177+ if ( VehicleManager . vehicles is null ) return ;
178+
179+ var colliders =
180+ Provider . clients . Select ( x => x ? . model ? . GetComponent < Collider > ( ) )
181+ . Concat ( VehicleManager . vehicles . Select ( x => x ? . GetComponent < Collider > ( ) ) )
182+ . ToArray ( ) ;
183+ foreach ( var collider in colliders )
184+ {
185+ if ( ! collider ) continue ;
186+ UpdateEnterState ( collider ) ;
187+ }
188+ }
166189 #endregion
167190
168191 #region Entities
@@ -222,6 +245,7 @@ public virtual void Dispose()
222245 protected virtual void Awake ( )
223246 {
224247 StartCoroutine ( UpdateEnteredCollidersRoutine ( ) ) ;
248+ StartCoroutine ( LocateEnteredCollidersRoutine ( ) ) ;
225249 }
226250 #endregion
227251}
0 commit comments