x


Converting Code from JavaScript to C#

What is the best means of converting JavaScript to C Sharp with a minimal amount of user interaction, meaning one that best converts the code without the user having to fix much of the code. Right now I use the converter at "http://www.m2h.nl/files/js_to_c.php", it works for the most part but it can't properly convert "var" over to C# and you must then specify a specific variable as that is what C# requires compared to the more openness of JavaScript variables. Such as when I convert the following code:

/* 
*  This file is part of the Unity networking tutorial by M2H (http://www.M2H.nl)
*  The original author of this code is Mike Hergaarden, even though some small parts 
*  are copied from the Unity tutorials/manuals.
*  Feel free to use this code for your own projects, drop us a line if you made something exciting! 
*/
#pragma strict

public var gameName = "Example4";
public var serverPort =  35001;

public var hostData : HostData[];

private var natCapable : ConnectionTesterStatus = ConnectionTesterStatus.Undetermined;
public var filterNATHosts = false;
private var probingPublicIP = false;
private var doneTestingNAT = false;
private var timer : float = 0.0;

private var hideTest = false;
private var testMessage = "Undetermined NAT capabilities";

private var tryingToConnectPlayNow : boolean = false;
public var tryingToConnectPlayNowNumber : int = 0;

private var remotePort : int[] = new int[3];
private var remoteIP : String[] = new String[3];
public var connectionInfo : String = "";

public var lastMSConnectionAttemptForcedNat : boolean= false;
private var NAToptionWasSwitchedForTesting : boolean = false;
private var officialNATstatus : boolean = Network.useNat;
public var errorMessage : String = "";
private var lastPlayNowConnectionTime : float;

public var nowConnecting : boolean = false;

function Awake ()
{
    sortedHostList = new Array ();

    // Start connection test
    natCapable = Network.TestConnection();

    // What kind of IP does this machine have? TestConnection also indicates this in the
    // test results
    if (Network.HavePublicAddress()){
        Debug.Log("This machine has a public IP address");
    }else{
        Debug.Log("This machine has a private IP address");
    }   

    /* //If you dont want to use the Unity masterserver..
    Network.natFacilitatorIP = myMasterServerIP;
    Network.natFacilitatorPort = 11111;//Change this
    MasterServer.ipAddress = myMasterServerIP;
    MasterServer.port = 22222;//Change this
    Network.connectionTesterIP = myMasterServerIP;
    Network.connectionTesterPort = 33333;//Change this
    */


}

function Start(){//must be in start because of coroutine

    yield WaitForSeconds(0.5);
    var tries : int=0;
    while(tries<=10){       
        if(hostData && hostData.length>0){
            //Waiting for hostData
        }else{
            FetchHostList(true);
        }
        yield WaitForSeconds(0.5);
        tries++;
    }
}


function OnFailedToConnectToMasterServer(info: NetworkConnectionError)
{
    //Yikes
}

function OnFailedToConnect(info: NetworkConnectionError)
{
    Debug.Log("FailedToConnect info:"+info);
    FailedConnRetry(info);      
}

function Connect(ip : String, port : int, usenat : boolean){
    // Enable NAT functionality based on what the hosts if configured to do
    Network.useNat = usenat;
    lastMSConnectionAttemptForcedNat = usenat;

    Debug.Log("Connecting to "+ip+":"+port+" NAT:"+usenat);
    Network.Connect(ip, port);      
    nowConnecting=true; 
}

//This second definition of Connect can handle the ip string[] passed by the masterserver
function Connect(ip : String[], port : int, usenat : boolean){
    // Enable NAT functionality based on what the hosts if configured to do
    Network.useNat = usenat;
    lastMSConnectionAttemptForcedNat = usenat;

    Debug.Log("Connecting to "+ip[0]+":"+port+" NAT:"+usenat);
    Network.Connect(ip, port);      
    nowConnecting=true; 
}

