コード例 #1
0
        private void OnServerNotification(object sender, NetComms.NotificationEventArgs e)
        {
            Logger.Log("NetClientWorld.OnServerNotification");

            try
            {
                // Skip if no type
                if (e.Notification.Length == 0)
                {
                    return;
                }

                // Get the packet type
                var type = e.Notification[0];

                // Get the payload JSON
                var payloadJson = Encoding.ASCII.GetString(e.Notification, 1, e.Notification.Length - 1);

                lock (WorldLock)
                {
                    switch (type)
                    {
                    case NetConstants.PlayersPacket:
                    {
                        var newPlayers = GamePlayers.FromJson(payloadJson);
                        Logger.Log("NetClientWorld.OnServerNotification - got players");

                        // If we have a local player then synchronize with new data
                        if (LocalPlayer != null)
                        {
                            // Find if the server has any new information
                            var serverPlayer = newPlayers.Players.FirstOrDefault(p => p.Guid == LocalPlayer.Guid);
                            if (serverPlayer != null)
                            {
                                LocalPlayer.Type = serverPlayer.Type;
                            }
                        }

                        // Write the new players
                        UpdatePlayers(newPlayers);
                        break;
                    }

                    case NetConstants.StatePacket:
                    {
                        var newState = GameState.FromJson(payloadJson);
                        Logger.Log("NetClientWorld.OnServerNotification - got state");

                        // Write the new game state
                        UpdateState(newState);
                        break;
                    }
                    }
                }
            }
            catch (Exception ex)
            {
                Logger.Log($"NetClientWorld.OnServerNotification - failed with {ex}", ex);
            }
        }
コード例 #2
0
        private void OnClientNotification(object sender, NetComms.NotificationEventArgs e)
        {
            Logger.Log("NetServerWorld.OnClientNotification");
            try
            {
                // Skip if no type
                if (e.Notification.Length == 0)
                {
                    return;
                }

                // Get the packet type
                var type = e.Notification[0];

                // Get the payload JSON
                var payloadJson = Encoding.ASCII.GetString(e.Notification, 1, e.Notification.Length - 1);

                lock (WorldLock)
                {
                    switch (type)
                    {
                    case NetConstants.PlayerPacket:
                    {
                        var player = Player.FromJson(payloadJson);
                        Logger.Log($"NetServerWorld.OnClientNotification - got player {player.Guid}");

                        // While not playing we only accept None or Observer players, everyone else is bounced back to None
                        if (State.Mode == GameMode.Playing &&
                            player.Type != PlayerType.None &&
                            player.Type != PlayerType.Observer)
                        {
                            player.Type = PlayerType.None;
                        }

                        Players.Players.RemoveAll(p => p.Guid == player.Guid);
                        Players.Players.Add(player);

                        // Save the player guid
                        e.Connection.AssociatedData = player.Guid;
                        break;
                    }

                    case NetConstants.AstronautPacket:
                    {
                        var astronaut = Astronaut.FromJson(payloadJson);
                        Logger.Log($"NetServerWorld.OnClientNotification - got astronaut update {astronaut.Guid}");

                        // Only accept astronauts when playing
                        if (State.Mode == GameMode.Playing)
                        {
                            State.Astronauts.RemoveAll(a => a.Guid == astronaut.Guid);
                            State.Astronauts.Add(astronaut);
                        }
                        break;
                    }

                    case NetConstants.AsteroidPacket:
                    {
                        // Only accept asteroids when playing
                        if (State.Mode == GameMode.Playing)
                        {
                            var asteroid = Asteroid.FromJson(payloadJson);
                            Logger.Log($"NetServerWorld.OnClientNotification - got fired asteroid {asteroid.Guid}");
                            State.Asteroids.RemoveAll(a => a.Guid == asteroid.Guid);
                            State.Asteroids.Add(asteroid);
                        }
                        break;
                    }
                    }
                }
            }
            catch (Exception ex)
            {
                Logger.Log($"NetServerWorld.OnClientNotification - failed with {ex}", ex);
            }
        }