UDK Scaleform 4 AS3 cross-domain URLRequest possible?

765 Views Asked by At

I want to post and get Highscores for my UDKGame via HTTP Requests to my webserver with an online Mysql database, Scaleform 4 (AS3) and PHP. Unfortunately I think that may not be possible, considering this document: http://gameware.autodesk.com/documents/gfx_4.0_flash_support.pdf .

I tried sending an URLRequest from my GFx Movie Player, but it doesn't seem to work. Heres my AS3 Code I'm using for my GFx Movie Player in Frame 1:

getScore();

function getScore():void {
//var url:String = "http://myserver.com/getScore.php";
    var request:URLRequest = new URLRequest(url);
    var requestVars:URLVariables = new URLVariables();
    requestVars.foo = "bar";
    request.data = requestVars;
    //request.method = URLRequestMethod.POST;
    //Security.allowDomain("myserver.com"); 
    //var context:LoaderContext = new LoaderContext();
    //context.securityDomain = SecurityDomain.currentDomain

    var urlLoader:URLLoader = new URLLoader();
    urlLoader = new URLLoader();
    urlLoader.dataFormat = URLLoaderDataFormat.TEXT;
    urlLoader.addEventListener(Event.COMPLETE, loaderCompleteHandler, false, 0, true);
    urlLoader.load(request);

    }

function loaderCompleteHandler(e:Event):void {
    trace(e.target.data);
    Object(this).response.text= "response:"+e.target.data;

}

Is There any way to achieve my goal without writing a .dll or use a manual TCP connection to my webserver?

2

There are 2 best solutions below

0
On BEST ANSWER

Unfortunately, the Scaleform that comes with UDK (4.0.16) does not have any networking support built into it. You'll have to have UDK do that part of the problem via dll bind or something else. Scaleform 4.2 added networking support but that version of Scaleform is not quite yet integrated into UDK. It IS in the process of being integrated though, so hopefully we'll see it soon.

0
On

Indeed SF4.0 doesn't support that. SF4.2 maybe does, and it's only available to UE3 licensees, through Epic's Perforce depot.

You can do it in unrealscript. Using a dll or a TCP connection is a bit overkill however. Use the HttpRequestInterface. Here's an exemple straight from the source samples delivered with UDK. It's pretty simple, and you can trim it down to the strict necessary to call your webservice with only a few lines.

/**
 * Simple function to illustrate the use of the HttpRequest system.
 */
exec function TestHttp(string Verb, string Payload, string URL, optional bool bSendParallelRequest)
{
    local HttpRequestInterface R;

    // create the request instance using the factory (which handles
    // determining the proper type to create based on config).
    R = class'HttpFactory'.static.CreateRequest();
    // always set a delegate instance to handle the response.
    R.OnProcessRequestComplete = OnRequestComplete;
    `log("Created request");
    // you can make many requests from one request object.
    R.SetURL(URL);
    // Default verb is GET
    if (Len(Verb) > 0)
    {
        R.SetVerb(Verb);
    }
    else
    {
        `log("No Verb given, using the defaults.");
    }
    // Default Payload is empty
    if (Len(Payload) > 0)
    {
        R.SetContentAsString(Payload);
    }
    else
    {
        `log("No payload given.");
    }
    `log("Creating request for URL:"@URL);

    // there is currently no way to distinguish keys that are empty from keys that aren't there.
    `log("Key1 ="@R.GetURLParameter("Key1"));
    `log("Key2 ="@R.GetURLParameter("Key2"));
    `log("Key3NoValue ="@R.GetURLParameter("Key3NoValue"));
    `log("NonexistentKey ="@R.GetURLParameter("NonexistentKey"));
    // A header will not necessarily be present if you don't set one. Platform implementations
    // may add things like Content-Length when you send the request, but won't necessarily
    // be available in the Header.
    `log("NonExistentHeader ="@R.GetHeader("NonExistentHeader"));
    `log("CustomHeaderName ="@R.GetHeader("CustomHeaderName"));
    `log("ContentType ="@R.GetContentType());
    `log("ContentLength ="@R.GetContentLength());
    `log("URL ="@R.GetURL());
    `log("Verb ="@R.GetVerb());

    // multiple ProcessRequest calls can be made from the same instance if desired.
    if (!R.ProcessRequest())
    {
        `log("ProcessRequest failed. Unsuppress DevHttpRequest to see more details.");
    }
    else
    {
        `log("Request sent");
    }
    // send off a parallel request for testing.
    if (bSendParallelRequest)
    {
        if (!class'HttpFactory'.static.CreateRequest()
            .SetURL("http://www.epicgames.com")
            .SetVerb("GET")
            .SetHeader("Test", "Value")
            .SetProcessRequestCompleteDelegate(OnRequestComplete)
            .ProcessRequest())
        {
            `log("ProcessRequest for parallel request failed. Unsuppress DevHttpRequest to see more details.");
        }
        else
        {
            `log("Parallel Request sent");
        }
    }
}


/** Delegate to use for HttpResponses. */
function OnRequestComplete(HttpRequestInterface OriginalRequest, HttpResponseInterface Response, bool bDidSucceed)
{
    local array<String> Headers;
    local String Header;
    local String Payload;
    local int PayloadIndex;

    `log("Got response!!!!!!! Succeeded="@bDidSucceed);
    `log("URL="@OriginalRequest.GetURL());
    // if we didn't succeed, we can't really trust the payload, so you should always really check this.
    if (Response != None)
    {
        `log("ResponseURL="@Response.GetURL());
        `log("Response Code="@Response.GetResponseCode());
        Headers = Response.GetHeaders();
        foreach Headers(Header)
        {
            `log("Header:"@Header);
        }
        // GetContentAsString will make a copy of the payload to add the NULL terminator,
        // then copy it again to convert it to TCHAR, so this could be fairly inefficient.
        // This call also assumes the payload is UTF8 right now, as truly determining the encoding
        // is content-type dependent.
        // You also can't trust the content-length as you don't always get one. You should instead
        // always trust the length of the content payload you receive.
        Payload = Response.GetContentAsString();
        if (Len(Payload) > 1024)
        {
            PayloadIndex = 0;
            `log("Payload:");
            while (PayloadIndex < Len(Payload))
            {
                `log("    "@Mid(Payload, PayloadIndex, 1024));
                PayloadIndex = PayloadIndex + 1024;
            }
        }
        else
        {
            `log("Payload:"@Payload);
        }
    }
}