Ejemplo n.º 1
0
        public void SetGame(GameCore game)
        {
            GameStartRemainingTimeout     = ServerSettings.Instance.TimeToWaitForPlayersReady;
            _disablePropertyNotifications = true;
            foreach (var player in Players)
            {
                player.Player.Tank        = null;
                player.Player.IsSpectator = false;
                //Clear existing attributes from the player object
                player.Player.SelectedTankReflectionName = null;
                player.Player.SpawnPoint       = Vector2.Zero;
                player.Player.Team             = null;
                player.Player.AllowedTankTypes = null;

                player.Player.IsReady = false;
                game.AddPlayer(player.Player);
            }
            _disablePropertyNotifications = false;
            GameInstance.FullGameState    = FullGameState.Create(game);
            Game.Authoritative            = true;
        }
Ejemplo n.º 2
0
        public void Apply(GameCore game)
        {
            game.Gamemode.FullState = GamemodeState;

            GameCore.TimescaleValue timescale = new GameCore.TimescaleValue(TimescaleValue, TimescaleString);
            foreach (var ts in GameCore.TimescaleValue.Values)
            {
                if (ts.DisplayString == TimescaleString)
                {
                    timescale = ts;
                }
            }

            game.Timescale           = timescale;
            game.FriendlyFireEnabled = FriendlyFireEnabled;

            //Do it via reflection to keep api private
            typeof(GameCore).GetProperty(nameof(GameCore.Status))
            .SetValue(game, Status);
            //Do this with reflection again because we want to keep the api private (set game time)
            typeof(GameCore).GetProperty(nameof(GameCore.Time))
            .SetValue(game, TimeSpan.FromMilliseconds(CurrentGameTimeMilliseconds));
            //Once again
            typeof(GameCore).GetProperty(nameof(GameCore.HasStarted))
            .SetValue(game, HasStarted);
            //A fourth time, keep the API private
            typeof(GameCore).GetField("_nextObjectId",
                                      System.Reflection.BindingFlags.Default | System.Reflection.BindingFlags.SetField |
                                      System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic)
            .SetValue(game, NextObjectId);
            //And a fifth
            typeof(GameCore).GetField("_gameEndedTime",
                                      System.Reflection.BindingFlags.Default | System.Reflection.BindingFlags.SetField |
                                      System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic)
            .SetValue(game, TimeSpan.FromMilliseconds(GameEndedTime));

            foreach (var player in Players)
            {
                var nwPlayer = new NetworkPlayer();
                if (game.PlayersById.ContainsKey(player.Id) && game.PlayersById[player.Id] is NetworkPlayer)
                {
                    nwPlayer = (NetworkPlayer)game.PlayersById[player.Id];
                }
                else if (game.PlayersById.ContainsKey(player.Id)) //remove because it isn't a networkplayer
                {
                    game.RemovePlayer(player.Id);
                }

                player.Apply(nwPlayer);

                if (!game.PlayersById.ContainsKey(player.Id))
                {
                    game.AddPlayer(nwPlayer);
                }
            }
            var missingPlayers = new List <NetworkPlayer>();

            foreach (var plr in game.Players)
            {
                bool found = false;
                foreach (var p in Players)
                {
                    if (p.UniqueId == ((NetworkPlayer)plr).UniqueId)
                    {
                        found = true;
                    }
                }
                if (!found)
                {
                    missingPlayers.Add((NetworkPlayer)plr);
                }
            }
            foreach (var plr in missingPlayers)
            {
                game.RemovePlayer(plr);
            }

            //Add all of the game objects
            foreach (var fullState in ObjectStates)
            {
                if (!game.GameObjectsById.ContainsKey(fullState.ObjectId))
                {
                    var rdr = ByteArrayReader.Get(fullState.Data);
                    GameObject.CreateAndAddFromSerializationInformation(game, rdr, true);
                    rdr.Release();
                }
                else
                {
                    game.GameObjectsById[fullState.ObjectId].FullState = fullState.Data;
                }
            }

            ApplyDestruction(game);

            var playersByTeam = new Dictionary <short, List <NetworkPlayer> >();

            foreach (var player in Players)
            {
                if (!playersByTeam.ContainsKey(player.TeamId))
                {
                    playersByTeam.Add(player.TeamId, new List <NetworkPlayer>());
                }

                playersByTeam[player.TeamId].Add(player.PlayerObject);
            }

            foreach (var kvp in playersByTeam)
            {
                var team = FindTeam(game.Gamemode.Teams, kvp.Key);
                team.Players = kvp.Value.ToArray();
            }

            foreach (var player in Players)
            {
                player.ApplySecondPass(player.PlayerObject, game);
            }

            game.Gamemode.DeferredSetFullState();
            foreach (var obj in game.GameObjects)
            {
                obj.SetPostInitStateData();
            }
        }