Beispiel #1
0
        public void ValidateNumHeartbeats()
        {
            // test for NumHeartBeatsForActivateResponse
            dynamic config = GetValidConfig();

            config.NumHeartBeatsForActivateResponse = 0;
            MultiplayerSettings settings = JsonConvert.DeserializeObject <MultiplayerSettings>(config.ToString());

            settings.SetDefaultsIfNotSpecified();
            new MultiplayerSettingsValidator(settings, _mockSystemOperations.Object).IsValid().Should().BeFalse();

            // test for NumHeartBeatsForTerminateResponse
            config = GetValidConfig();
            config.NumHeartBeatsForTerminateResponse = 0;
            settings = JsonConvert.DeserializeObject <MultiplayerSettings>(config.ToString());
            settings.SetDefaultsIfNotSpecified();
            new MultiplayerSettingsValidator(settings, _mockSystemOperations.Object).IsValid().Should().BeFalse();

            // test for NumHeartBeatsForTerminateResponse and NumHeartBeatsForActivateResponse
            config = GetValidConfig();
            config.NumHeartBeatsForTerminateResponse = 10;
            config.NumHeartBeatsForActivateResponse  = 10;
            settings = JsonConvert.DeserializeObject <MultiplayerSettings>(config.ToString());
            settings.SetDefaultsIfNotSpecified();
            new MultiplayerSettingsValidator(settings, _mockSystemOperations.Object).IsValid().Should().BeFalse();
        }
Beispiel #2
0
        public void DefaultConfigIsInvalid()
        {
            MultiplayerSettings settings = JsonConvert.DeserializeObject <MultiplayerSettings>(DefaultConfig);

            settings.SetDefaultsIfNotSpecified();
            new MultiplayerSettingsValidator(settings, _mockSystemOperations.Object).IsValid().Should().BeFalse();
        }
        public void SetMultiplayerSettings()
        {
            string filePath = PlatformerGame.OptionsPath + "Multiplayer Settings.platform";

            if (!File.Exists(filePath)) // remember to create directory as well if it doesnt exist
            {
                settings = new MultiplayerSettings()
                {
                    ServerIp        = IPAddress.Any.ToString(),
                    ServerPort      = 9009,
                    UpdateIntervals = 50,
                    MinDeltaMove    = 1f,
                    SmoothMovement  = true
                };

                Serialization.SerializeJson(filePath, settings);
            }
            else
            {
                settings = Serialization.DeserializeJson <MultiplayerSettings>(filePath);
            }

            sendTimer  = new Timer(SendDataCallBack, null, 0, settings.UpdateIntervals);
            ServerIp   = settings.ServerIp;
            ServerPort = settings.ServerPort;

            connectedClients     = new List <NetworkPlayer>();
            previousClientStates = new List <NetworkPlayer>();
            lerpProgress         = new List <float>();

            clients    = new List <int>();
            blockCells = new List <Cell>();
            endPoint   = new IPEndPoint(IPAddress.Parse(ServerIp), ServerPort);
        }
        private void OpenMultiplayerSettings(object sender, RoutedEventArgs e)
        {
            var multiplayerSettingsDialog = new MultiplayerSettings();

            multiplayerSettingsDialog.Owner = Window.GetWindow(this);
            multiplayerSettingsDialog.ShowDialog();
        }
Beispiel #5
0
        public void ValidConfigReturnsValid()
        {
            dynamic             config   = GetValidConfig();
            MultiplayerSettings settings = JsonConvert.DeserializeObject <MultiplayerSettings>(config.ToString());

            settings.SetDefaultsIfNotSpecified();
            new MultiplayerSettingsValidator(settings, _mockSystemOperations.Object).IsValid().Should().BeTrue();
        }
Beispiel #6
0
        public void EmptyNodePortInContainerModeShouldFail()
        {
            dynamic config = GetValidConfig();

            config.RunContainer = true;
            config.PortMappingsList[0][0].NodePort = 0;
            MultiplayerSettings settings = JsonConvert.DeserializeObject <MultiplayerSettings>(config.ToString());

            settings.SetDefaultsIfNotSpecified();
            new MultiplayerSettingsValidator(settings, _mockSystemOperations.Object).IsValid().Should().BeFalse();
        }
