1// ================== 2// MULTIPLAYER MENU 3// ================== 4 5component cmpAdr extends panel { 6{ 7 size "350 25" 8} 9 string adr { pos "30 1" size "300 20" tooltip "_Connect to this server" 10 onClick { cmd "server_info *cvar:adr<node:parent@num>;" } 11 onRClick { cmd "set adr<node:parent@num> \"\"; check_bookmarks;" } 12 } 13 button resetadr { pos "0 1" size "22 22" icon "icons/garbage" tooltip "_Delete this bookmark" 14 onClick { cmd "set adr<node:parent@num> \"\"; check_bookmarks;" } 15 onRClick { cmd "set adr<node:parent@num> \"\"; check_bookmarks;" } 16 } 17} 18 19window multiplayer 20{ 21 confunc mn_push_multiplayer 22 { 23 cmd "game_setmode multiplayer; ui_push mp_serverbrowser;" 24 *cvar:mn_multiplayer_tab = 1 25 } 26 27 /** 28 * @param <1> window id 29 * @param <2> name 30 */ 31 confunc game_addmode_multiplayer 32 { 33 // TODO: use this to support several multiplayer game types 34 } 35 36 /** @brief prevent pushing this menu */ 37 func onWindowOpened 38 { 39 cmd "ui_pop;" 40 call *node:root.mn_push_multiplayer 41 } 42} 43 44window abstract_multiplayer 45{ 46 /** @todo Remove me */ 47 { } // empty properties to fix parsing problem with "image" token (behaviour or property?) 48 49 // ================== 50 // background 51 // ================== 52 53 image background 54 { 55 src "background/options_bg" 56 } 57 58 // ================== 59 // main navigation 60 // ================== 61 62 cmpMenuButton button_team 63 { 64 string "_Team" 65 pos "80 160" 66 onClick { cmd "ui_pop;ui_push multiplayer_team;" } 67 } 68 69 cmpMenuButton button_join 70 { 71 string "_Join" 72 pos "80 230" 73 onClick { cmd "ui_pop; ui_push mp_serverbrowser;" } 74 } 75 76 cmpMenuButton button_create 77 { 78 string "_Create" 79 pos "80 300" 80 onClick { cmd "ui_pop; ui_push mp_create_server;" } 81 } 82 83 cmpMenuButton button_lobby 84 { 85 string "_Lobby" 86 pos "80 385" 87 onClick { cmd "irc_connect; ui_push irc;" } 88 } 89 90 cmpMenuButton button_exit 91 { 92 string "_Back" 93 pos "80 470" 94 onClick { cmd "ui_pop;" } 95 } 96} 97 98// ===================== 99// MP TEAM MENU 100// ===================== 101window multiplayer_team extends abstract_multiplayer 102{ 103 cmpTeamPanel content 104 { 105 { 106 pos "482 100" 107 size "480 350" 108 } 109 } 110 111 func onWindowActivate 112 { 113 cmd "game_teamcomments;" 114 } 115 116 func onWindowOpened 117 { 118 cmd "game_teamcomments;define cl_teamdef phalanx;" 119 } 120} 121 122window abstract_multiplayer_join extends abstract_multiplayer { 123 // ================== 124 // main navigation 125 // ================== 126 127 tab join_navigation { 128 { 129 pos "462 73" 130 size "486 40" 131 cvar *cvar:mn_multiplayer_tab 132 onChange { 133 if ( *cvar:mn_multiplayer_tab == 1 ) { 134 cmd "ui_pop;ui_push mp_serverbrowser;" 135 } elif ( *cvar:mn_multiplayer_tab == 2 ) { 136 137 } elif ( *cvar:mn_multiplayer_tab == 3 ) { 138 cmd "ui_pop;ui_push mp_bookmarks;" 139 } elif ( *cvar:mn_multiplayer_tab == 4 ) { 140 cmd "irc_connect; ui_push irc;" 141 } 142 } 143 } 144 option internet { 145 label "_Internet/Lan" 146 value "1" 147 } 148/* option lan { 149 label "_Lan" 150 value "2" 151 } 152*/ 153 option bookmark { 154 label "_Bookmark" 155 value "3" 156 } 157/* 158 option bookmark { 159 label "_Lobby" 160 value "4" 161 } 162*/ 163 } 164} 165 166// ================== 167// SERVER INFO 168// ================== 169window serverinfo 170{ 171 /** @todo Remove me */ 172 { } // empty properties to fix parsing problem with "image" token (behaviour or property?) 173 174 image background 175 { 176 src "background/multiplayer_bg" 177 } 178 179 text server_info 180 { 181 dataid TEXT_STANDARD 182 pos "500 200" 183 size "420 490" 184 lineheight 20 185 tabwidth 250 186 rows "24" 187 } 188 189 string user_list_str 190 { 191 string "_Userlist" 192 pos "50 115" 193 size "300 20" 194 color "1 1 1 1" 195 font "f_normal_bold" 196 contentalign ALIGN_CC 197 } 198 string user_list_head1 199 { 200 string "_Name" 201 pos "50 135" 202 size "150 20" 203 color "1 1 1 1" 204 font "f_verysmall" 205 contentalign ALIGN_UL 206 } 207 string user_list_head2 208 { 209 string "_Team" 210 pos "200 135" 211 size "150 20" 212 color "1 1 1 1" 213 font "f_verysmall" 214 contentalign ALIGN_UL 215 } 216 text user_list 217 { 218 dataid TEXT_LIST 219 pos "50 170" 220 size "300 380" 221 lineheight 20 222 tabwidth 200 223 font "f_verysmall" 224 mousefx true 225 border 3 226 bordercolor "0 0.5 0 1" 227 padding 10 228 bgcolor "0.3 0.3 0.3 0.4" 229 rows "19" 230 } 231 232 string mapstring 233 { 234 string *cvar:mn_svmapname 235 font "f_menubig" 236 color "1 1 1 1" 237 pos "500 110" 238 size "300 35" 239 } 240 241 image mappic 242 { 243 src *cvar:mn_mappic 244 pos "800 80" 245 texl "0 0" 246 texh "128 96" 247 } 248 249 cmpMenuButton button_connect 250 { 251 string "_Connect" 252 pos "70 580" 253 onClick { cmd "connect *cvar:mn_server_ip;" } 254 } 255 256 button button_exit 257 { 258 tooltip "_Leave Serverbrowser" 259 background "buttons/large_blue" 260 pos "26 720" 261 size "64 37" 262 flipicon true 263 icon "icons/return" 264 onClick { cmd "ui_pop; pingservers;" } 265 } 266 267 button button_favorite 268 { 269 string "_Bookmark" 270 tooltip "_Add server to bookmarks" 271 pos "150 720" 272 size "178 35" 273 background "ui/button_blue" 274 font "f_normal_bold" 275 color "1 1 1 0.8" 276 selectcolor "1 1 1 1" 277 onClick { cmd "bookmark_add;" } 278 } 279 280 func onWindowOpened 281 { 282 } 283 284 func onWindowClosed 285 { 286 cmd "pingservers; check_bookmarks;" 287 } 288} 289 290// ================== 291// JOIN LAN MENU 292// ================== 293window mp_serverbrowser extends abstract_multiplayer_join 294{ 295 timer event { 296 timeout 60000 297 onEvent { 298 cmd "pingservers refresh;" 299 } 300 } 301 302 func set_mn_serverliststr_from_id { 303 if (<1> == 0) { 304 *cvar:mn_serverliststr = "_All" 305 } elif (<1> == 1) { 306 *cvar:mn_serverliststr = "_Free" 307 } elif (<1> == 2) { 308 *cvar:mn_serverliststr = "_Playing" 309 } else { 310 *cvar:mn_serverliststr = "_Invalid" 311 } 312 } 313 314 panel content { 315 { 316 pos "415 120" 317 size "608 768" 318 } 319 320 string status_str 321 { 322 string "_Serverfilter:" 323 pos "150 7" 324 size "150 20" 325 } 326 string status_value 327 { 328 string *cvar:mn_serverliststr 329 pos "300 7" 330 size "150 20" 331 contentalign ALIGN_UC 332 } 333 button status_dec 334 { 335 pos "455 7" 336 size "16 16" 337 icon "icons/prev" 338 onClick { 339 *cvar:cl_serverlist = ((*cvar:cl_serverlist - 1) % 3) 340 if ( *cvar:cl_serverlist < 0 ) { 341 *cvar:cl_serverlist = 2 342 } 343 call *node:root.set_mn_serverliststr_from_id( *cvar:cl_serverlist ) 344 cmd "pingservers refresh;" 345 } 346 } 347 button status_inc 348 { 349 pos "470 7" 350 size "16 16" 351 icon "icons/next" 352 onClick { 353 *cvar:cl_serverlist = ((*cvar:cl_serverlist + 1) % 3) 354 call *node:root.set_mn_serverliststr_from_id( *cvar:cl_serverlist ) 355 cmd "pingservers refresh;" 356 } 357 } 358 359 // ==================== 360 // lan / inet buttons 361 // ==================== 362 363 // servers_click is CL_ServerListClick_f in cl_main.c 364 /* textlist using tabbed text */ 365 text servers 366 { 367 pos "65 40" 368 width "430" 369 lineheight 20 370 tabwidth 48 371 font "f_verysmall" 372 mousefx true 373 border 3 374 bordercolor "0 0.5 0 1" 375 padding 10 376 bgcolor "0.3 0.3 0.3 0.4" 377 rows "22" 378 dataid TEXT_LIST 379 onClick { cmd "servers_click <lineselected>;" } 380 onRClick { cmd "pingservers;" } 381 onViewChange { 382 *node:root.content.servers_scroll@fullsize = <fullsize> 383 *node:root.content.servers_scroll@current = <viewpos> 384 *node:root.content.servers_scroll@viewsize = <viewsize> 385 } 386 } 387 388 vscrollbar servers_scroll { 389 image "ui/scrollbar_v_green" 390 pos "500 40" 391 height "440" 392 current 0 393 viewsize 22 394 fullsize 22 395 onChange { *node:parent.servers@viewpos = <current> } 396 } 397 398 button button_serverbrowser_refresh 399 { 400 string "_Refresh" 401 background "ui/button_green_small" 402 color "0 0.8 0 1" 403 font "f_small" 404 pos "335 490" 405 size "176 32" 406 onClick { cmd "pingservers refresh;" } 407 } 408 409 // ================== 410 // nickname 411 // ================== 412/* 413 string current_name 414 { 415 string "_Name:" 416 pos "65 455" 417 size "256 20" 418 } 419 420 textentry slot_name 421 { 422 string *cvar:cl_name 423 background "ui/button_green_verysmall" 424 color "0 .78 0 1" 425 selectcolor "1 1 1 1" 426 contentalign ALIGN_CL 427 padding 8 428 font "f_verysmall" 429 pos "65 475" 430 size "256 34" 431 } 432*/ 433 434 // =================== 435 // connect_to_ip 436 // =================== 437 string current_inet_connect_to_ip 438 { 439 string "_Connect to IP" 440 pos "65 520" 441 size "256 20" 442 } 443 444 textentry slot_ip 445 { 446 string *cvar:mn_server_ip 447 background "ui/button_green_verysmall" 448 color "0 .78 0 1" 449 selectcolor "1 1 1 1" 450 contentalign ALIGN_CL 451 padding 8 452 font "f_verysmall" 453 pos "65 540" 454 size "256 34" 455 } 456 button button_inet_connect_to_ip 457 { 458 string "_Connect" 459 background "ui/button_green_small" 460 color "0 0.8 0 1" 461 font "f_small" 462 pos "335 540" 463 size "176 32" 464 onClick { cmd "server_info *cvar:mn_server_ip;" } 465 } 466 } 467 468 // ==================== 469 // init 470 // ==================== 471 func onWindowOpened 472 { 473 *cvar:cl_serverlist = 0 474 cmd "pingservers refresh;" 475 call *node:root.set_mn_serverliststr_from_id( *cvar:cl_serverlist ) 476 } 477} 478 479// ================== 480// INTERNET MENU 481// ================== 482 483window mp_bookmarks extends abstract_multiplayer_join 484{ 485 panel content { 486 { 487 pos "470 120" 488 size "470 580" 489 } 490 491 // ==================== 492 // lan / inet buttons 493 // ==================== 494 495 string inet_bookmarks 496 { 497 string "_Bookmarks" 498 font "f_menubig" 499 color "0 0.5 0 1" 500 pos "15 30" 501 size "440 35" 502 contentalign ALIGN_UC 503 } 504 505 rows lines { 506 pos "90 95" 507 size "310 480" 508 color1 "0 0.08 0 1" 509 color2 "0 0.16 0 1" 510 lineheight 30 511 } 512 cmpAdr adr0 { pos "95 100" num 0 } 513 cmpAdr adr1 { pos "95 130" num 1 } 514 cmpAdr adr2 { pos "95 160" num 2 } 515 cmpAdr adr3 { pos "95 190" num 3 } 516 cmpAdr adr4 { pos "95 220" num 4 } 517 cmpAdr adr5 { pos "95 250" num 5 } 518 cmpAdr adr6 { pos "95 280" num 6 } 519 cmpAdr adr7 { pos "95 310" num 7 } 520 cmpAdr adr8 { pos "95 340" num 8 } 521 cmpAdr adr9 { pos "95 370" num 9 } 522 cmpAdr adr10 { pos "95 400" num 10 } 523 cmpAdr adr11 { pos "95 430" num 11 } 524 cmpAdr adr12 { pos "95 460" num 12 } 525 cmpAdr adr13 { pos "95 490" num 13 } 526 cmpAdr adr14 { pos "95 520" num 14 } 527 cmpAdr adr15 { pos "95 550" num 15 } 528 } 529 530 confunc check_bookmarks { 531 *cvar:i = 0 532 while ( *cvar:i <= 15 ) { 533 if ( *cvar:adr<cvar:i> ne "" ) { 534 *node:root.content.adr<cvar:i>.resetadr@invis = false 535 *node:root.content.adr<cvar:i>.adr@invis = false 536 *node:root.content.adr<cvar:i>.adr@string = *cvar:adr<cvar:i> 537 } else { 538 *node:root.content.adr<cvar:i>.resetadr@invis = true 539 *node:root.content.adr<cvar:i>.adr@invis = true 540 } 541 *cvar:i = ( *cvar:i + 1 ) 542 } 543 delete *cvar:i 544 } 545 546 func onWindowOpened { 547 cmd "check_bookmarks;" 548 } 549} 550 551// ================== 552// SERVER MENU 553// ================== 554 555window mp_create_server extends abstract_multiplayer 556{ 557 tab create_natigation { 558 { 559 pos "462 200" 560 size "500 40" 561 cvar *cvar:mn_server_config_tab 562 onChange { 563 call *node:root.mp_update_config_navigation 564 } 565 } 566 option map { 567 label "_Map" 568 value "1" 569 } 570 option option { 571 label "_Options" 572 value "2" 573 } 574 option security { 575 label "_Security/registration" 576 value "3" 577 } 578 } 579 580 panel panel_main { 581 { 582 pos "415 80" 583 size "608 100" 584 } 585 586 // =================== 587 // HOSTNAME 588 // =================== 589 string current_hostname 590 { 591 string "_Hostname:" 592 pos "85 5" 593 size "256 20" 594 } 595 textentry slot_hostname 596 { 597 string *cvar:sv_hostname 598 background "ui/button_green_verysmall" 599 color "0 .78 0 1" 600 selectcolor "1 1 1 1" 601 contentalign ALIGN_CL 602 padding 8 603 font "f_verysmall" 604 pos "245 0" 605 size "256 34" 606 } 607 608 // =================== 609 // GAME TYPE 610 // =================== 611 string gametype_str 612 { 613 string "_Gametype:" 614 pos "85 40" 615 size "280 20" 616 } 617 selectbox gametype_selector 618 { 619 dataid TEXT_LIST 620 cvar *cvar:sv_gametype 621 pos "245 40" 622 size "256 215" 623 lineheight "20" 624 contentalign ALIGN_UC 625 onChange { 626 cmd "mp_updategametype;mn_getmaps;" 627 } 628 } 629 630 // =================== 631 // TEAMPLAY 632 // =================== 633 string server_teamplay_str 634 { 635 string "_Teamplay:" 636 pos "85 70" 637 size "280 20" 638 } 639 checkbox_blue server_teamplay_value 640 { 641 current *cvar:sv_teamplay 642 pos "245 70" 643 size "20 18" 644 } 645 } 646 647 cmpMapPanel panel_map { 648 { 649 pos "495 270" 650 size "475 370" 651 } 652 653 // =================== 654 // GAMETYPE 655 // =================== 656 657 string allowedtype_label 658 { 659 string "_Allowed gametype:" 660 pos "10 245" 661 size "256 20" 662 } 663 664 textlist list_gametypes_text 665 { 666 dataid TEXT_LIST2 667 pos "190 245" 668 size "230 115" 669 font "f_verysmall" 670 longlines LONGLINES_WRAP 671 onViewChange { 672 *node:parent.list_gametypes_scroll@fullsize = <fullsize> 673 *node:parent.list_gametypes_scroll@viewsize = <viewsize> 674 *node:parent.list_gametypes_scroll@current = <viewpos> 675 } 676 } 677 678 vscrollbar list_gametypes_scroll { 679 image "ui/scrollbar_v_green" 680 pos "420 245" 681 height "115" 682 hidewhenunused true 683 onChange { 684 *node:parent.list_gametypes_text@viewpos = <current> 685 } 686 } 687 } 688 689 panel panel_option { 690 { 691 pos "475 260" 692 size "460 350" 693 } 694 695 // =================== 696 // MORALE 697 // =================== 698 string morale_str 699 { 700 string "_Enable morale states:" 701 pos "25 0" 702 size "300 20" 703 } 704 checkbox_blue morale_value 705 { 706 current *cvar:sv_enablemorale 707 pos "350 1" 708 size "20 18" 709 } 710 // ======================= 711 // ALIEN RUSH 712 // ======================= 713 string alienrush_str 714 { 715 string "_Alien rush:" 716 pos "25 25" 717 size "250 20" 718 tooltip "_Enemies respawn when killed." 719 visiblewhen "*cvar:ai_multiplayeraliens >= 1" 720 } 721 checkbox_blue alienrush_value 722 { 723 current *cvar:g_endlessaliens 724 pos "350 26" 725 size "20 18" 726 visiblewhen "*cvar:ai_multiplayeraliens >= 1" 727 } 728 729 // =================== 730 // MAXCLIENTS 731 // =================== 732 string maxclients_str 733 { 734 string "_Max. clients:" 735 tooltip "_Sets the max allowed clients to connect" 736 pos "25 70" 737 size "300 20" 738 } 739 string maxclients_value 740 { 741 string *cvar:sv_maxclients 742 pos "335 70" 743 size "50 20" 744 contentalign ALIGN_UC 745 } 746 spinner_blue maxclients_change 747 { 748 current *cvar:sv_maxclients 749 pos "390 70" 750 min 2 751 max 16 752 delta 1 753 } 754 755 // =================== 756 // MAXSOLDIER PER TEAM 757 // =================== 758 string maxperplayer_str 759 { 760 string "_Max. soldiers per team:" 761 tooltip "_Sets the max allowed soldiers per team" 762 pos "25 90" 763 size "300 20" 764 } 765 string maxperplayer_value 766 { 767 string *cvar:sv_maxsoldiersperteam 768 pos "335 90" 769 size "50 20" 770 contentalign ALIGN_UC 771 } 772 spinner_blue maxperplayer_change 773 { 774 current *cvar:sv_maxsoldiersperteam 775 pos "390 90" 776 min 1 777 max 12 778 delta 1 779 } 780 781 // ===================== 782 // MAXSOLDIER PER PLAYER 783 // ===================== 784 string maxsoldierperplayer_str 785 { 786 string "_Max. soldiers per player:" 787 tooltip "_Sets the max allowed soldiers per player when in teamplay" 788 pos "25 110" 789 size "300 20" 790 } 791 string maxsoldierperplayer_value 792 { 793 string *cvar:sv_maxsoldiersperplayer 794 pos "335 110" 795 size "50 20" 796 contentalign ALIGN_UC 797 } 798 spinner_blue maxsoldierperplayer_change 799 { 800 current *cvar:sv_maxsoldiersperplayer 801 pos "390 110" 802 min 1 803 max 12 804 delta 1 805 } 806 807 // =================== 808 // MAX PLAYER PER TEAM 809 // max is half of sv_maxclients 810 // =================== 811 string server_maxplayerperteam_str 812 { 813 string "_Max. human players per team:" 814 pos "25 130" 815 size "300 20" 816 } 817 string server_maxplayerperteam_value 818 { 819 string *cvar:sv_maxplayersperteam 820 pos "335 130" 821 size "50 20" 822 contentalign ALIGN_UC 823 } 824 spinner_blue maxplayersperteam_change 825 { 826 current *cvar:sv_maxplayersperteam 827 pos "390 130" 828 min 1 829 max 8 830 delta 1 831 } 832 833 // =================== 834 // AI_NUMACTORS 835 // =================== 836 string ai_multiplayeraliens_str 837 { 838 string "_Max. AI actors:" 839 tooltip "_Max AI actors for teamplay mode" 840 pos "25 150" 841 size "300 20" 842 } 843 string ai_multiplayeraliens_value 844 { 845 string *cvar:ai_multiplayeraliens 846 pos "335 150" 847 size "50 20" 848 contentalign ALIGN_UC 849 } 850 spinner_blue ai_multiplayeraliens_change 851 { 852 current *cvar:ai_multiplayeraliens 853 pos "390 150" 854 min 0 855 max 8 856 delta 1 857 } 858 859 // TODO: Allow to set this to 0 to deactivate the round time limit 860 // =================== 861 // ROUND TIMELIMIT 862 // =================== 863 string timelimit_str 864 { 865 string "_Round time limit in seconds:" 866 pos "25 170" 867 size "250 20" 868 } 869 string timelimit_value 870 { 871 string *cvar:sv_roundtimelimit 872 pos "335 170" 873 size "50 20" 874 contentalign ALIGN_UC 875 } 876 spinner_blue timelimit_change 877 { 878 current *cvar:sv_roundtimelimit 879 pos "390 170" 880 min 30 881 max 500 882 delta 5 883 } 884 } 885 886 panel panel_security { 887 { 888 pos "415 250" 889 size "608 768" 890 } 891 892 // ===================== 893 // PUBLIC - MASTERSERVER 894 // ===================== 895 string public_str 896 { 897 string "_Make this server public:" 898 pos "85 20" 899 size "280 20" 900 } 901 checkbox_blue public_value 902 { 903 current *cvar:sv_public 904 pos "410 20" 905 size "20 18" 906 } 907 908 // =================== 909 // SERVER_PASSWORD 910 // =================== 911 string current_server_pwd 912 { 913 string "_Server-Password:" 914 pos "85 80" 915 size "256 20" 916 } 917 textentry slot_server_pwd 918 { 919 string *cvar:password 920 background "ui/button_green_verysmall" 921 color "0 .78 0 1" 922 selectcolor "1 1 1 1" 923 contentalign ALIGN_CL 924 padding 8 925 font "f_verysmall" 926 pos "245 75" 927 size "256 34" 928 ispassword true 929 } 930 931 // =================== 932 // RCON_PASSWORD 933 // =================== 934 string current_rcon_pwd 935 { 936 string "_RCON-Password:" 937 pos "85 140" 938 size "256 20" 939 } 940 textentry slot_rcon_pwd 941 { 942 string *cvar:rcon_password 943 background "ui/button_green_verysmall" 944 color "0 .78 0 1" 945 selectcolor "1 1 1 1" 946 contentalign ALIGN_CL 947 padding 8 948 font "f_verysmall" 949 pos "245 135" 950 size "256 34" 951 ispassword true 952 } 953 954 } 955 956 // =================== 957 // FIREWALL TEST 958 // =================== 959 960 /** @todo fix it, it can't support string property */ 961 text firewall_str 962 { 963 string "_Make sure that you've opened the TCP port 27910 in your firewall settings" 964 pos "500 530" 965 size "400 100" 966 longlines LONGLINES_WRAP 967 contentalign ALIGN_UC 968 font "f_small" 969 dataid TEXT_STANDARD 970 } 971 972 // ==================== 973 // create_server button 974 // ==================== 975 976 cmpMenuButton button_server 977 { 978 string "_Start server" 979 pos "570 630" 980 onClick { cmd "mp_startserver;" } 981 } 982 983 // =================== 984 // Interaction 985 // =================== 986 987 func mp_update_config_navigation { 988 *node:root.panel_map@invis = true 989 *node:root.panel_option@invis = true 990 *node:root.panel_security@invis = true 991 if ( *cvar:mn_server_config_tab == 1 ) { 992 *node:root.panel_map@invis = false 993 } 994 elif ( *cvar:mn_server_config_tab == 2 ) { 995 *node:root.panel_option@invis = false 996 } 997 elif ( *cvar:mn_server_config_tab == 3 ) { 998 *node:root.panel_security@invis = false 999 } 1000 } 1001 1002 func onWindowOpened 1003 { 1004 cmd "killserver;set sv_maxplayersperteam 8;set sv_roundtimelimit 0;set mn_serverday 1;" 1005 cmd "mp_init_ui;mn_getmaps;" 1006 *cvar:mn_server_config_tab = 1 1007 call *node:root.mp_update_config_navigation 1008 cmd "ui_resetdata TEXT_STANDARD;" 1009 cmd "define g_endlessaliens 0;" 1010 } 1011} 1012 1013// =========================================== 1014// MULTIPLAYER TEAM SELECTION AND WAIT DIALOG 1015// =========================================== 1016window multiplayer_wait extends levelbuttons 1017{ 1018 { 1019 fill true 1020 starlayout true 1021 } 1022 1023 timer event { 1024 timeout 2000 1025 // update every 2 sec 1026 onEvent { 1027 cmd "mp_selectteam_init;" 1028 } 1029 } 1030 1031 battlescape render { 1032 pos "0 0" 1033 size "1024 768" 1034 align LAYOUTALIGN_FILL 1035 } 1036 1037 todo widescreen { pos "80 370" string "Center panels"} 1038 1039 panel floor { 1040 { 1041 pos "0 128" 1042 size "40 346" 1043 align LAYOUTALIGN_LEFT 1044 excluderect { pos "0 0" size "40 4" } 1045 excluderect { pos "6 341" size "35 6" } 1046 excluderect { pos "32 333" size "8 8" } 1047 } 1048 1049 image bar_floor 1050 { 1051 src "hud/bar_floor" 1052 pos "0 0" 1053 size "40 346" 1054 texh "40 346" 1055 ghost true 1056 } 1057 1058 radiobutton bt0 1059 { 1060 tooltip "_Level 1" 1061 pos "6 293" 1062 size "27 35" 1063 background "buttons/blue2-1" 1064 value 0 1065 cvar *cvar:cl_worldlevel 1066 icon "icons/number_1" 1067 } 1068 1069 radiobutton bt1 1070 { 1071 tooltip "_Level 2" 1072 pos "6 253" 1073 size "27 35" 1074 background "buttons/blue2-1" 1075 value 1 1076 cvar *cvar:cl_worldlevel 1077 icon "icons/number_2" 1078 } 1079 1080 radiobutton bt2 1081 { 1082 tooltip "_Level 3" 1083 pos "6 213" 1084 size "27 35" 1085 background "buttons/blue2-1" 1086 value 2 1087 cvar *cvar:cl_worldlevel 1088 icon "icons/number_3" 1089 } 1090 1091 radiobutton bt3 1092 { 1093 tooltip "_Level 4" 1094 pos "6 173" 1095 size "27 35" 1096 background "buttons/blue2-1" 1097 value 3 1098 cvar *cvar:cl_worldlevel 1099 icon "icons/number_4" 1100 } 1101 1102 radiobutton bt4 1103 { 1104 tooltip "_Level 5" 1105 pos "6 133" 1106 size "27 35" 1107 background "buttons/blue2-1" 1108 value 4 1109 cvar *cvar:cl_worldlevel 1110 icon "icons/number_5" 1111 } 1112 1113 radiobutton bt5 1114 { 1115 tooltip "_Level 6" 1116 pos "6 93" 1117 size "27 35" 1118 background "buttons/blue2-1" 1119 value 5 1120 cvar *cvar:cl_worldlevel 1121 icon "icons/number_6" 1122 } 1123 1124 radiobutton bt6 1125 { 1126 tooltip "_Level 7" 1127 pos "6 53" 1128 size "27 35" 1129 background "buttons/blue2-1" 1130 value 6 1131 cvar *cvar:cl_worldlevel 1132 icon "icons/number_7" 1133 } 1134 1135 radiobutton bt7 1136 { 1137 tooltip "_Level 8" 1138 pos "6 13" 1139 size "27 35" 1140 background "buttons/blue2-1" 1141 value 7 1142 cvar *cvar:cl_worldlevel 1143 icon "icons/number_8" 1144 } 1145 } 1146 1147 panel players { 1148 { 1149 pos "520 30" 1150 size "400 250" 1151 padding 5 1152 background "ui/panel_window" 1153 } 1154 1155 string title 1156 { 1157 string "_Players connected" 1158 font "f_big" 1159 color "1 1 1 1" 1160 pos "0 5" 1161 size "415 50" 1162 contentalign ALIGN_CC 1163 } 1164 1165 panel ready { 1166 { 1167 layout LAYOUT_TOP_DOWN_FLOW 1168 layoutMargin 2 1169 padding 0 1170 pos "50 50" 1171 size "16 300" 1172 } 1173 1174 image p0 { size "16 16" } 1175 image p1 { size "16 16" } 1176 image p2 { size "16 16" } 1177 image p3 { size "16 16" } 1178 image p4 { size "16 16" } 1179 image p5 { size "16 16" } 1180 image p6 { size "16 16" } 1181 image p7 { size "16 16" } 1182 image p8 { size "16 16" } 1183 image p9 { size "16 16" } 1184 } 1185 1186 text userlist 1187 { 1188 dataid TEXT_MULTIPLAYER_USERLIST 1189 pos "80 50" 1190 size "150 300" 1191 } 1192 1193 text teamlist 1194 { 1195 dataid TEXT_MULTIPLAYER_USERTEAM 1196 pos "200 50" 1197 size "150 300" 1198 } 1199 } 1200 1201 panel teamselection { 1202 { 1203 pos "520 290" 1204 size "400 200" 1205 padding 10 1206 background "ui/panel_window" 1207 } 1208 1209 string title 1210 { 1211 string "_Team selection" 1212 font "f_big" 1213 color "1 1 1 1" 1214 pos "0 5" 1215 size "415 50" 1216 contentalign ALIGN_CC 1217 } 1218 1219 text teamnum_status 1220 { 1221 dataid TEXT_STANDARD 1222 pos "10 50" 1223 size "380 32" 1224 lineheight 16 1225 tabwidth 60 1226 rows 2 1227 contentalign ALIGN_CC 1228 } 1229 1230 string teamnum_str 1231 { 1232 string "_Team preference:" 1233 pos "25 80" 1234 size "195 20" 1235 } 1236 string teamnum_value 1237 { 1238 string *cvar:cl_teamnum 1239 pos "248 80" 1240 size "40 20" 1241 contentalign ALIGN_UR 1242 } 1243 button teamnum_inc 1244 { 1245 visiblewhen "*cvar:cl_ready != 1" 1246 tooltip "_Next free team" 1247 icon "icons/next" 1248 pos "298 82" 1249 size "16 16" 1250 padding 0 1251 onClick { cmd "teamnum_inc;" } 1252 } 1253 button teamnum_dec 1254 { 1255 visiblewhen "*cvar:cl_ready != 1" 1256 tooltip "_Previous free team" 1257 icon "icons/prev" 1258 pos "222 82" 1259 size "16 16" 1260 padding 0 1261 onClick { cmd "teamnum_dec;" } 1262 } 1263 1264 checkbox_green cb_ready 1265 { 1266 tooltip "_Finish the teamselection and start the game" 1267 pos "200 130" 1268 size "20 20" 1269 current *cvar:cl_ready 1270 } 1271 string cb_ready_label 1272 { 1273 string "_Are you ready?" 1274 tooltip "_Finish the teamselection and start the game" 1275 pos "230 130" 1276 size "180 20" 1277 onClick { call *node:parent.cb_ready@toggle } 1278 } 1279 } 1280 1281 panel admin { 1282 { 1283 pos "50 30" 1284 size "400 200" 1285 padding 10 1286 background "ui/panel_window" 1287 } 1288 1289 string title 1290 { 1291 string "_Admin control" 1292 font "f_big" 1293 color "1 1 1 1" 1294 pos "0 5" 1295 size "415 50" 1296 contentalign ALIGN_CC 1297 } 1298 1299 string maxperplayer_str 1300 { 1301 string "_Max. soldiers per team:" 1302 tooltip "_Sets the max allowed soldiers per team" 1303 pos "25 60" 1304 size "250 20" 1305 } 1306 string maxperplayer_value 1307 { 1308 string *cvar:sv_maxsoldiersperteam 1309 pos "280 60" 1310 size "40 20" 1311 contentalign ALIGN_UC 1312 } 1313 spinner_blue maxperplayer_change 1314 { 1315 current *cvar:sv_maxsoldiersperteam 1316 pos "325 60" 1317 min 1 1318 max 12 1319 delta 1 1320 } 1321 1322 string maxsoldierperplayer_str 1323 { 1324 string "_Max. soldiers per player:" 1325 tooltip "_Sets the max allowed soldiers per player when in teamplay" 1326 pos "25 85" 1327 size "250 20" 1328 } 1329 string maxsoldierperplayer_value 1330 { 1331 string *cvar:sv_maxsoldiersperplayer 1332 pos "280 85" 1333 size "40 20" 1334 contentalign ALIGN_UC 1335 } 1336 spinner_blue maxsoldierperplayer_change 1337 { 1338 current *cvar:sv_maxsoldiersperplayer 1339 pos "325 85" 1340 min 1 1341 max 12 1342 delta 1 1343 } 1344 1345 string roundlimit_str 1346 { 1347 string "_Round time limit:" 1348 tooltip "_Sets the max allowed soldiers per team" 1349 pos "25 110" 1350 size "250 20" 1351 } 1352 string roundtimelimit_value 1353 { 1354 string *cvar:sv_roundtimelimit 1355 pos "280 110" 1356 size "40 20" 1357 contentalign ALIGN_UC 1358 } 1359 spinner_blue roundtimelimit_change 1360 { 1361 current *cvar:sv_roundtimelimit 1362 pos "325 110" 1363 min 30 1364 max 500 1365 delta 5 1366 } 1367 1368 button button_force 1369 { 1370 string "_Force start" 1371 tooltip "_Launch the game before all teams are ready" 1372 background "ui/button_blue" 1373 pos "25 145" 1374 size "150 30" 1375 color "0.8 0.8 0.8 1" 1376 selectcolor "1 1 1 1" 1377 onClick { cmd "cl_startgame;" } 1378 } 1379 } 1380 1381 panel rcon { 1382 { 1383 pos "50 290" 1384 size "400 200" 1385 padding 10 1386 background "ui/panel_window" 1387 } 1388 1389 string title 1390 { 1391 string "_Remote Admin Control" 1392 font "f_big" 1393 color "1 1 1 1" 1394 pos "0 5" 1395 size "415 50" 1396 contentalign ALIGN_CC 1397 } 1398 1399 string current_rcon_pwd 1400 { 1401 string "_RCON-Password:" 1402 pos "25 80" 1403 size "256 20" 1404 } 1405 textentry slot_rcon_pwd 1406 { 1407 string *cvar:rcon_password 1408 background "ui/button_green_verysmall" 1409 color "0 .78 0 1" 1410 selectcolor "1 1 1 1" 1411 contentalign ALIGN_CL 1412 padding 8 1413 font "f_verysmall" 1414 pos "25 110" 1415 size "250 30" 1416 ispassword true 1417 } 1418 } 1419 1420 confunc multiplayer_admin_panel { 1421 if (<1> == 0) { 1422 *node:root.admin@invis = true 1423 } else { 1424 *node:root.admin@invis = false 1425 } 1426 } 1427 1428 button invite_players { 1429 string "_Invite others" 1430 background "ui/button_blue" 1431 tooltip "_Invite players that are online in the lobby" 1432 pos "30 650" 1433 size "150 40" 1434 disabled true 1435 color "0.8 0.8 0.8 1" 1436 selectcolor "1 1 1 1" 1437 onClick { 1438 cmd "irc_invite;" 1439 } 1440 } 1441 1442 /** 1443 * @param <1> player ID/line 1444 * @param <2> 0: not ready, 1: ready 1445 * @todo use an image instead of a color 1446 */ 1447 confunc multiplayer_playerIsReady { 1448 if ( ( <1> < 10 ) and ( <1> >= 0 ) ) { 1449 if ( <2> == 0 ) { 1450 *node:root.players.ready.p<1>@src = "icons/off" 1451 *node:root.players.ready.p<1>@invis = false 1452 } else { 1453 *node:root.players.ready.p<1>@src = "icons/on" 1454 *node:root.players.ready.p<1>@invis = false 1455 } 1456 } 1457 } 1458 1459 /** 1460 * @param <1> number of players 1461 */ 1462 confunc multiplayer_playerNumber { 1463 *cvar:tmp = "<1>" 1464 while ( *cvar:tmp < 10 ) { 1465 *node:root.players.ready.p<1>@invis = true 1466 *cvar:tmp = ( *cvar:tmp + 1 ) 1467 } 1468 delete *cvar:tmp 1469 } 1470 1471 /** 1472 * @param <1> boolean whether this is a teamplay match 1473 */ 1474 confunc multiplayer_setTeamplay { 1475 // @todo - deactivate team change if the given boolean is false (0) 1476 } 1477 1478 /** 1479 * @brief Updates the level status 1480 * @inherited from levelbuttons window 1481 * @param <1> Level id (0-7) 1482 * @param <2> State 1483 * 0 = disabled (map doesn't have this level), 1484 * 1 = available (user can switch to this level) 1485 * 2 = active (the current selected level) 1486 */ 1487 confunc updateLevelStatus { 1488 if ( <2> == 0 ) { *node:root.floor.bt<1>@disabled = true } 1489 elif ( <2> >= 1 ) { *node:root.floor.bt<1>@disabled = false } 1490 } 1491 1492 // =================== 1493 // EVENTS 1494 // =================== 1495 1496 func onWindowOpened 1497 { 1498 cmd "mp_selectteam_init;ui_push hud_chat;" 1499 *cvar:mn_displaypartyinfo = 1 1500 *cvar:mn_entry = "" 1501 *cvar:mn_chatselect = "chat" 1502 *cvar:cl_ready = 0 1503 } 1504 1505 func onWindowClosed 1506 { 1507 delete *cvar:mn_entry 1508 delete *cvar:mn_chatselect 1509 delete *cvar:mn_displaypartyinfo 1510 } 1511} 1512 1513// ========================== 1514// SERVER PASSWORD 1515// ========================== 1516window serverpassword 1517{ 1518 { 1519 string "_Enter server password" 1520 pos "264 262" 1521 size "496 247" 1522 dragbutton true 1523 closebutton true 1524 background "ui/popup_alpha_tile" 1525 } 1526 1527 // =================== 1528 // PASSWORD 1529 // =================== 1530 string current_password 1531 { 1532 string "_Password:" 1533 pos "66 58" 1534 size "256 20" 1535 } 1536 textentry slot_password 1537 { 1538 background "ui/button_green_verysmall" 1539 color "0 .78 0 1" 1540 selectcolor "1 1 1 1" 1541 contentalign ALIGN_CL 1542 padding 8 1543 font "f_verysmall" 1544 pos "66 78" 1545 size "256 34" 1546 string *cvar:password 1547 ispassword true 1548 } 1549 1550 button set_password 1551 { 1552 string "_OK" 1553 background "ui/button_green_small" 1554 pos "260 170" 1555 width "200" 1556 font "f_menu" 1557 color "0 0.5 0 1" 1558 selectcolor "1 1 1 1" 1559 onClick { cmd "mn_server_need_password 0;ui_pop;connect;" } 1560 } 1561} 1562 1563// ========================== 1564// GAME INVITATION 1565// ========================== 1566window multiplayer_invite 1567{ 1568 { 1569 string "_Game invitation" 1570 pos "264 262" 1571 size "496 247" 1572 dragbutton true 1573 closebutton true 1574 background "ui/popup_alpha_tile" 1575 } 1576 1577 /* store popup data */ 1578 string ip { invis true } 1579 string port { invis true } 1580 1581 confunc multiplayer_invite_server_info { 1582 *node:root.ip@string = <1> 1583 *node:root.port@string = <2> 1584 } 1585 1586 button server_info 1587 { 1588 string "_Server info" 1589 tooltip "_Show server information" 1590 background "ui/button_green_small" 1591 pos "30 170" 1592 width "200" 1593 font "f_menu" 1594 color "0 0.5 0 1" 1595 selectcolor "1 1 1 1" 1596 onClick { 1597 cmd "ui_pop;" 1598 cmd "server_info <node:root.ip@string> <node:root.port@string>;" 1599 } 1600 } 1601 1602 button enter_lobby 1603 { 1604 string "_Lobby" 1605 tooltip "_Go into the lobby" 1606 background "ui/button_green_small" 1607 pos "260 170" 1608 width "200" 1609 font "f_menu" 1610 color "0 0.5 0 1" 1611 selectcolor "1 1 1 1" 1612 onClick { cmd "ui_pop;ui_push irc;" } 1613 } 1614 1615 string invite_msg 1616 { 1617 string "_You received a invitation to take part of a multiplayer game. Hit the connect button to connect to the server" 1618 pos "30 50" 1619 longlines LONGLINES_WRAP 1620 size "440 60" 1621 } 1622} 1623