public MultiplayerLobbyScreen(ServerInfo serverInfo, ButtonDelegate buttonDelegate, bool isServer)
        {
            this.serverInfo = serverInfo;
            viewsLookup = new Dictionary<NetConnection, ClientInfoView>();

            View contentView = new View(512, 363);
            contentView.alignX = View.ALIGN_CENTER;
            contentView.x = 0.5f * width;
            contentView.y = 48;

            Font font = GetDefaultFont();

            contentView.AddView(new View(215, 145));

            TextView serverName = new TextView(font, serverInfo.name);
            serverName.alignX = View.ALIGN_CENTER;
            serverName.x = 113;
            serverName.y = 155;

            contentView.AddView(serverName);

            clientsView = new View(286, contentView.height);
            clientsView.alignX = View.ALIGN_MAX;
            clientsView.x = contentView.width;
            contentView.AddView(clientsView);

            AddView(contentView);

            View buttons = new View();
            buttons.x = 0.5f * width;
            buttons.y = 432;
            buttons.alignX = View.ALIGN_CENTER;
            buttons.alignY = View.ALIGN_MAX;

            Button button = new TempButton("BACK");
            button.buttonDelegate = buttonDelegate;
            button.id = (int)ButtonId.Back;
            buttons.AddView(button);
            SetCancelButton(button);

            String label = isServer ? "START" : "READY";
            ButtonId buttonId = isServer ? ButtonId.Start : ButtonId.Ready;

            button = new TempButton(label);
            button.buttonDelegate = buttonDelegate;
            button.id = (int)buttonId;
            buttons.AddView(button);

            buttons.LayoutHor(10);
            buttons.ResizeToFitViews();
            AddView(buttons);
        }
        internal static ServerInfo ReadServerInfo(NetIncomingMessage message)
        {
            // name
            String name = message.ReadString();

            // scheme
            Scheme scheme = new Scheme();

            // scheme: name
            scheme.name = message.ReadString();

            // scheme: field data
            int fieldWidth = message.ReadInt32();
            int fieldHeight = message.ReadInt32();
            FieldBlocks[] fieldDataArray = new FieldBlocks[fieldWidth * fieldHeight];
            for (int i = 0; i < fieldDataArray.Length; ++i)
            {
                fieldDataArray[i] = (FieldBlocks)message.ReadByte();
            }
            scheme.fieldData = new FieldData(fieldWidth, fieldHeight, fieldDataArray);

            // scheme: player locations
            int locationsCount = message.ReadByte();
            PlayerLocationInfo[] playerLocations = new PlayerLocationInfo[locationsCount];
            for (int i = 0; i < locationsCount; ++i)
            {
                int x = message.ReadByte();
                int y = message.ReadByte();
                int team = message.ReadByte();

                playerLocations[i] = new PlayerLocationInfo(i, x, y, team);
            }
            scheme.playerLocations = playerLocations;

            ServerInfo info = new ServerInfo(name, message.SenderEndPoint);
            info.scheme = scheme;
            return info;
        }
 //////////////////////////////////////////////////////////////////////////////
 private void StartLobbyScreen(ServerInfo info, bool isServer)
 {
     Screen screen = new MultiplayerLobbyScreen(serverInfo, OnLobbyScreenButtonPressed, isServer);
     screen.id = (int)ScreenId.Lobby;
     StartNextScreen(screen);
 }
 private void StopPeer()
 {
     serverInfo = null;
     GetNetwork().Stop();
 }
        private void OnButtonPressed(Button button)
        {
            MultiplayerScreen.ButtonId buttonId = (MultiplayerScreen.ButtonId)button.id;
            switch (buttonId)
            {
                case MultiplayerScreen.ButtonId.Back:
                {
                    Stop(ExitCode.Cancel);
                    break;
                }

                case MultiplayerScreen.ButtonId.Create:
                {
                    StopDiscovery(false);

                    String hostName = CVars.sv_hostname.value;

                    Scheme scheme = Application.Assets().LoadAsset<Scheme>("Content\\maps\\x.sch");
                    serverInfo = new ServerInfo(hostName);
                    serverInfo.scheme = scheme;
                    StartLobbyScreen(serverInfo, true);

                    StartServer();
                    break;
                }

                case MultiplayerScreen.ButtonId.Join:
                {
                    ServerInfo info = button.data as ServerInfo;
                    Debug.Assert(info != null);

                    serverInfo = info;
                    StartClient(info.endPoint);
                    break;
                }

                case MultiplayerScreen.ButtonId.Refresh:
                {
                    StopDiscovery(false);
                    StartDiscovery();
                    break;
                }
            }
        }
 private void OnLocalServerFound(ServerInfo info)
 {
     Log.d("Found local server: " + info.endPoint);
     foundServers.Add(info);
 }
        internal static void WriteServerInfo(NetOutgoingMessage message, ServerInfo info)
        {
            // name
            message.Write(info.name);

            // scheme
            Scheme scheme = info.scheme;

            // scheme: name
            message.Write(scheme.name);

            // scheme: field data
            FieldData fieldData = scheme.fieldData;
            message.Write(fieldData.GetWidth());
            message.Write(fieldData.GetHeight());

            FieldBlocks[] blocks = fieldData.GetDataArray();
            for (int i = 0; i < blocks.Length; ++i)
            {
                byte block = (byte)blocks[i];
                message.Write(block);
            }

            // scheme: player locations
            PlayerLocationInfo[] playerLocations = scheme.GetPlayerLocations();
            message.Write((byte)playerLocations.Length);
            for (int i = 0; i < playerLocations.Length; ++i)
            {
                message.Write((byte)playerLocations[i].x);
                message.Write((byte)playerLocations[i].y);
                message.Write((byte)playerLocations[i].team);
            }
        }
        public ServerView(ServerInfo server)
            : base(154, 143)
        {
            Font font = Helper.fontButton;

            nameView = new TextView(font, server.name);
            nameView.alignX = View.ALIGN_CENTER;
            nameView.x = 0.5f * width;
            nameView.y = 104;
            AddView(nameView);
        }
 //////////////////////////////////////////////////////////////////////////////
 private void Stop(ExitCode code, ServerInfo serverInfo = null)
 {
     Stop((int)code, serverInfo);
 }
        private void StartServer()
        {
            String hostName = CVars.sv_hostname.value;

            Scheme scheme = BmApplication.Assets().GetScheme(A.maps_x);
            serverInfo = new ServerInfo(hostName);
            serverInfo.scheme = scheme;

            GetNetwork().StartServer();
            GetNetwork().StartListeningForServerDiscovery();
        }
        private void OnLocalServerFound(ServerInfo info)
        {
            Log.d("Found local server: " + info.endPoint);
            StopDiscovery();

            serverInfo = info;
            StartClient(info.endPoint);
        }