Beispiel #7
0
        public void InvalidContainerStartCommandIsInvalid()
        {
            dynamic config = GetValidConfig();

            config.RunContainer = true;
            config.ContainerStartParameters.StartGameCommand = @"C:\Assets\<your_game_server_exe>";

            MultiplayerSettings settings = JsonConvert.DeserializeObject <MultiplayerSettings>(config.ToString());

            settings.SetDefaultsIfNotSpecified();
            new MultiplayerSettingsValidator(settings, _mockSystemOperations.Object).IsValid().Should().BeFalse();
        }
Beispiel #8
0
        public void StartGameCommandThatContainsMountPathShouldSucceed(string startGameCommand)
        {
            dynamic config = GetValidConfig();

            config.RunContainer = true;
            config.AssetDetails[0].MountPath = "C:\\Assets";
            config.ContainerStartParameters.StartGameCommand = startGameCommand;
            MultiplayerSettings settings = JsonConvert.DeserializeObject <MultiplayerSettings>(config.ToString());

            settings.SetDefaultsIfNotSpecified();
            new MultiplayerSettingsValidator(settings, _mockSystemOperations.Object).IsValid().Should().BeTrue();
        }
 private void Awake()
 {
     if (MultiplayerSettings.multiplayerSettings == null)
     {
         MultiplayerSettings.multiplayerSettings = this;
     }
     else if (MultiplayerSettings.multiplayerSettings != this)
     {
         Destroy(this.gameObject);
     }
     DontDestroyOnLoad(this.gameObject);
 }
Beispiel #10
0
 private void Awake()
 {
     if (instance != null)
     {
         GameObject.Destroy(gameObject);
     }
     else
     {
         instance = this;
         DontDestroyOnLoad(gameObject);
     }
 }
Beispiel #11
0
 private void Awake()
 {
     ///Keeps only one instance of MPSettings
     if (MultiplayerSettings.multiPlayerSettings == null)
     {
         MultiplayerSettings.multiPlayerSettings = this;
     }
     else if (MultiplayerSettings.multiPlayerSettings != this)
     {
         Destroy(this.gameObject);
     }
     DontDestroyOnLoad(this.gameObject);
 }
 void Awake()
 {
     if (multiplayerSetting == null)
     {
         multiplayerSetting = this;
     }
     else
     {
         if (multiplayerSetting != this)
         {
             Destroy(gameObject);
         }
     }
     DontDestroyOnLoad(gameObject);
 }
Beispiel #13
0
 void Awake()
 {
     if (Instance == null)
     {
         Instance = this;
     }
     else
     {
         if (Instance != this)
         {
             Destroy(this.gameObject);
         }
     }
     DontDestroyOnLoad(this.gameObject);
 }
Beispiel #14
0
 private void Awake()
 {
     // Setup Singleton
     if (MultiplayerSettings.multiplayerSetting == null)
     {
         MultiplayerSettings.multiplayerSetting = this;
     }
     else
     {
         if (MultiplayerSettings.multiplayerSetting != this)
         {
             Destroy(this.gameObject);
         }
     }
     DontDestroyOnLoad(this.gameObject);
 }
Beispiel #15
0
 /// <summary>
 /// </summary>
 private void CreateSettings() => Settings = new MultiplayerSettings(new List <IMultiplayerSettingsItem>
 {
     new MultiplayerSettingsRuleset("Game Mode", OnlineManager.CurrentGame.Ruleset.ToString().Replace("_", " ")),
     new MultiplayerSettingsMaxPlayers("Max Players", OnlineManager.CurrentGame.MaxPlayers.ToString()),
     new MultiplayerSettingsAutoHostRotation("Auto Host Rotation", MultiplayerSettingsText.BooleanToYesOrNo(OnlineManager.CurrentGame.HostRotation)),
     new MultiplayerSettingsFreeModType("Free Mod", MultiplayerSettingsFreeModType.FreeModTypeToString(MultiplayerFreeModType.Regular), MultiplayerFreeModType.Regular),
     new MultiplayerSettingsFreeModType("Free Rate", MultiplayerSettingsFreeModType.FreeModTypeToString(MultiplayerFreeModType.Rate), MultiplayerFreeModType.Rate),
     new MultiplayerSettingsHealthType("Health Type", ((MultiplayerHealthType)OnlineManager.CurrentGame.HealthType).ToString().Replace("_", " ")),
     new MultiplayerSettingsLives("Lives", OnlineManager.CurrentGame.Lives.ToString()),
     new MultiplayerSettingsAllowedGameModes("Allowed Game Modes", MultiplayerSettingsAllowedGameModes.AllowedModesToString(OnlineManager.CurrentGame.AllowedGameModes)),
     new MultiplayerSettingsMaximumSongLength("Maximum Song Length", MultiplayerSettingsMaximumSongLength.ToString(OnlineManager.CurrentGame.MaximumSongLength)),
     new MultiplayerSettingsDifficultyRange("Difficulty Range", MultiplayerSettingsDifficultyRange.ToString(OnlineManager.CurrentGame.MinimumDifficultyRating, OnlineManager.CurrentGame.MaximumDifficultyRating)),
     new MultiplayerSettingsLongNotePercentage("Long Note % Range", MultiplayerSettingsLongNotePercentage.ToString(OnlineManager.CurrentGame.MinimumLongNotePercentage, OnlineManager.CurrentGame.MaximumLongNotePercentage))
 })
 {
     Parent   = Container,
     Position = new ScalableVector2(Map.X, Map.Y + Map.Height + 20)
 };
