Esempio n. 1
0
        protected override async void HandleWorkerConnectionEstablished()
        {
            base.HandleWorkerConnectionEstablished();

            Worker.World.GetOrCreateSystem <MetricSendSystem>();

            if (SimulatedPlayerWorkerConnector == null)
            {
                return;
            }

            tokenSource = new CancellationTokenSource();

            try
            {
                // If we connect via dev auth. We are connecting via the Alpha Locator & we want to use worker flags
                // to change the parameters..
                if (connectPlayersWithDevAuth)
                {
                    await WaitForWorkerFlags(flagDevAuthTokenId, flagTargetDeployment, flagClientCount,
                                             flagCreationInterval);

                    var simulatedPlayerDevAuthTokenId   = Worker.GetWorkerFlag(flagDevAuthTokenId);
                    var simulatedPlayerTargetDeployment = Worker.GetWorkerFlag(flagTargetDeployment);

                    int.TryParse(Worker.GetWorkerFlag(flagCreationInterval), out var originalInterval);
                    int.TryParse(Worker.GetWorkerFlag(flagClientCount), out var originalCount);

                    using (var workerFlagTracker =
                               new WorkerFlagTracker(Worker.World.GetExistingSystem <WorkerFlagCallbackSystem>()))
                    {
                        await Monitor(originalCount, originalInterval,
                                      connector =>
                                      connector.ConnectSimulatedPlayer(simulatedPlayerDevAuthTokenId,
                                                                       simulatedPlayerTargetDeployment),
                                      (ref int count, ref int interval) =>
                                      MonitorWorkerFlags(workerFlagTracker, ref count, ref interval));
                    }
                }
                // If not using dev auth flow, we are in the editor or standalone worker on a local deployment.
                // Connect via receptionist & use prefabs to change the parameters.
                else
                {
                    await Monitor(MaxSimulatedPlayerCount, SimulatedPlayerCreationInterval,
                                  connector => connector.ConnectSimulatedPlayer(),
                                  (ref int count, ref int interval) =>
                    {
                        count    = MaxSimulatedPlayerCount;
                        interval = SimulatedPlayerCreationInterval;
                    });
                }
            }
            catch (TaskCanceledException)
            {
                // This is fine. Means we have triggered a cancel via Dispose().
            }
        }
        // Update worker flags if they have changed.
        private void MonitorWorkerFlags(WorkerFlagTracker tracker, ref int count, ref int interval)
        {
            if (tracker.TryGetFlagChange(flagCreationInterval, out var intervalStr) &&
                int.TryParse(intervalStr, out var newInterval))
            {
                interval = newInterval;
            }

            if (tracker.TryGetFlagChange(flagClientCount, out var newCountStr) &&
                int.TryParse(newCountStr, out var newCount))
            {
                count = newCount;
            }

            tracker.Reset();
        }