function StartHost(players : int, port : int){
    if(players<=1){
        players=1;
    }
    //Network.InitializeSecurity();
    Network.InitializeServer(players, port);
}

function OnConnectedToServer(){
    //Stop communication until in the game
    Network.isMessageQueueRunning = false;

    //Save these details so we can use it in the next scene
    PlayerPrefs.SetString("connectIP", Network.connections[0].ipAddress);
    PlayerPrefs.SetInt("connectPort", Network.connections[0].port);
}

function FailedConnRetry(info: NetworkConnectionError){
    if(info == NetworkConnectionError.InvalidPassword){
        mayRetry=false;
    }


    nowConnecting=false;

    //Quickplay
    if(tryingToConnectPlayNow){
        //Try again without NAT if we used NAT
        if(mayRetry && Network.useNat && lastMSConnectionAttemptForcedNat){
            Debug.Log("Failed connect 1A: retry without NAT");

            remotePort[0]=serverPort;//Fall back to default server port
            Connect(remoteIP, remotePort[0], false);
            lastPlayNowConnectionTime=Time.time;
        }else{
            //We didn't use NAT and failed
            Debug.Log("Failed connect 1B: Don't retry");

            //Reset NAT to org. value
            Network.useNat=officialNATstatus;

            //Connect to next playnow/quickplay host
            tryingToConnectPlayNowNumber++;
            tryingToConnectPlayNow=false;
        }
    }else{
        //Direct connect or via host list manually
        connectionInfo="Failed to connect!";

        if(mayRetry && Network.useNat && lastMSConnectionAttemptForcedNat){
            //Since the last connect forced NAT usage,
            // let's try again without NAT.     
            Network.useNat=false;
            Network.Connect(remoteIP, remotePort[0]);
            nowConnecting=true;
            lastPlayNowConnectionTime=Time.time;

        }else{
            Debug.Log("Failed 2b");

            if(info == NetworkConnectionError.InvalidPassword){
                errorMessage="Failed to connect: Wrong password supplied";
            }else if(info == NetworkConnectionError.TooManyConnectedPlayers){
                errorMessage="Failed to connect: Server is full";
            }else{
                errorMessage="Failed to connect";
            }

            //reset to default port
            remotePort[0]=serverPort;

            //Reset nat to tested value
            Network.useNat=officialNATstatus;

        }
    }   
}

public var CONNECT_TIMEOUT : float = 0.75;
public var CONNECT_NAT_TIMEOUT : float = 5.00;

//Our quickplay function: Go trough the gameslist and try to connect to all games
function PlayNow(timeStarted : float ){

        var i : int=0;

        for (var myElement in sortedHostList)
        {
            var element=hostData[myElement];

            // Do not try NAT enabled games if we cannot do NAT punchthrough
            // Do not try connecting to password protected games
            if ( !(filterNATHosts && element.useNat) && !element.passwordProtected  )
            {
                aHost=1;

                if(element.connectedPlayers<element.playerLimit)
                {                   
                    if(tryingToConnectPlayNow){
                        var natText;
                        if(Network.useNat){
                            natText=" with option 1/2";
                        }else{
                            natText=" with option 2/2";
                        }
                        if((!Network.useNat && lastPlayNowConnectionTime+CONNECT_TIMEOUT<=Time.time) || (Network.useNat  && lastPlayNowConnectionTime+CONNECT_NAT_TIMEOUT<=Time.time)){
                            Debug.Log("Interrupted by timer, NAT:"+Network.useNat);
                            FailedConnRetry(NetworkConnectionError.ConnectionFailed);                           
                        }
                        return "Trying to connect to host "+(tryingToConnectPlayNowNumber+1)+"/"+sortedHostList.length+" "+natText; 
                    }       
                    if(!tryingToConnectPlayNow && tryingToConnectPlayNowNumber<=i){
                        Debug.Log("Trying to connect to game NR "+i+" & "+tryingToConnectPlayNowNumber);
                        tryingToConnectPlayNow=true;
                        tryingToConnectPlayNowNumber=i;

                        // Enable NAT functionality based on what the hosts if configured to do
                        lastMSConnectionAttemptForcedNat=element.useNat;
                        Network.useNat = element.useNat;
                        var connectPort : int=element.port;
                        if (Network.useNat){
                            print("Using Nat punchthrough to connect");
                        }else{
                            //connectPort=serverPort; //bad idea!
                            print("Connecting directly to host");
                        }
                        Debug.Log("connecting to "+element.gameName+" "+element.ip+":"+connectPort);
                        Network.Connect(element.ip, connectPort);   
                        lastPlayNowConnectionTime=Time.time;
                    }
                    i++;        
                }
            }           
        }

        //If we reach this point then either we've parsed the whole list OR the list is still empty

        //Dont give up yet: Give MS 7 seconds to feed the list
        if(Time.time<timeStarted+7){
            FetchHostList(true);    
            return "Waiting for masterserver..."+Mathf.Ceil((timeStarted+7)-Time.time); 
        }

        if(!tryingToConnectPlayNow){
            return "failed";
        }


}


