protected override void OnLoad()
        {
            base.OnLoad();

            MMW.FindGameComponent <BackgroundScript>().Trans(new Color4(148, 222, 148, 255), 0.25);

            input       = new MenuInputResolver();
            input.Up    = Key.W;
            input.Down  = Key.S;
            input.Right = Key.D;
            input.Left  = Key.A;

            transit = new TransitControl();
            transit.LocalLocation = new Vector2(MMW.ClientSize.Width * 2.0f, 0);
            transit.Size          = new Vector2(MMW.ClientSize.Width, MMW.ClientSize.Height);
            transit.Target        = Vector2.Zero;

            var label = new Label()
            {
                Parent        = transit,
                Alignment     = ContentAlignment.TopCenter,
                Text          = "WORLD SELECT",
                Font          = new Font("Yu Gothic UI Light", 40.0f),
                LocalLocation = new Vector2(0.0f, 32.0f),
            };

            Controls.Add(label);

            var frame = new SelectWorldFrame(transit, MMW.ClientSize.Height - 120 - 100, new Vector2((MMW.ClientSize.Width - 760) * 0.5f, 120));

            Controls.Add(frame);
            foreach (var desc in MMW.GetAsset <UserData>().SignupServers)
            {
                frame.AddWorld(desc);
            }

            var signupBtn = new Button(frame, "SignUp World", new Vector2(70, MMW.ClientSize.Height - 120 - 100 + 20), new Vector2(140, 32), "click");

            Controls.Add(signupBtn);

            var editBtn = new Button(signupBtn, "Edit", new Vector2(160, 0), new Vector2(140, 32), "click");

            editBtn.Enabled = false;
            Controls.Add(editBtn);

            var delBtn = new Button(editBtn, "Delete", new Vector2(160, 0), new Vector2(140, 32), "click");

            delBtn.Enabled = false;
            Controls.Add(delBtn);

            var directBtn = new Button(delBtn, "Direct Connect", new Vector2(160, 0), new Vector2(140, 32), "click");

            Controls.Add(directBtn);

            signupBtn.Clicked += (s, b) =>
            {
                if (!signupBtn.Enabled)
                {
                    return;
                }
                trans          = true;
                transit.Target = new Vector2(-MMW.ClientSize.Width * 2.0f, 0.0f);
                GameObject.AddComponent <SignUpServerScript>();
            };

            editBtn.Clicked += (s, b) =>
            {
                if (!editBtn.Enabled)
                {
                    return;
                }
                trans          = true;
                transit.Target = new Vector2(-MMW.ClientSize.Width * 2.0f, 0.0f);
                GameObject.AddComponent <ServerEditScript>(frame.WorldInfo);
            };

            delBtn.Clicked += (s, b) =>
            {
                if (!delBtn.Enabled)
                {
                    return;
                }
                var res = System.Windows.Forms.MessageBox.Show(System.Windows.Forms.NativeWindow.FromHandle(MMW.Window.WindowInfo.Handle), "よろしいですか?\n(サーバ元のワールドは削除されません)", "ワールドを削除", System.Windows.Forms.MessageBoxButtons.OKCancel);
                if (res == System.Windows.Forms.DialogResult.OK)
                {
                    MMW.GetAsset <UserData>().SignupServers.Remove(frame.WorldInfo);
                    frame.RemoveWorld(frame.WorldInfo);
                    frame.WorldInfo = null;
                    editBtn.Enabled = false;
                    delBtn.Enabled  = false;
                }
            };

            directBtn.Clicked += (s, b) =>
            {
                if (!directBtn.Enabled)
                {
                    return;
                }
                trans          = true;
                transit.Target = new Vector2(-MMW.ClientSize.Width * 2.0f, 0.0f);
                GameObject.AddComponent <DirectConnectScript>();
            };

            frame.ServerClicked += (s, e) =>
            {
                editBtn.Enabled = true;
                delBtn.Enabled  = true;
            };
            frame.ServerSelected += (s, e) =>
            {
                MMW.GetAsset <Sound>("click").Play();
                var desc = frame.WorldInfo;
                Task.Factory.StartNew(() =>
                {
                    AcceptInput = false;
                    Thread.Sleep(100);

                    var server = NetworkUtil.Connect(desc.HostName, desc.Port);
                    if (server == null)
                    {
                        return;
                    }

                    server.Load();

                    var info = server.RequestJson <WorldInfo>(DataType.RequestWorldInfo, 1, DataType.ResponseWorldInfo, 3000);

                    if (info == null || info.GameType != 1 || (int)info.Version != (int)MMW.GetAsset <GameData>().Version)
                    {
                        AcceptInput = true;
                    }
                    else
                    {
                        MMW.Invoke(() =>
                        {
                            MMW.RegistAsset(server);
                            trans          = true;
                            transit.Target = new Vector2(-MMW.ClientSize.Width * 2.0f, 0.0f);
                            GameObject.AddComponent <ServerInfoScript>(info);
                        });
                    }
                });
            };
        }