Beispiel #16
0
        public void CertsWithDifferentPathAndNameSucceeds()
        {
            dynamic             config   = GetValidConfig();
            MultiplayerSettings settings = JsonConvert.DeserializeObject <MultiplayerSettings>(config.ToString());

            settings.SetDefaultsIfNotSpecified();
            settings.GameCertificateDetails = new[]
            {
                new GameCertificateDetails()
                {
                    Name = "test", Path = "C:\\mycert.pfx"
                },
                new GameCertificateDetails()
                {
                    Name = "test2", Path = "C:\\mycert2.pfx"
                }
            };
            new MultiplayerSettingsValidator(settings, _mockSystemOperations.Object).IsValid().Should().BeTrue();
        }
Beispiel #17
0
        public void CertsNoExtensionPfxFails()
        {
            dynamic             config   = GetValidConfig();
            MultiplayerSettings settings = JsonConvert.DeserializeObject <MultiplayerSettings>(config.ToString());

            settings.SetDefaultsIfNotSpecified();
            settings.GameCertificateDetails = new[]
            {
                new GameCertificateDetails()
                {
                    Name = "cert1", Path = "C:\\test.pfxlala"
                },
                new GameCertificateDetails()
                {
                    Name = "cert2", Path = "C:\\test2.123"
                }
            };
            new MultiplayerSettingsValidator(settings, _mockSystemOperations.Object).IsValid().Should().BeFalse();
        }
Beispiel #18
0
        public void SessionHostStartWithProcess()
        {
            dynamic config = GetValidConfig();

            config.RunContainer = false;

            MultiplayerSettings settings = JsonConvert.DeserializeObject <MultiplayerSettings>(config.ToString());

            settings.SetDefaultsIfNotSpecified();
            new MultiplayerSettingsValidator(settings, _mockSystemOperations.Object).IsValid().Should().BeTrue();

            SessionHostsStartInfo startInfo = settings.ToSessionHostsStartInfo();

            startInfo.HostConfigOverrides.Should().BeNull();
            startInfo.SessionHostType.Should().Be(SessionHostType.Process);
            foreach (AssetDetail assetDetail in startInfo.AssetDetails)
            {
                assetDetail.MountPath.Should().BeNull();
            }
        }
        public MultiplayerGameManagerService(
            IPlayFabService playFabService,
            ITokenService tokenService,
            IGameService gameService,
            IOptions <MultiplayerSettings> options,
            IMatchesRepository repository,
            ILogger <MultiplayerGameManagerService> logger)
        {
            _playFabService      = playFabService;
            _tokenService        = tokenService;
            _gameService         = gameService;
            _repository          = repository;
            _multiplayerSettings = options.Value;
            _logger = logger;

            if (_multiplayerSettings.Token.TicketStatusWait < 60000 / FREE_TIER_MAX_REQUESTS)
            {
                _logger.LogWarning($"PlayFab free tier limits the Get Matchmaking Ticket requests to a max of {FREE_TIER_MAX_REQUESTS} per minute. " +
                                   "A MatchmakingRateLimitExceeded error might occur while waiting for a multiplayer match");
            }
        }