function Update() {
    // If network test is undetermined, keep running
    if (!doneTestingNAT) {
        TestConnection();
    }
}

function TestConnection() {
    // Start/Poll the connection test, report the results in a label and react to the results accordingly
    natCapable = Network.TestConnection();
    switch (natCapable) {
        case ConnectionTesterStatus.Error: 
            testMessage = "Problem determining NAT capabilities";
            doneTestingNAT = true;
            break;

        case ConnectionTesterStatus.Undetermined: 
            testMessage = "Undetermined NAT capabilities";
            doneTestingNAT = false;
            break;

        case ConnectionTesterStatus.PrivateIPNoNATPunchthrough: 
            testMessage = "Cannot do NAT punchthrough, filtering NAT enabled hosts for client connections, local LAN games only.";
            filterNATHosts = true;
            Network.useNat = true;
            doneTestingNAT = true;
            break;

        case ConnectionTesterStatus.PrivateIPHasNATPunchThrough:
            if (probingPublicIP)
                testMessage = "Non-connectable public IP address (port "+ serverPort +" blocked), NAT punchthrough can circumvent the firewall.";
            else
                testMessage = "NAT punchthrough capable. Enabling NAT punchthrough functionality.";
            // NAT functionality is enabled in case a server is started,
            // clients should enable this based on if the host requires it
            Network.useNat = true;
            doneTestingNAT = true;
            break;

        case ConnectionTesterStatus.PublicIPIsConnectable:
            testMessage = "Directly connectable public IP address.";
            Network.useNat = false;
            doneTestingNAT = true;
            break;

        // This case is a bit special as we now need to check if we can 
        // cicrumvent the blocking by using NAT punchthrough
        case ConnectionTesterStatus.PublicIPPortBlocked:
            testMessage = "Non-connectble public IP address (port " + serverPort +" blocked), running a server is impossible.";
            Network.useNat = false;
            // If no NAT punchthrough test has been performed on this public IP, force a test
            if (!probingPublicIP)
            {
                Debug.Log("Testing if firewall can be circumnvented");
                natCapable = Network.TestConnectionNAT();
                probingPublicIP = true;
                timer = Time.time + 10;
            }
            // NAT punchthrough test was performed but we still get blocked
            else if (Time.time > timer)
            {
                probingPublicIP = false;        // reset
                Network.useNat = true;
                doneTestingNAT = true;
            }
            break;
        case ConnectionTesterStatus.PublicIPNoServerStarted:
            testMessage = "Public IP address but server not initialized, it must be started to check server accessibility. Restart connection test when ready.";
            break;
        default: 
            testMessage = "Error in test routine, got " + natCapable;
    }
    officialNATstatus=Network.useNat;
    if(doneTestingNAT){
        Debug.Log("TestConn:"+testMessage);
        Debug.Log("TestConn:"+natCapable + " " + probingPublicIP + " " + doneTestingNAT);
    }
}