예제 #2
0
        protected override void OnLoad()
        {
            base.OnLoad();

            MMW.FindGameComponent <BackgroundScript>().Trans(new Color4(148, 222, 148, 255), 0.25);

            input       = new MenuInputResolver();
            input.Up    = Key.W;
            input.Down  = Key.S;
            input.Right = Key.D;
            input.Left  = Key.A;

            transit = new TransitControl();
            transit.LocalLocation = new Vector2(MMW.ClientSize.Width * 2.0f, 0);
            transit.Size          = new Vector2(MMW.ClientSize.Width, MMW.ClientSize.Height);
            transit.Target        = Vector2.Zero;

            var label = new Label()
            {
                Parent        = transit,
                Alignment     = ContentAlignment.TopCenter,
                Text          = "DIRECT CONNECT",
                Font          = new Font("Yu Gothic UI Light", 40.0f),
                LocalLocation = new Vector2(0.0f, 32.0f),
            };

            Controls.Add(label);

            var labelHost = new Label(transit, "Host", new Vector2(MMW.Width * 0.5f - 160.0f, 300.0f + 2.0f));

            Controls.Add(labelHost);
            var labelPort = new Label(labelHost, "Port", new Vector2(0, 50.0f));

            Controls.Add(labelPort);

            var textBoxHost = new TextBox2(transit, "localhost", new Vector2(MMW.Width * 0.5f - 100.0f, 300.0f), new Vector2(360.0f, 32.0f));

            textBoxHost.MaxLength = 64;
            Controls.Add(textBoxHost);

            var textBoxPort = new TextBox2(textBoxHost, "39393", new Vector2(0, 50.0f), new Vector2(72.0f, 32.0f));

            textBoxPort.MaxLength = 5;
            Controls.Add(textBoxPort);

            var backBtn = new Button(transit, "Back", new Vector2(-70.0f - 20.0f, 440.0f), "back");

            backBtn.Alignment = ContentAlignment.TopCenter;
            backBtn.Clicked  += (s, e) =>
            {
                trans          = true;
                transit.Target = new Vector2(-MMW.ClientSize.Width * 2.0f, 0.0f);
                GameObject.AddComponent <ServerSelectScript>();
            };
            Controls.Add(backBtn);

            var labelInfo = new Label(transit, "", new Vector2(0.0f, 500.0f));

            labelInfo.Alignment = ContentAlignment.TopCenter;
            Controls.Add(labelInfo);

            var connectBtn = new Button(transit, "Connect", new Vector2(70.0f + 20.0f, 440.0f), "click");

            connectBtn.Alignment = ContentAlignment.TopCenter;
            connectBtn.Clicked  += (s, e) =>
            {
                AcceptInput = false;

                labelInfo.Brush = Brushes.White;
                labelInfo.Text  = "Connecting...";

                var host = textBoxHost.Text;
                var port = int.Parse(textBoxPort.Text);

                Task.Factory.StartNew(() =>
                {
                    Thread.Sleep(100);
                    var server = NetworkUtil.Connect(host, port);

                    if (server == null)
                    {
                        labelInfo.Brush = Brushes.Red;
                        labelInfo.Text  = "Host not Found.";
                        AcceptInput     = true;
                    }
                    else
                    {
                        labelInfo.Text = "Downloading World info...";

                        var info = server.RequestJson <WorldInfo>(DataType.RequestWorldInfo, 1, DataType.ResponseWorldInfo, 5000);

                        if (info.GameType != 1)
                        {
                            labelInfo.Brush = Brushes.Red;
                            labelInfo.Text  = "Host not Found.";
                            AcceptInput     = true;
                        }
                        else if ((int)info.Version != (int)MMW.GetAsset <GameData>().Version)
                        {
                            labelInfo.Brush = Brushes.Red;
                            labelInfo.Text  = $"Wrong version. Host ver.{info.Version:0.0}";
                            AcceptInput     = true;
                        }
                        else
                        {
                            MMW.Invoke(() =>
                            {
                                trans          = true;
                                transit.Target = new Vector2(-MMW.ClientSize.Width * 2.0f, 0.0f);
                                GameObject.AddComponent <ServerInfoScript>(server, info);
                            });
                        }
                    }
                });
            };
            Controls.Add(connectBtn);
        }