Game Development Community

Demo Networking

by Ernesto Peterson · in Torque 3D Beginner · 12/08/2012 (1:29 am) · 10 replies

Hi, I've been playing around with Torque3D again, it going open source reminded me I had a license. I want to play with the networking, not really something I've done before, was hoping to make something a few friends and I could mess around with, experiment with balance and consequences.

I figured I would start with seeing if I could get a built version of the demo working in multiplayer... And first problem encountered. I have no idea what exactly the network capabilities of the demo are, so I was hoping people could clue me in, I haven't found the answers I was looking for by searching.

Anyway, I tried just using internet, going through a virtual LAN (Tunngle) but not working. Unfortunately I can't test out normal LAN, only have the one computer. I -can- make a connectable server through two instances on one computer, but that's not too helpful.

Also to elaborate, for online network settings, we both placed our computers in our networks DMZ, so the only thing filtering would be our ISPs, and haven't had any issues with that before.

Hope I can get some answers, thanks in advance! Looking forward to working with Torque.

About the author

Recent Threads


#1
12/08/2012 (1:55 am)
T3D is geared for multiplayer out of the box so i believe the demo should be so aswell if you can connect two games on your own computer then you should be able to do it over lan and internet (effectively it's the same as lan)
So make sure that the port torque uses is open, i can't say much beside that it probably is a problem in your network
#2
12/08/2012 (5:34 am)
The port torque uses is 28000 by defualt.

For reference the network settings are in Project/Game/Core/prefs.cs
#3
12/08/2012 (3:50 pm)
In the FPS Tutorial the networking lesson covers how to set up a multiplayer game in T3D. I'd advise taking the time to complete this entire tutorial.
#4
12/08/2012 (8:00 pm)
Everything in the FPS Tutorial networking lesson is what I did.

Also, to clarify/restate, a network DMZ means that there ARE no ports that can be opened, as it sets every port for that computer to open. So again, unless it's the ISP, it's an unfiltered connection.

I'll muck around some more, see if I can get some other people to test it with. Maybe it was the people I was attempting to test with.
#5
12/08/2012 (8:40 pm)
Yes, 28000 and 28002 (master server heartbeat) should be open.

No significant changes in the network code since 1998 or so - pretty much works the same as it did back in the Tribes/Tribes 2 days. There is no special setup required, it should work out of the box.

I'd check to see that your computers aren't using Windows' built-in port filtering (Windows Firewall, for example). Also, if either of you is using Norton or McAfee or something similar it maybe blocking ports. Even if you each had your computers plugged directly into your cable modems, if firewall software has ports blocked then they're blocked.
#6
12/13/2012 (1:38 pm)
Well, I tried with a few different people, and got absolutely nothing. Windows and Antivirus firewalls were completely disabled, router firewall was completely disabled, but couldn't see any servers from either end.

I guess Torque3D just isn't the engine I'm looking for, not sure what's going on though.
#7
12/17/2012 (9:42 pm)
" Windows and Antivirus firewalls were completely disabled, router firewall was completely disabled, but couldn't see any servers from either end. "

strange!
never ever that happened to me.
t3d is completely ready for multiplaying.
just host your game.then use join button on other pc.

although i only have tested on lan.
for intenet u have to check some settings as those differ for network.

i am sure there happened something wrong on your pc/network.
#8
12/18/2012 (7:10 am)
I think I see the problem. The master server is down again.

Try replacing your art/gui/joinServerDlg.gui file with this (make a back-up copy first!):
//--- OBJECT WRITE BEGIN ---
%guiContent = new GuiControl(JoinServerDlg) {
   position = "0 0";
   extent = "1024 768";
   minExtent = "8 8";
   horizSizing = "width";
   vertSizing = "height";
   profile = "GuiOverlayProfile";
   visible = "1";
   active = "1";
   tooltipProfile = "GuiToolTipProfile";
   hovertime = "1000";
   isContainer = "1";
   canSave = "1";
   canSaveDynamicFields = "1";
      enabled = "1";

   new GuiWindowCtrl() {
      text = "Join Server";
      resizeWidth = "0";
      resizeHeight = "0";
      canMove = "1";
      canClose = "1";
      canMinimize = "0";
      canMaximize = "0";
      canCollapse = "0";
      closeCommand = "Canvas.popDialog(JoinServerDlg);";
      edgeSnap = "1";
      margin = "0 0 0 0";
      padding = "0 0 0 0";
      anchorTop = "1";
      anchorBottom = "0";
      anchorLeft = "1";
      anchorRight = "0";
      position = "252 201";
      extent = "520 365";
      minExtent = "8 8";
      horizSizing = "center";
      vertSizing = "center";
      profile = "GuiWindowProfile";
      visible = "1";
      active = "1";
      tooltipProfile = "GuiToolTipProfile";
      hovertime = "1000";
      isContainer = "1";
      canSave = "1";
      canSaveDynamicFields = "0";

      new GuiButtonCtrl(JS_queryMaster) {
         text = "Query Master";
         groupNum = "-1";
         buttonType = "PushButton";
         useMouseEvents = "0";
         position = "216 334";
         extent = "90 23";
         minExtent = "8 8";
         horizSizing = "right";
         vertSizing = "top";
         profile = "GuiButtonProfile";
         visible = "1";
         active = "1";
         command = "JoinServerDlg.query();";
         tooltipProfile = "GuiToolTipProfile";
         hovertime = "1000";
         isContainer = "0";
         canSave = "1";
         canSaveDynamicFields = "0";
      };
      new GuiButtonCtrl(JS_queryLan) {
         text = "Query LAN";
         groupNum = "-1";
         buttonType = "PushButton";
         useMouseEvents = "0";
         position = "114 334";
         extent = "90 23";
         minExtent = "8 8";
         horizSizing = "right";
         vertSizing = "top";
         profile = "GuiButtonProfile";
         visible = "1";
         active = "1";
         command = "JoinServerDlg.queryLan();";
         tooltipProfile = "GuiToolTipProfile";
         hovertime = "1000";
         isContainer = "0";
         canSave = "1";
         canSaveDynamicFields = "0";
      };
      new GuiButtonCtrl(JS_refreshServer) {
         text = "Refresh Server";
         groupNum = "-1";
         buttonType = "PushButton";
         useMouseEvents = "0";
         position = "318 334";
         extent = "90 23";
         minExtent = "8 8";
         horizSizing = "right";
         vertSizing = "top";
         profile = "GuiButtonProfile";
         visible = "1";
         active = "1";
         command = "JoinServerDlg.refresh();";
         tooltipProfile = "GuiToolTipProfile";
         hovertime = "1000";
         isContainer = "0";
         canSave = "1";
         canSaveDynamicFields = "0";
      };
      new GuiButtonCtrl(JS_joinServer) {
         text = "Join Server!";
         groupNum = "-1";
         buttonType = "PushButton";
         useMouseEvents = "0";
         position = "420 334";
         extent = "90 23";
         minExtent = "8 8";
         horizSizing = "right";
         vertSizing = "top";
         profile = "GuiButtonProfile";
         visible = "1";
         active = "0";
         command = "JoinServerDlg.join();";
         tooltipProfile = "GuiToolTipProfile";
         hovertime = "1000";
         isContainer = "0";
         canSave = "1";
         canSaveDynamicFields = "0";
      };
      new GuiScrollCtrl() {
         willFirstRespond = "1";
         hScrollBar = "dynamic";
         vScrollBar = "alwaysOn";
         lockHorizScroll = "0";
         lockVertScroll = "0";
         constantThumbHeight = "0";
         childMargin = "0 0";
         mouseWheelScrollSpeed = "-1";
         margin = "0 0 0 0";
         padding = "0 0 0 0";
         anchorTop = "1";
         anchorBottom = "0";
         anchorLeft = "1";
         anchorRight = "0";
         position = "10 105";
         extent = "500 197";
         minExtent = "8 8";
         horizSizing = "right";
         vertSizing = "bottom";
         profile = "GuiScrollProfile";
         visible = "1";
         active = "1";
         tooltipProfile = "GuiToolTipProfile";
         hovertime = "1000";
         isContainer = "1";
         canSave = "1";
         canSaveDynamicFields = "0";

         new GuiTextListCtrl(JS_serverList) {
            columns = "0 200 270 335 400";
            fitParentWidth = "1";
            clipColumnText = "0";
            position = "1 1";
            extent = "485 8";
            minExtent = "8 8";
            horizSizing = "right";
            vertSizing = "bottom";
            profile = "GuiTextArrayProfile";
            visible = "1";
            active = "1";
            tooltipProfile = "GuiToolTipProfile";
            hovertime = "1000";
            isContainer = "1";
            canSave = "1";
            canSaveDynamicFields = "0";
         };
      };
      new GuiTextEditCtrl() {
         historySize = "0";
         tabComplete = "0";
         sinkAllKeyEvents = "0";
         password = "0";
         passwordMask = "*";
         maxLength = "255";
         margin = "0 0 0 0";
         padding = "0 0 0 0";
         anchorTop = "1";
         anchorBottom = "0";
         anchorLeft = "1";
         anchorRight = "0";
         position = "84 31";
         extent = "144 18";
         minExtent = "8 8";
         horizSizing = "right";
         vertSizing = "bottom";
         profile = "GuiTextEditProfile";
         visible = "1";
         active = "1";
         variable = "pref::Player::Name";
         tooltipProfile = "GuiToolTipProfile";
         hovertime = "1000";
         isContainer = "0";
         canSave = "1";
         canSaveDynamicFields = "0";
      };
      new GuiTextCtrl() {
         text = "Player Name:";
         maxLength = "255";
         margin = "0 0 0 0";
         padding = "0 0 0 0";
         anchorTop = "1";
         anchorBottom = "0";
         anchorLeft = "1";
         anchorRight = "0";
         position = "12 31";
         extent = "63 18";
         minExtent = "8 8";
         horizSizing = "right";
         vertSizing = "bottom";
         profile = "GuiAutoSizeTextProfile";
         visible = "1";
         active = "1";
         tooltipProfile = "GuiToolTipProfile";
         hovertime = "1000";
         isContainer = "0";
         canSave = "1";
         canSaveDynamicFields = "0";
      };
      new GuiTextCtrl() {
         text = "Players";
         maxLength = "255";
         margin = "0 0 0 0";
         padding = "0 0 0 0";
         anchorTop = "1";
         anchorBottom = "0";
         anchorLeft = "1";
         anchorRight = "0";
         position = "269 84";
         extent = "36 18";
         minExtent = "8 8";
         horizSizing = "right";
         vertSizing = "bottom";
         profile = "GuiAutoSizeTextProfile";
         visible = "1";
         active = "1";
         tooltipProfile = "GuiToolTipProfile";
         hovertime = "1000";
         isContainer = "0";
         canSave = "1";
         canSaveDynamicFields = "0";
      };
      new GuiTextCtrl() {
         text = "Version";
         maxLength = "255";
         margin = "0 0 0 0";
         padding = "0 0 0 0";
         anchorTop = "1";
         anchorBottom = "0";
         anchorLeft = "1";
         anchorRight = "0";
         position = "335 84";
         extent = "38 18";
         minExtent = "8 8";
         horizSizing = "right";
         vertSizing = "bottom";
         profile = "GuiAutoSizeTextProfile";
         visible = "1";
         active = "1";
         tooltipProfile = "GuiToolTipProfile";
         hovertime = "1000";
         isContainer = "0";
         canSave = "1";
         canSaveDynamicFields = "0";
      };
      new GuiTextCtrl() {
         text = "Game";
         maxLength = "255";
         margin = "0 0 0 0";
         padding = "0 0 0 0";
         anchorTop = "1";
         anchorBottom = "0";
         anchorLeft = "1";
         anchorRight = "0";
         position = "412 84";
         extent = "28 18";
         minExtent = "8 8";
         horizSizing = "right";
         vertSizing = "bottom";
         profile = "GuiAutoSizeTextProfile";
         visible = "1";
         active = "1";
         tooltipProfile = "GuiToolTipProfile";
         hovertime = "1000";
         isContainer = "0";
         canSave = "1";
         canSaveDynamicFields = "0";
      };
      new GuiTextCtrl() {
         text = "Ping";
         maxLength = "255";
         margin = "0 0 0 0";
         padding = "0 0 0 0";
         anchorTop = "1";
         anchorBottom = "0";
         anchorLeft = "1";
         anchorRight = "0";
         position = "212 84";
         extent = "20 18";
         minExtent = "8 8";
         horizSizing = "right";
         vertSizing = "bottom";
         profile = "GuiAutoSizeTextProfile";
         visible = "1";
         active = "1";
         tooltipProfile = "GuiToolTipProfile";
         hovertime = "1000";
         isContainer = "0";
         canSave = "1";
         canSaveDynamicFields = "0";
      };
      new GuiTextCtrl() {
         text = "Server Name";
         maxLength = "255";
         margin = "0 0 0 0";
         padding = "0 0 0 0";
         anchorTop = "1";
         anchorBottom = "0";
         anchorLeft = "1";
         anchorRight = "0";
         position = "12 84";
         extent = "63 18";
         minExtent = "8 8";
         horizSizing = "right";
         vertSizing = "bottom";
         profile = "GuiAutoSizeTextProfile";
         visible = "1";
         active = "1";
         tooltipProfile = "GuiToolTipProfile";
         hovertime = "1000";
         isContainer = "0";
         canSave = "1";
         canSaveDynamicFields = "0";
      };
      new GuiButtonCtrl() {
         text = "< Back";
         groupNum = "-1";
         buttonType = "PushButton";
         useMouseEvents = "0";
         position = "12 334";
         extent = "90 23";
         minExtent = "8 8";
         horizSizing = "right";
         vertSizing = "top";
         profile = "GuiButtonProfile";
         visible = "1";
         active = "1";
         command = "JoinServerDlg.exit();";
         tooltipProfile = "GuiToolTipProfile";
         hovertime = "1000";
         isContainer = "0";
         canSave = "1";
         canSaveDynamicFields = "0";
      };
      new GuiWindowCtrl(JS_queryStatus) {
         text = "Status";
         resizeWidth = "0";
         resizeHeight = "0";
         canMove = "0";
         canClose = "0";
         canMinimize = "0";
         canMaximize = "0";
         canCollapse = "0";
         edgeSnap = "1";
         margin = "0 0 0 0";
         padding = "0 0 0 0";
         anchorTop = "1";
         anchorBottom = "0";
         anchorLeft = "1";
         anchorRight = "0";
         position = "105 157";
         extent = "310 50";
         minExtent = "8 8";
         horizSizing = "center";
         vertSizing = "center";
         profile = "GuiWindowProfile";
         visible = "0";
         active = "1";
         tooltipProfile = "GuiToolTipProfile";
         hovertime = "1000";
         isContainer = "1";
         hidden = "1";
         canSave = "1";
         canSaveDynamicFields = "0";

         new GuiButtonCtrl(JS_cancelQuery) {
            text = "Cancel!";
            groupNum = "-1";
            buttonType = "PushButton";
            useMouseEvents = "0";
            position = "9 25";
            extent = "64 20";
            minExtent = "8 8";
            horizSizing = "right";
            vertSizing = "bottom";
            profile = "GuiButtonProfile";
            visible = "1";
            active = "1";
            command = "JoinServerDlg.cancel();";
            tooltipProfile = "GuiToolTipProfile";
            hovertime = "1000";
            isContainer = "0";
            canSave = "1";
            canSaveDynamicFields = "0";
         };
         new GuiProgressCtrl(JS_statusBar) {
            maxLength = "1024";
            margin = "0 0 0 0";
            padding = "0 0 0 0";
            anchorTop = "1";
            anchorBottom = "0";
            anchorLeft = "1";
            anchorRight = "0";
            position = "84 25";
            extent = "207 20";
            minExtent = "8 8";
            horizSizing = "right";
            vertSizing = "bottom";
            profile = "GuiProgressProfile";
            visible = "1";
            active = "1";
            tooltipProfile = "GuiToolTipProfile";
            hovertime = "1000";
            isContainer = "0";
            canSave = "1";
            canSaveDynamicFields = "0";
         };
         new GuiTextCtrl(JS_statusText) {
            text = "Query Servers";
            maxLength = "255";
            margin = "0 0 0 0";
            padding = "0 0 0 0";
            anchorTop = "1";
            anchorBottom = "0";
            anchorLeft = "1";
            anchorRight = "0";
            position = "85 25";
            extent = "205 20";
            minExtent = "8 8";
            horizSizing = "right";
            vertSizing = "bottom";
            profile = "GuiProgressTextProfile";
            visible = "1";
            active = "1";
            tooltipProfile = "GuiToolTipProfile";
            hovertime = "1000";
            isContainer = "0";
            canSave = "1";
            canSaveDynamicFields = "0";
         };
      };
      new GuiTextCtrl(JS_status) {
         text = "No servers found.";
         maxLength = "255";
         margin = "0 0 0 0";
         padding = "0 0 0 0";
         anchorTop = "1";
         anchorBottom = "0";
         anchorLeft = "1";
         anchorRight = "0";
         position = "245 31";
         extent = "88 18";
         minExtent = "8 8";
         horizSizing = "right";
         vertSizing = "bottom";
         profile = "GuiAutoSizeTextProfile";
         visible = "1";
         active = "1";
         tooltipProfile = "GuiToolTipProfile";
         hovertime = "1000";
         isContainer = "1";
         canSave = "1";
         canSaveDynamicFields = "0";
      };
      new GuiTextCtrl() {
         text = "Server Address:";
         maxLength = "1024";
         margin = "0 0 0 0";
         padding = "0 0 0 0";
         anchorTop = "1";
         anchorBottom = "0";
         anchorLeft = "1";
         anchorRight = "0";
         position = "10 62";
         extent = "82 13";
         minExtent = "8 2";
         horizSizing = "right";
         vertSizing = "bottom";
         profile = "GuiTextProfile";
         visible = "1";
         active = "1";
         tooltipProfile = "GuiToolTipProfile";
         hovertime = "1000";
         isContainer = "1";
         canSave = "1";
         canSaveDynamicFields = "0";
      };
      new GuiTextEditCtrl(octet1) {
         historySize = "0";
         tabComplete = "0";
         sinkAllKeyEvents = "0";
         password = "0";
         passwordMask = "*";
         maxLength = "1024";
         margin = "0 0 0 0";
         padding = "0 0 0 0";
         anchorTop = "1";
         anchorBottom = "0";
         anchorLeft = "1";
         anchorRight = "0";
         position = "94 59";
         extent = "35 18";
         minExtent = "8 2";
         horizSizing = "right";
         vertSizing = "bottom";
         profile = "GuiTextEditNumericProfile";
         visible = "1";
         active = "1";
         tooltipProfile = "GuiToolTipProfile";
         hovertime = "1000";
         isContainer = "1";
         canSave = "1";
         canSaveDynamicFields = "0";
      };
      new GuiTextCtrl() {
         text = ".";
         maxLength = "1024";
         margin = "0 0 0 0";
         padding = "0 0 0 0";
         anchorTop = "1";
         anchorBottom = "0";
         anchorLeft = "1";
         anchorRight = "0";
         position = "134 62";
         extent = "8 13";
         minExtent = "8 2";
         horizSizing = "right";
         vertSizing = "bottom";
         profile = "GuiTextBoldProfile";
         visible = "1";
         active = "1";
         tooltipProfile = "GuiToolTipProfile";
         hovertime = "1000";
         isContainer = "1";
         canSave = "1";
         canSaveDynamicFields = "0";
      };
      new GuiTextEditCtrl(octet2) {
         historySize = "0";
         tabComplete = "0";
         sinkAllKeyEvents = "0";
         password = "0";
         passwordMask = "*";
         maxLength = "1024";
         margin = "0 0 0 0";
         padding = "0 0 0 0";
         anchorTop = "1";
         anchorBottom = "0";
         anchorLeft = "1";
         anchorRight = "0";
         position = "142 59";
         extent = "35 18";
         minExtent = "8 2";
         horizSizing = "right";
         vertSizing = "bottom";
         profile = "GuiTextEditNumericProfile";
         visible = "1";
         active = "1";
         tooltipProfile = "GuiToolTipProfile";
         hovertime = "1000";
         isContainer = "1";
         canSave = "1";
         canSaveDynamicFields = "0";
      };
continued....
#9
12/18/2012 (7:11 am)
new GuiTextCtrl() {
         text = ".";
         maxLength = "1024";
         margin = "0 0 0 0";
         padding = "0 0 0 0";
         anchorTop = "1";
         anchorBottom = "0";
         anchorLeft = "1";
         anchorRight = "0";
         position = "181 62";
         extent = "8 13";
         minExtent = "8 2";
         horizSizing = "right";
         vertSizing = "bottom";
         profile = "GuiTextBoldProfile";
         visible = "1";
         active = "1";
         tooltipProfile = "GuiToolTipProfile";
         hovertime = "1000";
         isContainer = "1";
         canSave = "1";
         canSaveDynamicFields = "0";
      };
      new GuiTextEditCtrl(octet3) {
         historySize = "0";
         tabComplete = "0";
         sinkAllKeyEvents = "0";
         password = "0";
         passwordMask = "*";
         maxLength = "1024";
         margin = "0 0 0 0";
         padding = "0 0 0 0";
         anchorTop = "1";
         anchorBottom = "0";
         anchorLeft = "1";
         anchorRight = "0";
         position = "188 59";
         extent = "35 18";
         minExtent = "8 2";
         horizSizing = "right";
         vertSizing = "bottom";
         profile = "GuiTextEditNumericProfile";
         visible = "1";
         active = "1";
         tooltipProfile = "GuiToolTipProfile";
         hovertime = "1000";
         isContainer = "1";
         canSave = "1";
         canSaveDynamicFields = "0";
      };
      new GuiTextCtrl() {
         text = ".";
         maxLength = "1024";
         margin = "0 0 0 0";
         padding = "0 0 0 0";
         anchorTop = "1";
         anchorBottom = "0";
         anchorLeft = "1";
         anchorRight = "0";
         position = "227 62";
         extent = "8 13";
         minExtent = "8 2";
         horizSizing = "right";
         vertSizing = "bottom";
         profile = "GuiTextBoldProfile";
         visible = "1";
         active = "1";
         tooltipProfile = "GuiToolTipProfile";
         hovertime = "1000";
         isContainer = "1";
         canSave = "1";
         canSaveDynamicFields = "0";
      };
      new GuiTextEditCtrl(octet4) {
         historySize = "0";
         tabComplete = "0";
         sinkAllKeyEvents = "0";
         password = "0";
         passwordMask = "*";
         maxLength = "1024";
         margin = "0 0 0 0";
         padding = "0 0 0 0";
         anchorTop = "1";
         anchorBottom = "0";
         anchorLeft = "1";
         anchorRight = "0";
         position = "235 59";
         extent = "35 18";
         minExtent = "8 2";
         horizSizing = "right";
         vertSizing = "bottom";
         profile = "GuiTextEditNumericProfile";
         visible = "1";
         active = "1";
         tooltipProfile = "GuiToolTipProfile";
         hovertime = "1000";
         isContainer = "1";
         canSave = "1";
         canSaveDynamicFields = "0";
      };
      new GuiTextCtrl() {
         text = ":";
         maxLength = "1024";
         margin = "0 0 0 0";
         padding = "0 0 0 0";
         anchorTop = "1";
         anchorBottom = "0";
         anchorLeft = "1";
         anchorRight = "0";
         position = "276 62";
         extent = "8 13";
         minExtent = "8 2";
         horizSizing = "right";
         vertSizing = "bottom";
         profile = "GuiTextBoldProfile";
         visible = "1";
         active = "1";
         tooltipProfile = "GuiToolTipProfile";
         hovertime = "1000";
         isContainer = "1";
         canSave = "1";
         canSaveDynamicFields = "0";
      };
      new GuiTextEditCtrl(portNum) {
         historySize = "0";
         tabComplete = "0";
         sinkAllKeyEvents = "0";
         password = "0";
         passwordMask = "*";
         maxLength = "1024";
         margin = "0 0 0 0";
         padding = "0 0 0 0";
         anchorTop = "1";
         anchorBottom = "0";
         anchorLeft = "1";
         anchorRight = "0";
         position = "287 59";
         extent = "67 18";
         minExtent = "8 2";
         horizSizing = "right";
         vertSizing = "bottom";
         profile = "GuiTextEditNumericProfile";
         visible = "1";
         active = "1";
         tooltipProfile = "GuiToolTipProfile";
         hovertime = "1000";
         isContainer = "1";
         canSave = "1";
         canSaveDynamicFields = "0";
      };
      new GuiTextCtrl() {
         text = "Preferred Team:";
         maxLength = "1024";
         margin = "0 0 0 0";
         padding = "0 0 0 0";
         anchorTop = "1";
         anchorBottom = "0";
         anchorLeft = "1";
         anchorRight = "0";
         position = "10 311";
         extent = "79 13";
         minExtent = "8 2";
         horizSizing = "right";
         vertSizing = "bottom";
         profile = "GuiTextProfile";
         visible = "1";
         active = "1";
         tooltipProfile = "GuiToolTipProfile";
         hovertime = "1000";
         isContainer = "1";
         canSave = "1";
         canSaveDynamicFields = "0";
      };
      new GuiRadioCtrl(rbRedTeam) {
         text = "Red Team";
         groupNum = "0";
         buttonType = "RadioButton";
         useMouseEvents = "0";
         position = "101 311";
         extent = "68 13";
         minExtent = "8 2";
         horizSizing = "right";
         vertSizing = "bottom";
         profile = "GuiRadioProfile";
         visible = "1";
         active = "1";
         variable = "pref::Player::teamRed";
         command = "$pref::Player::teamPreference = 1;$pref::Player::teamRed=1;$pref::Player::teamBlue=0;";
         tooltipProfile = "GuiToolTipProfile";
         hovertime = "1000";
         isContainer = "0";
         canSave = "1";
         canSaveDynamicFields = "0";
      };
      new GuiRadioCtrl(rbBlueTeam) {
         text = "Blue Team";
         groupNum = "0";
         buttonType = "RadioButton";
         useMouseEvents = "0";
         position = "190 311";
         extent = "68 13";
         minExtent = "8 2";
         horizSizing = "right";
         vertSizing = "bottom";
         profile = "GuiRadioProfile";
         visible = "1";
         active = "1";
         variable = "pref::Player::teamBlue";
         command = "$pref::Player::teamPreference = 2;$pref::Player::teamRed=0;$pref::Player::teamBlue=1;";
         tooltipProfile = "GuiToolTipProfile";
         hovertime = "1000";
         isContainer = "0";
         canSave = "1";
         canSaveDynamicFields = "0";
      };
      new GuiButtonCtrl(bQuerySpecSvr) {
         text = "<< Query this server";
         groupNum = "-1";
         buttonType = "PushButton";
         useMouseEvents = "0";
         position = "372 57";
         extent = "140 23";
         minExtent = "8 2";
         horizSizing = "right";
         vertSizing = "bottom";
         profile = "GuiButtonProfile";
         visible = "1";
         active = "1";
         command = "JoinServerDlg.querySpecifiedServer();";
         tooltipProfile = "GuiToolTipProfile";
         hovertime = "1000";
         isContainer = "0";
         canSave = "1";
         canSaveDynamicFields = "0";
      };
   };
};
//--- OBJECT WRITE END ---

function JoinServerDlg::onWake(%this)
{
   %this.setActive(true);
   // Double check the status. Tried setting this the control
   // inactive to start with, but that didn't seem to work.
   JS_joinServer.setActive(JS_serverList.rowCount() > 0);
   rbRedTeam.setIsSelected($pref::Player::teamRed);
   rbBlueTeam.setIsSelected($pref::Player::teamBlue);
}   

//----------------------------------------
function JoinServerDlg::query(%this)
{
   queryMasterServer(
      0,          // Query flags
      $Client::GameTypeQuery,       // gameTypes
      $Client::MissionTypeQuery,    // missionType
      0,          // minPlayers
      100,        // maxPlayers
      0,          // maxBots
      2,          // regionMask
      0,          // maxPing
      100,        // minCPU
      0           // filterFlags
   );
}

//----------------------------------------
function JoinServerDlg::queryLan(%this)
{
   queryLANServers(
      $pref::Net::Port,      // lanPort for local queries
      0,          // Query flags
      $Client::GameTypeQuery,       // gameTypes
      $Client::MissionTypeQuery,    // missionType
      0,          // minPlayers
      100,        // maxPlayers
      0,          // maxBots
      2,          // regionMask
      0,          // maxPing
      100,        // minCPU
      0           // filterFlags
   );
}

//----------------------------------------
function JoinServerDlg::cancel(%this)
{
   cancelServerQuery();
   JS_queryStatus.setVisible(false);
}


//----------------------------------------
function JoinServerDlg::join(%this)
{
   cancelServerQuery();
   %index = JS_serverList.getSelectedId();

   // The server info index is stored in the row along with the
   // rest of displayed info.

   if( setServerInfo( %index ) )
   {
      %conn = new GameConnection(ServerConnection);
      %conn.setConnectArgs($pref::Player::Name, $pref::Player::teamPreference);
      %conn.setJoinPassword($Client::Password);
      %conn.connect($ServerInfo::Address);
   }
   
   %this.setActive(false);
}

//----------------------------------------
function JoinServerDlg::refresh(%this)
{
   cancelServerQuery();
   %index= JS_serverList.getSelectedId();

   // The server info index is stored in the row along with the
   // rest of displayed info.
   if( setServerInfo( %index ) )
      querySingleServer( $ServerInfo::Address, 0 );
}

//----------------------------------------
function JoinServerDlg::refreshSelectedServer( %this )
{
   querySingleServer( $JoinGameAddress, 0 );
}

//----------------------------------------
function JoinServerDlg::querySpecifiedServer( %this )
{
   %oct1 = octet1.getText();
   %oct2 = octet2.getText();
   %oct3 = octet3.getText();
   %oct4 = octet4.getText();
   %port = portNum.getText();
   %tempAddress = %oct1@"."@%oct2@"."@%oct3@"."@%oct4@":"@%port;
   echo(" -- Query Specified Server : "@%tempAddress);
   $JoinGameAddress = %tempAddress;
   querySingleServer( $JoinGameAddress, 0 );
}

//----------------------------------------
function JoinServerDlg::exit(%this)
{
   cancelServerQuery();
   
   Canvas.popDialog(JoinServerDlg);
}

//----------------------------------------
function JoinServerDlg::update(%this)
{
   // Copy the servers into the server list.
   JS_queryStatus.setVisible(false);
   JS_serverList.clear();
   %sc = getServerCount();
   for( %i = 0; %i < %sc; %i ++ ) {
      setServerInfo(%i);
      JS_serverList.addRow( %i,
         $ServerInfo::Name TAB
         $ServerInfo::Ping TAB
         $ServerInfo::PlayerCount @ "/" @ $ServerInfo::MaxPlayers TAB
         $ServerInfo::Version TAB
         $ServerInfo::MissionName
      );
   }
   JS_serverList.sort(0);
   JS_serverList.setSelectedRow(0);
   JS_serverList.scrollVisible(0);

   JS_joinServer.setActive(JS_serverList.rowCount() > 0);
} 

//----------------------------------------
function onServerQueryStatus(%status, %msg, %value)
{
	echo("ServerQuery: " SPC %status SPC %msg SPC %value);
   // Update query status
   // States: start, update, ping, query, done
   // value = % (0-1) done for ping and query states
   if (!JS_queryStatus.isVisible())
      JS_queryStatus.setVisible(true);

   switch$ (%status) {
      case "start":
         JS_joinServer.setActive(false);
         JS_queryMaster.setActive(false);
         JS_statusText.setText(%msg);
         JS_statusBar.setValue(0);
         JS_serverList.clear();

      case "ping":
         JS_statusText.setText("Ping Servers");
         JS_statusBar.setValue(%value);

      case "query":
         JS_statusText.setText("Query Servers");
         JS_statusBar.setValue(%value);

      case "done":
         JS_queryMaster.setActive(true);
         JS_queryStatus.setVisible(false);
         JS_status.setText(%msg);
         JoinServerDlg.update();
   }
}

I added a few bits so that you can specify your desired server IP address and query it directly. There is a bug somewhere that causes it to "hang" - cancel and query it again. It may appear to only partially populate the list; you should still be able to connect to that address successfully.

Give that a shot, hope it helps!
#10
12/18/2012 (7:26 am)
The above dialog should look like www.roostertailgames.com/images/newJoinDialog.jpg.
Oops - I guess team options won't work for you, this is from a personal project and it looks like I have an accidental reference to Red vs. Blue in there....