private void chooseOUToolStripMenuItem_Click(object sender, EventArgs e)
 {
     sfd = new SomeFunctionDelegate(this.AddUsersAsync);
     sfd.BeginInvoke(null, null);
 }
        protected override void Update(GameTime gameTime)
        {
            //
            // Collect input
            //

                float xinput = 0;
                float yinput = 0;

                if (state != GameState.playing)
                {
                    mouseState = Mouse.GetState();

                    if (mouseState.LeftButton == ButtonState.Pressed)
                    {
                        if (singlePlayerButton.isVisible())
                        {
                            Rectangle recA = new Rectangle((int)singlePlayerButton.getPos().X, (int)singlePlayerButton.getPos().Y, singlePlayerButton.getImage().Width, singlePlayerButton.getImage().Height);
                            Rectangle recB = new Rectangle(mouseState.X, mouseState.Y, 1, 1);
                            if (recA.Contains(recB))
                            {
                                gameType = "single";

                                server = new Server();
                                sfd = new SomeFunctionDelegate(server.launchServer);
                                sfd.BeginInvoke(null, null);
                                host = true;
                                LAN = true;
                                client.DiscoverLocalPeers(14242);

                                state = GameState.lobby;

                            }
                        }
                        if (multiplayerButton.isVisible())
                        {
                            Rectangle recA = new Rectangle((int)multiplayerButton.getPos().X, (int)multiplayerButton.getPos().Y, multiplayerButton.getImage().Width, multiplayerButton.getImage().Height);
                            Rectangle recB = new Rectangle(mouseState.X, mouseState.Y, 1, 1);
                            if (recA.Contains(recB))
                            {

                                state = GameState.multiplayerMenu;

                            }
                        }
                        if (hostGame.isVisible())
                        {
                            Rectangle recA = new Rectangle((int)hostGame.getPos().X, (int)hostGame.getPos().Y, hostGame.getImage().Width, hostGame.getImage().Height);
                            Rectangle recB = new Rectangle(mouseState.X, mouseState.Y, 1, 1);
                            if (recA.Contains(recB))
                            {

                                gameType = "multi";
                                server = new Server();
                                sfd = new SomeFunctionDelegate(server.launchServer);
                                sfd.BeginInvoke(null, null);
                                host = true;
                                LAN = true;
                                client.DiscoverLocalPeers(14242);

                                state = GameState.lobby;
                            }
                        }
                        if (joinGame.isVisible())
                        {
                            Rectangle recA = new Rectangle((int)joinGame.getPos().X, (int)joinGame.getPos().Y, joinGame.getImage().Width, joinGame.getImage().Height);
                            Rectangle recB = new Rectangle(mouseState.X, mouseState.Y, 1, 1);
                            if (recA.Contains(recB))
                            {
                                state = GameState.joinOptions;
                            }
                        }
                        if (joinIneternet.isVisible())
                        {
                            Rectangle recA = new Rectangle((int)joinIneternet.getPos().X, (int)joinIneternet.getPos().Y, joinIneternet.getImage().Width, joinIneternet.getImage().Height);
                            Rectangle recB = new Rectangle(mouseState.X, mouseState.Y, 1, 1);
                            if (recA.Contains(recB))
                            {
                                state = GameState.enterIp;
                                gameType = "multi";
                            }
                        }
                        if (joinLan.isVisible())
                        {
                            Rectangle recA = new Rectangle((int)joinLan.getPos().X, (int)joinLan.getPos().Y, joinLan.getImage().Width, joinLan.getImage().Height);
                            Rectangle recB = new Rectangle(mouseState.X, mouseState.Y, 1, 1);
                            if (recA.Contains(recB))
                            {
                                client.DiscoverLocalPeers(14242);
                                state = GameState.lobby;
                                gameType = "multi";
                                LAN = true;
                            }
                        }
                        if (startGame.isVisible() && host == true)
                        {
                            Rectangle recA = new Rectangle((int)startGame.getPos().X, (int)startGame.getPos().Y, startGame.getImage().Width, startGame.getImage().Height);
                            Rectangle recB = new Rectangle(mouseState.X, mouseState.Y, 1, 1);
                            if (recA.Contains(recB))
                            {
                                state = GameState.playing;
                                NetOutgoingMessage om = client.CreateMessage();
                                om.Write(player.getId());
                                om.Write(1);
                                client.SendMessage(om, NetDeliveryMethod.UnreliableSequenced, 6);

                            }
                        }
                    }

                    if (state == GameState.lobby)
                    {
                        //Console.WriteLine(allPlayers.Count);
                        NetIncomingMessage msg;
                        while ((msg = client.ReadMessage()) != null)
                        {
                            bool playerFound = false;
                            bool cookieFound = false;
                            switch (msg.MessageType)
                            {
                                case NetIncomingMessageType.DiscoveryResponse:
                                    // just connect to first server discovered
                                   // Console.WriteLine("Received a request response");
                                    if (LAN)
                                    {
                                        client.Connect(msg.SenderEndPoint);
                                    }

                                    break;
                                case NetIncomingMessageType.Data:

                                    if (msg.SequenceChannel == 0)
                                    {
                                        // server sent a position update
                                        long who = msg.ReadInt64();
                                        float x = msg.ReadFloat();
                                        float y = msg.ReadFloat();
                                        int playerNum = msg.ReadInt32();
                                        Texture2D image;

                                        if (playerNum == 2)
                                        {
                                            image = truett_yellow;
                                        }
                                        else if (playerNum == 3)
                                        {
                                            image = truett_green;
                                        }
                                        else
                                        {
                                            image = truettFall;
                                        }

                                        Player newPlayer = null;
                                        foreach (var p in allPlayers)
                                        {

                                            if (who == p.getId())
                                            {
                                                if (p.getId() == player.getId())
                                                {
                                                    if (firstPass == true && x > 0)
                                                    {
                                                        player.newPos(new Vector2(x, y));

                                                        firstPass = false;
                                                    }

                                                    if (player.getPlayerNum() != playerNum)
                                                    {
                                                        player.setPlayerNum(playerNum, image);

                                                    }

                                                }

                                                playerFound = true;
                                            }

                                        }
                                        if (playerFound == false)
                                        {

                                            newPlayer = new Player(image, x, y, who, numPlayers);
                                            allPlayers.Add(newPlayer);
                                            numPlayers++;
                                        }

                                        positions[who] = new Vector2(x, y);

                                    }
                                    else if (msg.SequenceChannel == 1)
                                    {

                                        //cookies.Clear();
                                        float x = msg.ReadFloat();
                                        float y = msg.ReadFloat();
                                        int id = msg.ReadInt32();

                                        foreach (var c in cookies)
                                        {
                                            if (c.getId() == id)
                                            {
                                                cookieFound = true;
                                            }

                                        }
                                        if (cookieFound == false)
                                        {
                                            Object newCookie = new Object(cookieImage, x, y, id);
                                            cookies.Add(newCookie);
                                        }
                                    }
                                    else if (msg.SequenceChannel == 6)
                                    {
                                        int start = msg.ReadInt32();
                                        if (start == 1)
                                        {
                                            state = GameState.playing;
                                        }
                                    }

                                    break;
                            }
                        }

                    }

                }
                else
                {
                    KeyboardState keyState = Keyboard.GetState();

                // exit game if escape or Back is pressed
                if (keyState.IsKeyDown(Keys.Escape) || GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
                    this.Exit();

                // use arrows or dpad to move avatar
                if (GamePad.GetState(PlayerIndex.One).DPad.Left == ButtonState.Pressed || keyState.IsKeyDown(Keys.Left))
                    if (player.getPos().X > 0)
                    {
                        xinput = -3 * 100 * (float)gameTime.ElapsedGameTime.TotalSeconds;
                    }

                if (GamePad.GetState(PlayerIndex.One).DPad.Right == ButtonState.Pressed || keyState.IsKeyDown(Keys.Right))
                    if (player.getPos().X < 1160)
                    {
                        xinput = 3 * 100 * (float)gameTime.ElapsedGameTime.TotalSeconds;
                    }

                //if (GamePad.GetState(PlayerIndex.One).DPad.Up == ButtonState.Pressed || keyState.IsKeyDown(Keys.Up))

                //if (GamePad.GetState(PlayerIndex.One).DPad.Down == ButtonState.Pressed || keyState.IsKeyDown(Keys.Down))

                if (player.getPos().Y < 480 && player.goingUp() == false)
                {
                    yinput = 3 * 100 * (float)gameTime.ElapsedGameTime.TotalSeconds;

                    foreach (var tramp in trampolines)
                    {

                        Rectangle recA = new Rectangle((int)player.getPos().X, (int)player.getPos().Y, player.getImage().Width, player.getImage().Height);
                        Rectangle recB = new Rectangle((int)tramp.getPos().X, (int)tramp.getPos().Y, tramp.getImage().Width, tramp.getImage().Height);
                        if (collision.PerPixel(recA, player.getImage(), recB, tramp.getImage()) && (player.getPos().Y + 100 <= tramp.getPos().Y))
                        {
                            player.updateDirection();
                            //player.updateImage(truettJump);
                            break;
                        }

                    }

                    //yinput = 3 * 100 * (float)gameTime.ElapsedGameTime.TotalSeconds;

                }
                else if (player.getPos().Y >= 0 && player.goingUp() == true)
                {
                    yinput = -3 * 100 * (float)gameTime.ElapsedGameTime.TotalSeconds;
                    if (player.getPos().Y <= 50)
                    {
                        player.updateDirection();
                        //player.updateImage(truettFall);
                    }
                }

                foreach(var pl in allPlayers)
                {
                    for (int x = 0; x < cookies.Count; x++)
                    {

                        Rectangle recA = new Rectangle((int)player.getPos().X, (int)player.getPos().Y, 114, 240);
                        Rectangle recB = new Rectangle((int)cookies[x].getPos().X, (int)cookies[x].getPos().Y, 60, 60);
                        Rectangle recC = new Rectangle((int)pl.getPos().X, (int)pl.getPos().Y, 114, 240);

                        if (recA.Intersects(recB) || recC.Intersects(recB))
                        {
                            if(recA.Intersects(recB))
                            {
                                NetOutgoingMessage om = client.CreateMessage();
                                om.Write(player.getId());
                                om.Write(cookies[x].getId());
                                client.SendMessage(om, NetDeliveryMethod.UnreliableSequenced, 1);
                            }

                            cookies.RemoveAt(x);

                            //We just removed an object, so we set x back by one to make sure we skip none
                            //Just sit down and think about it, it makes sense
                            x--;

                        }

                    }

                }

                if (xinput != 0 || yinput != 0)
                {

                    player.updatePosX(xinput);
                    player.updatePosY(yinput);
                    //player.newPos(new Vector2(xinput, yinput));
                    //Console.WriteLine(player.getPos().X + " " + player.getPos().Y);
                    //
                    // If there's input; send it to server
                    //
                    NetOutgoingMessage om = client.CreateMessage();
                    om.Write(player.getId());
                    om.Write(xinput); // very inefficient to send a full Int32 (4 bytes) but we'll use this for simplicity
                    om.Write(yinput);
                    client.SendMessage(om, NetDeliveryMethod.UnreliableSequenced, 0);
                }

                //move all the other players
                foreach (var p in allPlayers)
                {
                    if (player.getId() != p.getId())
                    {
                        if (p.getMoveX() == 1)
                        {
                            p.updatePosX(3 * 100 * (float)gameTime.ElapsedGameTime.TotalSeconds);
                        }
                        else if (p.getMoveX() == -1)
                        {
                            p.updatePosX(-3 * 100 * (float)gameTime.ElapsedGameTime.TotalSeconds);
                        }

                        if (p.getMoveY() == 1)
                        {
                            p.updatePosY(3 * 100 * (float)gameTime.ElapsedGameTime.TotalSeconds);
                            //p.updateImage(truettJump);
                        }
                        else if (p.getMoveY() == -1)
                        {
                            p.updatePosY(-3 * 100 * (float)gameTime.ElapsedGameTime.TotalSeconds);
                            //p.updateImage(truettFall);
                        }
                    }

                }

                //move toby
                moveToby(gameTime);

                // read messages
                NetIncomingMessage msg;
                while ((msg = client.ReadMessage()) != null)
                {
                    bool playerFound = false;
                    bool cookieFound = false;
                    switch (msg.MessageType)
                    {
                        case NetIncomingMessageType.DiscoveryResponse:
                            // just connect to first server discovered
                            Console.WriteLine("Received a request response");
                            if (gameType == "single")
                            {
                                client.Connect(msg.SenderEndPoint);
                            }

                            break;
                        case NetIncomingMessageType.Data:

                            if (msg.SequenceChannel == 0)
                            {
                                // server sent a position update
                                long who = msg.ReadInt64();
                                float x = msg.ReadFloat();
                                float y = msg.ReadFloat();
                                int playerNum = msg.ReadInt32();

                                foreach (var p in allPlayers)
                                {

                                    if (who == p.getId())
                                    {
                                        if (p.getId() != player.getId())
                                        {
                                            float xDiff = Math.Abs(x - p.getPos().X);
                                            float yDiff = Math.Abs(y - p.getPos().Y);

                                            if (xDiff <= 5)
                                            {
                                                p.setMoveX(0);
                                            }
                                            else if (x > p.getPos().X)
                                            {
                                                p.setMoveX(1);
                                            }
                                            else if (x < p.getPos().X)
                                            {
                                                p.setMoveX(-1);
                                            }

                                            if (y == p.getPos().Y)
                                            {
                                                p.setMoveY(0);
                                            }
                                            else if (y > p.getPos().Y)
                                            {
                                                p.setMoveY(1);
                                            }
                                            else
                                            {
                                                p.setMoveY(-1);
                                            }

                                        }
                                    }

                                }

                                positions[who] = new Vector2(x, y);

                            }
                            if (msg.SequenceChannel == 1)
                            {

                                //cookies.Clear();
                                float x = msg.ReadFloat();
                                float y = msg.ReadFloat();
                                int id = msg.ReadInt32();

                                foreach (var c in cookies)
                                {
                                    if (c.getId() == id)
                                    {
                                        cookieFound = true;
                                    }

                                }
                                if (cookieFound == false)
                                {
                                    Object newCookie = new Object(cookieImage, x, y, id);
                                    cookies.Add(newCookie);
                                }
                            }
                            else if (msg.SequenceChannel == 2)
                            {
                                int cookieId = msg.ReadInt32();
                                List<Object> deleteCookies = new List<Object>(cookies);

                                foreach (var c in deleteCookies)
                                {
                                    if (c.getId() == cookieId)
                                    {
                                        cookies.Remove(c);
                                    }

                                }
                            }
                            else if (msg.SequenceChannel == 4)
                            {
                                remoteLevel = msg.ReadInt32();
                                if (localLevel != remoteLevel)
                                {
                                    localLevel = remoteLevel;
                                    Thread.Sleep(2000);
                                }
                            }

                            break;
                    }
                }

                textbox.Update(gameTime);
                base.Update(gameTime);

            }
        }
 public MyClass()
 {
     sfd = new SomeFunctionDelegate(this.SomeFunction);
 }