Beispiel #20
0
        public void SessionHostStartWithContainer()
        {
            dynamic config = GetValidConfig();

            config.RunContainer = true;

            MultiplayerSettings settings = JsonConvert.DeserializeObject <MultiplayerSettings>(config.ToString());

            settings.SetDefaultsIfNotSpecified();
            new MultiplayerSettingsValidator(settings, _mockSystemOperations.Object).IsValid().Should().BeTrue();

            SessionHostsStartInfo startInfo = settings.ToSessionHostsStartInfo();
            long expectedNanoCpus           = (long)((double)config.ContainerStartParameters.ResourceLimits.Cpus * 1_000_000_000);
            long expectedMemory             = config.ContainerStartParameters.ResourceLimits.MemoryGib * Math.Pow(1024, 3);

            startInfo.SessionHostType.Should().Be(SessionHostType.Container);
            startInfo.HostConfigOverrides.NanoCPUs.Should().Be(expectedNanoCpus);
            startInfo.HostConfigOverrides.Memory.Should().Be(expectedMemory);
            foreach (AssetDetail assetDetail in startInfo.AssetDetails)
            {
                assetDetail.MountPath.Should().NotBeNull();
            }
        }
Beispiel #21
0
        public static async Task Main(string[] args)
        {
            string[] salutations =
            {
                "Have a nice day!",
                "Thank you for using PlayFab Multiplayer Servers",
                "Check out our docs at aka.ms/playfabdocs!",
                "Have a question? Check our community at community.playfab.com"
            };
            Console.WriteLine(salutations[new Random().Next(salutations.Length)]);

            string debuggingUrl = "https://github.com/PlayFab/gsdkSamples/blob/master/Debugging.md";

            Console.WriteLine($"Check this page for debugging tips: {debuggingUrl}");

            // lcow stands for Linux Containers On Windows => https://docs.microsoft.com/en-us/virtualization/windowscontainers/deploy-containers/linux-containers
            Globals.GameServerEnvironment = args.Contains("-lcow") && RuntimeInformation.IsOSPlatform(OSPlatform.Windows)
                ? GameServerEnvironment.Linux : GameServerEnvironment.Windows; // LocalMultiplayerAgent is running only on Windows for the time being
            MultiplayerSettings settings = JsonConvert.DeserializeObject <MultiplayerSettings>(File.ReadAllText("MultiplayerSettings.json"));

            settings.SetDefaultsIfNotSpecified();

            MultiplayerSettingsValidator validator = new MultiplayerSettingsValidator(settings);

            if (!validator.IsValid())
            {
                Console.WriteLine("The specified settings are invalid. Please correct them and re-run the agent.");
                Environment.Exit(1);
            }

            string vmId =
                $"xcloudwusu4uyz5daouzl:{settings.Region}:{Guid.NewGuid()}:tvmps_{Guid.NewGuid():N}{Guid.NewGuid():N}_d";

            Console.WriteLine($"TitleId: {settings.TitleId}");
            Console.WriteLine($"BuildId: {settings.BuildId}");
            Console.WriteLine($"VmId: {vmId}");

            Globals.Settings = settings;
            string rootOutputFolder = Path.Combine(settings.OutputFolder, "PlayFabVmAgentOutput", DateTime.Now.ToString("s").Replace(':', '-'));

            Console.WriteLine($"Root output folder: {rootOutputFolder}");

            VmDirectories vmDirectories = new VmDirectories(rootOutputFolder);

            Globals.VmConfiguration = new VmConfiguration(settings.AgentListeningPort, vmId, vmDirectories);
            if (Globals.GameServerEnvironment == GameServerEnvironment.Linux && RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
            {
                Globals.AdaptFolderPathsForLinuxContainersOnWindows();  // Linux Containers on Windows requires special folder mapping
            }

            Directory.CreateDirectory(rootOutputFolder);
            Directory.CreateDirectory(vmDirectories.GameLogsRootFolderVm);
            Directory.CreateDirectory(Globals.VmConfiguration.VmDirectories.CertificateRootFolderVm);
            IWebHost host = new WebHostBuilder()
                            .UseKestrel()
                            .UseUrls($"http://*:{settings.AgentListeningPort}")
                            .UseContentRoot(Directory.GetCurrentDirectory())
                            .UseStartup <Startup>()
                            .Build();

            await host.StartAsync();

            Console.WriteLine($"Local Multiplayer Agent is listening on port {settings.AgentListeningPort}");

            Globals.SessionConfig = settings.SessionConfig ?? new SessionConfig()
            {
                SessionId = Guid.NewGuid()
            };
            Console.WriteLine($"{string.Join(", ", Globals.SessionConfig.InitialPlayers)}");
            await new MultiplayerServerManager(SystemOperations.Default, Globals.VmConfiguration, Globals.MultiLogger, SessionHostRunnerFactory.Instance)
            .CreateAndStartContainerWaitForExit(settings.ToSessionHostsStartInfo());

            await host.StopAsync();
        }