private var lastHostListRequest : float = 0;

//Request the host limit, but we limit these requests
//Max once every two minutes automatically, max once every 5 seconds when manually requested
function FetchHostList(manual : boolean){
    var timeout : int = 120;
    if(manual){
        timeout=5;
    }

    if(lastHostListRequest==0 || Time.realtimeSinceStartup > lastHostListRequest + timeout){
            lastHostListRequest = Time.realtimeSinceStartup;
            MasterServer.RequestHostList (gameName);            
            yield WaitForSeconds(1);//We gotta wait :/          
            hostData = MasterServer.PollHostList();
            yield WaitForSeconds(1);//We gotta wait :/  
            CreateSortedArray();
            Debug.Log("Requested new host list, got: "+hostData.length);
    }



}

//The code below is all about sorting the game list by playeramount

public var sortedHostList : Array;

function CreateSortedArray(){

    sortedHostList = new Array();   

    var i : int=0;
    var data : HostData[] = hostData;
    for (var element in data)
    {
        AddToArray(i);
        i++;        
    }           
}

function AddToArray(nr : int){
    sortedHostList.Add (nr);    
    SortLastItem();
}

function SortLastItem(){
    if(sortedHostList.length<=1){
        return;
    }
    for(var i=sortedHostList.length-1;i>0;i--){
    var value1 : int= hostData[sortedHostList[i-1]].connectedPlayers;
    var value2 : int = hostData[sortedHostList[i]].connectedPlayers;
        if(value1<value2){
            SwapArrayItem((i-1), i);
        }else{
            //Sorted!
            return;
        }
    }
}

function SwapArrayItem(nr1, nr2){
    var tmp=sortedHostList[nr1];
    sortedHostList[nr1]=sortedHostList[nr2];
    sortedHostList[nr2]=tmp;
}

The code then ends up as:

// Converted from UnityScript to C# at http://www.M2H.nl/files/js_to_c.php - by Mike Hergaarden
// Do test the code! You usually need to change a few small bits.

using UnityEngine;
using System.Collections;

