/vendors/lgsl/lgsl_protocol.php
PHP | 2655 lines | 1634 code | 553 blank | 468 comment | 397 complexity | 4150729481f5f70aaf0a80966085fd19 MD5 | raw file
Possible License(s): GPL-2.0, LGPL-2.1, CC-BY-SA-3.0
Large files files are truncated, but you can click here to view the full file
- <?php
-
- /*----------------------------------------------------------------------------------------------------------\
- | |
- | [ LIVE GAME SERVER LIST ] [ Š RICHARD PERRY FROM GREYCUBE.COM ] |
- | |
- | Released under the terms and conditions of the GNU General Public License Version 3 (http://gnu.org) |
- | |
- |-------------------------------------------------------------------------------------------------------------
- | [ EDITOR STYLE SETTINGS: LUCIDA CONSOLE, SIZE 10, TAB = 2 SPACES, BOLD GLOBALLY TURNED OFF ] |
- \-----------------------------------------------------------------------------------------------------------*/
-
- //------------------------------------------------------------------------------------------------------------+
- //------------------------------------------------------------------------------------------------------------+
-
- if (!function_exists('lgsl_type_list')) {
- function lgsl_type_list()
- {
- $lgsl_type_list = array("aarmy" => "Americas Army",
- "arma" => "ArmA: Armed Assault",
- "avp2" => "Aliens VS. Predator 2",
- "bfvietnam" => "Battlefield Vietnam",
- "bf1942" => "Battlefield 1942",
- "bf2" => "Battlefield 2",
- "bf2142" => "Battlefield 2142",
- "callofduty" => "Call Of Duty",
- "callofdutyuo" => "Call Of Duty: United Offensive",
- "callofduty2" => "Call Of Duty 2",
- "callofduty4" => "Call Of Duty 4",
- "cncrenegade" => "Command and Conquer: Renegade",
- "crysis" => "Crysis",
- "doom3" => "Doom 3",
- "dh2005" => "Deer Hunter 2005",
- "farcry" => "Far Cry",
- "fear" => "F.E.A.R.",
- "flashpoint" => "Operation Flashpoint",
- "freelancer" => "Freelancer",
- "frontlines" => "Frontlines: Fuel Of War",
- "ghostrecon" => "Ghost Recon",
- "graw" => "Ghost Recon: Advanced Warfighter",
- "graw2" => "Ghost Recon: Advanced Warfighter 2",
- "gtr2" => "GTR 2",
- "had2" => "Hidden and Dangerous 2",
- "halflife" => "Half-Life 1 ( Steam )",
- "halflifewon" => "Half-Life 1 ( WON )",
- "halo" => "Halo",
- "il2" => "IL-2 Sturmovik",
- "jediknight2" => "JediKnight 2",
- "mohaa" => "Medal of Honor: Allied Assault",
- "mohaab" => "Medal of Honor: Allied Assault Breakthrough",
- "mohaas" => "Medal of Honor: Allied Assault Spearhead",
- "mohpa" => "Medal of Honor: Pacific Assault",
- "mta" => "Multi Theft Auto",
- "nascar2004" => "Nascar Thunder 2004",
- "neverwinter" => "NeverWinter Nights",
- "neverwinter2" => "NeverWinter Nights 2",
- "painkiller" => "PainKiller",
- "quakeworld" => "Quake World",
- "quakewars" => "Enemy Territory: Quake Wars",
- "quake2" => "Quake 2",
- "quake3" => "Quake 3",
- "quake4" => "Quake 4",
- "ravenshield" => "Raven Shield",
- "rfactor" => "RFactor",
- "samp" => "San Andreas Multiplayer",
- "savage" => "Savage",
- "savage2" => "Savage 2",
- "serioussam" => "Serious Sam",
- "serioussam2" => "Serious Sam 2",
- "sof2" => "Soldier of Fortune 2",
- "soldat" => "Soldat",
- "source" => "Source ( Half-Life 2 )",
- "stalker" => "S.T.A.L.K.E.R.",
- "startrekef" => "StarTrek Elite-Force",
- "swat4" => "SWAT 4",
- "test" => "Test ( For PHP Developers )",
- "ut" => "Unreal Tournament",
- "ut2003" => "Unreal Tournament 2003",
- "ut2004" => "Unreal Tournament 2004",
- "ut3" => "Unreal Tournament 3",
- "vietcong" => "Vietcong",
- "vietcong2" => "Vietcong 2",
- "warsow" => "Warsow",
- "wolfenstein" => "Wolfenstein");
-
- return $lgsl_type_list;
- }}
-
- //------------------------------------------------------------------------------------------------------------+
- //------------------------------------------------------------------------------------------------------------+
-
- if (!function_exists('lgsl_protocol_list')) {
- function lgsl_protocol_list()
- {
- $lgsl_protocol_list = array("aarmy" => "09",
- "aarmy_" => "03",
- "arma" => "09",
- "avp2" => "03",
- "bfvietnam" => "09",
- "bf1942" => "03",
- "bf2" => "06",
- "bf2142" => "06",
- "callofduty" => "02",
- "callofdutyuo" => "02",
- "callofduty2" => "02",
- "callofduty4" => "02",
- "cncrenegade" => "03",
- "crysis" => "06",
- "doom3" => "10",
- "dh2005" => "09",
- "had2" => "03",
- "halflife" => "05",
- "halflifewon" => "05",
- "halo" => "03",
- "il2" => "03",
- "farcry" => "08",
- "fear" => "09",
- "flashpoint" => "03",
- "freelancer" => "14",
- "frontlines" => "20",
- "ghostrecon" => "19",
- "graw" => "06",
- "graw2" => "09",
- "gtr2" => "15",
- "jediknight2" => "02",
- "mohaa" => "03",
- "mohaab" => "03",
- "mohaas" => "03",
- "mohpa" => "03",
- "mohaa_" => "02",
- "mohaab_" => "02",
- "mohaas_" => "02",
- "mohpa_" => "02",
- "mta" => "08",
- "nascar2004" => "09",
- "neverwinter" => "09",
- "neverwinter2" => "09",
- "painkiller" => "08",
- "painkiller_" => "09",
- "quakeworld" => "07",
- "quakewars" => "10",
- "quake2" => "02",
- "quake3" => "02",
- "quake4" => "10",
- "ravenshield" => "04",
- "rfactor" => "16",
- "samp" => "12",
- "savage" => "17",
- "savage2" => "18",
- "serioussam" => "03",
- "serioussam2" => "09",
- "sof2" => "02",
- "soldat" => "08",
- "source" => "05",
- "stalker" => "06",
- "startrekef" => "02",
- "swat4" => "03",
- "test" => "01",
- "warsow" => "02",
- "ut" => "03",
- "ut2003" => "13",
- "ut2003_" => "03",
- "ut2004" => "13",
- "ut2004_" => "03",
- "ut3" => "11",
- "vietcong" => "03",
- "vietcong2" => "09",
- "wolfenstein" => "02");
-
- return $lgsl_protocol_list;
- }}
-
- //------------------------------------------------------------------------------------------------------------+
- //------------------------------------------------------------------------------------------------------------+
-
- if (!function_exists('lgsl_software_link')) {
- function lgsl_software_link($ip, $q_port, $c_port, $s_port, $type)
- {
- $lgsl_software_link = array("aarmy" => "qtracker://{IP}:{S_PORT}?game=ArmyOperations&action=show",
- "arma" => "qtracker://{IP}:{S_PORT}?game=ArmedAssault&action=show",
- "avp2" => "qtracker://{IP}:{S_PORT}?game=AliensversusPredator2&action=show",
- "bfvietnam" => "qtracker://{IP}:{S_PORT}?game=BattlefieldVietnam&action=show",
- "bf1942" => "qtracker://{IP}:{S_PORT}?game=Battlefield1942&action=show",
- "bf2" => "qtracker://{IP}:{S_PORT}?game=Battlefield2&action=show",
- "bf2142" => "qtracker://{IP}:{S_PORT}?game=Battlefield2142&action=show",
- "callofduty" => "qtracker://{IP}:{S_PORT}?game=CallOfDuty&action=show",
- "callofdutyuo" => "qtracker://{IP}:{S_PORT}?game=CallOfDutyUnitedOffensive&action=show",
- "callofduty2" => "qtracker://{IP}:{S_PORT}?game=CallOfDuty2&action=show",
- "callofduty4" => "qtracker://{IP}:{S_PORT}?game=CallOfDuty4&action=show",
- "cncrenegade" => "qtracker://{IP}:{S_PORT}?game=CommandConquerRenegade&action=show",
- "crysis" => "qtracker://{IP}:{S_PORT}?game=Crysis&action=show",
- "doom3" => "qtracker://{IP}:{S_PORT}?game=Doom3&action=show",
- "dh2005" => "http://en.wikipedia.org/wiki/Deer_Hunter_(computer_game)",
- "farcry" => "eye://NEW://{IP}:{S_PORT}",
- "fear" => "qtracker://{IP}:{S_PORT}?game=FEAR&action=show",
- "flashpoint" => "qtracker://{IP}:{S_PORT}?game=OperationFlashpoint&action=show",
- "freelancer" => "eye://DX://{IP}:{S_PORT}",
- "frontlines" => "http://en.wikipedia.org/wiki/Frontlines:_Fuel_of_War",
- "ghostrecon" => "eye://GR://{IP}:{S_PORT}",
- "graw" => "qtracker://{IP}:{S_PORT}?game=GhostRecon&action=show",
- "graw2" => "http://en.wikipedia.org/wiki/Tom_Clancy's_Ghost_Recon_Advanced_Warfighter_2",
- "gtr2" => "http://en.wikipedia.org/wiki/GTR2",
- "had2" => "http://en.wikipedia.org/wiki/Hidden_&_Dangerous_2",
- "halflife" => "qtracker://{IP}:{S_PORT}?game=HalfLife&action=show",
- "halflifewon" => "qtracker://{IP}:{S_PORT}?game=HalfLife_WON2&action=show",
- "halo" => "qtracker://{IP}:{S_PORT}?game=Halo&action=show",
- "il2" => "eye://OLD://{IP}:{S_PORT}",
- "jediknight2" => "qtracker://{IP}:{S_PORT}?game=JediKnight2&action=show",
- "mohaa" => "qtracker://{IP}:{S_PORT}?game=MedalofHonorAlliedAssault&action=show",
- "mohaab" => "qtracker://{IP}:{S_PORT}?game=MedalofHonorAlliedAssaultBreakthrough&action=show",
- "mohaas" => "qtracker://{IP}:{S_PORT}?game=MedalofHonorAlliedAssaultSpearhead&action=show",
- "mohpa" => "qtracker://{IP}:{S_PORT}?game=MedalofHonorPacificAssault&action=show",
- "mta" => "http://en.wikipedia.org/wiki/Multi_Theft_Auto",
- "nascar2004" => "http://en.wikipedia.org/wiki/NASCAR_Thunder_2004",
- "neverwinter" => "qtracker://{IP}:{S_PORT}?game=NeverwinterNights&action=show",
- "neverwinter2" => "qtracker://{IP}:{S_PORT}?game=NeverwinterNights&action=show",
- "painkiller" => "qtracker://{IP}:{S_PORT}?game=Painkiller&action=show",
- "quakeworld" => "qtracker://{IP}:{S_PORT}?game=QuakeWorld&action=show",
- "quakewars" => "qtracker://{IP}:{S_PORT}?game=EnemyTerritoryQuakeWars&action=show",
- "quake2" => "qtracker://{IP}:{S_PORT}?game=Quake2&action=show",
- "quake3" => "qtracker://{IP}:{S_PORT}?game=Quake3&action=show",
- "quake4" => "qtracker://{IP}:{S_PORT}?game=Quake4&action=show",
- "ravenshield" => "eye://RVS://{IP}:{S_PORT}",
- "rfactor" => "rfactor://{IP}:{S_PORT}",
- "samp" => "http://www.sa-mp.com",
- "savage" => "http://en.wikipedia.org/wiki/Savage:_The_Battle_for_Newerth",
- "savage2" => "http://en.wikipedia.org/wiki/Savage_2:_A_Tortured_Soul",
- "serioussam" => "qtracker://{IP}:{S_PORT}?game=SeriousSam&action=show",
- "serioussam2" => "qtracker://{IP}:{S_PORT}?game=Serious_Sam2&action=show",
- "sof2" => "qtracker://{IP}:{S_PORT}?game=SoldierOfFortune2&action=show",
- "soldat" => "eye://NEW://{IP}:{S_PORT}",
- "source" => "qtracker://{IP}:{S_PORT}?game=HalfLife2&action=show",
- "stalker" => "qtracker://{IP}:{S_PORT}?game=STALKER_ShadowChernobyl&action=show",
- "startrekef" => "EYE://EF://{IP}:{S_PORT}",
- "swat4" => "qtracker://{IP}:{S_PORT}?game=SWAT4&action=show",
- "test" => "http://www.greycube.com",
- "ut" => "qtracker://{IP}:{S_PORT}?game=UnrealTournament&action=show",
- "ut2003" => "qtracker://{IP}:{S_PORT}?game=UnrealTournament2003&action=show",
- "ut2004" => "qtracker://{IP}:{S_PORT}?game=UnrealTournament2004&action=show",
- "ut3" => "qtracker://{IP}:{S_PORT}?game=UnrealTournament3&action=show",
- "vietcong" => "qtracker://{IP}:{S_PORT}?game=Vietcong&action=show",
- "vietcong2" => "qtracker://{IP}:{S_PORT}?game=Vietcong2&action=show",
- "warsow" => "qtracker://{IP}:{S_PORT}?game=Warsow&action=show",
- "wolfenstein" => "qtracker://{IP}:{S_PORT}?game=ReturntoCastleWolfenstein&action=show");
-
- // IF THE SOFTWARE PORT IS NOT SET USE THE QUERY PORT
-
- if (!$s_port) { $s_port = $q_port; }
-
- // INSERT DATA INTO STATIC LINK AND RETURN
-
- return str_replace (array("{IP}", "{Q_PORT}", "{C_PORT}", "{S_PORT}"), array($ip, $q_port, $c_port, $s_port), $lgsl_software_link[$type]);
- }}
-
- //------------------------------------------------------------------------------------------------------------+
- //------------------------------------------------------------------------------------------------------------+
-
- if (!function_exists('lgsl_port_conversion')) {
- function lgsl_port_conversion($q_port, $c_port, $s_port, $type)
- {
- switch ($type) // GAMES WHERE Q_PORT IS NOT EQUAL TO C_PORT
- {
- case "aarmy" : $c_to_q = 1; $c_def = 1716; $q_def = 1717; $c_to_s = 0; break;
- case "bfvietnam" : $c_to_q = 0; $c_def = 15567; $q_def = 23000; $c_to_s = 0; break;
- case "bf1942" : $c_to_q = 0; $c_def = 14567; $q_def = 23000; $c_to_s = 0; break;
- case "bf2" : $c_to_q = 0; $c_def = 16567; $q_def = 29900; $c_to_s = 0; break;
- case "bf2142" : $c_to_q = 0; $c_def = 17567; $q_def = 29900; $c_to_s = 0; break;
- case "dh2005" : $c_to_q = 0; $c_def = 23459; $q_def = 34567; $c_to_s = 0; break;
- case "farcry" : $c_to_q = 123; $c_def = 49001; $q_def = 49124; $c_to_s = 0; break;
- case "flashpoint" : $c_to_q = 1; $c_def = 2302; $q_def = 2303; $c_to_s = 0; break;
- case "frontlines" : $c_to_q = 2; $c_def = 5476; $q_def = 5478; $c_to_s = 0; break;
- case "ghostrecon" : $c_to_q = 2; $c_def = 2346; $q_def = 2348; $c_to_s = 0; break;
- case "gtr2" : $c_to_q = 1; $c_def = 34297; $q_def = 34298; $c_to_s = 0; break;
- case "had2" : $c_to_q = 3; $c_def = 11001; $q_def = 11004; $c_to_s = 0; break;
- case "mohaa" : $c_to_q = 97; $c_def = 12203; $q_def = 12300; $c_to_s = 0; break;
- case "mohaab" : $c_to_q = 97; $c_def = 12203; $q_def = 12300; $c_to_s = 0; break;
- case "mohaas" : $c_to_q = 97; $c_def = 12203; $q_def = 12300; $c_to_s = 0; break;
- case "mohpa" : $c_to_q = 97; $c_def = 13203; $q_def = 13300; $c_to_s = 0; break;
- case "mta" : $c_to_q = 123; $c_def = 22003; $q_def = 22126; $c_to_s = 0; break;
- case "painkiller" : $c_to_q = 123; $c_def = 3455; $q_def = 3578; $c_to_s = 0; break;
- case "ravenshield" : $c_to_q = 1000; $c_def = 7777; $q_def = 8777; $c_to_s = 0; break;
- case "rfactor" : $c_to_q = -100; $c_def = 34397; $q_def = 34297; $c_to_s = 0; break;
- case "serioussam" : $c_to_q = 1; $c_def = 25600; $q_def = 25601; $c_to_s = 0; break;
- case "soldat" : $c_to_q = 123; $c_def = 23073; $q_def = 23196; $c_to_s = 0; break;
- case "stalker" : $c_to_q = 2; $c_def = 5447; $q_def = 5445; $c_to_s = 0; break;
- case "swat4" : $c_to_q = 1; $c_def = 10780; $q_def = 10781; $c_to_s = 0; break;
- case "ut" : $c_to_q = 1; $c_def = 7777; $q_def = 7778; $c_to_s = 0; break;
- case "ut2003" : $c_to_q = 1; $c_def = 7757; $q_def = 7758; $c_to_s = 10; break;
- case "ut2003_" : $c_to_q = 10; $c_def = 7757; $q_def = 7767; $c_to_s = 0; break;
- case "ut2004" : $c_to_q = 1; $c_def = 7777; $q_def = 7778; $c_to_s = 10; break;
- case "ut2004_" : $c_to_q = 10; $c_def = 7777; $q_def = 7787; $c_to_s = 0; break;
- case "ut3" : $c_to_q = 0; $c_def = 7777; $q_def = 6500; $c_to_s = 0; break;
- case "vietcong" : $c_to_q = 10000; $c_def = 5425; $q_def = 15425; $c_to_s = 0; break;
- case "vietcong2" : $c_to_q = 0; $c_def = 5001; $q_def = 19967; $c_to_s = 0; break;
- default : $c_to_q = 0; $c_def = $q_port; $q_def = $c_port; $c_to_s = 0; break;
- }
-
- if (!$c_port && !$q_port)
- {
- $c_port = $c_def;
- $q_port = $q_def;
- }
-
- if ($c_port && !$q_port)
- {
- $q_port = $c_to_q ? $c_port + $c_to_q : $q_def;
- }
-
- if ($q_port && !$c_port)
- {
- $c_port = $c_to_q ? $q_port - $c_to_q : $c_def;
- }
-
- if ($c_port && !$s_port)
- {
- $s_port = $c_to_s ? $c_port + $c_to_s : 0;
- }
-
- return array(intval($q_port), intval($c_port), intval($s_port));
- }}
-
- //------------------------------------------------------------------------------------------------------------+
- //------------------------------------------------------------------------------------------------------------+
-
- if (!function_exists('lgsl_query_live')) {
- function lgsl_query_live($ip, $q_port, $c_port, $s_port, $type, $request)
- {
- //---------------------------------------------------------+
-
- $lgsl_protocol_list = lgsl_protocol_list();
-
- if (!$lgsl_protocol_list[$type])
- {
- echo "LGSL PROBLEM: ".($type ? "INVALID TYPE '$type'" : "MISSING TYPE")." FOR $ip:$q_port:$c_port:$s_port"; exit;
- }
-
- if (!function_exists("lgsl_query_{$lgsl_protocol_list[$type]}"))
- {
- echo "LGSL PROBLEM: FUNCTION DOES NOT EXIST FOR: $type"; exit;
- }
-
- //---------------------------------------------------------+
-
- $status = 1;
-
- global $lgsl_config; // FEED IS CONFIGURED IN A SEPERATE FILE
-
- if (isset($lgsl_config['feed']) && $lgsl_config['feed']['method'] && $lgsl_config['feed']['url'])
- {
- $server = lgsl_query_feed($ip, $q_port, $c_port, $s_port, $type, $request, $lgsl_config['feed']['method'], $lgsl_config['feed']['url']);
- }
- elseif ($type == "test")
- {
- $server = call_user_func("lgsl_query_{$lgsl_protocol_list[$type]}", $type, $request, array());
- }
- else
- {
- $server = lgsl_query_direct($ip, $q_port, $type, $request, "lgsl_query_{$lgsl_protocol_list[$type]}");
- }
-
- //---------------------------------------------------------+
-
- // IF OFFLINE ARRAYS ARE SET TO TRIGGER OTHER CODE AND PREVENT FOEACH ERRORS
-
- if (!$server)
- {
- $status = 0;
- $server = array();
- $server['s'] = array();
- $server['e'] = array();
- $server['p'] = array();
- }
-
- //---------------------------------------------------------+
-
- // [s] IS A CONSISTANT FORMAT EVEN IF SERVER IS OFFLINE
-
- if (isset($server['s']))
- {
- if (isset($server['s']['game']) && !$server['s']['game']) { $server['s']['game'] = $type; }
-
- if (isset($server['s']['map']))
- {
- $tmp = str_replace("\\", "/", $server['s']['map']); // REMOVE ANY
- $tmp = explode("/", $tmp); // FOLDERS
- $server['s']['map'] = array_pop($tmp); // FROM MAP
- }
-
- if (isset($server['s']['password']))
- {
- if (strtolower($server['s']['password']) == "false") { $server['s']['password'] = 0; }
- if (strtolower($server['s']['password']) == "true") { $server['s']['password'] = 1; }
- }
-
- if (isset($server['s']['password']))
- $server['s']['password'] = intval($server['s']['password']);
- if (isset($server['s']['players']))
- {
- $server['s']['players'] = intval($server['s']['players']);
- if ($server['s']['players'] < 0) { $server['s']['players'] = 0; }
- }
- if (isset($server['s']['playersmax']))
- {
- $server['s']['playersmax'] = intval($server['s']['playersmax']);
- if ($server['s']['playersmax'] < 0) { $server['s']['playersmax'] = 0; }
- }
-
-
-
-
- }
-
- //---------------------------------------------------------+
-
- // [b] IS ALWAYS RETURNED
-
- $server['b']['ip'] = $ip;
- $server['b']['q_port'] = $q_port;
- $server['b']['c_port'] = $c_port;
- $server['b']['s_port'] = $s_port;
- $server['b']['type'] = $type;
- $server['b']['request'] = $request;
- $server['b']['status'] = $status;
-
- //---------------------------------------------------------+
-
- return $server;
- }}
-
- //------------------------------------------------------------------------------------------------------------+
- //------------------------------------------------------------------------------------------------------------+
-
- if (!function_exists('lgsl_query_direct')) {
- function lgsl_query_direct($ip, $q_port, $type, $request, $function_name)
- {
- //---------------------------------------------------------+
-
- // GAMES THAT NEED [s] QUERY TO COMPLETE [e]
-
- if (strpos($request, "e") !== FALSE && ($type == "halflifewon" || $type == "halflife" || $type == "source" || $type == "samp" || $type == "ut2004"))
- {
- $request .= "s";
- }
-
- // GAMES THAT NEED [e] QUERY TO COMPLETE [s]
-
- if (strpos($request, "s") !== FALSE && $type == "ut2004")
- {
- $request .= "e";
- }
-
- // GAMES THAT NEED [e] QUERY TO COMPLETE [p]
-
- if ((strpos($request, "p") !== FALSE) && $type == "bf1942")
- {
- $request .= "e";
- }
-
- //---------------------------------------------------------+
-
- global $lgsl_fp;
-
- $lgsl_fp = @fsockopen("udp://$ip", $q_port, $errno, $errstr, 1);
-
- if (!$lgsl_fp) { return FALSE; }
-
- //---------------------------------------------------------+
-
- global $lgsl_config;
-
- if ($lgsl_config['timeout'] = intval($lgsl_config['timeout']))
- {
- stream_set_timeout($lgsl_fp, $lgsl_config['timeout']);
- }
- else
- {
- stream_set_timeout($lgsl_fp, 0, 500000);
- }
-
- stream_set_blocking($lgsl_fp, TRUE);
-
- //---------------------------------------------------------+
-
- $server = array();
-
- if (strpos($request, "e") !== FALSE && !isset($server['e'])) // [e] MUST GO BEFORE [s]
- {
- $server = call_user_func($function_name, $type, "e", $server);
-
- if (!$server) { @fclose($lgsl_fp); return FALSE; }
- }
-
- if (strpos($request, "s") !== FALSE && !isset($server['s']))
- {
- $e_wipe = isset($server['e']) ? FALSE : TRUE;
- $server = call_user_func($function_name, $type, "s", $server);
-
- if (!$server) { @fclose($lgsl_fp); return FALSE; }
- if ($e_wipe) { unset($server['e']); } // DO NOT RETURN PARTIAL [e] GIVEN BY [s]
- }
-
- if (strpos($request, "p") !== FALSE && !isset($server['p']))
- {
- $e_wipe = isset($server['e']) ? FALSE : TRUE;
-
- if (isset($server['s']) && !$server['s']['players']) // SERVER EMPTY SO SKIP REQUESTING PLAYER DETAILS
- {
- $server['p'] = array();
- }
- else
- {
- $server = call_user_func($function_name, $type, "p", $server);
- }
-
- if (!$server) { @fclose($lgsl_fp); return FALSE; }
- if ($e_wipe) { unset($server['e']); } // DO NOT RETURN PARTIAL [e] GIVEN BY [p]
- }
-
- @fclose($lgsl_fp);
-
- //---------------------------------------------------------+
-
- return $server;
- }}
-
- //------------------------------------------------------------------------------------------------------------+
- //------------------------------------------------------------------------------------------------------------+
-
- if (!function_exists('lgsl_query_01')) {
- function lgsl_query_01($type, $request, $server)
- {
- //---------------------------------------------------------+
- // PROTOCOL FOR DEVELOPING WITHOUT USING LIVE SERVERS TO HELP ENSURE RETURNED
- // DATA IS SANITIZED AND THAT LONG SERVER AND PLAYER NAMES ARE HANDLED PROPERLY
-
- $server['s'] = array ("game" => "testgame",
- "name" => "testservernamethatsoften'really'longandcancontainsymbols<hr />thatwill\"screw\"uphtmlunlessentitied",
- "map" => "test_map",
- "players" => rand(0, 16),
- "playersmax" => rand(16, 32),
- "password" => rand(0, 1));
-
- //---------------------------------------------------------+
-
- $server['e'] = array ("testextra1" => time(),
- "testextra2" => 123,
- "testextra3" => "alpha",
- "testextra4" => "",
- "testextra5" => "<b>Charlie</b>",
- "testextra6" => "MapCycleGolfHotelIndiaJulietKiloLimaMikeNovemberOscarPapaGolfHotelIndiaJulietKiloLimaMikeNovemberOscarPapa");
-
- //---------------------------------------------------------+
-
- $server['p']['0']['name'] = "Delta";
- $server['p']['0']['score'] = "12";
- $server['p']['0']['ping'] = "34";
-
- $server['p']['1']['name'] = "\xc3\xa9\x63\x68\x6f\x20\xd0\xb8-d0\xb3\xd1\x80\xd0\xbe\xd0\xba"; // TEST UTF PLAYER NAMES
- $server['p']['1']['score'] = "56";
- $server['p']['1']['ping'] = "78";
-
- $server['p']['2']['name'] = "Foxtrot";
- $server['p']['2']['score'] = "90";
- $server['p']['2']['ping'] = "12";
-
- $server['p']['2']['name'] = "GolfHotelIndiaJulietKiloLimaMikeNovemberOscarPapa"; // TEST LONG PLAYER NAMES
- $server['p']['2']['score'] = "90";
- $server['p']['2']['ping'] = "12";
-
- //---------------------------------------------------------+
-
- if (rand(0, 10) == 5) { $server['p'] = array(); } // TEST SERVER WITH NO PLAYERS
- if (rand(0, 10) == 5) { return FALSE; } // TEST SERVER GOING OFFLINE
-
- //---------------------------------------------------------+
-
- return $server;
- }}
-
- //------------------------------------------------------------------------------------------------------------+
- //------------------------------------------------------------------------------------------------------------+
-
- if (!function_exists('lgsl_query_02')) {
- function lgsl_query_02($type, $request, $server)
- {
- //---------------------------------------------------------+
-
- global $lgsl_fp;
-
- if ($type == "mohaa_" || $type == "mohaab_" || $type == "mohaas_" || $type == "mohpa_")
- {
- fwrite($lgsl_fp, "\xFF\xFF\xFF\xFF\x02getstatus" );
- }
- elseif ($type == "quake2") { fwrite($lgsl_fp, "\xFF\xFF\xFF\xFFstatus"); }
- elseif ($type == "warsow") { fwrite($lgsl_fp, "\xFF\xFF\xFF\xFFgetinfo"); }
- else { fwrite($lgsl_fp, "\xFF\xFF\xFF\xFFgetstatus"); }
-
- $buffer = fread($lgsl_fp, 4096);
-
- if (!$buffer) { return FALSE; }
-
- //---------------------------------------------------------+
-
- $part = explode("\n", $buffer); // SPLIT INTO PARTS: HEADER/SETTINGS/PLAYERS/FOOTER
-
- array_pop($part); // REMOVE FOOTER WHICH IS EITHER NULL OR "\challenge\"
-
- $item = explode("\\", $part[1]); // SPLIT PART INTO ITEMS
-
- foreach ($item as $item_key => $data_key)
- {
- if (!($item_key % 2)) { continue; } // SKIP EVEN ITEM KEY
-
- $data_key = strtolower(lgsl_parse_color($data_key, "1"));
- $server['e'][$data_key] = lgsl_parse_color($item[$item_key + 1], "1");
- }
-
- //---------------------------------------------------------+
-
- $server['s']['game'] = $server['e']['gamename'];
- $server['s']['name'] = $server['e']['sv_hostname'];
- $server['s']['map'] = $server['e']['mapname'];
- $server['s']['players'] = isset($part['2']) && $part['2'] ? count($part) - 2 : 0;
- $server['s']['playersmax'] = $server['e']['sv_maxclients'];
- if (isset($server['e']['g_needpass']))
- $server['s']['password'] = $server['e']['g_needpass'];
- else
- $server['s']['password'] = "";
-
- if (!$server['s']['name']) { $server['s']['name'] = $server['e']['hostname']; } // HOSTNAME ALTERNATIVE
- if (isset($server['e']['pswrd'])) { $server['s']['password'] = $server['e']['pswrd']; } // CALL OF DUTY
- if (isset($server['e']['needpass'])) { $server['s']['password'] = $server['e']['needpass']; } // QUAKE2
- if (isset($server['e']['maxclients'])) { $server['s']['playersmax'] = $server['e']['maxclients']; } // QUAKE2
-
- //---------------------------------------------------------+
-
- array_shift($part); // REMOVE HEADER AND SHIFT KEYS
- array_shift($part); // REMOVE SETTING AND SHIFT KEYS
-
- $server['p'] = array();
-
- foreach ($part as $player_key => $data)
- {
- if (!$data) { continue; }
-
- if ($type == "warsow") // WARSOW: (SCORE) (PING) "(NAME)" "(TEAM)"
- {
- preg_match("/(.*) (.*) \"(.*)\" (.*)/", $data, $match);
-
- $server['p'][$player_key]['score'] = $match[1];
- $server['p'][$player_key]['ping'] = $match[2];
- $server['p'][$player_key]['name'] = $match[3];
- $server['p'][$player_key]['team'] = $match[4];
- }
- elseif ($type == "mohaa_" || $type == "mohaab_" || $type == "mohaas_") // MOH: (PING) "(NAME)"
- {
- preg_match("/(.*) \"(.*)\"/", $data, $match);
-
- $server['p'][$player_key]['ping'] = $match[1];
- $server['p'][$player_key]['name'] = $match[2];
- }
- elseif ($type == "mohpa_") // MOH: (?) (SCORE) (?) (TIME) (?) "(RANK?)" "(NAME)"
- {
- preg_match("/(.*) (.*) (.*) (.*) (.*) \"(.*)\" \"(.*)\"/", $data, $match);
-
- $server['p'][$player_key]['score'] = $match[2];
- $server['p'][$player_key]['deaths'] = $match[3];
- $server['p'][$player_key]['time'] = lgsl_time($match[4]);
- $server['p'][$player_key]['rank'] = $match[6];
- $server['p'][$player_key]['name'] = $match[7];
- }
- elseif ($type == "sof2") // SOF: (SCORE) (PING) (DEATHS) "(NAME)"
- {
- preg_match("/(.*) (.*) (.*) \"(.*)\"/", $data, $match);
-
- $server['p'][$player_key]['score'] = $match[1];
- $server['p'][$player_key]['ping'] = $match[2];
- $server['p'][$player_key]['deaths'] = $match[3];
- $server['p'][$player_key]['name'] = $match[4];
- }
- else // OTHER: (SCORE) (PING) "(NAME)"
- {
- preg_match("/(.*) (.*) \"(.*)\"/", $data, $match);
-
- $server['p'][$player_key]['score'] = $match[1];
- $server['p'][$player_key]['ping'] = $match[2];
- $server['p'][$player_key]['name'] = $match[3];
- }
-
- $server['p'][$player_key]['name'] = lgsl_parse_color($server['p'][$player_key]['name'], "1");
- }
-
- //---------------------------------------------------------+
-
- return $server;
- }}
-
- //------------------------------------------------------------------------------------------------------------+
- //------------------------------------------------------------------------------------------------------------+
-
- if (!function_exists('lgsl_query_03')) {
- function lgsl_query_03($type, $request, $server)
- {
- //---------------------------------------------------------+
-
- global $lgsl_fp;
-
- if ($type == "cncrenegade") { fwrite($lgsl_fp, "\\status\\" ); $server['p'] = array(); }
- elseif ($request == "p") { fwrite($lgsl_fp, "\\players\\" ); $server['p'] = array(); }
- else { fwrite($lgsl_fp, "\\basic\\\\info\\\\rules\\" ); $server['e'] = array(); }
-
- //---------------------------------------------------------+
-
- $packet1 = fread($lgsl_fp, 4096);
- if (!$packet1) { return FALSE; }
-
- preg_match_all("/(queryid\\\(.*)\.1|final\\\)/Us", $packet1, $match);
- if (count(array_unique($match[1])) < 2)
- {
- $packet2 = fread($lgsl_fp, 4096);
- if (!$packet2) { return FALSE; }
-
- preg_match_all("/(queryid\\\(.*)\.1|queryid\\\(.*)\.2|final\\\)/Us", $packet1.$packet2, $match);
- if (count(array_unique($match[1])) < 3)
- {
- $packet3 = fread($lgsl_fp, 4096);
- if (!$packet3) { return FALSE; }
- }
- }
-
- $buffer = $packet1.$packet2.$packet3; // JOIN ORDER DOES NOT MATTER
-
- if ($type == "avp2" && $request == "p") { $buffer = preg_replace("/\\\[0-9]+~/", "\\", $buffer); } // REMOVE ID PREFIX FROM NAMES
-
- $item = explode("\\", $buffer); // SPLIT INTO ITEMS
-
- //---------------------------------------------------------+
-
- foreach ($item as $item_key => $data_key)
- {
- if (!($item_key % 2)) { continue; } // SKIP EVEN ITEM KEY
- if ($data_key == "") { continue; } // SKIP BLANK DATA KEY
- if ($data_key == "final") { continue; } // SKIP PACKET STUFF
- if ($data_key == "queryid") { continue; } // SKIP PACKET STUFF
-
- $data_key = strtolower($data_key); // LOWERCASE KEY
- $tmp = explode("_", $data_key, 2); // SPLIT FOR CHECKS
-
- if (!isset($tmp[1]) || !is_numeric($tmp[1]) || $tmp[0] == "teamname") // EXTRA DATA
- {
- $server['e'][$data_key] = $item[$item_key + 1];
- }
- else // PLAYER DATA
- {
- if ($tmp[0] == "player") { $tmp[0] = "name"; } // CONVERT KEYS TO STANDARD FIELDS
- elseif ($tmp[0] == "playername") { $tmp[0] = "name"; }
- elseif ($tmp[0] == "frags") { $tmp[0] = "score"; }
- elseif ($tmp[0] == "ngsecret") { $tmp[0] = "stats"; }
-
- $server['p'][$tmp[1]][$tmp[0]] = $item[$item_key + 1];
- }
- }
-
- //---------------------------------------------------------+
-
- if ($server['e']['mapname'])
- {
- if (!$server['e']['gamename'] || $type == "bf1942") { $server['s']['game'] = $server['e']['gameid']; }
- else { $server['s']['game'] = $server['e']['gamename']; }
-
- if (!$server['e']['sv_hostname']) { $server['s']['name'] = $server['e']['hostname']; }
- else { $server['s']['name'] = $server['e']['sv_hostname']; }
-
- $server['s']['name'] = lgsl_parse_color($server['s']['name'], $type);
- $server['s']['map'] = $server['e']['mapname'];
- $server['s']['players'] = $server['e']['numplayers'];
- $server['s']['playersmax'] = $server['e']['maxplayers'];
- $server['s']['password'] = $server['e']['password'];
- }
-
- //---------------------------------------------------------+
-
- if ($server['p']) // NEED TO RE-SET PLAYER KEYS AS THERE MAY BE GAPS
- {
- $player_tmp = array();
- $player_key = 0;
-
- foreach ($server['p'] as $player)
- {
- if ($player_key >= $server['s']['players']) { continue; } // SKIP GHOST PLAYERS THAT BF1942 RETURNS
- $player_tmp[$player_key] = $player;
- $player_key++;
- }
-
- $server['p'] = $player_tmp;
- }
-
- //---------------------------------------------------------+
-
- return $server;
- }}
-
- //------------------------------------------------------------------------------------------------------------+
- //------------------------------------------------------------------------------------------------------------+
-
- if (!function_exists('lgsl_query_04')) {
- function lgsl_query_04($type, $request, $server)
- {
- //---------------------------------------------------------+
-
- global $lgsl_fp;
-
- fwrite($lgsl_fp, "REPORT");
-
- $buffer = fread($lgsl_fp, 4096);
-
- if (!$buffer) { return FALSE; }
-
- //---------------------------------------------------------+
-
- $lgsl_ravenshield_key = array("A1" => "playersmax",
- "A2" => "tkpenalty",
- "B1" => "players",
- "B2" => "allowradar",
- "D2" => "version",
- "E1" => "mapname",
- "E2" => "lid",
- "F1" => "maptype",
- "F2" => "gid",
- "G1" => "password",
- "G2" => "hostport",
- "H1" => "dedicated",
- "H2" => "terroristcount",
- "I1" => "hostname",
- "I2" => "aibackup",
- "J1" => "mapcycletypes",
- "J2" => "rotatemaponsuccess",
- "K1" => "mapcycle",
- "K2" => "forcefirstpersonweapons",
- "L1" => "players_name",
- "L2" => "gamename",
- "L3" => "punkbuster",
- "M1" => "players_time",
- "N1" => "players_ping",
- "O1" => "players_score",
- "P1" => "queryport",
- "Q1" => "rounds",
- "R1" => "roundtime",
- "S1" => "bombtimer",
- "T1" => "bomb",
- "W1" => "allowteammatenames",
- "X1" => "iserver",
- "Y1" => "friendlyfire",
- "Z1" => "autobalance");
-
- //---------------------------------------------------------+
-
- $item = explode("\xB6", $buffer); // SPLIT INTO ITEMS
-
- foreach ($item as $data_value)
- {
- $tmp = explode(" ", $data_value, 2);
- $data_key = $lgsl_ravenshield_key[$tmp[0]] ? $lgsl_ravenshield_key[$tmp[0]] : $tmp[0]; // CONVERT TO HUMAN FRIENDLY KEY
- $server['e'][$data_key] = trim($tmp[1]); // ALL VALUES NEED TRIMMING
- }
-
- $server['e']['mapcycle'] = str_replace("/"," ", $server['e']['mapcycle']); // CONVERT SLASH TO SPACE SO
- $server['e']['mapcycletypes'] = str_replace("/"," ", $server['e']['mapcycletypes']); // LONG LISTS WRAP NATURALLY
-
- //---------------------------------------------------------+
-
- $server['s']['game'] = $server['e']['gamename'];
- $server['s']['name'] = $server['e']['hostname'];
- $server['s']['map'] = $server['e']['mapname'];
- $server['s']['players'] = $server['e']['players'];
- $server['s']['playersmax'] = $server['e']['playersmax'];
- $server['s']['password'] = $server['e']['password'];
-
- //---------------------------------------------------------+
-
- $server['p'] = array();
-
- $player_name = $server['e']['players_name'] ? explode("/", substr($server['e']['players_name'], 1)) : array(); unset($server['e']['players_name']);
- $player_time = $server['e']['players_time'] ? explode("/", substr($server['e']['players_time'], 1)) : array(); unset($server['e']['players_time']);
- $player_ping = $server['e']['players_ping'] ? explode("/", substr($server['e']['players_ping'], 1)) : array(); unset($server['e']['players_ping']);
- $player_score = $server['e']['players_score'] ? explode("/", substr($server['e']['players_score'], 1)) : array(); unset($server['e']['players_score']);
-
- foreach ($player_name as $key => $name)
- {
- $server['p'][$key]['name'] = $player_name[$key];
- $server['p'][$key]['time'] = $player_time[$key];
- $server['p'][$key]['ping'] = $player_ping[$key];
- $server['p'][$key]['score'] = $player_score[$key];
- }
-
- //---------------------------------------------------------+
-
- return $server;
- }}
-
- //------------------------------------------------------------------------------------------------------------+
- //------------------------------------------------------------------------------------------------------------+
-
- if (!function_exists('lgsl_query_05')) {
- function lgsl_query_05($type, $request, $server)
- {
-
- //---------------------------------------------------------+
- // REFERENCE: http://developer.valvesoftware.com/wiki/Server_Queries
-
- global $lgsl_fp;
-
- if ($type == "halflifewon")
- {
- if ($request == "s") { fwrite($lgsl_fp, "\xFF\xFF\xFF\xFFdetails\x00"); }
- elseif ($request == "e") { fwrite($lgsl_fp, "\xFF\xFF\xFF\xFFrules\x00"); }
- elseif ($request == "p") { fwrite($lgsl_fp, "\xFF\xFF\xFF\xFFplayers\x00"); }
- }
- else
- {
- if ($request == "e" || $request == "p")
- {
- fwrite($lgsl_fp, "\xFF\xFF\xFF\xFF\x57");
-
- $challenge_packet = fread($lgsl_fp, 4096);
-
- if (!$challenge_packet) { return FALSE; }
-
- $challenge_code = substr($challenge_packet, 5, 4);
- }
-
- if ($request == "s") { fwrite($lgsl_fp, "\xFF\xFF\xFF\xFF\x54Source Engine Query\x00"); }
- elseif ($request == "e") { fwrite($lgsl_fp, "\xFF\xFF\xFF\xFF\x56{$challenge_code}"); }
- elseif ($request == "p") { fwrite($lgsl_fp, "\xFF\xFF\xFF\xFF\x55{$challenge_code}"); }
- }
-
- //---------------------------------------------------------+
-
- $packet_count = 0;
- $packet_bzip2 = FALSE;
-
- do
- {
- $packet_count ++;
- $packet = fread($lgsl_fp, 4096);
-
- if (!$packet) { return FALSE; }
-
- if ($packet[0] != "\xFE") // SINGLE PACKET
- {
- $buffer[0] = $packet;
- break;
- }
-
- if ((ord($packet[8]) & 0xF) > 1) // HALF-LIFE 1 MULTI-PACKET
- {
- $packet_total = ord($packet[8]) & 0xF; // UPPER NIBBLE
- $packet_index = ord($packet[8]) >> 4; …
Large files files are truncated, but you can click here to view the full file