[How To] Game Server Status Script (ArmA3)

Neue Datenschutzerklärung gemäß EU-Datenschutz-Grundverordnung (DS-GVO). Weitergehende Infos findet ihr hier.
  • Ladet euch das Standalone LGSL 5.8 Script von Richard Perry runter. Installiert es auf eurem Webserver. Dazu gehört auch ein Datenbank Eintrag. Beschreibung dazu ist in einer Readme Datei im Standalone Script. Ich erkläre hier nur wie man den ArmA3 Server und den Minecraft Server integriert, den Rest der davor zu machen ist müsst Ihr schon selber machen.


    Um einen ArmA2OA Server anzeigen zu lassen könnt Ihr auch Das GameSpy3 Protokoll benutzen. Sieht aber nicht so dolle aus.


    Öffnet die Datei lgsl/lgsl_files/lgsl_protocol.php und fügt nach dem Eintrag Zeile: 26 diesen Code ein.


    [code=php]"arma3" => "ArmA 3",[/php]


    Danach sucht Ihr die Zeile :


    [code=php]"arma2" => "09",[/php]


    und ersetzt diese mit diesem Code:


    [code=php]
    "arma2" => "06",
    "arma3" => "06",[/php]


    Danach ersetzt Ihr das Hier:


    [code=php]//------------------------------------------------------------------------------------------------------------+


    function lgsl_query_06(&$server, &$lgsl_need, &$lgsl_fp)
    {
    //---------------------------------------------------------+
    // GET A CHALLENGE CODE IF NEEDED


    $challenge_code = "";


    if ($server['b']['type'] != "bf2" && $server['b']['type'] != "graw")
    {
    fwrite($lgsl_fp, "\xFE\xFD\x09\x21\x21\x21\x21\xFF\xFF\xFF\x01");


    $challenge_packet = fread($lgsl_fp, 4096);


    if (!$challenge_packet) { return FALSE; }


    $challenge_code = substr($challenge_packet, 5, -1); // REMOVE HEADER AND TRAILING NULL


    // IF CODE IS RETURNED ( SOME STALKER SERVERS RETURN BLANK WHERE THE CODE IS NOT NEEDED )
    // CONVERT DECIMAL |TO| HEX AS 8 CHARACTER STRING |TO| 4 PAIRS OF HEX |TO| 4 PAIRS OF DECIMAL |TO| 4 PAIRS OF ASCII


    $challenge_code = $challenge_code ? chr($challenge_code >> 24).chr($challenge_code >> 16).chr($challenge_code >> 8).chr($challenge_code >> 0) : "";
    }


    fwrite($lgsl_fp, "\xFE\xFD\x00\x21\x21\x21\x21{$challenge_code}\xFF\xFF\xFF\x01");


    //---------------------------------------------------------+
    // GET RAW PACKET DATA


    $buffer = array();
    $packet_count = 0;
    $packet_total = 4;


    do
    {
    $packet_count ++;
    $packet = fread($lgsl_fp, 4096);


    if (!$packet) { return FALSE; }


    $packet = substr($packet, 14); // REMOVE SPLITNUM HEADER
    $packet_order = ord(lgsl_cut_byte($packet, 1));


    if ($packet_order >= 128) // LAST PACKET - SO ITS ORDER NUMBER IS ALSO THE TOTAL
    {
    $packet_order -= 128;
    $packet_total = $packet_order + 1;
    }


    $buffer[$packet_order] = $packet;
    }
    while ($packet_count < $packet_total);


    //---------------------------------------------------------+
    // PROCESS AND SORT PACKETS


    foreach ($buffer as $key => $packet)
    {
    $packet = substr($packet, 0, -1); // REMOVE END NULL FOR JOINING


    if (substr($packet, -1) != "\x00") // LAST VALUE HAS BEEN SPLIT
    {
    $part = explode("\x00", $packet); // REMOVE SPLIT VALUE AS COMPLETE VALUE IS IN NEXT PACKET
    array_pop($part);
    $packet = implode("\x00", $part)."\x00";
    }


    if ($packet[0] != "\x00") // PLAYER OR TEAM DATA THAT MAY BE A CONTINUATION
    {
    $pos = strpos($packet, "\x00") + 1; // WHEN DATA IS SPLIT THE NEXT PACKET STARTS WITH A REPEAT OF THE FIELD NAME


    if (isset($packet[$pos]) && $packet[$pos] != "\x00") // REPEATED FIELD NAMES END WITH \x00\x?? INSTEAD OF \x00\x00
    {
    $packet = substr($packet, $pos + 1); // REMOVE REPEATED FIELD NAME
    }
    else
    {
    $packet = "\x00".$packet; // RE-ADD NULL AS PACKET STARTS WITH A NEW FIELD
    }
    }


    $buffer[$key] = $packet;
    }


    ksort($buffer);


    $buffer = implode("", $buffer);


    //---------------------------------------------------------+
    // SERVER SETTINGS


    $buffer = substr($buffer, 1); // REMOVE HEADER \x00


    while ($key = strtolower(lgsl_cut_string($buffer)))
    {
    $server['e'][$key] = lgsl_cut_string($buffer);
    }


    $lgsl_conversion = array("name"=>"hostname", "game"=>"gamename", "map"=>"mapname", "players"=>"numplayers", "playersmax"=>"maxplayers", "password"=>"password");
    foreach ($lgsl_conversion as $s => $e) { if (isset($server['e'][$e])) { $server['s'][$s] = $server['e'][$e]; unset($server['e'][$e]); } } // LGSL STANDARD


    if ($server['b']['type'] == "bf2" || $server['b']['type'] == "bf2142") { $server['s']['map'] = ucwords(str_replace("_", " ", $server['s']['map'])); } // MAP NAME CONSISTENCY


    if ($server['s']['players'] == "0") { return TRUE; } // IF SERVER IS EMPTY SKIP THE PLAYER CODE


    //---------------------------------------------------------+
    // PLAYER DETAILS


    $buffer = substr($buffer, 1); // REMOVE HEADER \x01


    while ($buffer)
    {
    if ($buffer[0] == "\x02") { break; }
    if ($buffer[0] == "\x00") { $buffer = substr($buffer, 1); break; }


    $field = lgsl_cut_string($buffer, 0, "\x00\x00");
    $field = strtolower(substr($field, 0, -1));


    if ($field == "player") { $field = "name"; }
    elseif ($field == "aibot") { $field = "bot"; }


    if ($buffer[0] == "\x00") { $buffer = substr($buffer, 1); continue; }


    $value_list = lgsl_cut_string($buffer, 0, "\x00\x00");
    $value_list = explode("\x00", $value_list);


    foreach ($value_list as $key => $value)
    {
    $server['p'][$key][$field] = $value;
    }
    }


    //---------------------------------------------------------+
    // TEAM DATA


    $buffer = substr($buffer, 1); // REMOVE HEADER \x02


    while ($buffer)
    {
    if ($buffer[0] == "\x00") { break; }


    $field = lgsl_cut_string($buffer, 0, "\x00\x00");
    $field = strtolower($field);


    if ($field == "team_t") { $field = "name"; }
    elseif ($field == "score_t") { $field = "score"; }


    $value_list = lgsl_cut_string($buffer, 0, "\x00\x00");
    $value_list = explode("\x00", $value_list);


    foreach ($value_list as $key => $value)
    {
    $server['t'][$key][$field] = $value;
    }
    }


    //---------------------------------------------------------+
    // TEAM NAME CONVERSION


    if ($server['p'] && isset($server['t'][0]['name']) && $server['t'][0]['name'] != "Team")
    {
    foreach ($server['p'] as $key => $value)
    {
    if (empty($server['p'][$key]['team'])) { continue; }


    $team_key = $server['p'][$key]['team'] - 1;


    if (!isset($server['t'][$team_key]['name'])) { continue; }


    $server['p'][$key]['team'] = $server['t'][$team_key]['name'];
    }
    }


    //---------------------------------------------------------+


    return TRUE;
    }


    //------------------------------------------------------------------------------------------------------------+[/php]


    mit dem Hier:


    [code=php]//------------------------------------------------------------------------------------------------------------+


    function lgsl_query_06(&$server, &$lgsl_need, &$lgsl_fp)
    {
    //---------------------------------------------------------+
    // GET A CHALLENGE CODE IF NEEDED


    $challenge_code = "";


    if ($server['b']['type'] != "bf2" && $server['b']['type'] != "graw")
    {
    fwrite($lgsl_fp, "\xFE\xFD\x09\x21\x21\x21\x21\xFF\xFF\xFF\x01");


    $challenge_packet = fread($lgsl_fp, 4096);


    if (!$challenge_packet) { return FALSE; }


    $challenge_code = substr($challenge_packet, 5, -1); // REMOVE HEADER AND TRAILING NULL


    // IF CODE IS RETURNED ( SOME STALKER SERVERS RETURN BLANK WHERE THE CODE IS NOT NEEDED )
    // CONVERT DECIMAL |TO| HEX AS 8 CHARACTER STRING |TO| 4 PAIRS OF HEX |TO| 4 PAIRS OF DECIMAL |TO| 4 PAIRS OF ASCII


    $challenge_code = $challenge_code ? chr($challenge_code >> 24).chr($challenge_code >> 16).chr($challenge_code >> 8).chr($challenge_code >> 0) : "";
    }


    if ($server['b']['type'] != "arma2")
    {
    fwrite($lgsl_fp, "\xFE\xFD\x09\xFF\xFF\xFF\x01");


    $challenge_packet = fread($lgsl_fp, 4096);


    if (!$challenge_packet) { return FALSE; }


    $challenge_code = substr($challenge_packet, 5, -1); // REMOVE HEADER AND TRAILING NULL


    // IF CODE IS RETURNED ( SOME STALKER SERVERS RETURN BLANK WHERE THE CODE IS NOT NEEDED )
    // CONVERT DECIMAL |TO| HEX AS 8 CHARACTER STRING |TO| 4 PAIRS OF HEX |TO| 4 PAIRS OF DECIMAL |TO| 4 PAIRS OF ASCII


    $challenge_code = $challenge_code ? chr($challenge_code >> 24).chr($challenge_code >> 16).chr($challenge_code >> 8).chr($challenge_code >> 0) : "";
    }

    if($server['b']['type'] == "arma2"){
    fwrite($lgsl_fp, "\xFE\xFD\x00\x10\x20\x30\x40{$challenge_code}\xFF\xFF\xFF\x01");
    }
    else{
    fwrite($lgsl_fp, "\xFE\xFD\x00\x21\x21\x21\x21{$challenge_code}\xFF\xFF\xFF\x01");
    }


    //---------------------------------------------------------+
    // GET RAW PACKET DATA


    $buffer = array();
    $packet_count = 0;
    $packet_total = 4;


    do
    {
    $packet_count ++;
    $packet = fread($lgsl_fp, 4096);


    if (!$packet) { return FALSE; }


    $packet = substr($packet, 14); // REMOVE SPLITNUM HEADER
    $packet_order = ord(lgsl_cut_byte($packet, 1));


    if ($packet_order >= 128) // LAST PACKET - SO ITS ORDER NUMBER IS ALSO THE TOTAL
    {
    $packet_order -= 128;
    $packet_total = $packet_order + 1;
    }


    $buffer[$packet_order] = $packet;
    }
    while ($packet_count < $packet_total);


    //---------------------------------------------------------+
    // PROCESS AND SORT PACKETS


    foreach ($buffer as $key => $packet)
    {
    $packet = substr($packet, 0, -1); // REMOVE END NULL FOR JOINING


    if (substr($packet, -1) != "\x00") // LAST VALUE HAS BEEN SPLIT
    {
    $part = explode("\x00", $packet); // REMOVE SPLIT VALUE AS COMPLETE VALUE IS IN NEXT PACKET
    array_pop($part);
    $packet = implode("\x00", $part)."\x00";
    }


    if ($packet[0] != "\x00") // PLAYER OR TEAM DATA THAT MAY BE A CONTINUATION
    {
    $pos = strpos($packet, "\x00") + 1; // WHEN DATA IS SPLIT THE NEXT PACKET STARTS WITH A REPEAT OF THE FIELD NAME


    if (isset($packet[$pos]) && $packet[$pos] != "\x00") // REPEATED FIELD NAMES END WITH \x00\x?? INSTEAD OF \x00\x00
    {
    $packet = substr($packet, $pos + 1); // REMOVE REPEATED FIELD NAME
    }
    else
    {
    $packet = "\x00".$packet; // RE-ADD NULL AS PACKET STARTS WITH A NEW FIELD
    }
    }


    $buffer[$key] = $packet;

    }


    ksort($buffer);


    $buffer = implode("", $buffer);


    //---------------------------------------------------------+
    // SERVER SETTINGS


    $buffer = substr($buffer, 1); // REMOVE HEADER \x00


    while ($key = strtolower(lgsl_cut_string($buffer)))
    {
    $server['e'][$key] = lgsl_cut_string($buffer);
    }


    $lgsl_conversion = array("name"=>"hostname", "game"=>"gamename", "map"=>"mapname", "players"=>"numplayers", "playersmax"=>"maxplayers", "password"=>"password");
    foreach ($lgsl_conversion as $s => $e) { if (isset($server['e'][$e])) { $server['s'][$s] = $server['e'][$e]; unset($server['e'][$e]); } } // LGSL STANDARD


    if ($server['b']['type'] == "bf2" || $server['b']['type'] == "bf2142") { $server['s']['map'] = ucwords(str_replace("_", " ", $server['s']['map'])); } // MAP NAME CONSISTENCY


    if ($server['s']['players'] == "0") { return TRUE; } // IF SERVER IS EMPTY SKIP THE PLAYER CODE


    //---------------------------------------------------------+
    // PLAYER DETAILS

    $buffer = substr($buffer, 1); // REMOVE HEADER \x01


    while ($buffer)
    {
    if ($buffer[0] == "\x02") { break; }
    if ($server['b']['type'] == "arma2" && $buffer[0] == "\x00") { $buffer = substr($buffer, 1);}
    elseif ($server['b']['type'] != "arma2" && $buffer[0] == "\x00") { $buffer = substr($buffer, 1); break; }


    $field = lgsl_cut_string($buffer, 0, "\x00\x00");
    $field = strtolower(substr($field, 0, -1));


    if ($field == "player") { $field = "name"; }
    elseif ($field == "aibot") { $field = "bot"; }


    if ($buffer[0] == "\x00") { $buffer = substr($buffer, 1); continue; }


    $value_list = lgsl_cut_string($buffer, 0, "\x00\x00");
    $value_list = explode("\x00", $value_list);


    foreach ($value_list as $key => $value)
    {
    $server['p'][$key][$field] = $value;
    }
    }
    //---------------------------------------------------------+
    // TEAM DATA


    $buffer = substr($buffer, 1); // REMOVE HEADER \x02


    while ($buffer)
    {
    if ($buffer[0] == "\x00") { break; }


    $field = lgsl_cut_string($buffer, 0, "\x00\x00");
    $field = strtolower($field);


    if ($field == "team_t") { $field = "name"; }
    elseif ($field == "score_t") { $field = "score"; }


    $value_list = lgsl_cut_string($buffer, 0, "\x00\x00");
    $value_list = explode("\x00", $value_list);


    foreach ($value_list as $key => $value)
    {
    $server['t'][$key][$field] = $value;
    }
    }


    //---------------------------------------------------------+
    // TEAM NAME CONVERSION


    if ($server['p'] && isset($server['t'][0]['name']) && $server['t'][0]['name'] != "Team")
    {
    foreach ($server['p'] as $key => $value)
    {
    if (empty($server['p'][$key]['team'])) { continue; }


    $team_key = $server['p'][$key]['team'] - 1;


    if (!isset($server['t'][$team_key]['name'])) { continue; }


    $server['p'][$key]['team'] = $server['t'][$team_key]['name'];
    }
    }


    //---------------------------------------------------------+


    return TRUE;
    }


    //------------------------------------------------------------------------------------------------------------+ [/php]


    Jetzt erstellt Ihr in dem Ordner Icons auf eurem Webserver noch einen Ordner Namens "arma3" und kopiert dort ein ArmA3 Icon rein. und fertig ist die Laube.


    Wenn Ihr jetzt Server in der Admin Oberfläche hinzufügen wollt müsst Ihr nicht mehr Gamespy3 als Protokoll auswählen sondern arma2 oder arma3.


    Bei uns auf der Seite habe ich noch ein Wenig getrickst. Problem ist das man für ArmA3 und 2 ja nicht für jede Mission nen Bild rein machen kann gibt ja so viele. Ich habe dafür ein Standard Bild genommen das ich mit einer Online und Offline Grafik versehen habe. Die Icons habe ich auch ausgetauscht, damit diese besser zu sehen sind. Alle Server bei uns auf der Seite sind in einer Zone!