public class MYCLASSNAME : MonoBehaviour {
/* 
*  This file is part of the Unity networking tutorial by M2H (http://www.M2H.nl)
*  The original author of this code is Mike Hergaarden, even though some small parts 
*  are copied from the Unity tutorials/manuals.
*  Feel free to use this code for your own projects, drop us a line if you made something exciting! 
*/


public FIXME_VAR_TYPE gameName= "Example4";
public FIXME_VAR_TYPE serverPort=  35001;

public HostData[] hostData;

private ConnectionTesterStatus natCapable = ConnectionTesterStatus.Undetermined;
public FIXME_VAR_TYPE filterNATHosts= false;
private FIXME_VAR_TYPE probingPublicIP= false;
private FIXME_VAR_TYPE doneTestingNAT= false;
private float timer = 0.0f;

private FIXME_VAR_TYPE hideTest= false;
private FIXME_VAR_TYPE testMessage= "Undetermined NAT capabilities";

private bool  tryingToConnectPlayNow = false;
public int tryingToConnectPlayNowNumber = 0;

private int[] remotePort = new int[3];
private string[] remoteIP = new string[3];
public string connectionInfo = "";

public bool  lastMSConnectionAttemptForcedNat= false;
private bool  NAToptionWasSwitchedForTesting = false;
private bool  officialNATstatus = Network.useNat;
public string errorMessage = "";
private float lastPlayNowConnectionTime;

public bool  nowConnecting = false;

void  Awake (){
    sortedHostList = new Array ();

    // Start connection test
    natCapable = Network.TestConnection();

    // What kind of IP does this machine have? TestConnection also indicates this in the
    // test results
    if (Network.HavePublicAddress()){
        Debug.Log("This machine has a public IP address");
    }else{
        Debug.Log("This machine has a private IP address");
    }   

    /* //If you dont want to use the Unity masterserver..
    Network.natFacilitatorIP = myMasterServerIP;
    Network.natFacilitatorPort = 11111;//Change this
    MasterServer.ipAddress = myMasterServerIP;
    MasterServer.port = 22222;//Change this
    Network.connectionTesterIP = myMasterServerIP;
    Network.connectionTesterPort = 33333;//Change this
    */


}

void  Start (){//must be in start because of coroutine

    yield return new WaitForSeconds(0.5f);
    int tries=0;
    while(tries<=10){       
        if(hostData && hostData.length>0){
            //Waiting for hostData
        }else{
            FetchHostList(true);
        }
        yield return new WaitForSeconds(0.5f);
        tries++;
    }
}


void  OnFailedToConnectToMasterServer ( NetworkConnectionError info  ){
    //Yikes
}

void  OnFailedToConnect ( NetworkConnectionError info  ){
    Debug.Log("FailedToConnect info:"+info);
    FailedConnRetry(info);      
}

void  Connect ( string ip ,   int port ,   bool usenat  ){
     // Enable NAT functionality based on what the hosts if configured to do
    Network.useNat = usenat;
    lastMSConnectionAttemptForcedNat = usenat;

    Debug.Log("Connecting to "+ip+":"+port+" NAT:"+usenat);
    Network.Connect(ip, port);      
    nowConnecting=true; 
}

//This second definition of Connect can handle the ip string[] passed by the masterserver
void  Connect ( string[] ip ,   int port ,   bool usenat  ){
     // Enable NAT functionality based on what the hosts if configured to do
    Network.useNat = usenat;
    lastMSConnectionAttemptForcedNat = usenat;

    Debug.Log("Connecting to "+ip[0]+":"+port+" NAT:"+usenat);
    Network.Connect(ip, port);      
    nowConnecting=true; 
}

void  StartHost ( int players ,   int port  ){
    if(players<=1){
        players=1;
    }
    //Network.InitializeSecurity();
    Network.InitializeServer(players, port);
}

void  OnConnectedToServer (){
    //Stop communication until in the game
    Network.isMessageQueueRunning = false;

    //Save these details so we can use it in the next scene
    PlayerPrefs.SetString("connectIP", Network.connections[0].ipAddress);
    PlayerPrefs.SetInt("connectPort", Network.connections[0].port);
}

void  FailedConnRetry ( NetworkConnectionError info  ){
    if(info == NetworkConnectionError.InvalidPassword){
        mayRetry=false;
    }


    nowConnecting=false;

    //Quickplay
    if(tryingToConnectPlayNow){
        //Try again without NAT if we used NAT
        if(mayRetry && Network.useNat && lastMSConnectionAttemptForcedNat){
            Debug.Log("Failed connect 1A: retry without NAT");

            remotePort[0]=serverPort;//Fall back to default server port
            Connect(remoteIP, remotePort[0], false);
            lastPlayNowConnectionTime=Time.time;
        }else{
            //We didn't use NAT and failed
            Debug.Log("Failed connect 1B: Don't retry");

            //Reset NAT to org. value
            Network.useNat=officialNATstatus;

            //Connect to next playnow/quickplay host
            tryingToConnectPlayNowNumber++;
            tryingToConnectPlayNow=false;
        }
    }else{
        //Direct connect or via host list manually
        connectionInfo="Failed to connect!";

        if(mayRetry && Network.useNat && lastMSConnectionAttemptForcedNat){
            //Since the last connect forced NAT usage,
            // let's try again without NAT.     
            Network.useNat=false;
            Network.Connect(remoteIP, remotePort[0]);
            nowConnecting=true;
            lastPlayNowConnectionTime=Time.time;

        }else{
            Debug.Log("Failed 2b");

            if(info == NetworkConnectionError.InvalidPassword){
                errorMessage="Failed to connect: Wrong password supplied";
            }else if(info == NetworkConnectionError.TooManyConnectedPlayers){
                errorMessage="Failed to connect: Server is full";
            }else{
                errorMessage="Failed to connect";
            }

            //reset to default port
            remotePort[0]=serverPort;

            //Reset nat to tested value
            Network.useNat=officialNATstatus;

        }
    }   
}

public float CONNECT_TIMEOUT = 0.75f;
public float CONNECT_NAT_TIMEOUT = 5.00f;

//Our quickplay function: Go trough the gameslist and try to connect to all games
void  PlayNow ( float timeStarted   ){

        int i=0;

        foreach(var myElement in sortedHostList)
        {
            FIXME_VAR_TYPE element=hostData[myElement];

            // Do not try NAT enabled games if we cannot do NAT punchthrough
            // Do not try connecting to password protected games
            if ( !(filterNATHosts && element.useNat) && !element.passwordProtected  )
            {
                aHost=1;

                if(element.connectedPlayers<element.playerLimit)
                {                   
                    if(tryingToConnectPlayNow){
                        FIXME_VAR_TYPE natText;
                        if(Network.useNat){
                            natText=" with option 1/2";
                        }else{
                            natText=" with option 2/2";
                        }
                        if((!Network.useNat && lastPlayNowConnectionTime+CONNECT_TIMEOUT<=Time.time) || (Network.useNat  && lastPlayNowConnectionTime+CONNECT_NAT_TIMEOUT<=Time.time)){
                            Debug.Log("Interrupted by timer, NAT:"+Network.useNat);
                            FailedConnRetry(NetworkConnectionError.ConnectionFailed);                           
                        }
                        return "Trying to connect to host "+(tryingToConnectPlayNowNumber+1)+"/"+sortedHostList.length+" "+natText; 
                    }       
                    if(!tryingToConnectPlayNow && tryingToConnectPlayNowNumber<=i){
                        Debug.Log("Trying to connect to game NR "+i+" & "+tryingToConnectPlayNowNumber);
                        tryingToConnectPlayNow=true;
                        tryingToConnectPlayNowNumber=i;

                        // Enable NAT functionality based on what the hosts if configured to do
                        lastMSConnectionAttemptForcedNat=element.useNat;
                        Network.useNat = element.useNat;
                        int connectPort=element.port;
                        if (Network.useNat){
                            print("Using Nat punchthrough to connect");
                        }else{
                            //connectPort=serverPort; //bad idea!
                            print("Connecting directly to host");
                        }
                        Debug.Log("connecting to "+element.gameName+" "+element.ip+":"+connectPort);
                        Network.Connect(element.ip, connectPort);   
                        lastPlayNowConnectionTime=Time.time;
                    }
                    i++;        
                }
            }           
        }

        //If we reach this point then either we've parsed the whole list OR the list is still empty

        //Dont give up yet: Give MS 7 seconds to feed the list
        if(Time.time<timeStarted+7){
            FetchHostList(true);    
            return "Waiting for masterserver..."+Mathf.Ceil((timeStarted+7)-Time.time); 
        }

        if(!tryingToConnectPlayNow){
            return "failed";
        }


}


void  Update (){
    // If network test is undetermined, keep running
    if (!doneTestingNAT) {
        TestConnection();
    }
}

void  TestConnection (){
    // Start/Poll the connection test, report the results in a label and react to the results accordingly
    natCapable = Network.TestConnection();
    switch (natCapable) {
        case ConnectionTesterStatus.Error: 
            testMessage = "Problem determining NAT capabilities";
            doneTestingNAT = true;
            break;

        case ConnectionTesterStatus.Undetermined: 
            testMessage = "Undetermined NAT capabilities";
            doneTestingNAT = false;
            break;

        case ConnectionTesterStatus.PrivateIPNoNATPunchthrough: 
            testMessage = "Cannot do NAT punchthrough, filtering NAT enabled hosts for client connections, local LAN games only.";
            filterNATHosts = true;
            Network.useNat = true;
            doneTestingNAT = true;
            break;

        case ConnectionTesterStatus.PrivateIPHasNATPunchThrough:
            if (probingPublicIP)
                testMessage = "Non-connectable public IP address (port "+ serverPort +" blocked), NAT punchthrough can circumvent the firewall.";
            else
                testMessage = "NAT punchthrough capable. Enabling NAT punchthrough functionality.";
            // NAT functionality is enabled in case a server is started,
            // clients should enable this based on if the host requires it
            Network.useNat = true;
            doneTestingNAT = true;
            break;

        case ConnectionTesterStatus.PublicIPIsConnectable:
            testMessage = "Directly connectable public IP address.";
            Network.useNat = false;
            doneTestingNAT = true;
            break;

        // This case is a bit special as we now need to check if we can 
        // cicrumvent the blocking by using NAT punchthrough
        case ConnectionTesterStatus.PublicIPPortBlocked:
            testMessage = "Non-connectble public IP address (port " + serverPort +" blocked), running a server is impossible.";
            Network.useNat = false;
            // If no NAT punchthrough test has been performed on this public IP, force a test
            if (!probingPublicIP)
            {
                Debug.Log("Testing if firewall can be circumnvented");
                natCapable = Network.TestConnectionNAT();
                probingPublicIP = true;
                timer = Time.time + 10;
            }
            // NAT punchthrough test was performed but we still get blocked
            else if (Time.time > timer)
            {
                probingPublicIP = false;        // reset
                Network.useNat = true;
                doneTestingNAT = true;
            }
            break;
        case ConnectionTesterStatus.PublicIPNoServerStarted:
            testMessage = "Public IP address but server not initialized, it must be started to check server accessibility. Restart connection test when ready.";
            break;
        default: 
            testMessage = "Error in test routine, got " + natCapable;
    }
    officialNATstatus=Network.useNat;
    if(doneTestingNAT){
        Debug.Log("TestConn:"+testMessage);
        Debug.Log("TestConn:"+natCapable + " " + probingPublicIP + " " + doneTestingNAT);
    }
}

private float lastHostListRequest = 0;

//Request the host limit, but we limit these requests
//Max once every two minutes automatically, max once every 5 seconds when manually requested
void  FetchHostList ( bool manual  ){
     int timeout = 120;
    if(manual){
        timeout=5;
    }

    if(lastHostListRequest==0 || Time.realtimeSinceStartup > lastHostListRequest + timeout){
            lastHostListRequest = Time.realtimeSinceStartup;
            MasterServer.RequestHostList (gameName);            
            yield return new WaitForSeconds(1);//We gotta wait :/           
            hostData = MasterServer.PollHostList();
            yield return new WaitForSeconds(1);//We gotta wait :/   
            CreateSortedArray();
            Debug.Log("Requested new host list, got: "+hostData.length);
    }



}

//The code below is all about sorting the game list by playeramount

public Array sortedHostList;

void  CreateSortedArray (){

    sortedHostList = new Array();   

    int i=0;
    HostData[] data = hostData;
    foreach(var element in data)
    {
        AddToArray(i);
        i++;        
    }           
}

void  AddToArray ( int nr  ){
    sortedHostList.Add (nr);    
    SortLastItem();
}

void  SortLastItem (){
    if(sortedHostList.length<=1){
        return;
    }
    for(FIXME_VAR_TYPE i=sortedHostList.length-1;i>0;i--){
    int value1= hostData[sortedHostList[i-1]].connectedPlayers;
    int value2 = hostData[sortedHostList[i]].connectedPlayers;
        if(value1<value2){
            SwapArrayItem((i-1), i);
        }else{
            //Sorted!
            return;
        }
    }
}

void  SwapArrayItem (nr1, nr2){
    FIXME_VAR_TYPE tmp=sortedHostList[nr1];
    sortedHostList[nr1]=sortedHostList[nr2];
    sortedHostList[nr2]=tmp;
}
}

