11using System ;
22using System . Collections ;
33using System . Collections . Generic ;
4+ using System . Linq ;
45using System . Text ;
56using Improbable . Gdk . Core ;
6- using UnityEngine ;
77using Improbable . Gdk . GameObjectCreation ;
88using Improbable . Gdk . PlayerLifecycle ;
99using Improbable . Worker . CInterop ;
1010using Improbable . Worker . CInterop . Alpha ;
11- using Unity . Entities ;
11+ using UnityEngine ;
1212
1313namespace Fps
1414{
1515 public class ClientWorkerConnector : WorkerConnectorBase
1616 {
17- private string deployment ;
17+ protected string deployment ;
18+
1819 private string playerName ;
1920 private bool isReadyToSpawn ;
2021 private bool wantsSpawn ;
2122 private Action < PlayerCreator . CreatePlayer . ReceivedResponse > onPlayerResponse ;
2223 private AdvancedEntityPipeline entityPipeline ;
2324
25+ public bool HasConnected => Worker != null ;
2426 protected bool UseSessionFlow => ! string . IsNullOrEmpty ( deployment ) ;
2527
2628 public event Action OnLostPlayerEntity ;
@@ -38,21 +40,11 @@ public void SpawnPlayer(string playerName, Action<PlayerCreator.CreatePlayer.Rec
3840 wantsSpawn = true ;
3941 }
4042
41- public bool HasConnected ( )
42- {
43- return Worker != null ;
44- }
45-
4643 public void DisconnectPlayer ( )
4744 {
4845 StartCoroutine ( PrepareDestroy ( ) ) ;
4946 }
5047
51- protected override string GetWorkerType ( )
52- {
53- return WorkerUtils . UnityClient ;
54- }
55-
5648 protected virtual string GetAuthPlayerPrefabPath ( )
5749 {
5850 return "Prefabs/UnityClient/Authoritative/Player" ;
@@ -63,36 +55,51 @@ protected virtual string GetNonAuthPlayerPrefabPath()
6355 return "Prefabs/UnityClient/NonAuthoritative/Player" ;
6456 }
6557
66- protected override AlphaLocatorConfig GetAlphaLocatorConfig ( string workerType )
58+ protected override IConnectionHandlerBuilder GetConnectionHandlerBuilder ( )
6759 {
68- return UseSessionFlow
69- ? GetAlphaLocatorConfigViaDevAuthFlow ( workerType )
70- : base . GetAlphaLocatorConfig ( workerType ) ;
71- }
60+ var connectionParams = new ConnectionParameters
61+ {
62+ DefaultComponentVtable = new ComponentVtable ( ) ,
63+ WorkerType = WorkerUtils . UnityClient
64+ } ;
65+
66+ var builder = new SpatialOSConnectionHandlerBuilder ( )
67+ . SetConnectionParameters ( connectionParams ) ;
7268
73- protected override string SelectLoginToken ( List < LoginTokenDetails > loginTokens )
74- {
7569 if ( UseSessionFlow )
7670 {
77- foreach ( var loginToken in loginTokens )
78- {
79- if ( loginToken . DeploymentName == deployment )
80- {
81- return loginToken . LoginToken ;
82- }
83- }
71+ connectionParams . Network . UseExternalIp = true ;
72+ builder . SetConnectionFlow ( new ChosenDeploymentAlphaLocatorFlow ( deployment ,
73+ new SessionConnectionFlowInitializer ( new CommandLineConnectionFlowInitializer ( ) ) ) ) ;
8474 }
85- else
75+ else if ( Application . isEditor )
8676 {
87- return base . SelectLoginToken ( loginTokens ) ;
77+ builder . SetConnectionFlow ( new ReceptionistFlow ( CreateNewWorkerId ( WorkerUtils . UnityClient ) ) ) ;
8878 }
79+ else
80+ {
81+ var initializer = new CommandLineConnectionFlowInitializer ( ) ;
8982
90- throw new ArgumentException ( "Was not able to connect to deployment." ) ;
91- }
83+ switch ( initializer . GetConnectionService ( ) )
84+ {
85+ case ConnectionService . Receptionist :
86+ builder . SetConnectionFlow ( new ReceptionistFlow ( CreateNewWorkerId ( WorkerUtils . UnityClient ) ,
87+ initializer ) ) ;
88+ break ;
89+ case ConnectionService . Locator :
90+ connectionParams . Network . UseExternalIp = true ;
91+ builder . SetConnectionFlow ( new LocatorFlow ( initializer ) ) ;
92+ break ;
93+ case ConnectionService . AlphaLocator :
94+ connectionParams . Network . UseExternalIp = true ;
95+ builder . SetConnectionFlow ( new AlphaLocatorFlow ( initializer ) ) ;
96+ break ;
97+ default :
98+ throw new ArgumentOutOfRangeException ( ) ;
99+ }
100+ }
92101
93- protected override ConnectionService GetConnectionService ( )
94- {
95- return UseSessionFlow ? ConnectionService . AlphaLocator : base . GetConnectionService ( ) ;
102+ return builder ;
96103 }
97104
98105 protected override void HandleWorkerConnectionEstablished ( )
@@ -169,4 +176,58 @@ private void SendRequest()
169176 . RequestPlayerCreation ( serializedArgs , onPlayerResponse ) ;
170177 }
171178 }
179+
180+ internal class ChosenDeploymentAlphaLocatorFlow : AlphaLocatorFlow
181+ {
182+ private readonly string targetDeployment ;
183+
184+ public ChosenDeploymentAlphaLocatorFlow ( string targetDeployment ,
185+ IConnectionFlowInitializer < AlphaLocatorFlow > initializer = null ) : base ( initializer )
186+ {
187+ this . targetDeployment = targetDeployment ;
188+ }
189+
190+ protected override string SelectLoginToken ( List < LoginTokenDetails > loginTokens )
191+ {
192+ var token = loginTokens . FirstOrDefault ( loginToken => loginToken . DeploymentName == targetDeployment ) ;
193+
194+ return token . LoginToken ?? throw new ArgumentException ( "Was not able to connect to deployment" ) ;
195+ }
196+ }
197+
198+ internal class SessionConnectionFlowInitializer : IConnectionFlowInitializer < AlphaLocatorFlow >
199+ {
200+ private IConnectionFlowInitializer < AlphaLocatorFlow > initializer ;
201+
202+ public SessionConnectionFlowInitializer ( IConnectionFlowInitializer < AlphaLocatorFlow > standaloneInitializer )
203+ {
204+ initializer = standaloneInitializer ;
205+ }
206+
207+ public void Initialize ( AlphaLocatorFlow flow )
208+ {
209+ if ( Application . isEditor )
210+ {
211+ if ( PlayerPrefs . HasKey ( RuntimeConfigNames . DevAuthTokenKey ) )
212+ {
213+ flow . DevAuthToken = PlayerPrefs . GetString ( RuntimeConfigNames . DevAuthTokenKey ) ;
214+ return ;
215+ }
216+
217+ var textAsset = Resources . Load < TextAsset > ( "DevAuthToken" ) ;
218+
219+ if ( textAsset == null )
220+ {
221+ throw new MissingReferenceException ( "Unable to find DevAuthToken.txt in the Resources folder. " +
222+ "You can generate one via SpatialOS > Generate Dev Authentication Token." ) ;
223+ }
224+
225+ flow . DevAuthToken = textAsset . text ;
226+ }
227+ else
228+ {
229+ initializer . Initialize ( flow ) ;
230+ }
231+ }
232+ }
172233}
0 commit comments