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; }
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(); } }