As you see, the "var" parts get turned into "FIXME_VAR_TYPE" because it doesn't know the proper var, is there any list of any kind showing the differnet variable types you can use or could someone please tell me the proper things to put in those spots. And should I make the "Array" places into "Array List"? Any help or another converter would be appreciated.

more ▼

asked Jul 05 '10 at 08:43 PM

WillieZZy gravatar image

WillieZZy
51 6 6 11

I would like to thank all of you for answering, I put Jashan's answers as the best because that is what everyone else voted for, but I think all of your answers are great and all of the answers definetely have helped me. Also, a thanks to Eric5h5 for editng my question to put the codes in scrollable boxes. I never knew this website had so many helpful people, and again thanks to all of ya'll. :)

Jul 05 '10 at 11:46 PM WillieZZy
(comments are locked)
10|3000 characters needed characters left

3 answers: sort voted first

Actually, converting UnityScript to C# is probably best done via a .NET reverse compiler, of which there are quite a few available. Simply put the UnityScript file into Unity and let Unity compile the file. Then, grab the bytecode DLL from the folder [yourProject]/Library/ScriptAssemblies

Then, finally, take a .NET reverse compiler like .NET Reflector, use the DLL (it's called "Assembly - UnityScript.dll", or, if you have editor scripts in UnityScript you might need to look for the file "Assembly - UnityScript - Editor.dll"), look up the class in the tree, do disassemble on it, and show the methods - there you go.

What you get there is perfect C# code that will compile without any problem (well, it is compiled already). The only thing that will be missing is the comments; but you could easily copy those over if you really need them (obviously depends on what you want to use this for).

This is also a very interesting way to figure out how certain things in UnityScript/JavaScript are actually implemented in bytecode (it's sometimes good to know because sometimes, UnityScript will "look very simple" but produce code that's simply less than perfect ;-) ).

more ▼

answered Jul 05 '10 at 09:32 PM

jashan gravatar image

jashan
10.3k 25 43 117

Since .Net Reflector isn't free, this one works as well. http://wiki.sharpdevelop.net/ilspy.ashx

Jun 05 '12 at 09:02 PM Lttldude
(comments are locked)
10|3000 characters needed characters left

All of the FIXME_VAR_TYPE instances in the code are either bool, string or int (should be fairly easy to work out which is which)

And yes - you'll need to change Array to ArrayList, though that should be the only change I think seeing as ArrayList has Add just the same as Array

I don't think there is another convertor, so that's the best you're going to get (and I'll be honest, it's pretty damned good considering unity's javascript isn't much like other javascript implementations)

If you need to search for a list of types, MSDN has a pretty long list you can look through

more ▼

answered Jul 05 '10 at 08:53 PM

Mike 3 gravatar image

Mike 3
30.7k 10 67 256

(comments are locked)
10|3000 characters needed characters left

You should change

public var gameName = "Example4";
public var serverPort =  35001;
...
public var filterNATHosts = false;

to

public var gameName : String = "Example4";
public var serverPort : int = 35001;
...
public var filterNATHosts : boolean = false;

and so on.

I don't know why #pragma strict does not complain about it (probably because you assign the variables directly), but if you tell javascript what type the variables are, your converter will know it, too.

more ▼

answered Jul 05 '10 at 09:29 PM

felix. gravatar image

felix.
2k 18 25 47

It's not mandatory when the compiler can infer the type, so #pragma strict doesn't and shouldn't complain about it. Works exactly like var in c# 3 (which is probably going to make convertors much easier to write when unity 3 is released)

Jul 05 '10 at 09:36 PM Mike 3

Thanks Mike, I thought it would be this way.

Jul 06 '10 at 08:09 AM felix.
(comments are locked)
10|3000 characters needed characters left
Your answer
toggle preview:

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Follow this question

By Email:

Once you sign in you will be able to subscribe for any updates here

By RSS:

Answers

Answers and Comments

Topics:

x48

asked: Jul 05 '10 at 08:43 PM

Seen: 8618 times

Last Updated: Jun 05 '12 at 09:02 PM