Guest User

lgsl_protocol.php

a guest
Feb 9th, 2018
5,292
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 199.97 KB | None | 0 0
  1. <?php
  2. error_reporting(E_ERROR);
  3.  /*----------------------------------------------------------------------------------------------------------\
  4.  |                                                                                                          |
  5.  |                    [ LIVE GAME SERVER LIST ] [ © RICHARD PERRY FROM GREYCUBE.COM ]                      |
  6.  |                                                                                                          |
  7.  |  Released under the terms and conditions of the GNU General Public License Version 3 (http://gnu.org)    |
  8.  |                                                                                                          |
  9.  |-------------------------------------------------------------------------------------------------------------
  10.  |      [ EDITOR STYLE SETTINGS: LUCIDA CONSOLE, SIZE 10, TAB = 2 SPACES, BOLD GLOBALLY TURNED OFF ]        |
  11.  \-----------------------------------------------------------------------------------------------------------*/
  12.  
  13. //------------------------------------------------------------------------------------------------------------+
  14. //------------------------------------------------------------------------------------------------------------+
  15.  
  16. if (!function_exists('lgsl_version')) { // START OF DOUBLE LOAD PROTECTION
  17.  
  18. //------------------------------------------------------------------------------------------------------------+
  19. //------------------------------------------------------------------------------------------------------------+
  20.  
  21.     function lgsl_type_list()
  22.     {
  23.         return array(
  24.         "7dtd"          => "7 Days to Die",
  25.         "aarmy"         => "Americas Army",
  26.         "aarmy3"        => "Americas Army 3",
  27.         "aliensvspredator"  => "Aliens vs Predator",
  28.         "arcasimracing" => "Arca Sim Racing",
  29.         "arkse"         => "ARK: Survival Evolved",
  30.         "arma"          => "ArmA: Armed Assault",
  31.         "arma2"         => "ArmA 2",
  32.         "arma2oa"       => "ArmA 2 Operation Arrowhead",
  33.         "arma2co"       => "ArmA 2 Combined Operations",
  34.         "arma3"         => "ArmA 3",
  35.         "arma3alpha"    => "ArmA 3 Alpha",
  36.         "avorion"       => "Avorion",
  37.         "avp2"          => "Aliens VS. Predator 2",
  38.         "bfbc2"         => "Battlefield Bad Company 2",
  39.         "bfvietnam"     => "Battlefield Vietnam",
  40.         "bf1942"        => "Battlefield 1942",
  41.         "bf2"           => "Battlefield 2",
  42.         "bf3"           => "Battlefield 3",
  43.         "bf2142"        => "Battlefield 2142",
  44.         "callofduty"    => "Call of Duty",
  45.         "callofdutyuo"  => "Call of Duty: United Offensive",
  46.         "callofduty2"   => "Call of Duty 2",
  47.         "callofduty4mw" => "Call of Duty 4: Modern Warfare",
  48.         "callofdutywaw" => "Call of Duty: World at War",
  49.         "callofdutymw2" => "Call of Duty: Modern Warfare 2",
  50.         "callofdutymw3" => "Call of Duty: Modern Warfare 3",
  51.         "cncrenegade"   => "Command and Conquer: Renegade",
  52.         "conanexiles"   => "Conan Exiles",
  53.         "crysis"        => "Crysis",
  54.         "crysiswars"    => "Crysis Wars",
  55.         "cs2d"          => "CS2D",
  56.         "cube"          => "Cube Engine",
  57.         "dayzmod"       => "DayZ Mod",
  58.         "doomskulltag"  => "Doom - Skulltag",
  59.         "doomzdaemon"   => "Doom - ZDaemon",
  60.         "doom3"         => "Doom 3",
  61.         "dh2005"        => "Deer Hunter 2005",
  62.         "egs"           => "Empyrion - Galactic Survival",
  63.         "farcry"        => "Far Cry",
  64.         "fear"          => "F.E.A.R.",
  65.         "fivem"         =>  "GTA FiveM",
  66.         "flashpoint"    => "Operation Flashpoint",
  67.         "freelancer"    => "Freelancer",
  68.         "frontlines"    => "Frontlines: Fuel Of War",
  69.         "f1c9902"       => "F1 Challenge 99-02",
  70.         "gamespy1"      => "Generic GameSpy 1",
  71.         "gamespy2"      => "Generic GameSpy 2",
  72.         "gamespy3"      => "Generic GameSpy 3",
  73.         "ghostrecon"    => "Ghost Recon",
  74.         "graw"          => "Ghost Recon: Advanced Warfighter",
  75.         "graw2"         => "Ghost Recon: Advanced Warfighter 2",
  76.         "gtr2"          => "GTR 2",
  77.         "had2"          => "Hidden and Dangerous 2",
  78.         "halflife"      => "Half-Life - Steam",
  79.         "halflifewon"   => "Half-Life - WON",
  80.         "halo"          => "Halo",
  81.         "hurtworld"     => "Hurtworld",
  82.         "il2"           => "IL-2 Sturmovik",
  83.         "ivmp"          => "GTA IV:MP",
  84.         "jediknight2"   => "JediKnight 2: Jedi Outcast",
  85.         "jediknightja"  => "JediKnight: Jedi Academy",
  86.         "jc2mp"         => "Just Cause 2 Multiplayer",
  87.         "killingfloor"  => "Killing Floor",
  88.         "killingfloor2" => "Killing Floor 2",
  89.         "kingpin"       => "Kingpin: Life of Crime",
  90.         "lifeisfeudal"  => "Life is Feudal",
  91.         "moh"           => "Medal of Honor",
  92.         "mohaa"         => "Medal of Honor: Allied Assault",
  93.         "mohaab"        => "Medal of Honor: Allied Assault Breakthrough",
  94.         "mohaas"        => "Medal of Honor: Allied Assault Spearhead",
  95.         "mohpa"         => "Medal of Honor: Pacific Assault",
  96.         "mta"           => "Multi Theft Auto",
  97.         "murmur"        => "Murmur ( Mumble Server )",
  98.         "nascar2004"    => "Nascar Thunder 2004",
  99.         "neverwinter"   => "NeverWinter Nights",
  100.         "neverwinter2"  => "NeverWinter Nights 2",
  101.         "nexuiz"        => "Nexuiz",
  102.         "ns2"           => "Natural Selection 2",
  103.         "openttd"       => "Open Transport Tycoon Deluxe",
  104.         "painkiller"    => "PainKiller",
  105.         "plainsight"    => "Plain Sight",
  106.         "prey"          => "Prey",
  107.         "quakeworld"    => "Quake World",
  108.         "quakewars"     => "Enemy Territory: Quake Wars",
  109.         "quake2"        => "Quake 2",
  110.         "quake3"        => "Quake 3",
  111.         "quake4"        => "Quake 4",
  112.         "ravenshield"   => "Raven Shield",
  113.         "redorchestra"  => "Red Orchestra",
  114.         "redorchestra2" => "Red Orchestra 2 & Rising Storm",
  115.         "reignofkings"  => "Reign of Kings",
  116.         "rfactor"       => "RFactor",
  117.         "risingstorm2"  => "Rising Storm 2: Vietnam",
  118.         "ror"           => "Rigs of Rods",
  119.         "rust"          => "Rust",
  120.         "samp"          => "San Andreas Multiplayer",
  121.         "savage"        => "Savage",
  122.         "savage2"       => "Savage 2",
  123.         "serioussam"    => "Serious Sam",
  124.         "shoutcast"     => "SHOUTcast Server",
  125.         "serioussam2"   => "Serious Sam 2",
  126.         "shatteredh"    => "Shattered Horizon",
  127.         "sof2"          => "Soldier of Fortune 2",
  128.         "soldat"        => "Soldat",
  129.         "source"        => "Source ( Half-Life 2 )",
  130.         "stalker"       => "S.T.A.L.K.E.R.",
  131.         "stalkercs"     => "S.T.A.L.K.E.R. Clear Sky",
  132.         "startrekef"    => "StarTrek Elite-Force",
  133.         "starwarsbf"    => "Star Wars: Battlefront",
  134.         "starwarsbf2"   => "Star Wars: Battlefront 2",
  135.         "starwarsrc"    => "Star Wars: Republic Commando",
  136.         "stationeers"   => "Stationeers",
  137.         "squad"         => "Squad",
  138.         "swat4"         => "SWAT 4",
  139.         "test"          => "Test ( For PHP Developers )",
  140.         "teeworlds"     => "Teeworlds",
  141.         "tribes"        => "Tribes ( Starsiege )",
  142.         "tribes2"       => "Tribes 2",
  143.         "tribesv"       => "Tribes Vengeance",
  144.         "urbanterror"   => "UrbanTerror",
  145.         "ut"            => "Unreal Tournament",
  146.         "ut2003"        => "Unreal Tournament 2003",
  147.         "ut2004"        => "Unreal Tournament 2004",
  148.         "ut3"           => "Unreal Tournament 3",
  149.         "vbox"          => "VirtualBox",
  150.         "vcmp"          => "Vice City Multiplayer",
  151.         "vietcong"      => "Vietcong",
  152.         "vietcong2"     => "Vietcong 2",
  153.         "warsow"        => "Warsow",
  154.         "warsowold"     => "Warsow ( 0.4.2 and older )",
  155.         "wolfet"        => "Wolfenstein: Enemy Territory",
  156.         "wolfrtcw"      => "Wolfenstein: Return To Castle Wolfenstein",
  157.         "wolf2009"      => "Wolfenstein ( 2009 By Raven )",
  158.         "xonotic"       => "Xonotic");
  159.     }
  160.  
  161. //------------------------------------------------------------------------------------------------------------+
  162. //------------------------------------------------------------------------------------------------------------+
  163.  
  164.     function lgsl_protocol_list()
  165.     {
  166.         return array(
  167.         "7dtd"          => "05",
  168.         "aarmy"         => "09",
  169.         "aarmy_"        => "03",
  170.         "aarmy3"        => "26",
  171.         "aliensvspredator"  => "31",
  172.         "arcasimracing" => "16",
  173.         "arkse"         => "05",
  174.         "arma"          => "09",
  175.         "arma2"         => "06",
  176.         "arma2oa"       => "06",
  177.         "arma2co"       => "06",
  178.         "arma3"         => "05",
  179.         "arma3alpha"    => "09",
  180.         "avorion"       => "05",
  181.         "avp2"          => "03",
  182.         "bfbc2"         => "30",
  183.         "bfvietnam"     => "09",
  184.         "bf1942"        => "03",
  185.         "bf2"           => "06",
  186.         "bf3"           => "33",
  187.         "bf2142"        => "06",
  188.         "callofduty"    => "02",
  189.         "callofdutyuo"  => "02",
  190.         "callofduty2"   => "02",
  191.         "callofduty4mw" => "02",
  192.         "callofdutywaw" => "02",
  193.         "callofdutymw2" => "02",
  194.         "callofdutymw3" => "31",
  195.         "cncrenegade"   => "03",
  196.         "conanexiles"   => "05",
  197.         "crysis"        => "06",
  198.         "crysiswars"    => "06",
  199.         "cs2d"          => "29",
  200.         "cube"          => "24",
  201.         "dayzmod"  => "05",
  202.         "doomskulltag"  => "27",
  203.         "doomzdaemon"   => "28",
  204.         "doom3"         => "10",
  205.         "dh2005"        => "09",
  206.         "egs"           => "05",
  207.         "had2"          => "03",
  208.         "halflife"      => "05",
  209.         "halflifewon"   => "05",
  210.         "halo"          => "03",
  211.         "il2"           => "03",
  212.         "ivmp"          => "39",
  213.         "farcry"        => "08",
  214.         "fear"          => "09",
  215.         "fivem"         => "41",
  216.         "flashpoint"    => "03",
  217.         "freelancer"    => "14",
  218.         "frontlines"    => "20",
  219.         "f1c9902"       => "03",
  220.         "gamespy1"      => "03",
  221.         "gamespy2"      => "09",
  222.         "gamespy3"      => "06",
  223.         "ghostrecon"    => "19",
  224.         "graw"          => "06",
  225.         "graw2"         => "09",
  226.         "gtr2"          => "15",
  227.         "hurtworld"     => "05",
  228.         "jediknight2"   => "02",
  229.         "jediknightja"  => "02",
  230.         "jc2mp"         => "40",
  231.         "killingfloor"  => "13",
  232.         "killingfloor2" => "05",
  233.         "kingpin"       => "03",
  234.         "lifeisfeudal"  => "05",
  235.         "moh"           => "30",
  236.         "mohaa"         => "03",
  237.         "mohaab"        => "03",
  238.         "mohaas"        => "03",
  239.         "mohpa"         => "03",
  240.         "mohaa_"        => "02",
  241.         "mohaab_"       => "02",
  242.         "mohaas_"       => "02",
  243.         "mohpa_"        => "02",
  244.         "mta"           => "08",
  245.         "murmur"        => "34",
  246.         "nascar2004"    => "09",
  247.         "neverwinter"   => "09",
  248.         "neverwinter2"  => "09",
  249.         "nexuiz"        => "02",
  250.         "ns2"           => "05",
  251.         "openttd"       => "22",
  252.         "painkiller"    => "08",
  253.         "painkiller_"   => "09",
  254.         "plainsight"    => "32",
  255.         "prey"          => "10",
  256.         "quakeworld"    => "07",
  257.         "quakewars"     => "10",
  258.         "quake2"        => "02",
  259.         "quake3"        => "02",
  260.         "quake4"        => "10",
  261.         "ravenshield"   => "04",
  262.         "redorchestra"  => "13",
  263.         "redorchestra2" => "05",
  264.         "reignofkings"  => "05",
  265.         "rfactor"       => "16",
  266.         "risingstorm2"  => "05",
  267.         "ror"           => "36",
  268.         "rust"          => "05",
  269.         "samp"          => "12",
  270.         "savage"        => "17",
  271.         "savage2"       => "18",
  272.         "serioussam"    => "03",
  273.         "serioussam2"   => "09",
  274.         "shatteredh"    => "05",
  275.         "shoutcast"     => "37",
  276.         "sof2"          => "02",
  277.         "soldat"        => "08",
  278.         "source"        => "05",
  279.         "stalker"       => "06",
  280.         "stalkercs"     => "09",
  281.         "startrekef"    => "02",
  282.         "starwarsbf"    => "09",
  283.         "starwarsbf2"   => "09",
  284.         "starwarsrc"    => "09",
  285.         "stationeers"   => "05",
  286.         "squad"         => "05",
  287.         "swat4"         => "03",
  288.         "test"          => "01",
  289.         "teeworlds"     => "21",
  290.         "tribes"        => "23",
  291.         "tribes2"       => "25",
  292.         "tribesv"       => "09",
  293.         "warsow"        => "02",
  294.         "warsowold"     => "02",
  295.         "urbanterror"   => "02",
  296.         "ut"            => "03",
  297.         "ut2003"        => "13",
  298.         "ut2003_"       => "03",
  299.         "ut2004"        => "13",
  300.         "ut2004_"       => "03",
  301.         "ut3"           => "11",
  302.         "vbox"          => "38",
  303.         "vcmp"          => "12",
  304.         "vietcong"      => "03",
  305.         "vietcong2"     => "09",
  306.         "wolfet"        => "02",
  307.         "wolfrtcw"      => "02",
  308.         "wolf2009"      => "10",
  309.         "xonotic"       => "02");
  310.  
  311.         return $lgsl_protocol_list;
  312.     }
  313.      
  314. //------------------------------------------------------------------------------------------------------------+
  315. //------------------------------------------------------------------------------------------------------------+
  316.  
  317.     function lgsl_software_link($type, $ip, $c_port, $q_port, $s_port)
  318.     {
  319.         $lgsl_software_link = array(
  320.         "7dtd"          => "steam://connect/{IP}:{Q_PORT}",
  321.         "aarmy"         => "qtracker://{IP}:{S_PORT}?game=ArmyOperations&action=show",
  322.         "aarmy3"        => "qtracker://{IP}:{S_PORT}?game=AmericasArmy3&action=show",
  323.         "aliensvspredator"  => "steam://connect/{IP}:{Q_PORT}",
  324.         "arcasimracing" => "http://en.wikipedia.org/wiki/ARCA_Sim_Racing",
  325.         "arkse"         => "steam://connect/{IP}:{Q_PORT}",
  326.         "arma"          => "qtracker://{IP}:{S_PORT}?game=ArmedAssault&action=show",
  327.         "arma2"         => "http://en.wikipedia.org/wiki/ARMA_2",
  328.         "arma2oa"       => "http://en.wikipedia.org/wiki/ARMA_2",
  329.         "arma2co"       => "http://en.wikipedia.org/wiki/ARMA_2",
  330.         "arma3"         => "steam://connect/{IP}:{S_PORT}",
  331.         "arma3alpha"    => "http://en.wikipedia.org/wiki/ARMA_2",
  332.         "avorion"       => "steam://connect/{IP}:{S_PORT}",
  333.         "avp2"          => "qtracker://{IP}:{S_PORT}?game=AliensversusPredator2&action=show",
  334.         "bfbc2"         => "http://en.wikipedia.org/wiki/Battlefield_bad_company_2",
  335.         "bfvietnam"     => "qtracker://{IP}:{S_PORT}?game=BattlefieldVietnam&action=show",
  336.         "bf1942"        => "qtracker://{IP}:{S_PORT}?game=Battlefield1942&action=show",
  337.         "bf2"           => "qtracker://{IP}:{S_PORT}?game=Battlefield2&action=show",
  338.         "bf3"           => "http://en.wikipedia.org/wiki/Battlefield_3",
  339.         "bf2142"        => "qtracker://{IP}:{S_PORT}?game=Battlefield2142&action=show",
  340.         "callofduty"    => "qtracker://{IP}:{S_PORT}?game=CallOfDuty&action=show",
  341.         "callofdutyuo"  => "qtracker://{IP}:{S_PORT}?game=CallOfDutyUnitedOffensive&action=show",
  342.         "callofduty2"   => "qtracker://{IP}:{S_PORT}?game=CallOfDuty2&action=show",
  343.         "callofduty4mw" => "qtracker://{IP}:{S_PORT}?game=CallOfDuty4&action=show",
  344.         "callofdutywaw" => "qtracker://{IP}:{S_PORT}?game=CallOfDutyWorldAtWar&action=show",
  345.         "callofdutymw2" => "aiw://connect/{IP}:{S_PORT}",
  346.         "callofdutymw3" => "steam://connect/{IP}:{Q_PORT}",
  347.         "cncrenegade"   => "qtracker://{IP}:{S_PORT}?game=CommandConquerRenegade&action=show",
  348.         "conanexiles"   => "steam://connect/{IP}:{S_PORT}",
  349.         "crysis"        => "qtracker://{IP}:{S_PORT}?game=Crysis&action=show",
  350.         "crysiswars"    => "qtracker://{IP}:{S_PORT}?game=CrysisWars&action=show",
  351.         "cs2d"          => "http://www.cs2d.com",
  352.         "cube"          => "http://cubeengine.com",
  353.         "dayzmod"          => "steam://connect/{IP}:{S_PORT}",
  354.         "doomskulltag"  => "http://skulltag.com",
  355.         "doomzdaemon"   => "http://www.zdaemon.org",
  356.         "doom3"         => "qtracker://{IP}:{S_PORT}?game=Doom3&action=show",
  357.         "dh2005"        => "http://en.wikipedia.org/wiki/Deer_Hunter_(computer_game)",
  358.         "egs"           => "steam://connect/{IP}:{Q_PORT}",
  359.         "farcry"        => "qtracker://{IP}:{S_PORT}?game=FarCry&action=show",
  360.         "fear"          => "qtracker://{IP}:{S_PORT}?game=FEAR&action=show",
  361.         "fivem"         => "http://fivem.net/",
  362.         "flashpoint"    => "qtracker://{IP}:{S_PORT}?game=OperationFlashpoint&action=show",
  363.         "freelancer"    => "http://en.wikipedia.org/wiki/Freelancer_(computer_game)",
  364.         "frontlines"    => "http://en.wikipedia.org/wiki/Frontlines:_Fuel_of_War",
  365.         "f1c9902"       => "http://en.wikipedia.org/wiki/EA_Sports_F1_Series",
  366.         "gamespy1"      => "http://www.greycube.com",
  367.         "gamespy2"      => "http://www.greycube.com",
  368.         "gamespy3"      => "http://www.greycube.com",
  369.         "ghostrecon"    => "http://en.wikipedia.org/wiki/Tom_Clancy's_Ghost_Recon",
  370.         "graw"          => "qtracker://{IP}:{S_PORT}?game=GhostRecon&action=show",
  371.         "graw2"         => "http://en.wikipedia.org/wiki/Tom_Clancy's_Ghost_Recon_Advanced_Warfighter_2",
  372.         "gtr2"          => "http://en.wikipedia.org/wiki/GTR2",
  373.         "had2"          => "http://en.wikipedia.org/wiki/Hidden_&_Dangerous_2",
  374.         "halflife"      => "steam://connect/{IP}:{S_PORT}",
  375.         "halflifewon"   => "qtracker://{IP}:{S_PORT}?game=HalfLife_WON2&action=show",
  376.         "halo"          => "qtracker://{IP}:{S_PORT}?game=Halo&action=show",
  377.         "hurtworld"     => "http://hurtworld.com",
  378.         "il2"           => "http://en.wikipedia.org/wiki/IL-2_Sturmovik_(game)",
  379.         "ivmp"          => "http://web.archive.org/web/20120817041710/http://web.no1http.com/~ivmultip/files/beta",
  380.         "jediknight2"   => "qtracker://{IP}:{S_PORT}?game=JediKnight2&action=show",
  381.         "jediknightja"  => "qtracker://{IP}:{S_PORT}?game=JediKnightJediAcademy&action=show",
  382.         "jc2mp"         => "steam://connect/{IP}:{S_PORT}",
  383.         "killingfloor"  => "steam://connect/{IP}:{C_PORT}",
  384.         "killingfloor2" => "steam://connect/{IP}:{S_PORT}",
  385.         "kingpin"       => "qtracker://{IP}:{S_PORT}?game=Kingpin&action=show",
  386.         "lifeisfeudal"  => "steam://connect/{IP}:{Q_PORT}",
  387.         "mohaa"         => "qtracker://{IP}:{S_PORT}?game=MedalofHonorAlliedAssault&action=show",
  388.         "mohaab"        => "qtracker://{IP}:{S_PORT}?game=MedalofHonorAlliedAssaultBreakthrough&action=show",
  389.         "mohaas"        => "qtracker://{IP}:{S_PORT}?game=MedalofHonorAlliedAssaultSpearhead&action=show",
  390.         "mohpa"         => "qtracker://{IP}:{S_PORT}?game=MedalofHonorPacificAssault&action=show",
  391.         "mta"           => "mtasa://{IP}:{C_PORT}",
  392.         "murmur"        => "mumble://{IP}:{C_PORT}/?version=1.2.0",
  393.         "nascar2004"    => "http://en.wikipedia.org/wiki/NASCAR_Thunder_2004",
  394.         "neverwinter"   => "qtracker://{IP}:{S_PORT}?game=NeverwinterNights&action=show",
  395.         "neverwinter2"  => "qtracker://{IP}:{S_PORT}?game=NeverwinterNights&action=show",
  396.         "nexuiz"        => "qtracker://{IP}:{S_PORT}?game=Nexuiz&action=show",
  397.         "ns2"           => "steam://connect/{IP}:{S_PORT}",
  398.         "openttd"       => "http://wwww.openttd.org",
  399.         "painkiller"    => "qtracker://{IP}:{S_PORT}?game=Painkiller&action=show",
  400.         "plainsight"    => "http://www.plainsightgame.com",
  401.         "prey"          => "qtracker://{IP}:{S_PORT}?game=Prey&action=show",
  402.         "quakeworld"    => "qtracker://{IP}:{S_PORT}?game=QuakeWorld&action=show",
  403.         "quakewars"     => "qtracker://{IP}:{S_PORT}?game=EnemyTerritoryQuakeWars&action=show",
  404.         "quake2"        => "qtracker://{IP}:{S_PORT}?game=Quake2&action=show",
  405.         "quake3"        => "qtracker://{IP}:{S_PORT}?game=Quake3&action=show",
  406.         "quake4"        => "qtracker://{IP}:{S_PORT}?game=Quake4&action=show",
  407.         "ravenshield"   => "http://en.wikipedia.org/wiki/Tom_Clancy's_Rainbow_Six_3",
  408.         "redorchestra"  => "steam://connect/{IP}:{C_PORT}",
  409.         "redorchestra2" => "steam://connect/{IP}:{S_PORT}",
  410.         "rfactor"       => "rfactor://{IP}:{S_PORT}",
  411.         "risingstorm2"  => "steam://connect/{IP}:{S_PORT}",
  412.         "reignofkings"  => "steam://connect/{IP}:{Q_PORT}",
  413.         "ror"           => "http://www.rigsofrods.com/servers/",
  414.         "rust"          => "steam://connect/{IP}:{S_PORT}",
  415.         "samp"          => "samp://{IP}:{C_PORT}",
  416.         "savage"        => "http://en.wikipedia.org/wiki/Savage:_The_Battle_for_Newerth",
  417.         "savage2"       => "http://en.wikipedia.org/wiki/Savage_2:_A_Tortured_Soul",
  418.         "serioussam"    => "qtracker://{IP}:{S_PORT}?game=SeriousSam&action=show",
  419.         "serioussam2"   => "qtracker://{IP}:{S_PORT}?game=Serious_Sam2&action=show",
  420.         "shatteredh"    => "http://en.wikipedia.org/wiki/Shattered_Horizon",
  421.         "shoutcast"     => "http://{IP}:{S_PORT}/index.html",
  422.         "stationeers"   => "http://{IP}:{C_PORT}",
  423.         "sof2"          => "qtracker://{IP}:{S_PORT}?game=SoldierOfFortune2&action=show",
  424.         "soldat"        => "http://www.soldat.pl",
  425.         "source"        => "steam://connect/{IP}:{S_PORT}",
  426.         "stalker"       => "qtracker://{IP}:{S_PORT}?game=STALKER_ShadowChernobyl&action=show",
  427.         "stalkercs"     => "qtracker://{IP}:{S_PORT}?game=STALKER_ClearSky&action=show",
  428.         "startrekef"    => "http://en.wikipedia.org/wiki/Star_Trek:_Voyager:_Elite_Force",
  429.         "starwarsbf"    => "qtracker://{IP}:{S_PORT}?game=StarWarsBattlefront&action=show",
  430.         "starwarsbf2"   => "qtracker://{IP}:{S_PORT}?game=StarWarsBattlefront2&action=show",
  431.         "starwarsrc"    => "qtracker://{IP}:{S_PORT}?game=StarWarsRepublicCommando&action=show",
  432.         "squad"         => "steam://connect/{IP}:{S_PORT}",
  433.         "swat4"         => "qtracker://{IP}:{S_PORT}?game=SWAT4&action=show",
  434.         "test"          => "http://www.greycube.com",
  435.         "teeworlds"     => "http://www.teeworlds.com",
  436.         "tribes"        => "qtracker://{IP}:{S_PORT}?game=Tribes&action=show",
  437.         "tribes2"       => "qtracker://{IP}:{S_PORT}?game=Tribes2&action=show",
  438.         "tribesv"       => "qtracker://{IP}:{S_PORT}?game=TribesVengeance&action=show",
  439.         "urbanterror"   => "qtracker://{IP}:{S_PORT}?game=UrbanTerror&action=show",
  440.         "ut"            => "qtracker://{IP}:{S_PORT}?game=UnrealTournament&action=show",
  441.         "ut2003"        => "qtracker://{IP}:{S_PORT}?game=UnrealTournament2003&action=show",
  442.         "ut2004"        => "qtracker://{IP}:{S_PORT}?game=UnrealTournament2004&action=show",
  443.         "ut3"           => "qtracker://{IP}:{S_PORT}?game=UnrealTournament3&action=show",
  444.         "vcmp"          => "http://vc-mp.org",
  445.         "vietcong"      => "qtracker://{IP}:{S_PORT}?game=Vietcong&action=show",
  446.         "vietcong2"     => "qtracker://{IP}:{S_PORT}?game=Vietcong2&action=show",
  447.         "warsow"        => "warsow://{IP}:{S_PORT}",
  448.         "warsowold"     => "qtracker://{IP}:{S_PORT}?game=Warsow&action=show",
  449.         "wolfet"        => "qtracker://{IP}:{S_PORT}?game=WolfensteinEnemyTerritory&action=show",
  450.         "wolfrtcw"      => "qtracker://{IP}:{S_PORT}?game=ReturntoCastleWolfenstein&action=show",
  451.         "wolf2009"      => "http://en.wikipedia.org/wiki/Wolfenstein_(2009_video_game)",
  452.         "xonotic"       => "qtracker://{IP}:{S_PORT}?game=Xonotic&action=show");
  453.  
  454.         // SOFTWARE PORT IS THE QUERY PORT UNLESS SET
  455.         if (!$s_port) { $s_port = $q_port; }
  456.  
  457.         // Force the SimpleXMLElement into a plain string
  458.         $type = (string) $type;
  459.  
  460.        // TRY USING THE STANDARD LAUNCH LINK FOR ALTERNATE PROTOCOLS IF ONE IS NOT SET
  461.         $type = str_replace("_", "", $type);
  462.  
  463.         // INSERT DATA INTO STATIC LINK - CONVERT SPECIAL CHARACTERS - RETURN
  464.         return htmlentities(str_replace(array("{IP}", "{C_PORT}", "{Q_PORT}", "{S_PORT}"), array($ip, $c_port, $q_port, $s_port), $lgsl_software_link[$type]), ENT_QUOTES);
  465.     }
  466.  
  467. //------------------------------------------------------------------------------------------------------------+
  468. //------------------------------------------------------------------------------------------------------------+
  469.  
  470.     function lgsl_port_conversion($type, $c_port, $q_port, $s_port)
  471.     {
  472.         switch ($type) // GAMES WHERE Q_PORT IS NOT EQUAL TO C_PORT
  473.         {
  474.             case "7dtd"             : $c_to_q = 1;      $c_def = 26900; $q_def = 26901; $c_to_s = 0;    break;
  475.             case "aarmy"            : $c_to_q = 1;      $c_def = 1716;  $q_def = 1717;  $c_to_s = 0;    break;
  476.             case "aarmy3"           : $c_to_q = 0;      $c_def = 8777;  $q_def = 39300; $c_to_s = 0;    break;
  477.             case "aliensvspredator" : $c_to_q = -23357; $c_def = 27015; $q_def = 3658;  $c_to_s = 0;    break;
  478.             case "arcasimracing"    : $c_to_q = -100;   $c_def = 34397; $q_def = 34297; $c_to_s = 0;    break;
  479.             case "arkse"            : $c_to_q = 19238;  $c_def = 7777;  $q_def = 27015; $c_to_s = 0;    break;
  480.             case "arma3"            : $c_to_q = 1;      $c_def = 2302;  $q_def = 2303;  $c_to_s = 0;    break;
  481.             case "avorion"          : $c_to_q = 20;     $c_def = 27000; $q_def = 27020; $c_to_s = 0;    break;
  482.             case "bfbc2"            : $c_to_q = 0;      $c_def = 19567; $q_def = 48888; $c_to_s = 0;    break;
  483.             case "bfvietnam"        : $c_to_q = 0;      $c_def = 15567; $q_def = 23000; $c_to_s = 0;    break;
  484.             case "bf1942"           : $c_to_q = 0;      $c_def = 14567; $q_def = 23000; $c_to_s = 0;    break;
  485.             case "bf2"              : $c_to_q = 13333;  $c_def = 16567; $q_def = 29900; $c_to_s = 0;    break;
  486.             case "bf3"              : $c_to_q = 22000;  $c_def = 25200; $q_def = 47200; $c_to_s = 0;    break;
  487.             case "bf2142"           : $c_to_q = 0;      $c_def = 17567; $q_def = 29900; $c_to_s = 0;    break;
  488.             case "callofdutymw3"    : $c_to_q = -1;     $c_def = 27015; $q_def = 27014; $c_to_s = 0;    break;
  489.             case "conanexiles"      : $c_to_q = 19238;  $c_def = 7777;  $q_def = 27015; $c_to_s = 0;    break;
  490.             case "cube"             : $c_to_q = 1;      $c_def = 28785; $q_def = 28786; $c_to_s = 0;    break;
  491.             case "dayzmod"          : $c_to_q = 1;      $c_def = 2302;  $q_def = 2303;  $c_to_s = 0;    break;
  492.             case "egs"              : $c_to_q = 1;      $c_def = 30000; $q_def = 30001; $c_to_s = 0;    break;
  493.             case "dh2005"           : $c_to_q = 0;      $c_def = 23459; $q_def = 34567; $c_to_s = 0;    break;
  494.             case "farcry"           : $c_to_q = 123;    $c_def = 49001; $q_def = 49124; $c_to_s = 0;    break;
  495.             case "flashpoint"       : $c_to_q = 1;      $c_def = 2302;  $q_def = 2303;  $c_to_s = 0;    break;
  496.             case "frontlines"       : $c_to_q = 2;      $c_def = 5476;  $q_def = 5478;  $c_to_s = 0;    break;
  497.             case "ghostrecon"       : $c_to_q = 2;      $c_def = 2346;  $q_def = 2348;  $c_to_s = 0;    break;
  498.             case "gtr2"             : $c_to_q = 1;      $c_def = 34297; $q_def = 34298; $c_to_s = 0;    break;
  499.             case "had2"             : $c_to_q = 3;      $c_def = 11001; $q_def = 11004; $c_to_s = 0;    break;
  500.             case "hurtworld"        : $c_to_q = 10;     $c_def = 12871; $q_def = 12881; $c_to_s = 0;    break;
  501.             case "kingpin"          : $c_to_q = -10;    $c_def = 31510; $q_def = 31500; $c_to_s = 0;    break;
  502.             case "killingfloor"     : $c_to_q = 1;      $c_def = 7708;  $q_def = 7709;  $c_to_s = 0;    break;
  503.             case "killingfloor2"    : $c_to_q = 19238;  $c_def = 7777;  $q_def = 27015; $c_to_s = 0;    break;
  504.             case "lifeisfeudal"     : $c_to_q = 2;      $c_def = 28000; $q_def = 28002; $c_to_s = 0;    break;
  505.             case "mohaa"            : $c_to_q = 97;     $c_def = 12203; $q_def = 12300; $c_to_s = 0;    break;
  506.             case "mohaab"           : $c_to_q = 97;     $c_def = 12203; $q_def = 12300; $c_to_s = 0;    break;
  507.             case "mohaas"           : $c_to_q = 97;     $c_def = 12203; $q_def = 12300; $c_to_s = 0;    break;
  508.             case "mohpa"            : $c_to_q = 97;     $c_def = 13203; $q_def = 13300; $c_to_s = 0;    break;
  509.             case "mta"              : $c_to_q = 123;    $c_def = 22003; $q_def = 22126; $c_to_s = 0;    break;
  510.             case "murmur"           : $c_to_q = 2;      $c_def = 64738; $q_def = 64740; $c_to_s = 0;    break;
  511.             case "ns2"              : $c_to_q = 1;      $c_def = 27015; $q_def = 27016; $c_to_s = 1;    break;
  512.             case "painkiller"       : $c_to_q = 123;    $c_def = 3455;  $q_def = 3578;  $c_to_s = 0;    break;
  513.             case "ravenshield"      : $c_to_q = 1000;   $c_def = 7777;  $q_def = 8777;  $c_to_s = 0;    break;
  514.             case "redorchestra"     : $c_to_q = 1;      $c_def = 7758;  $q_def = 7759;  $c_to_s = 0;    break;
  515.             case "redorchestra2"    : $c_to_q = 19238;  $c_def = 7777;  $q_def = 27015; $c_to_s = 0;    break;
  516.             case "reignofkings"     : $c_to_q = 19665;  $c_def = 7350;  $q_def = 27015; $c_to_s = 0;    break;
  517.             case "rfactor"          : $c_to_q = -100;   $c_def = 34397; $q_def = 34297; $c_to_s = 0;    break;
  518.             case "risingstorm2"     : $c_to_q = 19238;  $c_def = 7777;  $q_def = 27015; $c_to_s = 0;    break;
  519.             case "serioussam"       : $c_to_q = 1;      $c_def = 25600; $q_def = 25601; $c_to_s = 0;    break;
  520.             case "soldat"           : $c_to_q = 123;    $c_def = 23073; $q_def = 23196; $c_to_s = 0;    break;
  521.             case "stalker"          : $c_to_q = 2;      $c_def = 5447;  $q_def = 5445;  $c_to_s = 0;    break;
  522.             case "stalkercs"        : $c_to_q = 2;      $c_def = 5447;  $q_def = 5445;  $c_to_s = 0;    break;
  523.             case "starwarsrc"       : $c_to_q = 0;      $c_def = 7777;  $q_def = 11138; $c_to_s = 0;    break;
  524.             case "stationeers"      : $c_to_q = -485;   $c_def = 27500; $q_def = 27015; $c_to_s = 0;    break;
  525.             case "squad"            : $c_to_q = 19378;  $c_def = 7787;  $q_def = 27165; $c_to_s = 0;    break;
  526.             case "swat4"            : $c_to_q = 1;      $c_def = 10780; $q_def = 10781; $c_to_s = 0;    break;
  527.             case "tribesv"          : $c_to_q = 1;      $c_def = 7777;  $q_def = 7778;  $c_to_s = 0;    break;
  528.             case "ut"               : $c_to_q = 1;      $c_def = 7777;  $q_def = 7778;  $c_to_s = 0;    break;
  529.             case "ut2003"           : $c_to_q = 1;      $c_def = 7757;  $q_def = 7758;  $c_to_s = 10;   break;
  530.             case "ut2003_"          : $c_to_q = 10;     $c_def = 7757;  $q_def = 7767;  $c_to_s = 0;    break;
  531.             case "ut2004"           : $c_to_q = 1;      $c_def = 7777;  $q_def = 7778;  $c_to_s = 10;   break;
  532.             case "ut2004_"          : $c_to_q = 10;     $c_def = 7777;  $q_def = 7787;  $c_to_s = 0;    break;
  533.             case "ut3"              : $c_to_q = -1277;  $c_def = 7777;  $q_def = 6500;  $c_to_s = 0;    break;
  534.             case "vietcong"         : $c_to_q = 10000;  $c_def = 5425;  $q_def = 15425; $c_to_s = 0;    break;
  535.             case "vietcong2"        : $c_to_q = 0;      $c_def = 5001;  $q_def = 19967; $c_to_s = 0;    break;
  536.             default                 : $c_to_q = 0;      $c_def = 0;     $q_def = 0;     $c_to_s = 0;    break;
  537.         }
  538.  
  539.         if      (!$c_port && !$q_port && $c_def)    { $c_port = $c_def; $q_port = $q_def; }
  540.         if      (!$c_port &&  $q_port && $c_to_q)   { $c_port = $q_port - $c_to_q; }
  541.         elseif  (!$c_port &&  $q_port && $c_def)    { $c_port = $c_def; }
  542.         elseif  (!$c_port &&  $q_port)              { $c_port = $q_port; }
  543.         if      (!$q_port &&  $c_port && $c_to_q)   { $q_port = $c_port + $c_to_q; }
  544.         elseif  (!$q_port &&  $c_port && $q_def)    { $q_port = $q_def; }
  545.         elseif  (!$q_port &&  $c_port)              { $q_port = $c_port; }
  546.         if      (!$s_port &&  $c_to_s)              { $s_port = $c_port + $c_to_s; }
  547.  
  548.         return array(intval($c_port), intval($q_port), intval($s_port));
  549.     }
  550.  
  551. //------------------------------------------------------------------------------------------------------------+
  552. //------------------------------------------------------------------------------------------------------------+
  553.  
  554.     function lgsl_query_live($type, $ip, $c_port, $q_port, $s_port, $request)
  555.     {
  556. //---------------------------------------------------------+
  557.         if (preg_match("/[^0-9a-z\.\-\[\]\:]/i", $ip))
  558.         {
  559.             exit("LGSL PROBLEM: INVALID IP OR HOSTNAME");
  560.         }
  561.  
  562.         $lgsl_protocol_list = lgsl_protocol_list();
  563.  
  564.         if (!isset($lgsl_protocol_list[$type]))
  565.         {
  566.             exit("LGSL PROBLEM: ".($type ? "INVALID TYPE '{$type}'" : "MISSING TYPE")." FOR {$ip}, {$c_port}, {$q_port}, {$s_port}");
  567.         }
  568.  
  569.         $lgsl_function = "lgsl_query_{$lgsl_protocol_list[$type]}";
  570.  
  571.         if (!function_exists($lgsl_function))
  572.         {
  573.             exit("LGSL PROBLEM: FUNCTION DOES NOT EXIST FOR: {$type}");
  574.         }
  575.  
  576.         if (!intval($q_port))
  577.         {
  578.             exit("LGSL PROBLEM: INVALID QUERY PORT");
  579.         }
  580.  
  581.     //---------------------------------------------------------+
  582.     //  ARRAYS ARE SETUP IN ADVANCE
  583.  
  584.         $server = array(
  585.         "b" => array("type" => $type, "ip" => $ip, "c_port" => $c_port, "q_port" => $q_port, "s_port" => $s_port, "status" => 1),
  586.         "s" => array("game" => "", "name" => "", "map" => "", "players" => 0, "playersmax" => 0, "password" => ""),
  587.         "e" => array(),
  588.         "p" => array(),
  589.         "t" => array());
  590.  
  591.     //---------------------------------------------------------+
  592.     //  GET DATA
  593.  
  594.         if ($lgsl_function == "lgsl_query_01") // TEST BYPAssES THE REST
  595.         {
  596.             $lgsl_need = ""; $lgsl_fp = "";
  597.             $response = call_user_func_array($lgsl_function, array(&$server, &$lgsl_need, &$lgsl_fp));
  598.             return $server;
  599.         }
  600.             //------------------Open Game Panel LGSL FEED CONFIGURATION (found on web settings)-----------------------+      
  601.         global $settings;
  602.        
  603.         if( isset($_GET['m']) and $_GET['m'] == "lgsl" )
  604.             $lgsl_config['feed']['method'] = 0;
  605.         else
  606.             $lgsl_config['feed']['method'] = $settings['feed_enable'];
  607.  
  608.         $lgsl_config['feed']['url'] = $settings['feed_url'];
  609.     //--------------------------------------------------------------------------------------------------------+
  610.         if (!empty($lgsl_config['feed']['method']) && !empty($lgsl_config['feed']['url']))
  611.         {
  612.             $response = lgsl_query_feed($server, $request, $lgsl_config['feed']['method'], $lgsl_config['feed']['url']);
  613.         }
  614.         elseif (isset($settings['remote_query']) and $settings['remote_query'] == 1)
  615.         {
  616.             global $db;
  617.             $home_info = $db->getGameHomeByIP($ip, $c_port);
  618.             $response = lgsl_query_feed($server, $request, $lgsl_config['feed']['method'], $lgsl_config['feed']['url'], $home_info);
  619.         }
  620.         elseif ($lgsl_function == "lgsl_query_30")
  621.         {
  622.             $response = lgsl_query_direct($server, $request, $lgsl_function, "tcp");
  623.         }
  624.         elseif ($lgsl_function == "lgsl_query_33")
  625.         {
  626.             $response = lgsl_query_direct($server, $request, $lgsl_function, "tcp");
  627.         }
  628.         else
  629.         {
  630.             $response = lgsl_query_direct($server, $request, $lgsl_function, "udp");
  631.         }
  632.  
  633.     //---------------------------------------------------------+
  634.     //  FORMAT RESPONSE
  635.  
  636.         if (!$response) // SERVER OFFLINE
  637.         {
  638.             $server['b']['status'] = 0;
  639.         }
  640.         else
  641.         {
  642.             // IF NOT RETURNED USE THE TYPE AS THE GAME
  643.             if (empty($server['s']['game'])) { $server['s']['game'] = $type; }
  644.             if (empty($server['s']['map'])) { $server['s']['map']   = "-"; }
  645.  
  646.             // REMOVE FOLDERS FROM MAP NAMES
  647.             if (($pos = strrpos($server['s']['map'], "/"))  !== FALSE) { $server['s']['map'] = substr($server['s']['map'], $pos + 1); }
  648.             if (($pos = strrpos($server['s']['map'], "\\")) !== FALSE) { $server['s']['map'] = substr($server['s']['map'], $pos + 1); }
  649.  
  650.             // PLAYER COUNT AND PASSWORD STATUS SHOULD BE NUMERIC
  651.             $server['s']['players'] = intval($server['s']['players']);
  652.             $server['s']['playersmax'] = intval($server['s']['playersmax']);
  653.  
  654.             if (strtolower($server['s']['password']) == "false") { $server['s']['password'] = 0; }
  655.             if (strtolower($server['s']['password']) == "true")  { $server['s']['password'] = 1; }
  656.  
  657.             $server['s']['password']   = intval($server['s']['password']);
  658.  
  659.             // REMOVE UN-REQUESTED AND UN-USED ARRAYS
  660.  
  661.             if (strpos($request, "p") === FALSE && empty($server['p']) && $server['s']['players'] != 0)      { unset($server['p']); }
  662.             if (strpos($request, "p") === FALSE && empty($server['t']))                                      { unset($server['t']); }
  663.             if (strpos($request, "e") === FALSE && empty($server['e']))                                      { unset($server['e']); }
  664.             if (strpos($request, "s") === FALSE && empty($server['s']['name']) && empty($server['s']['map'])) { unset($server['s']); }
  665.         }
  666.  
  667.     //---------------------------------------------------------+
  668.  
  669.         return $server;
  670.     }
  671.  
  672. //------------------------------------------------------------------------------------------------------------+
  673. //------------------------------------------------------------------------------------------------------------+
  674.  
  675.     function lgsl_query_direct(&$server, $request, $lgsl_function, $scheme)
  676.     {
  677. //---------------------------------------------------------+
  678.         $lgsl_fp = @fsockopen("{$scheme}://{$server['b']['ip']}", $server['b']['q_port'], $errno, $errstr, 1);
  679.        
  680.         if (!$lgsl_fp) { return FALSE; }
  681.         $lgsl_config['timeout'] = 0;
  682.         $lgsl_config['timeout'] = intval($lgsl_config['timeout']);
  683.         stream_set_timeout($lgsl_fp, $lgsl_config['timeout'], $lgsl_config['timeout'] ? 0 : 500000);
  684.         stream_set_blocking($lgsl_fp, TRUE);
  685.     //---------------------------------------------------------+
  686.     //  CHECK WHAT IS NEEDED
  687.  
  688.         $lgsl_need      = array();
  689.         $lgsl_need['s'] = strpos($request, "s") !== FALSE ? TRUE : FALSE;
  690.         $lgsl_need['e'] = strpos($request, "e") !== FALSE ? TRUE : FALSE;
  691.         $lgsl_need['p'] = strpos($request, "p") !== FALSE ? TRUE : FALSE;
  692.  
  693.         // ChANGE [e] TO [s][e] AS BASIC QUERIES OFTEN RETURN EXTRA INFO
  694.         if ($lgsl_need['e'] && !$lgsl_need['s']) { $lgsl_need['s'] = TRUE; }
  695.  
  696.     //---------------------------------------------------------+
  697.     //  QUERY FUNCTION IS REPEATED TO REDUCE DUPLICATE CODE
  698.  
  699.         do
  700.         {
  701.             $lgsl_need_check = $lgsl_need;
  702.  
  703.             // CALL FUNCTION REQUIRES '&$variable' TO PASS 'BY REFERENCE'
  704.             $response = call_user_func_array($lgsl_function, array(&$server, &$lgsl_need, &$lgsl_fp));
  705.  
  706.             // CHECK IF SERVER IS OFFLINE
  707.             if (!$response) { break; }
  708.  
  709.             // CHECK IF NEED HAS NOT CHANGED - THIS SERVES TWO PURPOSES - TO PREVENT INFINITE LOOPS - AND TO
  710.             // AVOID WRITING $lgsl_need = FALSE FALSE FALSE FOR GAMES THAT RETURN ALL DATA IN ONE RESPONSE
  711.             if ($lgsl_need_check == $lgsl_need) { break; }
  712.  
  713.             // OPTIMIZATION THAT SKIPS REQUEST FOR PLAYER DETAILS WHEN THE SERVER IS KNOWN TO BE EMPTY
  714.             if ($lgsl_need['p'] && $server['s']['players'] == "0") { $lgsl_need['p'] = FALSE; }
  715.         }
  716.         while ($lgsl_need['s'] == TRUE || $lgsl_need['e'] == TRUE || $lgsl_need['p'] == TRUE);
  717.  
  718.     //---------------------------------------------------------+
  719.  
  720.         @fclose($lgsl_fp);
  721.  
  722.         return $response;
  723.     }
  724.  
  725. //------------------------------------------------------------------------------------------------------------+
  726. //------------------------------------------------------------------------------------------------------------+
  727.  
  728.     function lgsl_query_01(&$server, &$lgsl_need, &$lgsl_fp)
  729.     {
  730.     //---------------------------------------------------------+
  731.     //  PROTOCOL FOR DEVELOPING WITHOUT USING LIVE SERVERS TO HELP ENSURE RETURNED
  732.     //  DATA IS SANITIZED AND THAT LONG SERVER AND PLAYER NAMES ARE HANDLED PROPERLY
  733.  
  734.         $server['s'] = array(
  735.         "game"       => "test_game",
  736.         "name"       => "test_ServerNameThatsOften'Really'LongAndCanHaveSymbols<hr />ThatWill\"Screw\"UpHtmlUnlessEntitied",
  737.         "map"       => "test_map",
  738.         "players"   => rand(0,  16),
  739.         "playersmax" => rand(16, 32),
  740.         "password"   => rand(0,  1));
  741.  
  742.     //---------------------------------------------------------+
  743.  
  744.         $server['e'] = array(
  745.         "testextra1" => "normal",
  746.         "testextra2" => 123,
  747.         "testextra3" => time(),
  748.         "testextra4" => "",
  749.         "testextra5" => "<b>Setting<hr />WithHtml</b>",
  750.         "testextra6" => "ReallyLongSettingLikeSomeMapCyclesThatHaveNoSpacesAndCauseThePageToGoReallyWideIfNotBrokenUp");
  751.  
  752.     //---------------------------------------------------------+
  753.  
  754.         $server['p']['0']['name']  = "Normal";
  755.         $server['p']['0']['score'] = "12";
  756.         $server['p']['0']['ping']  = "34";
  757.  
  758.         $server['p']['1']['name']  = "\xc3\xa9\x63\x68\x6f\x20\xd0\xb8-d0\xb3\xd1\x80\xd0\xbe\xd0\xba"; // UTF PLAYER NAME
  759.         $server['p']['1']['score'] = "56";
  760.         $server['p']['1']['ping']  = "78";
  761.  
  762.         $server['p']['2']['name']  = "One&<Two>&Three&\"Four\"&'Five'";
  763.         $server['p']['2']['score'] = "90";
  764.         $server['p']['2']['ping']  = "12";
  765.  
  766.         $server['p']['3']['name']  = "ReallyLongPlayerNameBecauseTheyAreUberCoolAndAreInFiveClans";
  767.         $server['p']['3']['score'] = "90";
  768.         $server['p']['3']['ping']  = "12";
  769.  
  770.     //---------------------------------------------------------+
  771.  
  772.         if (rand(0, 10) == 5) { $server['p'] = array(); }   // RANDOM NO PLAYERS
  773.         if (rand(0, 10) == 5) { return FALSE; }             // RANDOM GOING OFFLINE
  774.  
  775.     //---------------------------------------------------------+
  776.  
  777.         return TRUE;
  778.     }
  779.  
  780. //------------------------------------------------------------------------------------------------------------+
  781. //------------------------------------------------------------------------------------------------------------+
  782.  
  783.     function lgsl_query_02(&$server, &$lgsl_need, &$lgsl_fp)
  784.     {
  785.     //---------------------------------------------------------+
  786.  
  787.         if   ($server['b']['type'] == "quake2")                 { fwrite($lgsl_fp, "\xFF\xFF\xFF\xFFstatus");       }
  788.         elseif ($server['b']['type'] == "warsowold")            { fwrite($lgsl_fp, "\xFF\xFF\xFF\xFFgetinfo");     }
  789.         elseif (strpos($server['b']['type'], "moh") !== FALSE)  { fwrite($lgsl_fp, "\xFF\xFF\xFF\xFF\x02getstatus"); } // mohaa_ mohaab_ mohaas_ mohpa_
  790.         else                                                    { fwrite($lgsl_fp, "\xFF\xFF\xFF\xFFgetstatus");     }
  791.  
  792.         $buffer = fread($lgsl_fp, 4096);
  793.  
  794.         if (!$buffer) { return FALSE; }
  795.  
  796.     //---------------------------------------------------------+
  797.  
  798.         $part = explode("\n", $buffer);  // SPLIT INTO PARTS: HEADER/SETTINGS/PLAYERS/FOOTER
  799.         array_pop($part);               // REMOVE FOOTER WHICH IS EITHER NULL OR "\challenge\"
  800.         $item = explode("\\", $part[1]); // SPLIT PART INTO ITEMS
  801.  
  802.         foreach ($item as $item_key => $data_key)
  803.         {
  804.             if (!($item_key % 2)) { continue; } // SKIP EVEN KEYS
  805.  
  806.             $data_key                   = strtolower(lgsl_parse_color($data_key, "1"));
  807.             $server['e'][$data_key] = lgsl_parse_color($item[$item_key+1], "1");
  808.         }
  809.  
  810.     //---------------------------------------------------------+
  811.  
  812.         if (!empty($server['e']['hostname'])) { $server['s']['name'] = $server['e']['hostname']; }
  813.         if (!empty($server['e']['sv_hostname'])) { $server['s']['name'] = $server['e']['sv_hostname']; }
  814.  
  815.         if (isset($server['e']['gamename'])) { $server['s']['game'] = $server['e']['gamename']; }
  816.         if (isset($server['e']['mapname']))  { $server['s']['map']  = $server['e']['mapname']; }
  817.  
  818.         $server['s']['players'] = empty($part['2']) ? 0 : count($part) - 2;
  819.  
  820.         if (isset($server['e']['maxclients']))  { $server['s']['playersmax'] = $server['e']['maxclients']; }    // QUAKE 2
  821.         if (isset($server['e']['sv_maxclients'])) { $server['s']['playersmax'] = $server['e']['sv_maxclients']; }
  822.  
  823.         if (isset($server['e']['pswrd'])) { $server['s']['password'] = $server['e']['pswrd']; }           // CALL OF DUTY
  824.         if (isset($server['e']['needpass'])) { $server['s']['password'] = $server['e']['needpass']; }          // QUAKE 2
  825.         if (isset($server['e']['g_needpass'])) { $server['s']['password'] = $server['e']['g_needpass']; }
  826.  
  827.         array_shift($part); // REMOVE HEADER
  828.         array_shift($part); // REMOVE SETTING
  829.  
  830.     //---------------------------------------------------------+
  831.  
  832.         if ($server['b']['type'] == "nexuiz"|| $server['b']['type'] == "xonotic") // (SCORE) (PING) (TEAM IF TEAM GAME) "(NAME)"
  833.         {
  834.             $pattern = "/(.*) (.*) (.*)\"(.*)\"/U"; $fields = array(1=>"score", 2=>"ping", 3=>"team", 4=>"name");
  835.         }
  836.         elseif ($server['b']['type'] == "warsow") // (SCORE) (PING) "(NAME)" (TEAM)
  837.         {
  838.             $pattern = "/(.*) (.*) \"(.*)\" (.*)/"; $fields = array(1=>"score", 2=>"ping", 3=>"name", 4=>"team");
  839.         }
  840.         elseif ($server['b']['type'] == "sof2") // (SCORE) (PING) (DEATHS) "(NAME)"
  841.         {
  842.             $pattern = "/(.*) (.*) (.*) \"(.*)\"/"; $fields = array(1=>"score", 2=>"ping", 3=>"deaths", 4=>"name");
  843.         }
  844.         elseif (strpos($server['b']['type'], "mohpa") !== FALSE) // (?) (SCORE) (?) (TIME) (?) "(RANK?)" "(NAME)"
  845.         {
  846.             $pattern = "/(.*) (.*) (.*) (.*) (.*) \"(.*)\" \"(.*)\"/"; $fields = array(2=>"score", 3=>"deaths", 4=>"time", 6=>"rank", 7=>"name");
  847.         }
  848.         elseif (strpos($server['b']['type'], "moh") !== FALSE) // (PING) "(NAME)"
  849.         {
  850.             $pattern = "/(.*) \"(.*)\"/"; $fields = array(1=>"ping", 2=>"name");
  851.         }
  852.         else // (SCORE) (PING) "(NAME)"
  853.         {
  854.             $pattern = "/(.*) (.*) \"(.*)\"/"; $fields = array(1=>"score", 2=>"ping", 3=>"name");
  855.         }
  856.  
  857.     //---------------------------------------------------------+
  858.  
  859.         foreach ($part as $player_key => $data)
  860.         {
  861.             if (!$data) { continue; }
  862.  
  863.             preg_match($pattern, $data, $match);
  864.  
  865.             foreach ($fields as $match_key => $field_name)
  866.             {
  867.                 if (isset($match[$match_key])) { $server['p'][$player_key][$field_name] = trim($match[$match_key]); }
  868.             }
  869.  
  870.             $server['p'][$player_key]['name'] = lgsl_parse_color($server['p'][$player_key]['name'], "1");
  871.  
  872.             if (isset($server['p'][$player_key]['time']))
  873.             {
  874.                 $server['p'][$player_key]['time'] = lgsl_time($server['p'][$player_key]['time']);
  875.             }
  876.         }
  877.  
  878.     //---------------------------------------------------------+
  879.  
  880.         return TRUE;
  881.     }
  882.  
  883. //------------------------------------------------------------------------------------------------------------+
  884. //------------------------------------------------------------------------------------------------------------+
  885.  
  886.     function lgsl_query_03(&$server, &$lgsl_need, &$lgsl_fp)
  887.     {
  888.         //---------------------------------------------------------+
  889.         // BF1942 HAS A BUG WHERE IT RETURNS EXTRA NAMES - TO SKIP THESE 'GHOSTS' LATER WE NEED AN [s] REQUEST TO GET THE CURRENT NUMBER OF PLAYERS
  890.         if ($server['b']['type'] == "bf1942" && $lgsl_need['p'] && !$lgsl_need['s'] && !isset($lgsl_need['sp'])) { $lgsl_need['s'] = TRUE; $lgsl_need['sp'] = TRUE; }
  891.  
  892.         if   ($server['b']['type'] == "cncrenegade"){ fwrite($lgsl_fp, "\\status\\"); }
  893.         elseif ($lgsl_need['s'] || $lgsl_need['e']) { fwrite($lgsl_fp, "\\basic\\\\info\\\\rules\\"); $lgsl_need['s'] = FALSE; $lgsl_need['e'] = FALSE; }
  894.         elseif ($lgsl_need['p'])                    { fwrite($lgsl_fp, "\\players\\"); $lgsl_need['p'] = FALSE; }
  895.  
  896.         //---------------------------------------------------------+
  897.  
  898.         $buffer = "";
  899.         $packet_count = 0;
  900.         $packet_total = 20;
  901.  
  902.         do
  903.         {
  904.             $packet = fread($lgsl_fp, 4096);
  905.  
  906.             // QUERY PORT CHECK AS THE CONNECTION PORT WILL ALSO RESPOND
  907.             if (strpos($packet, "\\") === FALSE) { return FALSE; }
  908.  
  909.             // REMOVE SLASH PREFIX
  910.             if ($packet[0] == "\\") { $packet = substr($packet, 1); }
  911.  
  912.             // QUICK AND DIRTY FIX FOR AVP2 HAVING PREFIXES ON THE PLAYER NAMES
  913.             if (!$lgsl_need['s'] && !$lgsl_need['e'] && $server['b']['type'] == "avp2") { $packet = preg_replace("/\\\[0-9]+~/", "\\", $packet); }
  914.  
  915.             while ($packet)
  916.             {
  917.                 $key   = strtolower(lgsl_cut_string($packet, 0, "\\"));
  918.                 $value = trim(lgsl_cut_string($packet, 0, "\\"));
  919.  
  920.                 // CHECK IF KEY IS PLAYER DATA
  921.                 if (preg_match("/(.*)_([0-9]+)$/", $key, $match))
  922.                 {
  923.                     // SEPERATE TEAM NAMES
  924.                     if ($match[1] == "teamname") { $server['t'][$match[2]]['name'] = $value; continue; }
  925.  
  926.                     // CONVERT TO LGSL STANDARD
  927.                     if   ($match[1] == "player")     { $match[1] = "name";  }
  928.                     elseif ($match[1] == "playername") { $match[1] = "name";  }
  929.                     elseif ($match[1] == "frags")     { $match[1] = "score"; }
  930.                     elseif ($match[1] == "ngsecret")   { $match[1] = "stats"; }
  931.  
  932.                     $server['p'][$match[2]][$match[1]] = $value; continue;
  933.                 }
  934.  
  935.                 // SEPERATE QUERYID
  936.                 if ($key == "queryid") { $queryid = $value; continue; }
  937.  
  938.                 // SERVER SETTING
  939.                 $server['e'][$key] = $value;
  940.             }
  941.  
  942.             // FINAL PACKET NUMBER IS THE TOTAL
  943.             if (isset($server['e']['final']))
  944.             {
  945.                 preg_match("/([0-9]+)\.([0-9]+)/", $queryid, $match);
  946.                 $packet_total = intval($match[2]);
  947.                 unset($server['e']['final']);
  948.             }
  949.  
  950.             $packet_count ++;
  951.         }
  952.         while ($packet_count < $packet_total);
  953.  
  954.     //---------------------------------------------------------+
  955.  
  956.         if ($server['e']['mapname'])
  957.         {
  958.             $server['s']['map'] = $server['e']['mapname'];
  959.  
  960.             if (!empty($server['e']['hostname'])) { $server['s']['name'] = $server['e']['hostname']; }
  961.             if (!empty($server['e']['sv_hostname'])) { $server['s']['name'] = $server['e']['sv_hostname']; }
  962.  
  963.             if (!empty($server['e']['gamename'])) { $server['s']['game'] = $server['e']['gamename']; }
  964.             if (!empty($server['e']['gameid']) && empty($server['e']['gamename']))  { $server['s']['game'] = $server['e']['gameid']; }
  965.             if (!empty($server['e']['gameid']) && $server['b']['type'] == "bf1942") { $server['s']['game'] = $server['e']['gameid']; }
  966.  
  967.             if (isset($server['e']['mapname'])) { $server['s']['map'] = $server['e']['mapname']; }
  968.             if (isset($server['e']['numplayers'])) { $server['s']['players'] = $server['e']['numplayers']; }
  969.             if (isset($server['e']['maxplayers'])) { $server['s']['playersmax'] = $server['e']['maxplayers']; }
  970.             if (isset($server['e']['password']))   { $server['s']['password'] = $server['e']['password']; }
  971.         }
  972.  
  973.     //---------------------------------------------------------+
  974.  
  975.         if ($server['p'])
  976.         {
  977.             // REMOVE BF1942 GHOST PLAYERS WHICH ALSO RE-INDEXES PLAYER KEYS
  978.             if ($server['b']['type'] == "bf1942" && $server['s']['players']) { $server['p'] = array_slice($server['p'], 0, $server['s']['players']); }
  979.  
  980.             // OPERATION FLASHPOINT BUG: 'GHOST' PLAYERS IN UN-USED 'TEAM' FIELD
  981.             if ($server['b']['type'] == "flashpoint")
  982.             {
  983.                 foreach ($server['p'] as $key => $value)
  984.                 {
  985.                     unset($server['p'][$key]['team']);
  986.                 }
  987.             }
  988.  
  989.             // AVP2 BUG: PLAYER NUMBER PREFIXED TO NAMES
  990.             if ($server['b']['type'] == "avp2")
  991.             {
  992.                 foreach ($server['p'] as $key => $value)
  993.                 {
  994.                     $server['p'][$key]['name'] = preg_replace("/[0-9]+~/", "", $server['p'][$key]['name']);
  995.                 }
  996.             }
  997.  
  998.             // CHANGE TEAM NUMBERS TO TEAM NAMES IF POSSIBLE
  999.             if (isset($server['t'][0]['name']))
  1000.             {
  1001.                 foreach ($server['p'] as $key => $value)
  1002.                 {
  1003.                     $team_key = $server['p'][$key]['team'] - 1;
  1004.                     $server['p'][$key]['team'] = $server['t'][$team_key]['name'];
  1005.                 }
  1006.             }
  1007.  
  1008.             // RE-INDEX PLAYER KEYS TO REMOVE ANY GAPS
  1009.             $server['p'] = array_values($server['p']);
  1010.         }
  1011.  
  1012.         return TRUE;
  1013.     }
  1014.  
  1015. //------------------------------------------------------------------------------------------------------------+
  1016. //------------------------------------------------------------------------------------------------------------+
  1017.  
  1018.     function lgsl_query_04(&$server, &$lgsl_need, &$lgsl_fp)
  1019.     {
  1020.     //---------------------------------------------------------+
  1021.  
  1022.         fwrite($lgsl_fp, "REPORT");
  1023.  
  1024.         $buffer = fread($lgsl_fp, 4096);
  1025.  
  1026.         if (!$buffer) { return FALSE; }
  1027.  
  1028.     //---------------------------------------------------------+
  1029.  
  1030.         $lgsl_ravenshield_key = array(
  1031.         "A1" => "playersmax",
  1032.         "A2" => "tkpenalty",
  1033.         "B1" => "players",
  1034.         "B2" => "allowradar",
  1035.         "D2" => "version",
  1036.         "E1" => "mapname",
  1037.         "E2" => "lid",
  1038.         "F1" => "maptype",
  1039.         "F2" => "gid",
  1040.         "G1" => "password",
  1041.         "G2" => "hostport",
  1042.         "H1" => "dedicated",
  1043.         "H2" => "terroristcount",
  1044.         "I1" => "hostname",
  1045.         "I2" => "aibackup",
  1046.         "J1" => "mapcycletypes",
  1047.         "J2" => "rotatemaponsuccess",
  1048.         "K1" => "mapcycle",
  1049.         "K2" => "forcefirstpersonweapons",
  1050.         "L1" => "players_name",
  1051.         "L2" => "gamename",
  1052.         "L3" => "punkbuster",
  1053.         "M1" => "players_time",
  1054.         "N1" => "players_ping",
  1055.         "O1" => "players_score",
  1056.         "P1" => "queryport",
  1057.         "Q1" => "rounds",
  1058.         "R1" => "roundtime",
  1059.         "S1" => "bombtimer",
  1060.         "T1" => "bomb",
  1061.         "W1" => "allowteammatenames",
  1062.         "X1" => "iserver",
  1063.         "Y1" => "friendlyfire",
  1064.         "Z1" => "autobalance");
  1065.  
  1066.     //---------------------------------------------------------+
  1067.  
  1068.         $item = explode("\xB6", $buffer);
  1069.  
  1070.         foreach ($item as $data_value)
  1071.         {
  1072.             $tmp = explode(" ", $data_value, 2);
  1073.             $data_key = isset($lgsl_ravenshield_key[$tmp[0]]) ? $lgsl_ravenshield_key[$tmp[0]] : $tmp[0]; // CONVERT TO DESCRIPTIVE KEYS
  1074.             $server['e'][$data_key] = trim($tmp[1]); // ALL VALUES NEED TRIMMING
  1075.         }
  1076.  
  1077.         $server['e']['mapcycle']      = str_replace("/"," ", $server['e']['mapcycle']);   // CONVERT SLASH TO SPACE
  1078.         $server['e']['mapcycletypes'] = str_replace("/"," ", $server['e']['mapcycletypes']); // SO LONG LISTS WRAP
  1079.  
  1080.     //---------------------------------------------------------+
  1081.  
  1082.         $server['s']['game']       = $server['e']['gamename'];
  1083.         $server['s']['name']       = $server['e']['hostname'];
  1084.         $server['s']['map']        = $server['e']['mapname'];
  1085.         $server['s']['players']    = $server['e']['players'];
  1086.         $server['s']['playersmax'] = $server['e']['playersmax'];
  1087.         $server['s']['password']   = $server['e']['password'];
  1088.  
  1089.     //---------------------------------------------------------+
  1090.  
  1091.         $player_name  = isset($server['e']['players_name'])  ? explode("/", substr($server['e']['players_name'],  1)) : array(); unset($server['e']['players_name']);
  1092.         $player_time  = isset($server['e']['players_time'])  ? explode("/", substr($server['e']['players_time'],  1)) : array(); unset($server['e']['players_time']);
  1093.         $player_ping  = isset($server['e']['players_ping'])  ? explode("/", substr($server['e']['players_ping'],  1)) : array(); unset($server['e']['players_ping']);
  1094.         $player_score = isset($server['e']['players_score']) ? explode("/", substr($server['e']['players_score'], 1)) : array(); unset($server['e']['players_score']);
  1095.  
  1096.         foreach ($player_name as $key => $name)
  1097.         {
  1098.             $server['p'][$key]['name']  = $player_name[$key];
  1099.             $server['p'][$key]['time']  = $player_time[$key];
  1100.             $server['p'][$key]['ping']  = $player_ping[$key];
  1101.             $server['p'][$key]['score'] = $player_score[$key];
  1102.         }
  1103.  
  1104.     //---------------------------------------------------------+
  1105.  
  1106.         return TRUE;
  1107.     }
  1108.  
  1109. //------------------------------------------------------------------------------------------------------------+
  1110. //------------------------------------------------------------------------------------------------------------+
  1111.  
  1112.     function lgsl_query_05(&$server, &$lgsl_need, &$lgsl_fp)
  1113.     {
  1114.     //---------------------------------------------------------+
  1115.     //  REFERENCE: http://developer.valvesoftware.com/wiki/Server_Queries
  1116.  
  1117.         if ($server['b']['type'] == "halflifewon")
  1118.         {
  1119.             if   ($lgsl_need['s']) { fwrite($lgsl_fp, "\xFF\xFF\xFF\xFFdetails\x00"); }
  1120.             elseif ($lgsl_need['e']) { fwrite($lgsl_fp, "\xFF\xFF\xFF\xFFrules\x00"); }
  1121.             elseif ($lgsl_need['p']) { fwrite($lgsl_fp, "\xFF\xFF\xFF\xFFplayers\x00"); }
  1122.         }
  1123.         else
  1124.         {
  1125.             $challenge_code = isset($lgsl_need['challenge']) ? $lgsl_need['challenge'] : "\x00\x00\x00\x00";
  1126.  
  1127.             if ($lgsl_need['s']) { fwrite($lgsl_fp, "\xFF\xFF\xFF\xFF\x54Source Engine Query\x00"); }
  1128.             elseif ($lgsl_need['e']) { fwrite($lgsl_fp, "\xFF\xFF\xFF\xFF\x56{$challenge_code}"); }
  1129.             elseif ($lgsl_need['p']) { fwrite($lgsl_fp, "\xFF\xFF\xFF\xFF\x55{$challenge_code}"); }
  1130.         }
  1131.  
  1132.     //---------------------------------------------------------+
  1133.     //  THE STANDARD HEADER POSITION REVEALS THE TYPE BUT IT MAY NOT ARRIVE FIRST
  1134.     //  ONCE WE KNOW THE TYPE WE CAN FIND THE TOTAL NUMBER OF PACKETS EXPECTED
  1135.  
  1136.         $packet_temp  = array();
  1137.         $packet_type  = 0;
  1138.         $packet_count = 0;
  1139.         $packet_total = 4;
  1140.  
  1141.         do
  1142.         {
  1143.             //$packet = fread($lgsl_fp, 4096); if (!$packet) { return FALSE; }
  1144.             if (!($packet = fread($lgsl_fp, 4096))) {
  1145.                 if ($lgsl_need['s']) { return FALSE; }
  1146.                 elseif ($lgsl_need['e']) { $lgsl_need['e'] = FALSE; return TRUE; }
  1147.                 else { return TRUE; }
  1148.             }
  1149.  
  1150.             //---------------------------------------------------------------------------------------------------------------------------------+
  1151.             // NEWER HL1 SERVERS REPLY TO A2S_INFO WITH 3 PACKETS ( HL1 FORMAT INFO, SOURCE FORMAT INFO, PLAYERS )
  1152.             // THIS DISCARDS UN-EXPECTED PACKET FORMATS ON THE GO ( AS READING IN ADVANCE CAUSES TIMEOUT DELAYS FOR OTHER SERVER VERSIONS )
  1153.             // ITS NOT PERFECT AS [s] CAN FLIP BETWEEN HL1 AND SOURCE FORMATS DEPENDING ON ARRIVAL ORDER ( MAYBE FIX WITH RETURN ON HL1 APPID )
  1154.             if   ($lgsl_need['s']) { if ($packet[4] == "D")                                             { continue; } }
  1155.             elseif ($lgsl_need['e']) { if ($packet[4] == "m" || $packet[4] == "I" || $packet[4] == "D")     { continue; } }
  1156.             elseif ($lgsl_need['p']) { if ($packet[4] == "m" || $packet[4] == "I")                          { continue; } }
  1157.             //---------------------------------------------------------------------------------------------------------------------------------+
  1158.  
  1159.             if   (substr($packet, 0,  5) == "\xFF\xFF\xFF\xFF\x41") { $lgsl_need['challenge'] = substr($packet, 5,  4); return TRUE; } // REPEAT WITH GIVEN CHALLENGE CODE
  1160.             elseif (substr($packet, 0,  4) == "\xFF\xFF\xFF\xFF")    { $packet_total = 1;                    $packet_type = 1;       } // SINGLE PACKET - HL1 OR HL2
  1161.             elseif (substr($packet, 9,  4) == "\xFF\xFF\xFF\xFF")    { $packet_total = ord($packet[8]) & 0xF; $packet_type = 2;      } // MULTI PACKET  - HL1 ( TOTAL IS LOWER NIBBLE OF BYTE )
  1162.             elseif (substr($packet, 12, 4) == "\xFF\xFF\xFF\xFF")    { $packet_total = ord($packet[8]);      $packet_type = 3;       } // MULTI PACKET  - HL2
  1163.             elseif (substr($packet, 18, 2) == "BZ")                  { $packet_total = ord($packet[8]);      $packet_type = 4;       } // BZIP PACKET   - HL2
  1164.  
  1165.             $packet_count ++;
  1166.             $packet_temp[] = $packet;
  1167.         }
  1168.         while ($packet && $packet_count < $packet_total);
  1169.  
  1170.         if ($packet_type == 0) { return $server['s'] ? TRUE : FALSE; } // UNKNOWN RESPONSE ( SOME SERVERS ONLY SEND [s] )
  1171.  
  1172.     //---------------------------------------------------------+
  1173.     //  WITH THE TYPE WE CAN NOW SORT AND JOIN THE PACKETS IN THE CORRECT ORDER
  1174.     //  REMOVING ANY EXTRA HEADERS IN THE PROCESS
  1175.  
  1176.         $buffer = array();
  1177.  
  1178.         foreach ($packet_temp as $packet)
  1179.         {
  1180.             if   ($packet_type == 1) { $packet_order = 0; }
  1181.             elseif ($packet_type == 2) { $packet_order = ord($packet[8]) >> 4; $packet = substr($packet, 9);  } // ( INDEX IS UPPER NIBBLE OF BYTE )
  1182.             elseif ($packet_type == 3) { $packet_order = ord($packet[9]);       $packet = substr($packet, 12); }
  1183.             elseif ($packet_type == 4) { $packet_order = ord($packet[9]);       $packet = substr($packet, 18); }
  1184.  
  1185.             $buffer[$packet_order] = $packet;
  1186.         }
  1187.  
  1188.         ksort($buffer);
  1189.  
  1190.         $buffer = implode("", $buffer);
  1191.  
  1192.     //---------------------------------------------------------+
  1193.     //  WITH THE PACKETS JOINED WE CAN NOW DECOMPRESS BZIP PACKETS
  1194.     //  THEN REMOVE THE STANDARD HEADER AND CHECK ITS CORRECT
  1195.  
  1196.         if ($packet_type == 4)
  1197.         {
  1198.             if (!function_exists("bzdecompress")) // REQUIRES http://php.net/bzip2
  1199.             {
  1200.             $server['e']['bzip2'] = "unavailable"; $lgsl_need['e'] = FALSE;
  1201.             return TRUE;
  1202.             }
  1203.  
  1204.             $buffer = bzdecompress($buffer);
  1205.         }
  1206.  
  1207.         $header = lgsl_cut_byte($buffer, 4);
  1208.  
  1209.         if ($header != "\xFF\xFF\xFF\xFF") { return FALSE; } // SOMETHING WENT WRONG
  1210.  
  1211.     //---------------------------------------------------------+
  1212.  
  1213.         $response_type = lgsl_cut_byte($buffer, 1);
  1214.  
  1215.         if ($response_type == "I") // SOURCE INFO ( HALF-LIFE 2 )
  1216.         {
  1217.             lgsl_cut_byte($buffer, 1);
  1218.             $server['s']['name']        = lgsl_cut_string($buffer);
  1219.             $server['s']['map']         = lgsl_cut_string($buffer);
  1220.             $server['s']['game']        = lgsl_cut_string($buffer);
  1221.             $server['e']['description'] = lgsl_cut_string($buffer);
  1222.             $server['e']['appid']       = lgsl_unpack(lgsl_cut_byte($buffer, 2), "S");
  1223.             $server['s']['players']     = ord(lgsl_cut_byte($buffer, 1));
  1224.             $server['s']['playersmax']  = ord(lgsl_cut_byte($buffer, 1));
  1225.             $server['e']['bots']        = ord(lgsl_cut_byte($buffer, 1));
  1226.             $server['e']['dedicated']   = lgsl_cut_byte($buffer, 1);
  1227.             $server['e']['os']          = lgsl_cut_byte($buffer, 1);
  1228.             $server['s']['password']    = ord(lgsl_cut_byte($buffer, 1));
  1229.             $server['e']['anticheat']   = ord(lgsl_cut_byte($buffer, 1));
  1230.             $server['e']['version']     = lgsl_cut_string($buffer);
  1231.         }
  1232.  
  1233.         elseif ($response_type == "m") // HALF-LIFE 1 INFO
  1234.         {
  1235.             $server_ip                  = lgsl_cut_string($buffer);
  1236.             $server['s']['name']        = lgsl_cut_string($buffer);
  1237.             $server['s']['map']         = lgsl_cut_string($buffer);
  1238.             $server['s']['game']        = lgsl_cut_string($buffer);
  1239.             $server['e']['description'] = lgsl_cut_string($buffer);
  1240.             $server['s']['players']  = ord(lgsl_cut_byte($buffer, 1));
  1241.             $server['s']['playersmax']  = ord(lgsl_cut_byte($buffer, 1));
  1242.             $server['e']['netcode']     = ord(lgsl_cut_byte($buffer, 1));
  1243.             $server['e']['dedicated']   = lgsl_cut_byte($buffer, 1);
  1244.             $server['e']['os']          = lgsl_cut_byte($buffer, 1);
  1245.             $server['s']['password']    = ord(lgsl_cut_byte($buffer, 1));
  1246.  
  1247.             if (ord(lgsl_cut_byte($buffer, 1))) // MOD FIELDS ( OFF FOR SOME HALFLIFEWON-VALVE SERVERS )
  1248.             {
  1249.             $server['e']['mod_url_info']     = lgsl_cut_string($buffer);
  1250.             $server['e']['mod_url_download'] = lgsl_cut_string($buffer);
  1251.             $buffer = substr($buffer, 1);
  1252.             $server['e']['mod_version']     = lgsl_unpack(lgsl_cut_byte($buffer, 4), "l");
  1253.             $server['e']['mod_size']         = lgsl_unpack(lgsl_cut_byte($buffer, 4), "l");
  1254.             $server['e']['mod_server_side']  = ord(lgsl_cut_byte($buffer, 1));
  1255.             $server['e']['mod_custom_dll']   = ord(lgsl_cut_byte($buffer, 1));
  1256.             }
  1257.  
  1258.             $server['e']['anticheat'] = ord(lgsl_cut_byte($buffer, 1));
  1259.             $server['e']['bots']      = ord(lgsl_cut_byte($buffer, 1));
  1260.         }
  1261.  
  1262.         elseif ($response_type == "D") // SOURCE AND HALF-LIFE 1 PLAYERS
  1263.         {
  1264.             $returned = ord(lgsl_cut_byte($buffer, 1));
  1265.  
  1266.             $player_key = 0;
  1267.  
  1268.             while ($buffer)
  1269.             {
  1270.             $server['p'][$player_key]['pid']   = ord(lgsl_cut_byte($buffer, 1));
  1271.             $server['p'][$player_key]['name']  = lgsl_cut_string($buffer);
  1272.             $server['p'][$player_key]['score'] = lgsl_unpack(lgsl_cut_byte($buffer, 4), "l");
  1273.             $server['p'][$player_key]['time']  = lgsl_time(lgsl_unpack(lgsl_cut_byte($buffer, 4), "f"));
  1274.  
  1275.             $player_key ++;
  1276.             }
  1277.         }
  1278.  
  1279.         elseif ($response_type == "E") // SOURCE AND HALF-LIFE 1 RULES
  1280.         {
  1281.             $returned = lgsl_unpack(lgsl_cut_byte($buffer, 2), "S");
  1282.  
  1283.             while ($buffer)
  1284.             {
  1285.             $item_key   = strtolower(lgsl_cut_string($buffer));
  1286.             $item_value = lgsl_cut_string($buffer);
  1287.  
  1288.             $server['e'][$item_key] = $item_value;
  1289.             }
  1290.         }
  1291.  
  1292.     //---------------------------------------------------------+
  1293.  
  1294.         // IF ONLY [s] WAS REQUESTED THEN REMOVE INCOMPLETE [e]
  1295.         if ($lgsl_need['s'] && !$lgsl_need['e']) { $server['e'] = array(); }
  1296.  
  1297.         if   ($lgsl_need['s']) { $lgsl_need['s'] = FALSE; }
  1298.         elseif ($lgsl_need['e']) { $lgsl_need['e'] = FALSE; }
  1299.         elseif ($lgsl_need['p']) { $lgsl_need['p'] = FALSE; }
  1300.  
  1301.     //---------------------------------------------------------+
  1302.  
  1303.         return TRUE;
  1304.     }
  1305.  
  1306. //------------------------------------------------------------------------------------------------------------+
  1307. //------------------------------------------------------------------------------------------------------------+
  1308.  
  1309.     function lgsl_query_06(&$server, &$lgsl_need, &$lgsl_fp)
  1310.     {
  1311.     //---------------------------------------------------------+
  1312.     //  GET A CHALLENGE CODE IF NEEDED
  1313.  
  1314.         $challenge_code = "";
  1315.  
  1316.         if ($server['b']['type'] != "bf2" && $server['b']['type'] != "graw")
  1317.         {
  1318.             fwrite($lgsl_fp, "\xFE\xFD\x09\x21\x21\x21\x21\xFF\xFF\xFF\x01");
  1319.  
  1320.             $challenge_packet = fread($lgsl_fp, 4096);
  1321.  
  1322.             if (!$challenge_packet) { return FALSE; }
  1323.  
  1324.             $challenge_code = substr($challenge_packet, 5, -1); // REMOVE HEADER AND TRAILING NULL
  1325.  
  1326.             // IF CODE IS RETURNED ( SOME STALKER SERVERS RETURN BLANK WHERE THE CODE IS NOT NEEDED )
  1327.             // CONVERT DECIMAL |TO| HEX AS 8 CHARACTER STRING |TO| 4 PAIRS OF HEX |TO| 4 PAIRS OF DECIMAL |TO| 4 PAIRS OF ASCII
  1328.  
  1329.             $challenge_code = $challenge_code ? chr($challenge_code >> 24).chr($challenge_code >> 16).chr($challenge_code >> 8).chr($challenge_code >> 0) : "";
  1330.         }
  1331.  
  1332.         fwrite($lgsl_fp, "\xFE\xFD\x00\x21\x21\x21\x21{$challenge_code}\xFF\xFF\xFF\x01");
  1333.  
  1334.     //---------------------------------------------------------+
  1335.     //  GET RAW PACKET DATA
  1336.  
  1337.         $buffer = array();
  1338.         $packet_count = 0;
  1339.         $packet_total = 4;
  1340.  
  1341.         do
  1342.         {
  1343.             $packet_count ++;
  1344.             $packet = fread($lgsl_fp, 4096);
  1345.  
  1346.             if (!$packet) { return FALSE; }
  1347.  
  1348.             $packet         = substr($packet, 14); // REMOVE SPLITNUM HEADER
  1349.             $packet_order   = ord(lgsl_cut_byte($packet, 1));
  1350.  
  1351.             if ($packet_order >= 128) // LAST PACKET - SO ITS ORDER NUMBER IS ALSO THE TOTAL
  1352.             {
  1353.             $packet_order -= 128;
  1354.             $packet_total = $packet_order + 1;
  1355.             }
  1356.  
  1357.             $buffer[$packet_order] = $packet;
  1358.         }
  1359.         while ($packet_count < $packet_total);
  1360.  
  1361.     //---------------------------------------------------------+
  1362.     //  PROCESS AND SORT PACKETS
  1363.  
  1364.         foreach ($buffer as $key => $packet)
  1365.         {
  1366.             $packet = substr($packet, 0, -1); // REMOVE END NULL FOR JOINING
  1367.  
  1368.             if (substr($packet, -1) != "\x00") // LAST VALUE HAS BEEN SPLIT
  1369.             {
  1370.             $part = explode("\x00", $packet); // REMOVE SPLIT VALUE AS COMPLETE VALUE IS IN NEXT PACKET
  1371.             array_pop($part);
  1372.             $packet = implode("\x00", $part)."\x00";
  1373.             }
  1374.  
  1375.             if ($packet[0] != "\x00") // PLAYER OR TEAM DATA THAT MAY BE A CONTINUATION
  1376.             {
  1377.             $pos = strpos($packet, "\x00") + 1; // WHEN DATA IS SPLIT THE NEXT PACKET STARTS WITH A REPEAT OF THE FIELD NAME
  1378.  
  1379.             if (isset($packet[$pos]) && $packet[$pos] != "\x00") // REPEATED FIELD NAMES END WITH \x00\x?? INSTEAD OF \x00\x00
  1380.             {
  1381.              $packet = substr($packet, $pos + 1); // REMOVE REPEATED FIELD NAME
  1382.             }
  1383.             else
  1384.             {
  1385.              $packet = "\x00".$packet; // RE-ADD NULL AS PACKET STARTS WITH A NEW FIELD
  1386.             }
  1387.             }
  1388.  
  1389.             $buffer[$key] = $packet;
  1390.         }
  1391.  
  1392.         ksort($buffer);
  1393.  
  1394.         $buffer = implode("", $buffer);
  1395.  
  1396.     //---------------------------------------------------------+
  1397.     //  SERVER SETTINGS
  1398.  
  1399.         $buffer = substr($buffer, 1); // REMOVE HEADER \x00
  1400.  
  1401.         while ($key = strtolower(lgsl_cut_string($buffer)))
  1402.         {
  1403.             $server['e'][$key] = lgsl_cut_string($buffer);
  1404.         }
  1405.  
  1406.         $lgsl_conversion = array("name"=>"hostname", "game"=>"gamename", "map"=>"mapname", "players"=>"numplayers", "playersmax"=>"maxplayers", "password"=>"password");
  1407.         foreach ($lgsl_conversion as $s => $e) { if (isset($server['e'][$e])) { $server['s'][$s] = $server['e'][$e]; unset($server['e'][$e]); } } // LGSL STANDARD
  1408.  
  1409.         if ($server['b']['type'] == "bf2" || $server['b']['type'] == "bf2142") { $server['s']['map'] = ucwords(str_replace("_", " ", $server['s']['map'])); } // MAP NAME CONSISTENCY
  1410.  
  1411.         if ($server['s']['players'] == "0") { return TRUE; } // IF SERVER IS EMPTY SKIP THE PLAYER CODE
  1412.  
  1413.     //---------------------------------------------------------+
  1414.     //  PLAYER DETAILS
  1415.  
  1416.         $buffer = substr($buffer, 1); // REMOVE HEADER \x01
  1417.  
  1418.         while ($buffer)
  1419.         {
  1420.             if ($buffer[0] == "\x02") { break; }
  1421.             if ($buffer[0] == "\x00") { $buffer = substr($buffer, 1); break; }
  1422.  
  1423.             $field = lgsl_cut_string($buffer, 0, "\x00\x00");
  1424.             $field = strtolower(substr($field, 0, -1));
  1425.  
  1426.             if   ($field == "player") { $field = "name"; }
  1427.             elseif ($field == "aibot")  { $field = "bot";  }
  1428.  
  1429.             if ($buffer[0] == "\x00") { $buffer = substr($buffer, 1); continue; }
  1430.  
  1431.             $value_list = lgsl_cut_string($buffer, 0, "\x00\x00");
  1432.             $value_list = explode("\x00", $value_list);
  1433.  
  1434.             foreach ($value_list as $key => $value)
  1435.             {
  1436.             $server['p'][$key][$field] = $value;
  1437.             }
  1438.         }
  1439.  
  1440.     //---------------------------------------------------------+
  1441.     //  TEAM DATA
  1442.  
  1443.         $buffer = substr($buffer, 1); // REMOVE HEADER \x02
  1444.  
  1445.         while ($buffer)
  1446.         {
  1447.             if ($buffer[0] == "\x00") { break; }
  1448.  
  1449.             $field = lgsl_cut_string($buffer, 0, "\x00\x00");
  1450.             $field = strtolower($field);
  1451.  
  1452.             if   ($field == "team_t")  { $field = "name";  }
  1453.             elseif ($field == "score_t") { $field = "score"; }
  1454.  
  1455.             $value_list = lgsl_cut_string($buffer, 0, "\x00\x00");
  1456.             $value_list = explode("\x00", $value_list);
  1457.  
  1458.             foreach ($value_list as $key => $value)
  1459.             {
  1460.             $server['t'][$key][$field] = $value;
  1461.             }
  1462.         }
  1463.  
  1464.     //---------------------------------------------------------+
  1465.     //  TEAM NAME CONVERSION
  1466.  
  1467.         if ($server['p'] && isset($server['t'][0]['name']) && $server['t'][0]['name'] != "Team")
  1468.         {
  1469.             foreach ($server['p'] as $key => $value)
  1470.             {
  1471.             if (empty($server['p'][$key]['team'])) { continue; }
  1472.  
  1473.             $team_key = $server['p'][$key]['team'] - 1;
  1474.  
  1475.             if (!isset($server['t'][$team_key]['name'])) { continue; }
  1476.  
  1477.             $server['p'][$key]['team'] = $server['t'][$team_key]['name'];
  1478.             }
  1479.         }
  1480.  
  1481.     //---------------------------------------------------------+
  1482.  
  1483.         return TRUE;
  1484.     }
  1485.  
  1486. //------------------------------------------------------------------------------------------------------------+
  1487. //------------------------------------------------------------------------------------------------------------+
  1488.  
  1489.     function lgsl_query_07(&$server, &$lgsl_need, &$lgsl_fp)
  1490.     {
  1491.     //---------------------------------------------------------+
  1492.  
  1493.         fwrite($lgsl_fp, "\xFF\xFF\xFF\xFFstatus\x00");
  1494.  
  1495.         $buffer = fread($lgsl_fp, 4096);
  1496.  
  1497.         if (!$buffer) { return FALSE; }
  1498.  
  1499.     //---------------------------------------------------------+
  1500.  
  1501.         $buffer = substr($buffer, 6, -2); // REMOVE HEADER AND FOOTER
  1502.         $part   = explode("\n", $buffer); // SPLIT INTO SETTINGS/PLAYER/PLAYER/PLAYER
  1503.  
  1504.     //---------------------------------------------------------+
  1505.  
  1506.         $item = explode("\\", $part[0]);
  1507.  
  1508.         foreach ($item as $item_key => $data_key)
  1509.         {
  1510.             if ($item_key % 2) { continue; } // SKIP ODD KEYS
  1511.  
  1512.             $data_key              = strtolower($data_key);
  1513.             $server['e'][$data_key] = $item[$item_key+1];
  1514.         }
  1515.  
  1516.     //---------------------------------------------------------+
  1517.  
  1518.         array_shift($part); // REMOVE SETTINGS
  1519.  
  1520.         foreach ($part as $key => $data)
  1521.         {
  1522.             preg_match("/(.*) (.*) (.*) (.*) \"(.*)\" \"(.*)\" (.*) (.*)/s", $data, $match); // GREEDY MATCH FOR SKINS
  1523.  
  1524.             $server['p'][$key]['pid']        = $match[1];
  1525.             $server['p'][$key]['score']    = $match[2];
  1526.             $server['p'][$key]['time']      = $match[3];
  1527.             $server['p'][$key]['ping']      = $match[4];
  1528.             $server['p'][$key]['name']      = lgsl_parse_color($match[5], $server['b']['type']);
  1529.             $server['p'][$key]['skin']      = $match[6];
  1530.             $server['p'][$key]['skin_top']  = $match[7];
  1531.             $server['p'][$key]['skin_bottom'] = $match[8];
  1532.         }
  1533.  
  1534.     //---------------------------------------------------------+
  1535.  
  1536.         $server['s']['game']       = $server['e']['*gamedir'];
  1537.         $server['s']['name']       = $server['e']['hostname'];
  1538.         $server['s']['map']     = $server['e']['map'];
  1539.         $server['s']['players'] = $server['p'] ? count($server['p']) : 0;
  1540.         $server['s']['playersmax'] = $server['e']['maxclients'];
  1541.         $server['s']['password']   = isset($server['e']['needpass']) && $server['e']['needpass'] > 0 && $server['e']['needpass'] < 4 ? 1 : 0;
  1542.  
  1543.     //---------------------------------------------------------+
  1544.  
  1545.         return TRUE;
  1546.     }
  1547.  
  1548. //------------------------------------------------------------------------------------------------------------+
  1549. //------------------------------------------------------------------------------------------------------------+
  1550.  
  1551.     function lgsl_query_08(&$server, &$lgsl_need, &$lgsl_fp)
  1552.     {
  1553.     //---------------------------------------------------------+
  1554.  
  1555.         fwrite($lgsl_fp, "s"); // ASE ( ALL SEEING EYE ) PROTOCOL
  1556.  
  1557.         $buffer = fread($lgsl_fp, 4096);
  1558.  
  1559.         if (!$buffer) { return FALSE; }
  1560.  
  1561.     //---------------------------------------------------------+
  1562.  
  1563.         $buffer = substr($buffer, 4); // REMOVE HEADER
  1564.  
  1565.         $server['e']['gamename']   = lgsl_cut_pascal($buffer, 1, -1);
  1566.         $server['e']['hostport']   = lgsl_cut_pascal($buffer, 1, -1);
  1567.         $server['s']['name']       = lgsl_parse_color(lgsl_cut_pascal($buffer, 1, -1), $server['b']['type']);
  1568.         $server['e']['gamemode']   = lgsl_cut_pascal($buffer, 1, -1);
  1569.         $server['s']['map']     = lgsl_cut_pascal($buffer, 1, -1);
  1570.         $server['e']['version'] = lgsl_cut_pascal($buffer, 1, -1);
  1571.         $server['s']['password']   = lgsl_cut_pascal($buffer, 1, -1);
  1572.         $server['s']['players'] = lgsl_cut_pascal($buffer, 1, -1);
  1573.         $server['s']['playersmax'] = lgsl_cut_pascal($buffer, 1, -1);
  1574.  
  1575.         while ($buffer && $buffer[0] != "\x01")
  1576.         {
  1577.             $item_key   = strtolower(lgsl_cut_pascal($buffer, 1, -1));
  1578.             $item_value = lgsl_cut_pascal($buffer, 1, -1);
  1579.  
  1580.             $server['e'][$item_key] = $item_value;
  1581.         }
  1582.  
  1583.         $buffer = substr($buffer, 1); // REMOVE END MARKER
  1584.  
  1585.     //---------------------------------------------------------+
  1586.  
  1587.         $player_key = 0;
  1588.  
  1589.         while ($buffer)
  1590.         {
  1591.             $bit_flags = lgsl_cut_byte($buffer, 1); // FIELDS HARD CODED BELOW BECAUSE GAMES DO NOT USE THEM PROPERLY
  1592.  
  1593.             if   ($bit_flags == "\x3D")              { $field_list = array("name",                "score", "",   "time"); } // FARCRY PLAYERS CONNECTING
  1594.             elseif ($server['b']['type'] == "farcry")    { $field_list = array("name", "team", "",    "score", "ping", "time"); } // FARCRY PLAYERS JOINED
  1595.             elseif ($server['b']['type'] == "mta")      { $field_list = array("name", "",     "",    "score", "ping", ""    ); }
  1596.             elseif ($server['b']['type'] == "painkiller") { $field_list = array("name", "",  "skin",  "score", "ping", ""   ); }
  1597.             elseif ($server['b']['type'] == "soldat")    { $field_list = array("name", "team", "",    "score", "ping", "time"); }
  1598.  
  1599.             foreach ($field_list as $item_key)
  1600.             {
  1601.                 $item_value = lgsl_cut_pascal($buffer, 1, -1);
  1602.  
  1603.                 if (!$item_key) { continue; }
  1604.  
  1605.                 if ($item_key == "name") { lgsl_parse_color($item_value, $server['b']['type']); }
  1606.  
  1607.                 $server['p'][$player_key][$item_key] = $item_value;
  1608.             }
  1609.  
  1610.             $player_key ++;
  1611.         }
  1612.  
  1613.     //---------------------------------------------------------+
  1614.  
  1615.         return TRUE;
  1616.     }
  1617.  
  1618. //------------------------------------------------------------------------------------------------------------+
  1619. //------------------------------------------------------------------------------------------------------------+
  1620.  
  1621.     function lgsl_query_09(&$server, &$lgsl_need, &$lgsl_fp)
  1622.     {
  1623.     //---------------------------------------------------------+
  1624.  
  1625.         // SERIOUS SAM 2 RETURNS ALL PLAYER NAMES AS "Unknown Player" SO SKIP OR CONVERT ANY PLAYER REQUESTS
  1626.         if ($server['b']['type'] == "serioussam2") { $lgsl_need['p'] = FALSE; if (!$lgsl_need['s'] && !$lgsl_need['e']) { $lgsl_need['s'] = TRUE; } }
  1627.  
  1628.     //---------------------------------------------------------+
  1629.  
  1630.         if ($lgsl_need['s'] || $lgsl_need['e'])
  1631.         {
  1632.             $lgsl_need['s'] = FALSE; $lgsl_need['e'] = FALSE;
  1633.  
  1634.             fwrite($lgsl_fp, "\xFE\xFD\x00\x21\x21\x21\x21\xFF\x00\x00\x00");
  1635.  
  1636.             $buffer = fread($lgsl_fp, 4096);
  1637.  
  1638.             $buffer = substr($buffer, 5, -2); // REMOVE HEADER AND FOOTER
  1639.  
  1640.             if (!$buffer) { return FALSE; }
  1641.  
  1642.             $item = explode("\x00", $buffer);
  1643.  
  1644.             foreach ($item as $item_key => $data_key)
  1645.             {
  1646.                 if ($item_key % 2) { continue; } // SKIP EVEN KEYS
  1647.  
  1648.                 $data_key = strtolower($data_key);
  1649.                 $server['e'][$data_key] = $item[$item_key+1];
  1650.             }
  1651.  
  1652.             if (isset($server['e']['hostname']))   { $server['s']['name']      = $server['e']['hostname']; }
  1653.             if (isset($server['e']['mapname'])) { $server['s']['map']       = $server['e']['mapname']; }
  1654.             if (isset($server['e']['numplayers'])) { $server['s']['players']    = $server['e']['numplayers']; }
  1655.             if (isset($server['e']['maxplayers'])) { $server['s']['playersmax'] = $server['e']['maxplayers']; }
  1656.             if (isset($server['e']['password']))   { $server['s']['password']   = $server['e']['password']; }
  1657.  
  1658.             if (!empty($server['e']['gamename']))   { $server['s']['game'] = $server['e']['gamename']; }   // AARMY
  1659.             if (!empty($server['e']['gsgamename'])) { $server['s']['game'] = $server['e']['gsgamename']; } // FEAR
  1660.             if (!empty($server['e']['game_id']))    { $server['s']['game'] = $server['e']['game_id']; } // BFVIETNAM
  1661.  
  1662.             if ($server['b']['type'] == "arma" || $server['b']['type'] == "arma2" || $server['b']['type'] == "arma2oa" || $server['b']['type'] == "arma2co" || $server['b']['type'] == "dayzmod")
  1663.             {
  1664.                 $server['s']['map'] = $server['e']['mission'];
  1665.             }
  1666.             elseif ($server['b']['type'] == "vietcong2")
  1667.             {
  1668.                 $server['e']['extinfo_autobalance'] = ord($server['e']['extinfo'][18]) == 2 ? "off" : "on";
  1669.                 // [ 13 = Vietnam and RPG Mode 19 1b 99 9b ] [ 22 23 = Mounted MG Limit ]
  1670.                 // [ 27 = Idle Limit ] [ 18 = Auto Balance ] [ 55 = Chat and Blind Spectator 5a 5c da dc ]
  1671.             }
  1672.         }
  1673.  
  1674.     //---------------------------------------------------------+
  1675.  
  1676.         elseif ($lgsl_need['p'])
  1677.         {
  1678.             $lgsl_need['p'] = FALSE;
  1679.  
  1680.             fwrite($lgsl_fp, "\xFE\xFD\x00\x21\x21\x21\x21\x00\xFF\x00\x00");
  1681.  
  1682.             $buffer = fread($lgsl_fp, 4096);
  1683.  
  1684.             $buffer = substr($buffer, 7, -1); // REMOVE HEADER / PLAYER TOTAL / FOOTER
  1685.  
  1686.             if (!$buffer) { return FALSE; }
  1687.  
  1688.             if (strpos($buffer, "\x00\x00") === FALSE) { return TRUE; } // NO PLAYERS
  1689.  
  1690.             $buffer  = explode("\x00\x00",$buffer, 2);          // SPLIT FIELDS FROM ITEMS
  1691.             $buffer[0]  = str_replace("_",    "",    $buffer[0]); // REMOVE UNDERSCORES FROM FIELDS
  1692.             $buffer[0]  = str_replace("player", "name", $buffer[0]); // LGSL STANDARD
  1693.             $field_list = explode("\x00",$buffer[0]);               // SPLIT UP FIELDS
  1694.             $item      = explode("\x00",$buffer[1]);                // SPLIT UP ITEMS
  1695.  
  1696.             $item_position = 0;
  1697.             $item_total = count($item);
  1698.             $player_key = 0;
  1699.  
  1700.             do
  1701.             {
  1702.                 foreach ($field_list as $field)
  1703.                 {
  1704.                     $server['p'][$player_key][$field] = $item[$item_position];
  1705.  
  1706.                     $item_position ++;
  1707.                 }
  1708.  
  1709.                 $player_key ++;
  1710.             }
  1711.             while ($item_position < $item_total);
  1712.         }
  1713.  
  1714.         //---------------------------------------------------------+
  1715.  
  1716.         return TRUE;
  1717.     }
  1718.  
  1719. //------------------------------------------------------------------------------------------------------------+
  1720. //------------------------------------------------------------------------------------------------------------+
  1721.  
  1722.     function lgsl_query_10(&$server, &$lgsl_need, &$lgsl_fp)
  1723.   {
  1724.     //---------------------------------------------------------+
  1725.  
  1726.         if ($server['b']['type'] == "quakewars") { fwrite($lgsl_fp, "\xFF\xFFgetInfoEX\xFF"); }
  1727.         else                                     { fwrite($lgsl_fp, "\xFF\xFFgetInfo\xFF");   }
  1728.  
  1729.         $buffer = fread($lgsl_fp, 4096);
  1730.  
  1731.         if (!$buffer) { return FALSE; }
  1732.  
  1733.     //---------------------------------------------------------+
  1734.  
  1735.         if   ($server['b']['type'] == "wolf2009")  { $buffer = substr($buffer, 31); }  // REMOVE HEADERS
  1736.         elseif ($server['b']['type'] == "quakewars") { $buffer = substr($buffer, 33); }
  1737.         else                                         { $buffer = substr($buffer, 23); }
  1738.  
  1739.         $buffer = lgsl_parse_color($buffer, "2");
  1740.  
  1741.     //---------------------------------------------------------+
  1742.  
  1743.         while ($buffer && $buffer[0] != "\x00")
  1744.         {
  1745.             $item_key   = strtolower(lgsl_cut_string($buffer));
  1746.             $item_value = lgsl_cut_string($buffer);
  1747.  
  1748.             $server['e'][$item_key] = $item_value;
  1749.         }
  1750.  
  1751.     //---------------------------------------------------------+
  1752.  
  1753.         $buffer = substr($buffer, 2);
  1754.  
  1755.         $player_key = 0;
  1756.  
  1757.     //---------------------------------------------------------+
  1758.  
  1759.         if ($server['b']['type'] == "wolf2009") // WOLFENSTEIN: (PID)(PING)(NAME)(TAGPOSITION)(TAG)(BOT)
  1760.         {
  1761.             while ($buffer && $buffer[0] != "\x10") // STOPS AT PID 16
  1762.             {
  1763.             $server['p'][$player_key]['pid']     = ord(lgsl_cut_byte($buffer, 1));
  1764.             $server['p'][$player_key]['ping']   = lgsl_unpack(lgsl_cut_byte($buffer, 2), "S");
  1765.             $server['p'][$player_key]['rate']   = lgsl_unpack(lgsl_cut_byte($buffer, 2), "S");
  1766.             $server['p'][$player_key]['unknown'] = lgsl_unpack(lgsl_cut_byte($buffer, 2), "S");
  1767.             $player_name                         = lgsl_cut_string($buffer);
  1768.             $player_tag_position                 = ord(lgsl_cut_byte($buffer, 1));
  1769.             $player_tag                       = lgsl_cut_string($buffer);
  1770.             $server['p'][$player_key]['bot']     = ord(lgsl_cut_byte($buffer, 1));
  1771.  
  1772.             if   ($player_tag == "")           { $server['p'][$player_key]['name'] = $player_name; }
  1773.             elseif ($player_tag_position == "0") { $server['p'][$player_key]['name'] = $player_tag." ".$player_name; }
  1774.             else                                 { $server['p'][$player_key]['name'] = $player_name." ".$player_tag; }
  1775.  
  1776.             $player_key ++;
  1777.             }
  1778.         }
  1779.  
  1780.     //---------------------------------------------------------+
  1781.  
  1782.         elseif ($server['b']['type'] == "quakewars") // QUAKEWARS: (PID)(PING)(NAME)(TAGPOSITION)(TAG)(BOT)
  1783.         {
  1784.             while ($buffer && $buffer[0] != "\x20") // STOPS AT PID 32
  1785.             {
  1786.             $server['p'][$player_key]['pid']  = ord(lgsl_cut_byte($buffer, 1));
  1787.             $server['p'][$player_key]['ping'] = lgsl_unpack(lgsl_cut_byte($buffer, 2), "S");
  1788.             $player_name                      = lgsl_cut_string($buffer);
  1789.             $player_tag_position              = ord(lgsl_cut_byte($buffer, 1));
  1790.             $player_tag                    = lgsl_cut_string($buffer);
  1791.             $server['p'][$player_key]['bot']  = ord(lgsl_cut_byte($buffer, 1));
  1792.  
  1793.             if ($player_tag_position == "")  { $server['p'][$player_key]['name'] = $player_name; }
  1794.             elseif ($player_tag_position == "1") { $server['p'][$player_key]['name'] = $player_name." ".$player_tag; }
  1795.             else                                 { $server['p'][$player_key]['name'] = $player_tag." ".$player_name; }
  1796.  
  1797.             $player_key ++;
  1798.             }
  1799.  
  1800.             $buffer                   = substr($buffer, 1);
  1801.             $server['e']['si_osmask']   = lgsl_unpack(lgsl_cut_byte($buffer, 4), "I");
  1802.             $server['e']['si_ranked']   = ord(lgsl_cut_byte($buffer, 1));
  1803.             $server['e']['si_timeleft']  = lgsl_time(lgsl_unpack(lgsl_cut_byte($buffer, 4), "I") / 1000);
  1804.             $server['e']['si_gamestate'] = ord(lgsl_cut_byte($buffer, 1));
  1805.             $buffer                   = substr($buffer, 2);
  1806.  
  1807.             $player_key = 0;
  1808.  
  1809.             while ($buffer && $buffer[0] != "\x20") // QUAKEWARS EXTENDED: (PID)(XP)(TEAM)(KILLS)(DEATHS)
  1810.             {
  1811.             $server['p'][$player_key]['pid']    = ord(lgsl_cut_byte($buffer, 1));
  1812.             $server['p'][$player_key]['xp']  = intval(lgsl_unpack(lgsl_cut_byte($buffer, 4), "f"));
  1813.             $server['p'][$player_key]['team']   = lgsl_cut_string($buffer);
  1814.             $server['p'][$player_key]['score']  = lgsl_unpack(lgsl_cut_byte($buffer, 4), "i");
  1815.             $server['p'][$player_key]['deaths'] = lgsl_unpack(lgsl_cut_byte($buffer, 4), "i");
  1816.             $player_key ++;
  1817.             }
  1818.         }
  1819.  
  1820.     //---------------------------------------------------------+
  1821.  
  1822.         elseif ($server['b']['type'] == "quake4") // QUAKE4: (PID)(PING)(RATE)(NULLNULL)(NAME)(TAG)
  1823.         {
  1824.             while ($buffer && $buffer[0] != "\x20") // STOPS AT PID 32
  1825.             {
  1826.             $server['p'][$player_key]['pid']  = ord(lgsl_cut_byte($buffer, 1));
  1827.             $server['p'][$player_key]['ping'] = lgsl_unpack(lgsl_cut_byte($buffer, 2), "S");
  1828.             $server['p'][$player_key]['rate'] = lgsl_unpack(lgsl_cut_byte($buffer, 2), "S");
  1829.             $buffer                        = substr($buffer, 2);
  1830.             $player_name                      = lgsl_cut_string($buffer);
  1831.             $player_tag                    = lgsl_cut_string($buffer);
  1832.             $server['p'][$player_key]['name'] = $player_tag ? $player_tag." ".$player_name : $player_name;
  1833.  
  1834.             $player_key ++;
  1835.             }
  1836.         }
  1837.  
  1838.     //---------------------------------------------------------+
  1839.  
  1840.         else // DOOM3 AND PREY: (PID)(PING)(RATE)(NULLNULL)(NAME)
  1841.         {
  1842.             while ($buffer && $buffer[0] != "\x20") // STOPS AT PID 32
  1843.             {
  1844.             $server['p'][$player_key]['pid']  = ord(lgsl_cut_byte($buffer, 1));
  1845.             $server['p'][$player_key]['ping'] = lgsl_unpack(lgsl_cut_byte($buffer, 2), "S");
  1846.             $server['p'][$player_key]['rate'] = lgsl_unpack(lgsl_cut_byte($buffer, 2), "S");
  1847.             $buffer                        = substr($buffer, 2);
  1848.             $server['p'][$player_key]['name'] = lgsl_cut_string($buffer);
  1849.  
  1850.             $player_key ++;
  1851.             }
  1852.         }
  1853.  
  1854.     //---------------------------------------------------------+
  1855.  
  1856.         $server['s']['game']       = $server['e']['gamename'];
  1857.         $server['s']['name']       = $server['e']['si_name'];
  1858.         $server['s']['map']     = $server['e']['si_map'];
  1859.         $server['s']['players'] = $server['p'] ? count($server['p']) : 0;
  1860.         $server['s']['playersmax'] = $server['e']['si_maxplayers'];
  1861.  
  1862.         if ($server['b']['type'] == "wolf2009" || $server['b']['type'] == "quakewars")
  1863.         {
  1864.             $server['s']['map']   = str_replace(".entities", "", $server['s']['map']);
  1865.             $server['s']['password'] = $server['e']['si_needpass'];
  1866.         }
  1867.         else
  1868.         {
  1869.             $server['s']['password'] = $server['e']['si_usepass'];
  1870.         }
  1871.  
  1872.     //---------------------------------------------------------+
  1873.  
  1874.         return TRUE;
  1875.     }
  1876.  
  1877. //------------------------------------------------------------------------------------------------------------+
  1878. //------------------------------------------------------------------------------------------------------------+
  1879.  
  1880.     function lgsl_query_11(&$server, &$lgsl_need, &$lgsl_fp)
  1881.     {
  1882.     //---------------------------------------------------------+
  1883.     //  REFERENCE: http://wiki.unrealadmin.org/UT3_query_protocol
  1884.     //  UT3 RESPONSE IS REALLY MESSY SO THIS CLEANS IT UP
  1885.  
  1886.         $status = lgsl_query_06($server, $lgsl_need, $lgsl_fp);
  1887.  
  1888.         if (!$status) { return FALSE; }
  1889.  
  1890.     //---------------------------------------------------------+
  1891.  
  1892.         $server['s']['map'] = $server['e']['p1073741825'];
  1893.                     unset($server['e']['p1073741825']);
  1894.  
  1895.     //---------------------------------------------------------+
  1896.  
  1897.         $lgsl_ut3_key = array(
  1898.         "s0"          => "bots_skill",
  1899.         "s6"          => "pure",
  1900.         "s7"          => "password",
  1901.         "s8"          => "bots_vs",
  1902.         "s10"        => "forcerespawn",
  1903.         "p268435703"  => "bots",
  1904.         "p268435704"  => "goalscore",
  1905.         "p268435705"  => "timelimit",
  1906.         "p268435717"  => "mutators_default",
  1907.         "p1073741826" => "gamemode",
  1908.         "p1073741827" => "description",
  1909.         "p1073741828" => "mutators_custom");
  1910.  
  1911.         foreach ($lgsl_ut3_key as $old => $new)
  1912.         {
  1913.             if (!isset($server['e'][$old])) { continue; }
  1914.             $server['e'][$new] = $server['e'][$old];
  1915.             unset($server['e'][$old]);
  1916.         }
  1917.  
  1918.     //---------------------------------------------------------+
  1919.  
  1920.         $part = explode(".", $server['e']['gamemode']);
  1921.  
  1922.         if ($part[0] && (stristr($part[0], "UT") === FALSE))
  1923.         {
  1924.             $server['s']['game'] = $part[0];
  1925.         }
  1926.  
  1927.     //---------------------------------------------------------+
  1928.  
  1929.         $tmp = $server['e']['mutators_default'];
  1930.               $server['e']['mutators_default'] = "";
  1931.  
  1932.         if ($tmp & 1)    { $server['e']['mutators_default'] .= " BigHead";         }
  1933.         if ($tmp & 2)    { $server['e']['mutators_default'] .= " FriendlyFire";   }
  1934.         if ($tmp & 4)    { $server['e']['mutators_default'] .= " Handicap";       }
  1935.         if ($tmp & 8)    { $server['e']['mutators_default'] .= " Instagib";       }
  1936.         if ($tmp & 16)  { $server['e']['mutators_default'] .= " LowGrav";          }
  1937.         if ($tmp & 64)  { $server['e']['mutators_default'] .= " NoPowerups";        }
  1938.         if ($tmp & 128)   { $server['e']['mutators_default'] .= " NoTranslocator";  }
  1939.         if ($tmp & 256)   { $server['e']['mutators_default'] .= " Slomo";            }
  1940.         if ($tmp & 1024)  { $server['e']['mutators_default'] .= " SpeedFreak";      }
  1941.         if ($tmp & 2048)  { $server['e']['mutators_default'] .= " SuperBerserk";      }
  1942.         if ($tmp & 8192)  { $server['e']['mutators_default'] .= " WeaponReplacement"; }
  1943.         if ($tmp & 16384) { $server['e']['mutators_default'] .= " WeaponsRespawn";  }
  1944.  
  1945.         $server['e']['mutators_default'] = str_replace(" ", " / ", trim($server['e']['mutators_default']));
  1946.         $server['e']['mutators_custom']  = str_replace("\x1c", " / ",     $server['e']['mutators_custom']);
  1947.  
  1948.     //---------------------------------------------------------+
  1949.  
  1950.         return TRUE;
  1951.     }
  1952.  
  1953. //------------------------------------------------------------------------------------------------------------+
  1954. //------------------------------------------------------------------------------------------------------------+
  1955.  
  1956.     function lgsl_query_12(&$server, &$lgsl_need, &$lgsl_fp)
  1957.     {
  1958.     //---------------------------------------------------------+
  1959.     //  REFERENCE:
  1960.     //  VICE CITY CURRENTLY ONLY SUPPORTS THE 'i' CHALLENGE
  1961.  
  1962.         if   ($server['b']['type'] == "samp") { $challenge_packet = "SAMP\x21\x21\x21\x21\x00\x00"; }
  1963.         elseif ($server['b']['type'] == "vcmp") { $challenge_packet = "VCMP\x21\x21\x21\x21\x00\x00"; $lgsl_need['e'] = FALSE; $lgsl_need['p'] = FALSE; }
  1964.  
  1965.         if   ($lgsl_need['s']) { $challenge_packet .= "i"; }
  1966.         elseif ($lgsl_need['e']) { $challenge_packet .= "r"; }
  1967.         elseif ($lgsl_need['p']) { $challenge_packet .= "d"; }
  1968.  
  1969.         fwrite($lgsl_fp, $challenge_packet);
  1970.  
  1971.         $buffer = fread($lgsl_fp, 4096);
  1972.  
  1973.         if (!$buffer) { return FALSE; }
  1974.  
  1975.     //---------------------------------------------------------+
  1976.  
  1977.         $buffer = substr($buffer, 10); // REMOVE HEADER
  1978.  
  1979.         $response_type = lgsl_cut_byte($buffer, 1);
  1980.  
  1981.     //---------------------------------------------------------+
  1982.  
  1983.         if ($response_type == "i")
  1984.         {
  1985.             $lgsl_need['s'] = FALSE;
  1986.  
  1987.             $server['s']['password']   = ord(lgsl_cut_byte($buffer, 1));
  1988.             $server['s']['players'] = lgsl_unpack(lgsl_cut_byte($buffer, 2), "S");
  1989.             $server['s']['playersmax'] = lgsl_unpack(lgsl_cut_byte($buffer, 2), "S");
  1990.             $server['s']['name']       = lgsl_cut_pascal($buffer, 4);
  1991.             $server['e']['gamemode']   = lgsl_cut_pascal($buffer, 4);
  1992.             $server['s']['map']     = lgsl_cut_pascal($buffer, 4);
  1993.         }
  1994.  
  1995.     //---------------------------------------------------------+
  1996.  
  1997.         elseif ($response_type == "r")
  1998.         {
  1999.             $lgsl_need['e'] = FALSE;
  2000.  
  2001.             $item_total = lgsl_unpack(lgsl_cut_byte($buffer, 2), "S");
  2002.  
  2003.             for ($i=0; $i<$item_total; $i++)
  2004.             {
  2005.             if (!$buffer) { return FALSE; }
  2006.  
  2007.             $data_key   = strtolower(lgsl_cut_pascal($buffer));
  2008.             $data_value = lgsl_cut_pascal($buffer);
  2009.  
  2010.             $server['e'][$data_key] = $data_value;
  2011.             }
  2012.         }
  2013.  
  2014.     //---------------------------------------------------------+
  2015.  
  2016.         elseif ($response_type == "d")
  2017.         {
  2018.             $lgsl_need['p'] = FALSE;
  2019.  
  2020.             $player_total = lgsl_unpack(lgsl_cut_byte($buffer, 2), "S");
  2021.  
  2022.             for ($i=0; $i<$player_total; $i++)
  2023.             {
  2024.             if (!$buffer) { return FALSE; }
  2025.  
  2026.             $server['p'][$i]['pid']   = ord(lgsl_cut_byte($buffer, 1));
  2027.             $server['p'][$i]['name']  = lgsl_cut_pascal($buffer);
  2028.             $server['p'][$i]['score'] = lgsl_unpack(lgsl_cut_byte($buffer, 4), "S");
  2029.             $server['p'][$i]['ping']  = lgsl_unpack(lgsl_cut_byte($buffer, 4), "S");
  2030.             }
  2031.         }
  2032.  
  2033.     //---------------------------------------------------------+
  2034.  
  2035.         return TRUE;
  2036.     }
  2037.  
  2038. //------------------------------------------------------------------------------------------------------------+
  2039. //------------------------------------------------------------------------------------------------------------+
  2040.  
  2041.     function lgsl_query_13(&$server, &$lgsl_need, &$lgsl_fp)
  2042.     {
  2043.     //---------------------------------------------------------+
  2044.  
  2045.         $buffer_s = ""; fwrite($lgsl_fp, "\x21\x21\x21\x21\x00"); // REQUEST [s]
  2046.         $buffer_e = ""; fwrite($lgsl_fp, "\x21\x21\x21\x21\x01"); // REQUEST [e]
  2047.         $buffer_p = ""; fwrite($lgsl_fp, "\x21\x21\x21\x21\x02"); // REQUEST [p]
  2048.  
  2049.     //---------------------------------------------------------+
  2050.  
  2051.         while ($packet = fread($lgsl_fp, 4096))
  2052.         {
  2053.             if   ($packet[4] == "\x00") { $buffer_s .= substr($packet, 5); }
  2054.             elseif ($packet[4] == "\x01") { $buffer_e .= substr($packet, 5); }
  2055.             elseif ($packet[4] == "\x02") { $buffer_p .= substr($packet, 5); }
  2056.         }
  2057.  
  2058.         if (!$buffer_s) { return FALSE; }
  2059.  
  2060.     //---------------------------------------------------------+
  2061.     //  SOME VALUES START WITH A PASCAL LENGTH AND END WITH A NULL BUT THERE IS AN ISSUE WHERE
  2062.     //  CERTAIN CHARACTERS CAUSE A WRONG PASCAL LENGTH AND NULLS TO APPEAR WITHIN NAMES
  2063.  
  2064.         $buffer_s = str_replace("\xa0", "\x20", $buffer_s); // REPLACE SPECIAL SPACE WITH NORMAL SPACE
  2065.         $buffer_s = substr($buffer_s, 5);
  2066.         $server['e']['hostport']   = lgsl_unpack(lgsl_cut_byte($buffer_s, 4), "S");
  2067.         $buffer_s = substr($buffer_s, 4);
  2068.         $server['s']['name']       = lgsl_cut_string($buffer_s, 1);
  2069.         $server['s']['map']     = lgsl_cut_string($buffer_s, 1);
  2070.         $server['e']['gamemode']   = lgsl_cut_string($buffer_s, 1);
  2071.         $server['s']['players'] = lgsl_unpack(lgsl_cut_byte($buffer_s, 4), "S");
  2072.         $server['s']['playersmax'] = lgsl_unpack(lgsl_cut_byte($buffer_s, 4), "S");
  2073.  
  2074.     //---------------------------------------------------------+
  2075.  
  2076.         while ($buffer_e && $buffer_e[0] != "\x00")
  2077.         {
  2078.             $item_key   = strtolower(lgsl_cut_string($buffer_e, 1));
  2079.             $item_value = lgsl_cut_string($buffer_e, 1);
  2080.  
  2081.             $item_key   = str_replace("\x1B\xFF\xFF\x01", "", $item_key);   // REMOVE MOD
  2082.             $item_value = str_replace("\x1B\xFF\xFF\x01", "", $item_value); // GARBAGE
  2083.  
  2084.             $server['e'][$item_key] = $item_value;
  2085.         }
  2086.  
  2087.     //---------------------------------------------------------+
  2088.     //  THIS PROTOCOL RETURNS MORE INFO THAN THE ALTERNATIVE BUT IT DOES NOT
  2089.     //  RETURN THE GAME NAME ! SO WE HAVE MANUALLY DETECT IT USING THE GAME TYPE
  2090.  
  2091.         $tmp = strtolower(substr($server['e']['gamemode'], 0, 2));
  2092.  
  2093.             if ($tmp == "ro") { $server['s']['game'] = "Red Orchestra"; }
  2094.         elseif ($tmp == "kf") { $server['s']['game'] = "Killing Floor"; }
  2095.  
  2096.        $server['s']['password'] = empty($server['e']['password']) && empty($server['e']['gamepassword']) ? "0" : "1";
  2097.  
  2098.     //---------------------------------------------------------+
  2099.  
  2100.         $player_key = 0;
  2101.  
  2102.         while ($buffer_p && $buffer_p[0] != "\x00")
  2103.         {
  2104.             $server['p'][$player_key]['pid']   = lgsl_unpack(lgsl_cut_byte($buffer_p, 4), "S");
  2105.  
  2106.             $end_marker = ord($buffer_p[0]) > 64 ? "\x00\x00" : "\x00"; // DIRTY WORK-AROUND FOR NAMES WITH PROBLEM CHARACTERS
  2107.  
  2108.             $server['p'][$player_key]['name']  = lgsl_cut_string($buffer_p, 1, $end_marker);
  2109.             $server['p'][$player_key]['ping']  = lgsl_unpack(lgsl_cut_byte($buffer_p, 4), "S");
  2110.             $server['p'][$player_key]['score'] = lgsl_unpack(lgsl_cut_byte($buffer_p, 4), "s");
  2111.             $tmp                               = lgsl_cut_byte($buffer_p, 4);
  2112.  
  2113.              if ($tmp[3] == "\x20") { $server['p'][$player_key]['team'] = 1; }
  2114.             elseif ($tmp[3] == "\x40") { $server['p'][$player_key]['team'] = 2; }
  2115.  
  2116.             $player_key ++;
  2117.         }
  2118.  
  2119.     //---------------------------------------------------------+
  2120.  
  2121.         return TRUE;
  2122.     }
  2123.  
  2124. //------------------------------------------------------------------------------------------------------------+
  2125. //------------------------------------------------------------------------------------------------------------+
  2126.  
  2127.     function lgsl_query_14(&$server, &$lgsl_need, &$lgsl_fp)
  2128.     {
  2129.     //---------------------------------------------------------+
  2130.     //  REFERENCE: http://flstat.cryosphere.co.uk/global-list.php
  2131.  
  2132.         fwrite($lgsl_fp, "\x00\x02\xf1\x26\x01\x26\xf0\x90\xa6\xf0\x26\x57\x4e\xac\xa0\xec\xf8\x68\xe4\x8d\x21");
  2133.  
  2134.         $buffer = fread($lgsl_fp, 4096);
  2135.  
  2136.         if (!$buffer) { return FALSE; }
  2137.  
  2138.     //---------------------------------------------------------+
  2139.  
  2140.         $buffer = substr($buffer, 4); // HEADER   ( 00 03 F1 26 )
  2141.         $buffer = substr($buffer, 4); // NOT USED ( 87 + NAME LENGTH )
  2142.         $buffer = substr($buffer, 4); // NOT USED ( NAME END TO BUFFER END LENGTH )
  2143.         $buffer = substr($buffer, 4); // UNKNOWN  ( 80 )
  2144.  
  2145.         $server['s']['map']     = "freelancer";
  2146.         $server['s']['password']   = lgsl_unpack(lgsl_cut_byte($buffer, 4), "l") - 1 ? 1 : 0;
  2147.         $server['s']['playersmax'] = lgsl_unpack(lgsl_cut_byte($buffer, 4), "l") - 1;
  2148.         $server['s']['players'] = lgsl_unpack(lgsl_cut_byte($buffer, 4), "l") - 1;
  2149.         $buffer                 = substr($buffer, 4);  // UNKNOWN ( 88 )
  2150.         $name_length               = lgsl_unpack(lgsl_cut_byte($buffer, 4), "l");
  2151.         $buffer                 = substr($buffer, 56); // UNKNOWN
  2152.         $server['s']['name']       = lgsl_cut_byte($buffer, $name_length);
  2153.  
  2154.         lgsl_cut_string($buffer, 0, ":");
  2155.         lgsl_cut_string($buffer, 0, ":");
  2156.         lgsl_cut_string($buffer, 0, ":");
  2157.         lgsl_cut_string($buffer, 0, ":");
  2158.         lgsl_cut_string($buffer, 0, ":");
  2159.  
  2160.         // WHATS LEFT IS THE MOTD
  2161.         $server['e']['motd'] = substr($buffer, 0, -1);
  2162.  
  2163.         // REMOVE UTF-8 ENCODING NULLS
  2164.         $server['s']['name'] = str_replace("\x00", "", $server['s']['name']);
  2165.         $server['e']['motd'] = str_replace("\x00", "", $server['e']['motd']);
  2166.  
  2167.         // DOES NOT RETURN PLAYER INFORMATION
  2168.  
  2169.     //---------------------------------------------------------+
  2170.  
  2171.         return TRUE;
  2172.     }
  2173.  
  2174. //------------------------------------------------------------------------------------------------------------+
  2175. //------------------------------------------------------------------------------------------------------------+
  2176.  
  2177.     function lgsl_query_15(&$server, &$lgsl_need, &$lgsl_fp)
  2178.     {
  2179.     //---------------------------------------------------------+
  2180.  
  2181.         fwrite($lgsl_fp, "GTR2_Direct_IP_Search\x00");
  2182.  
  2183.         $buffer = fread($lgsl_fp, 4096);
  2184.  
  2185.         if (!$buffer) { return FALSE; }
  2186.  
  2187.     //---------------------------------------------------------+
  2188.  
  2189.         $buffer = str_replace("\xFE", "\xFF", $buffer);
  2190.         $buffer = explode("\xFF", $buffer);
  2191.  
  2192.         $server['s']['name']       = $buffer[3];
  2193.         $server['s']['game']       = $buffer[7];
  2194.         $server['e']['version'] = $buffer[11];
  2195.         $server['e']['hostport']   = $buffer[15];
  2196.         $server['s']['map']     = $buffer[19];
  2197.         $server['s']['players'] = $buffer[25];
  2198.         $server['s']['playersmax'] = $buffer[27];
  2199.         $server['e']['gamemode']   = $buffer[31];
  2200.  
  2201.         // DOES NOT RETURN PLAYER INFORMATION
  2202.  
  2203.     //---------------------------------------------------------+
  2204.  
  2205.         return TRUE;
  2206.     }
  2207.  
  2208. //------------------------------------------------------------------------------------------------------------+
  2209. //------------------------------------------------------------------------------------------------------------+
  2210.  
  2211.     function lgsl_query_16(&$server, &$lgsl_need, &$lgsl_fp)
  2212.     {
  2213.     //---------------------------------------------------------+
  2214.     //  REFERENCE:
  2215.     //  http://www.planetpointy.co.uk/software/rfactorsspy.shtml
  2216.     //  http://users.pandora.be/viperius/mUtil/
  2217.     //  USES FIXED DATA POSITIONS WITH RANDOM CHARACTERS FILLING THE GAPS
  2218.  
  2219.         fwrite($lgsl_fp, "rF_S");
  2220.  
  2221.         $buffer = fread($lgsl_fp, 4096);
  2222.  
  2223.         if (!$buffer) { return FALSE; }
  2224.  
  2225.     //---------------------------------------------------------+
  2226.  
  2227.     //  $server['e']['gamename']         = lgsl_get_string($buffer);
  2228.         $buffer = substr($buffer, 8);
  2229.     //  $server['e']['fullupdate']     = lgsl_unpack($buffer[0], "C");
  2230.         $server['e']['region']         = lgsl_unpack($buffer[1] .$buffer[2],  "S");
  2231.     //  $server['e']['ip']             = ($buffer[3] .$buffer[4].$buffer[5].$buffer[6]); // UNSIGNED LONG
  2232.     //  $server['e']['size']             = lgsl_unpack($buffer[7] .$buffer[8],  "S");
  2233.         $server['e']['version']       = lgsl_unpack($buffer[9] .$buffer[10], "S");
  2234.     //  $server['e']['version_racecast'] = lgsl_unpack($buffer[11].$buffer[12], "S");
  2235.         $server['e']['hostport']         = lgsl_unpack($buffer[13].$buffer[14], "S");
  2236.     //  $server['e']['queryport']       = lgsl_unpack($buffer[15].$buffer[16], "S");
  2237.         $buffer = substr($buffer, 17);
  2238.         $server['s']['game']             = lgsl_get_string($buffer);
  2239.         $buffer = substr($buffer, 20);
  2240.         $server['s']['name']             = lgsl_get_string($buffer);
  2241.         $buffer = substr($buffer, 28);
  2242.         $server['s']['map']           = lgsl_get_string($buffer);
  2243.         $buffer = substr($buffer, 32);
  2244.         $server['e']['motd']             = lgsl_get_string($buffer);
  2245.         $buffer = substr($buffer, 96);
  2246.         $server['e']['packed_aids']   = lgsl_unpack($buffer[0].$buffer[1], "S");
  2247.     //  $server['e']['ping']             = lgsl_unpack($buffer[2].$buffer[3], "S");
  2248.         $server['e']['packed_flags']     = lgsl_unpack($buffer[4],  "C");
  2249.         $server['e']['rate']             = lgsl_unpack($buffer[5],  "C");
  2250.         $server['s']['players']       = lgsl_unpack($buffer[6],  "C");
  2251.         $server['s']['playersmax']     = lgsl_unpack($buffer[7],  "C");
  2252.         $server['e']['bots']             = lgsl_unpack($buffer[8],  "C");
  2253.         $server['e']['packed_special']   = lgsl_unpack($buffer[9],  "C");
  2254.         $server['e']['damage']         = lgsl_unpack($buffer[10], "C");
  2255.         $server['e']['packed_rules']     = lgsl_unpack($buffer[11].$buffer[12], "S");
  2256.         $server['e']['credits1']         = lgsl_unpack($buffer[13], "C");
  2257.         $server['e']['credits2']         = lgsl_unpack($buffer[14].$buffer[15], "S");
  2258.         $server['e']['time']   = lgsl_time(lgsl_unpack($buffer[16].$buffer[17], "S"));
  2259.         $server['e']['laps']             = lgsl_unpack($buffer[18].$buffer[19], "s") / 16;
  2260.         $buffer = substr($buffer, 23);
  2261.         $server['e']['vehicles']         = lgsl_get_string($buffer);
  2262.  
  2263.         // DOES NOT RETURN PLAYER INFORMATION
  2264.  
  2265.     //---------------------------------------------------------+
  2266.  
  2267.         $server['s']['password']    = ($server['e']['packed_special'] & 2)  ? 1 : 0;
  2268.         $server['e']['racecast']    = ($server['e']['packed_special'] & 4)  ? 1 : 0;
  2269.         $server['e']['fixedsetups'] = ($server['e']['packed_special'] & 16) ? 1 : 0;
  2270.  
  2271.                                               $server['e']['aids']  = "";
  2272.         if ($server['e']['packed_aids'] & 1)    { $server['e']['aids'] .= " TractionControl"; }
  2273.         if ($server['e']['packed_aids'] & 2)    { $server['e']['aids'] .= " AntiLockBraking"; }
  2274.         if ($server['e']['packed_aids'] & 4)    { $server['e']['aids'] .= " StabilityControl"; }
  2275.         if ($server['e']['packed_aids'] & 8)    { $server['e']['aids'] .= " AutoShifting"; }
  2276.         if ($server['e']['packed_aids'] & 16)   { $server['e']['aids'] .= " AutoClutch"; }
  2277.         if ($server['e']['packed_aids'] & 32)   { $server['e']['aids'] .= " Invulnerability"; }
  2278.         if ($server['e']['packed_aids'] & 64)   { $server['e']['aids'] .= " OppositeLock"; }
  2279.         if ($server['e']['packed_aids'] & 128)  { $server['e']['aids'] .= " SteeringHelp"; }
  2280.         if ($server['e']['packed_aids'] & 256)  { $server['e']['aids'] .= " BrakingHelp"; }
  2281.         if ($server['e']['packed_aids'] & 512)  { $server['e']['aids'] .= " SpinRecovery"; }
  2282.         if ($server['e']['packed_aids'] & 1024) { $server['e']['aids'] .= " AutoPitstop"; }
  2283.  
  2284.         $server['e']['aids']     = str_replace(" ", " / ", trim($server['e']['aids']));
  2285.         $server['e']['vehicles'] = str_replace("|", " / ", trim($server['e']['vehicles']));
  2286.  
  2287.         unset($server['e']['packed_aids']);
  2288.         unset($server['e']['packed_flags']);
  2289.         unset($server['e']['packed_special']);
  2290.         unset($server['e']['packed_rules']);
  2291.  
  2292.     //---------------------------------------------------------+
  2293.  
  2294.         return TRUE;
  2295.     }
  2296.  
  2297. //------------------------------------------------------------------------------------------------------------+
  2298. //------------------------------------------------------------------------------------------------------------+
  2299.  
  2300.     function lgsl_query_17(&$server, &$lgsl_need, &$lgsl_fp)
  2301.     {
  2302.     //---------------------------------------------------------+
  2303.     //  REFERENCE: http://masterserver.savage.s2games.com
  2304.  
  2305.         fwrite($lgsl_fp, "\x9e\x4c\x23\x00\x00\xce\x21\x21\x21\x21");
  2306.  
  2307.         $buffer = fread($lgsl_fp, 4096);
  2308.  
  2309.         if (!$buffer) { return FALSE; }
  2310.  
  2311.     //---------------------------------------------------------+
  2312.  
  2313.         $buffer = substr($buffer, 12); // REMOVE HEADER
  2314.  
  2315.         while ($key = strtolower(lgsl_cut_string($buffer, 0, "\xFE")))
  2316.         {
  2317.             if ($key == "players") { break; }
  2318.  
  2319.             $value = lgsl_cut_string($buffer, 0, "\xFF");
  2320.             $value = str_replace("\x00", "", $value);
  2321.             $value = lgsl_parse_color($value, $server['b']['type']);
  2322.  
  2323.             $server['e'][$key] = $value;
  2324.         }
  2325.  
  2326.         $server['s']['name']       = $server['e']['name'];  unset($server['e']['name']);
  2327.         $server['s']['map']     = $server['e']['world']; unset($server['e']['world']);
  2328.         $server['s']['players'] = $server['e']['cnum'];  unset($server['e']['cnum']);
  2329.         $server['s']['playersmax'] = $server['e']['cmax'];  unset($server['e']['cnum']);
  2330.         $server['s']['password']   = $server['e']['pass'];  unset($server['e']['cnum']);
  2331.  
  2332.     //---------------------------------------------------------+
  2333.  
  2334.         $server['t'][0]['name'] = $server['e']['race1'];
  2335.         $server['t'][1]['name'] = $server['e']['race2'];
  2336.         $server['t'][2]['name'] = "spectator";
  2337.  
  2338.         $team_key   = -1;
  2339.         $player_key = 0;
  2340.  
  2341.         while ($value = lgsl_cut_string($buffer, 0, "\x0a"))
  2342.         {
  2343.             if ($value[0] == "\x00") { break; }
  2344.             if ($value[0] != "\x20") { $team_key++; continue; }
  2345.  
  2346.             $server['p'][$player_key]['name'] = lgsl_parse_color(substr($value, 1), $server['b']['type']);
  2347.             $server['p'][$player_key]['team'] = $server['t'][$team_key]['name'];
  2348.  
  2349.             $player_key++;
  2350.         }
  2351.  
  2352.     //---------------------------------------------------------+
  2353.  
  2354.         return TRUE;
  2355.     }
  2356.  
  2357. //------------------------------------------------------------------------------------------------------------+
  2358. //------------------------------------------------------------------------------------------------------------+
  2359.  
  2360.     function lgsl_query_18(&$server, &$lgsl_need, &$lgsl_fp)
  2361.     {
  2362.     //---------------------------------------------------------+
  2363.     //  REFERENCE: http://masterserver.savage2.s2games.com
  2364.  
  2365.         fwrite($lgsl_fp, "\x01");
  2366.  
  2367.         $buffer = fread($lgsl_fp, 4096);
  2368.  
  2369.         if (!$buffer) { return FALSE; }
  2370.  
  2371.     //---------------------------------------------------------+
  2372.  
  2373.         $buffer = substr($buffer, 12); // REMOVE HEADER
  2374.  
  2375.         $server['s']['name']            = lgsl_cut_string($buffer);
  2376.         $server['s']['players']      = ord(lgsl_cut_byte($buffer, 1));
  2377.         $server['s']['playersmax']    = ord(lgsl_cut_byte($buffer, 1));
  2378.         $server['e']['time']            = lgsl_cut_string($buffer);
  2379.         $server['s']['map']          = lgsl_cut_string($buffer);
  2380.         $server['e']['nextmap']      = lgsl_cut_string($buffer);
  2381.         $server['e']['location']        = lgsl_cut_string($buffer);
  2382.         $server['e']['minimum_players'] = ord(lgsl_cut_string($buffer));
  2383.         $server['e']['gamemode']        = lgsl_cut_string($buffer);
  2384.         $server['e']['version']      = lgsl_cut_string($buffer);
  2385.         $server['e']['minimum_level']   = ord(lgsl_cut_byte($buffer, 1));
  2386.  
  2387.         // DOES NOT RETURN PLAYER INFORMATION
  2388.  
  2389.     //---------------------------------------------------------+
  2390.  
  2391.         return TRUE;
  2392.     }
  2393.  
  2394. //------------------------------------------------------------------------------------------------------------+
  2395. //------------------------------------------------------------------------------------------------------------+
  2396.  
  2397.     function lgsl_query_19(&$server, &$lgsl_need, &$lgsl_fp)
  2398.     {
  2399.     //---------------------------------------------------------+
  2400.  
  2401.         fwrite($lgsl_fp, "\xC0\xDE\xF1\x11\x42\x06\x00\xF5\x03\x21\x21\x21\x21");
  2402.  
  2403.         $buffer = fread($lgsl_fp, 4096);
  2404.  
  2405.         if (!$buffer) { return FALSE; }
  2406.  
  2407.     //---------------------------------------------------------+
  2408.  
  2409.         $buffer = substr($buffer, 25); // REMOVE HEADER
  2410.  
  2411.         $server['s']['name']       = lgsl_get_string(lgsl_cut_pascal($buffer, 4, 3, -3));
  2412.         $server['s']['map']     = lgsl_get_string(lgsl_cut_pascal($buffer, 4, 3, -3));
  2413.         $server['e']['nextmap'] = lgsl_get_string(lgsl_cut_pascal($buffer, 4, 3, -3));
  2414.         $server['e']['gametype']   = lgsl_get_string(lgsl_cut_pascal($buffer, 4, 3, -3));
  2415.  
  2416.         $buffer = substr($buffer, 1);
  2417.  
  2418.         $server['s']['password']   = ord(lgsl_cut_byte($buffer, 1));
  2419.         $server['s']['playersmax'] = ord(lgsl_cut_byte($buffer, 4));
  2420.         $server['s']['players'] = ord(lgsl_cut_byte($buffer, 4));
  2421.  
  2422.     //---------------------------------------------------------+
  2423.  
  2424.         for ($player_key=0; $player_key<$server['s']['players']; $player_key++)
  2425.         {
  2426.          $server['p'][$player_key]['name'] = lgsl_get_string(lgsl_cut_pascal($buffer, 4, 3, -3));
  2427.         }
  2428.  
  2429.     //---------------------------------------------------------+
  2430.  
  2431.         $buffer = substr($buffer, 17);
  2432.  
  2433.         $server['e']['version'] = lgsl_get_string(lgsl_cut_pascal($buffer, 4, 3, -3));
  2434.         $server['e']['mods']       = lgsl_get_string(lgsl_cut_pascal($buffer, 4, 3, -3));
  2435.         $server['e']['dedicated']  = ord(lgsl_cut_byte($buffer, 1));
  2436.         $server['e']['time']       = lgsl_time(lgsl_unpack(lgsl_cut_byte($buffer, 4), "f"));
  2437.         $server['e']['status']   = ord(lgsl_cut_byte($buffer, 4));
  2438.         $server['e']['gamemode']   = ord(lgsl_cut_byte($buffer, 4));
  2439.         $server['e']['motd']       = lgsl_get_string(lgsl_cut_pascal($buffer, 4, 3, -3));
  2440.         $server['e']['respawns']   = ord(lgsl_cut_byte($buffer, 4));
  2441.         $server['e']['time_limit'] = lgsl_time(lgsl_unpack(lgsl_cut_byte($buffer, 4), "f"));
  2442.         $server['e']['voting']   = ord(lgsl_cut_byte($buffer, 4));
  2443.  
  2444.         $buffer = substr($buffer, 2);
  2445.  
  2446.     //---------------------------------------------------------+
  2447.  
  2448.         for ($player_key=0; $player_key<$server['s']['players']; $player_key++)
  2449.         {
  2450.          $server['p'][$player_key]['team'] = ord(lgsl_cut_byte($buffer, 4));
  2451.  
  2452.          $unknown = ord(lgsl_cut_byte($buffer, 1));
  2453.         }
  2454.  
  2455.     //---------------------------------------------------------+
  2456.  
  2457.         $buffer = substr($buffer, 7);
  2458.  
  2459.         $server['e']['platoon_1_color']   = ord(lgsl_cut_byte($buffer, 8));
  2460.         $server['e']['platoon_2_color']   = ord(lgsl_cut_byte($buffer, 8));
  2461.         $server['e']['platoon_3_color']   = ord(lgsl_cut_byte($buffer, 8));
  2462.         $server['e']['platoon_4_color']   = ord(lgsl_cut_byte($buffer, 8));
  2463.         $server['e']['timer_on']          = ord(lgsl_cut_byte($buffer, 1));
  2464.         $server['e']['timer_time']      = lgsl_time(lgsl_unpack(lgsl_cut_byte($buffer, 4), "f"));
  2465.         $server['e']['time_debriefing']   = lgsl_time(lgsl_unpack(lgsl_cut_byte($buffer, 4), "f"));
  2466.         $server['e']['time_respawn_min']  = lgsl_time(lgsl_unpack(lgsl_cut_byte($buffer, 4), "f"));
  2467.         $server['e']['time_respawn_max']  = lgsl_time(lgsl_unpack(lgsl_cut_byte($buffer, 4), "f"));
  2468.         $server['e']['time_respawn_safe'] = lgsl_time(lgsl_unpack(lgsl_cut_byte($buffer, 4), "f"));
  2469.         $server['e']['difficulty']      = ord(lgsl_cut_byte($buffer, 4));
  2470.         $server['e']['respawn_total']    = ord(lgsl_cut_byte($buffer, 4));
  2471.         $server['e']['random_insertions'] = ord(lgsl_cut_byte($buffer, 1));
  2472.         $server['e']['spectators']      = ord(lgsl_cut_byte($buffer, 1));
  2473.         $server['e']['arcademode']      = ord(lgsl_cut_byte($buffer, 1));
  2474.         $server['e']['ai_backup']        = ord(lgsl_cut_byte($buffer, 1));
  2475.         $server['e']['random_teams']      = ord(lgsl_cut_byte($buffer, 1));
  2476.         $server['e']['time_starting']    = lgsl_time(lgsl_unpack(lgsl_cut_byte($buffer, 4), "f"));
  2477.         $server['e']['identify_friends']  = ord(lgsl_cut_byte($buffer, 1));
  2478.         $server['e']['identify_threats']  = ord(lgsl_cut_byte($buffer, 1));
  2479.  
  2480.         $buffer = substr($buffer, 5);
  2481.  
  2482.         $server['e']['restrictions']      = lgsl_get_string(lgsl_cut_pascal($buffer, 4, 3, -3));
  2483.  
  2484.     //---------------------------------------------------------+
  2485.  
  2486.         switch ($server['e']['status'])
  2487.         {
  2488.             case 3: $server['e']['status'] = "Joining"; break;
  2489.             case 4: $server['e']['status'] = "Joining"; break;
  2490.             case 5: $server['e']['status'] = "Joining"; break;
  2491.         }
  2492.  
  2493.         switch ($server['e']['gamemode'])
  2494.         {
  2495.             case 2: $server['e']['gamemode'] = "Co-Op"; break;
  2496.             case 3: $server['e']['gamemode'] = "Solo";  break;
  2497.             case 4: $server['e']['gamemode'] = "Team";  break;
  2498.         }
  2499.  
  2500.         switch ($server['e']['respawns'])
  2501.         {
  2502.             case 0: $server['e']['respawns'] = "None";     break;
  2503.             case 1: $server['e']['respawns'] = "Individual"; break;
  2504.             case 2: $server['e']['respawns'] = "Team";     break;
  2505.             case 3: $server['e']['respawns'] = "Infinite";   break;
  2506.         }
  2507.  
  2508.         switch ($server['e']['difficulty'])
  2509.         {
  2510.             case 0: $server['e']['difficulty'] = "Recruit"; break;
  2511.             case 1: $server['e']['difficulty'] = "Veteran"; break;
  2512.             case 2: $server['e']['difficulty'] = "Elite";   break;
  2513.         }
  2514.  
  2515.     //---------------------------------------------------------+
  2516.  
  2517.         return TRUE;
  2518.     }
  2519.  
  2520. //------------------------------------------------------------------------------------------------------------+
  2521. //------------------------------------------------------------------------------------------------------------+
  2522.  
  2523.     function lgsl_query_20(&$server, &$lgsl_need, &$lgsl_fp)
  2524.     {
  2525.     //---------------------------------------------------------+
  2526.  
  2527.         if ($lgsl_need['s'])
  2528.         {
  2529.             fwrite($lgsl_fp, "\xFF\xFF\xFF\xFFFLSQ");
  2530.         }
  2531.         else
  2532.         {
  2533.             fwrite($lgsl_fp, "\xFF\xFF\xFF\xFF\x57");
  2534.  
  2535.             $challenge_packet = fread($lgsl_fp, 4096);
  2536.  
  2537.             if (!$challenge_packet) { return FALSE; }
  2538.  
  2539.             $challenge_code = substr($challenge_packet, 5, 4);
  2540.  
  2541.             if   ($lgsl_need['e']) { fwrite($lgsl_fp, "\xFF\xFF\xFF\xFF\x56{$challenge_code}"); }
  2542.             elseif ($lgsl_need['p']) { fwrite($lgsl_fp, "\xFF\xFF\xFF\xFF\x55{$challenge_code}"); }
  2543.         }
  2544.  
  2545.         $buffer = fread($lgsl_fp, 4096);
  2546.         $buffer = substr($buffer, 4); // REMOVE HEADER
  2547.  
  2548.         if (!$buffer) { return FALSE; }
  2549.  
  2550.     //---------------------------------------------------------+
  2551.  
  2552.         $response_type = lgsl_cut_byte($buffer, 1);
  2553.  
  2554.         if ($response_type == "I")
  2555.         {
  2556.             $server['e']['netcode']  = ord(lgsl_cut_byte($buffer, 1));
  2557.             $server['s']['name']        = lgsl_cut_string($buffer);
  2558.             $server['s']['map']      = lgsl_cut_string($buffer);
  2559.             $server['s']['game']        = lgsl_cut_string($buffer);
  2560.             $server['e']['gamemode']    = lgsl_cut_string($buffer);
  2561.             $server['e']['description'] = lgsl_cut_string($buffer);
  2562.             $server['e']['version']  = lgsl_cut_string($buffer);
  2563.             $server['e']['hostport']    = lgsl_unpack(lgsl_cut_byte($buffer, 2), "n");
  2564.             $server['s']['players']  = lgsl_unpack(lgsl_cut_byte($buffer, 1), "C");
  2565.             $server['s']['playersmax']  = lgsl_unpack(lgsl_cut_byte($buffer, 1), "C");
  2566.             $server['e']['dedicated']   = lgsl_cut_byte($buffer, 1);
  2567.             $server['e']['os']        = lgsl_cut_byte($buffer, 1);
  2568.             $server['s']['password']    = lgsl_unpack(lgsl_cut_byte($buffer, 1), "C");
  2569.             $server['e']['anticheat']   = lgsl_unpack(lgsl_cut_byte($buffer, 1), "C");
  2570.             $server['e']['cpu_load']    = round(3.03 * lgsl_unpack(lgsl_cut_byte($buffer, 1), "C"))."%";
  2571.             $server['e']['round']      = lgsl_unpack(lgsl_cut_byte($buffer, 1), "C");
  2572.             $server['e']['roundsmax']   = lgsl_unpack(lgsl_cut_byte($buffer, 1), "C");
  2573.             $server['e']['timeleft']    = lgsl_time(lgsl_unpack(lgsl_cut_byte($buffer, 2), "S") / 250);
  2574.         }
  2575.  
  2576.         elseif ($response_type == "E")
  2577.         {
  2578.             $returned = lgsl_unpack(lgsl_cut_byte($buffer, 2), "S");
  2579.  
  2580.             while ($buffer)
  2581.             {
  2582.             $item_key   = strtolower(lgsl_cut_string($buffer));
  2583.             $item_value = lgsl_cut_string($buffer);
  2584.  
  2585.             $server['e'][$item_key] = $item_value;
  2586.             }
  2587.         }
  2588.  
  2589.         elseif ($response_type == "D")
  2590.         {
  2591.             $returned = ord(lgsl_cut_byte($buffer, 1));
  2592.  
  2593.             $player_key = 0;
  2594.  
  2595.             while ($buffer)
  2596.             {
  2597.             $server['p'][$player_key]['pid']   = ord(lgsl_cut_byte($buffer, 1));
  2598.             $server['p'][$player_key]['name']  = lgsl_cut_string($buffer);
  2599.             $server['p'][$player_key]['score'] = lgsl_unpack(lgsl_cut_byte($buffer, 4), "N");
  2600.             $server['p'][$player_key]['time']  = lgsl_time(lgsl_unpack(strrev(lgsl_cut_byte($buffer, 4)), "f"));
  2601.             $server['p'][$player_key]['ping']  = lgsl_unpack(lgsl_cut_byte($buffer, 2), "n");
  2602.             $server['p'][$player_key]['uid']   = lgsl_unpack(lgsl_cut_byte($buffer, 4), "N");
  2603.             $server['p'][$player_key]['team']  = ord(lgsl_cut_byte($buffer, 1));
  2604.  
  2605.             $player_key ++;
  2606.             }
  2607.         }
  2608.  
  2609.     //---------------------------------------------------------+
  2610.  
  2611.         if   ($lgsl_need['s']) { $lgsl_need['s'] = FALSE; }
  2612.         elseif ($lgsl_need['e']) { $lgsl_need['e'] = FALSE; }
  2613.         elseif ($lgsl_need['p']) { $lgsl_need['p'] = FALSE; }
  2614.  
  2615.     //---------------------------------------------------------+
  2616.  
  2617.         return TRUE;
  2618.     }
  2619.  
  2620. //------------------------------------------------------------------------------------------------------------+
  2621. //------------------------------------------------------------------------------------------------------------+
  2622.  
  2623.     function lgsl_query_21(&$server, &$lgsl_need, &$lgsl_fp)
  2624.     {
  2625.     //---------------------------------------------------------+
  2626.  
  2627.         fwrite($lgsl_fp,"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xffgief");
  2628.  
  2629.         $buffer = fread($lgsl_fp, 4096);
  2630.         $buffer = substr($buffer, 20); // REMOVE HEADER
  2631.  
  2632.         if (!$buffer) { return FALSE; }
  2633.  
  2634.     //---------------------------------------------------------+
  2635.  
  2636.         $server['s']['name']       = lgsl_cut_string($buffer);
  2637.         $server['s']['map']     = lgsl_cut_string($buffer);
  2638.         $server['e']['gamemode']   = lgsl_cut_string($buffer);
  2639.         $server['s']['password']   = lgsl_cut_string($buffer);
  2640.         $server['e']['progress']   = lgsl_cut_string($buffer)."%";
  2641.         $server['s']['players'] = lgsl_cut_string($buffer);
  2642.         $server['s']['playersmax'] = lgsl_cut_string($buffer);
  2643.  
  2644.         switch ($server['e']['gamemode'])
  2645.         {
  2646.             case 0: $server['e']['gamemode'] = "Deathmatch"; break;
  2647.             case 1: $server['e']['gamemode'] = "Team Deathmatch"; break;
  2648.             case 2: $server['e']['gamemode'] = "Capture The Flag"; break;
  2649.         }
  2650.  
  2651.     //---------------------------------------------------------+
  2652.  
  2653.         $player_key = 0;
  2654.  
  2655.         while ($buffer)
  2656.         {
  2657.             $server['p'][$player_key]['name']  = lgsl_cut_string($buffer);
  2658.             $server['p'][$player_key]['score'] = lgsl_cut_string($buffer);
  2659.  
  2660.             $player_key ++;
  2661.         }
  2662.  
  2663.     //---------------------------------------------------------+
  2664.  
  2665.         return TRUE;
  2666.     }
  2667.  
  2668. //------------------------------------------------------------------------------------------------------------+
  2669. //------------------------------------------------------------------------------------------------------------+
  2670.  
  2671.     function lgsl_query_22(&$server, &$lgsl_need, &$lgsl_fp)
  2672.     {
  2673.     //---------------------------------------------------------+
  2674.  
  2675.         fwrite($lgsl_fp,"\x03\x00\x00");
  2676.  
  2677.         $buffer = fread($lgsl_fp, 4096);
  2678.         $buffer = substr($buffer, 3); // REMOVE HEADER
  2679.  
  2680.         if (!$buffer) { return FALSE; }
  2681.  
  2682.         $response_type = ord(lgsl_cut_byte($buffer, 1)); // TYPE SHOULD BE 4
  2683.  
  2684.     //---------------------------------------------------------+
  2685.  
  2686.         $grf_count = ord(lgsl_cut_byte($buffer, 1));
  2687.  
  2688.         for ($a=0; $a<$grf_count; $a++)
  2689.         {
  2690.             $server['e']['grf_'.$a.'_id'] = strtoupper(dechex(lgsl_unpack(lgsl_cut_byte($buffer, 4), "N")));
  2691.  
  2692.             for ($b=0; $b<16; $b++)
  2693.             {
  2694.             $server['e']['grf_'.$a.'_md5'] .= strtoupper(dechex(ord(lgsl_cut_byte($buffer, 1))));
  2695.             }
  2696.         }
  2697.  
  2698.     //---------------------------------------------------------+
  2699.  
  2700.         $server['e']['date_current']   = lgsl_unpack(lgsl_cut_byte($buffer, 4), "L");
  2701.         $server['e']['date_start']   = lgsl_unpack(lgsl_cut_byte($buffer, 4), "L");
  2702.         $server['e']['companies_max']  = ord(lgsl_cut_byte($buffer, 1));
  2703.         $server['e']['companies']     = ord(lgsl_cut_byte($buffer, 1));
  2704.         $server['e']['spectators_max'] = ord(lgsl_cut_byte($buffer, 1));
  2705.         $server['s']['name']           = lgsl_cut_string($buffer);
  2706.         $server['e']['version']     = lgsl_cut_string($buffer);
  2707.         $server['e']['language']       = ord(lgsl_cut_byte($buffer, 1));
  2708.         $server['s']['password']       = ord(lgsl_cut_byte($buffer, 1));
  2709.         $server['s']['playersmax']   = ord(lgsl_cut_byte($buffer, 1));
  2710.         $server['s']['players']     = ord(lgsl_cut_byte($buffer, 1));
  2711.         $server['e']['spectators']   = ord(lgsl_cut_byte($buffer, 1));
  2712.         $server['s']['map']         = lgsl_cut_string($buffer);
  2713.         $server['e']['map_width']     = lgsl_unpack(lgsl_cut_byte($buffer, 2), "S");
  2714.         $server['e']['map_height']   = lgsl_unpack(lgsl_cut_byte($buffer, 2), "S");
  2715.         $server['e']['map_set']     = ord(lgsl_cut_byte($buffer, 1));
  2716.         $server['e']['dedicated']     = ord(lgsl_cut_byte($buffer, 1));
  2717.  
  2718.         // DOES NOT RETURN PLAYER INFORMATION
  2719.  
  2720.     //---------------------------------------------------------+
  2721.  
  2722.         return TRUE;
  2723.     }
  2724.  
  2725. //------------------------------------------------------------------------------------------------------------+
  2726. //------------------------------------------------------------------------------------------------------------+
  2727.  
  2728.     function lgsl_query_23(&$server, &$lgsl_need, &$lgsl_fp)
  2729.     {
  2730.     //---------------------------------------------------------+
  2731.     //  REFERENCE:
  2732.     //  http://siteinthe.us
  2733.     //  http://www.tribesmasterserver.com
  2734.  
  2735.         fwrite($lgsl_fp, "b++");
  2736.  
  2737.         $buffer = fread($lgsl_fp, 4096);
  2738.  
  2739.         if (!$buffer) { return FALSE; }
  2740.  
  2741.         $buffer = substr($buffer, 4); // REMOVE HEADER
  2742.  
  2743.     //---------------------------------------------------------+
  2744.  
  2745.         $server['s']['game']       = lgsl_cut_pascal($buffer);
  2746.         $server['e']['version'] = lgsl_cut_pascal($buffer);
  2747.         $server['s']['name']       = lgsl_cut_pascal($buffer);
  2748.         $server['e']['dedicated']  = ord(lgsl_cut_byte($buffer, 1));
  2749.         $server['s']['password']   = ord(lgsl_cut_byte($buffer, 1));
  2750.         $server['s']['players'] = ord(lgsl_cut_byte($buffer, 1));
  2751.         $server['s']['playersmax'] = ord(lgsl_cut_byte($buffer, 1));
  2752.         $server['e']['cpu']     = lgsl_unpack(lgsl_cut_byte($buffer, 2), "S");
  2753.         $server['e']['mod']     = lgsl_cut_pascal($buffer);
  2754.         $server['e']['type']       = lgsl_cut_pascal($buffer);
  2755.         $server['s']['map']     = lgsl_cut_pascal($buffer);
  2756.         $server['e']['motd']       = lgsl_cut_pascal($buffer);
  2757.         $server['e']['teams']     = ord(lgsl_cut_byte($buffer, 1));
  2758.  
  2759.     //---------------------------------------------------------+
  2760.  
  2761.         $team_field = "?".lgsl_cut_pascal($buffer);
  2762.         $team_field = explode("\t", $team_field);
  2763.  
  2764.         foreach ($team_field as $key => $value)
  2765.         {
  2766.             $value = substr($value, 1);
  2767.             $value = strtolower($value);
  2768.             $team_field[$key] = $value;
  2769.         }
  2770.  
  2771.     //---------------------------------------------------------+
  2772.  
  2773.         $player_field = "?".lgsl_cut_pascal($buffer);
  2774.         $player_field = explode("\t", $player_field);
  2775.  
  2776.         foreach ($player_field as $key => $value)
  2777.         {
  2778.             $value = substr($value, 1);
  2779.             $value = strtolower($value);
  2780.  
  2781.             if ($value == "player name") { $value = "name"; }
  2782.  
  2783.             $player_field[$key] = $value;
  2784.         }
  2785.  
  2786.         $player_field[] = "unknown_1";
  2787.         $player_field[] = "unknown_2";
  2788.  
  2789.     //---------------------------------------------------------+
  2790.  
  2791.         for ($i=0; $i<$server['e']['teams']; $i++)
  2792.         {
  2793.             $team_name = lgsl_cut_pascal($buffer);
  2794.             $team_info = lgsl_cut_pascal($buffer);
  2795.  
  2796.             if (!$team_info) { continue; }
  2797.  
  2798.             $team_info = str_replace("%t", $team_name, $team_info);
  2799.             $team_info = explode("\t", $team_info);
  2800.  
  2801.             foreach ($team_info as $key => $value)
  2802.             {
  2803.             $field = $team_field[$key];
  2804.             $value = trim($value);
  2805.  
  2806.             if ($field == "team name") { $field = "name"; }
  2807.  
  2808.             $server['t'][$i][$field] = $value;
  2809.             }
  2810.         }
  2811.  
  2812.     //---------------------------------------------------------+
  2813.  
  2814.         for ($i=0; $i<$server['s']['players']; $i++)
  2815.         {
  2816.             $player_bits   = array();
  2817.             $player_bits[] = ord(lgsl_cut_byte($buffer, 1)) * 4; // %p = PING
  2818.             $player_bits[] = ord(lgsl_cut_byte($buffer, 1));     // %l = PACKET LOSS
  2819.             $player_bits[] = ord(lgsl_cut_byte($buffer, 1));     // %t = TEAM
  2820.             $player_bits[] = lgsl_cut_pascal($buffer);         // %n = PLAYER NAME
  2821.             $player_info   = lgsl_cut_pascal($buffer);
  2822.  
  2823.             if (!$player_info) { continue; }
  2824.  
  2825.             $player_info = str_replace(array("%p","%l","%t","%n"), $player_bits, $player_info);
  2826.             $player_info = explode("\t", $player_info);
  2827.  
  2828.             foreach ($player_info as $key => $value)
  2829.             {
  2830.             $field = $player_field[$key];
  2831.             $value = trim($value);
  2832.  
  2833.             if ($field == "team") { $value = $server['t'][$value]['name']; }
  2834.  
  2835.             $server['p'][$i][$field] = $value;
  2836.             }
  2837.         }
  2838.  
  2839.     //---------------------------------------------------------+
  2840.  
  2841.         return TRUE;
  2842.     }
  2843.  
  2844. //------------------------------------------------------------------------------------------------------------+
  2845. //------------------------------------------------------------------------------------------------------------+
  2846.  
  2847.     function lgsl_query_24(&$server, &$lgsl_need, &$lgsl_fp)
  2848.     {
  2849.     //---------------------------------------------------------+
  2850.     //  REFERENCE: http://cubelister.sourceforge.net
  2851.  
  2852.         fwrite($lgsl_fp, "\x21\x21");
  2853.  
  2854.         $buffer = fread($lgsl_fp, 4096);
  2855.  
  2856.         if (!$buffer) { return FALSE; }
  2857.  
  2858.         $buffer = substr($buffer, 2); // REMOVE HEADER
  2859.  
  2860.     //---------------------------------------------------------+
  2861.  
  2862.         if ($buffer[0] == "\x1b") // CUBE 1
  2863.         {
  2864.             // RESPONSE IS XOR ENCODED FOR SOME STRANGE REASON
  2865.             for ($i=0; $i<strlen($buffer); $i++) { $buffer[$i] = chr(ord($buffer[$i]) ^ 0x61); }
  2866.  
  2867.             $server['s']['game']       = "Cube";
  2868.             $server['e']['netcode'] = ord(lgsl_cut_byte($buffer, 1));
  2869.             $server['e']['gamemode']   = ord(lgsl_cut_byte($buffer, 1));
  2870.             $server['s']['players'] = ord(lgsl_cut_byte($buffer, 1));
  2871.             $server['e']['timeleft']   = lgsl_time(ord(lgsl_cut_byte($buffer, 1)) * 60);
  2872.             $server['s']['map']     = lgsl_cut_string($buffer);
  2873.             $server['s']['name']       = lgsl_cut_string($buffer);
  2874.             $server['s']['playersmax'] = "0"; // NOT PROVIDED
  2875.  
  2876.             // DOES NOT RETURN PLAYER INFORMATION
  2877.  
  2878.             return TRUE;
  2879.         }
  2880.  
  2881.         elseif ($buffer[0] == "\x80") // ASSAULT CUBE
  2882.         {
  2883.             $server['s']['game']       = "AssaultCube";
  2884.             $server['e']['netcode'] = ord(lgsl_cut_byte($buffer, 1));
  2885.             $server['e']['version'] = lgsl_unpack(lgsl_cut_byte($buffer, 2), "S");
  2886.             $server['e']['gamemode']   = ord(lgsl_cut_byte($buffer, 1));
  2887.             $server['s']['players'] = ord(lgsl_cut_byte($buffer, 1));
  2888.             $server['e']['timeleft']   = lgsl_time(ord(lgsl_cut_byte($buffer, 1)) * 60);
  2889.             $server['s']['map']     = lgsl_cut_string($buffer);
  2890.             $server['s']['name']       = lgsl_cut_string($buffer);
  2891.             $server['s']['playersmax'] = ord(lgsl_cut_byte($buffer, 1));
  2892.         }
  2893.  
  2894.         elseif ($buffer[1] == "\x05") // CUBE 2 - SAUERBRATEN
  2895.         {
  2896.             $server['s']['game']       = "Sauerbraten";
  2897.             $server['s']['players'] = ord(lgsl_cut_byte($buffer, 1));
  2898.             $info_returned           = ord(lgsl_cut_byte($buffer, 1)); // CODED FOR 5
  2899.             $server['e']['netcode'] = ord(lgsl_cut_byte($buffer, 1));
  2900.             $server['e']['version'] = lgsl_unpack(lgsl_cut_byte($buffer, 2), "S");
  2901.             $server['e']['gamemode']   = ord(lgsl_cut_byte($buffer, 1));
  2902.             $server['e']['timeleft']   = lgsl_time(ord(lgsl_cut_byte($buffer, 1)) * 60);
  2903.             $server['s']['playersmax'] = ord(lgsl_cut_byte($buffer, 1));
  2904.             $server['s']['password']   = ord(lgsl_cut_byte($buffer, 1)); // BIT FIELD
  2905.             $server['s']['password']   = $server['s']['password'] & 4 ? "1" : "0";
  2906.             $server['s']['map']     = lgsl_cut_string($buffer);
  2907.             $server['s']['name']       = lgsl_cut_string($buffer);
  2908.         }
  2909.  
  2910.         elseif ($buffer[1] == "\x06") // BLOODFRONTIER
  2911.         {
  2912.             $server['s']['game']       = "Blood Frontier";
  2913.             $server['s']['players'] = ord(lgsl_cut_byte($buffer, 1));
  2914.             $info_returned           = ord(lgsl_cut_byte($buffer, 1)); // CODED FOR 6
  2915.             $server['e']['netcode'] = ord(lgsl_cut_byte($buffer, 1));
  2916.             $server['e']['version'] = lgsl_unpack(lgsl_cut_byte($buffer, 2), "S");
  2917.             $server['e']['gamemode']   = ord(lgsl_cut_byte($buffer, 1));
  2918.             $server['e']['mutators']   = ord(lgsl_cut_byte($buffer, 1));
  2919.             $server['e']['timeleft']   = lgsl_time(ord(lgsl_cut_byte($buffer, 1)) * 60);
  2920.             $server['s']['playersmax'] = ord(lgsl_cut_byte($buffer, 1));
  2921.             $server['s']['password']   = ord(lgsl_cut_byte($buffer, 1)); // BIT FIELD
  2922.             $server['s']['password']   = $server['s']['password'] & 4 ? "1" : "0";
  2923.             $server['s']['map']     = lgsl_cut_string($buffer);
  2924.             $server['s']['name']       = lgsl_cut_string($buffer);
  2925.         }
  2926.  
  2927.         else // UNKNOWN
  2928.         {
  2929.             return FALSE;
  2930.         }
  2931.  
  2932.     //---------------------------------------------------------+
  2933.     //  CRAZY PROTOCOL - REQUESTS MUST BE MADE FOR EACH PLAYER
  2934.     //  BOTS ARE RETURNED BUT NOT INCLUDED IN THE PLAYER TOTAL
  2935.     //  AND THERE CAN BE ID GAPS BETWEEN THE PLAYERS RETURNED
  2936.  
  2937.         if ($lgsl_need['p'] && $server['s']['players'])
  2938.         {
  2939.             $player_key = 0;
  2940.  
  2941.             for ($player_id=0; $player_id<32; $player_id++)
  2942.             {
  2943.             fwrite($lgsl_fp, "\x00\x01".chr($player_id));
  2944.  
  2945.             // READ PACKET
  2946.             $buffer = fread($lgsl_fp, 4096);
  2947.             if (!$buffer) { break; }
  2948.  
  2949.             // CHECK IF PLAYER ID IS ACTIVE
  2950.             if ($buffer[5] != "\x00")
  2951.             {
  2952.                 if ($player_key < $server['s']['players']) { continue; }
  2953.                 break;
  2954.             }
  2955.  
  2956.             // IF PREVIEW PACKET GET THE FULL PACKET THAT FOLLOWS
  2957.             if (strlen($buffer) < 15)
  2958.             {
  2959.                 $buffer = fread($lgsl_fp, 4096);
  2960.                 if (!$buffer) { break; }
  2961.             }
  2962.  
  2963.             // REMOVE HEADER
  2964.             $buffer = substr($buffer, 7);
  2965.  
  2966.             // WE CAN NOW GET THE PLAYER DETAILS
  2967.             if ($server['s']['game'] == "Blood Frontier")
  2968.             {
  2969.                 $server['p'][$player_key]['pid']       = lgsl_unpack(lgsl_cut_byte($buffer, 1), "C");
  2970.                 $server['p'][$player_key]['ping']     = lgsl_unpack(lgsl_cut_byte($buffer, 1), "C");
  2971.                 $server['p'][$player_key]['ping']     = $server['p'][$player_key]['ping'] == 128 ? lgsl_unpack(lgsl_cut_byte($buffer, 2), "S") : $server['p'][$player_key]['ping'];
  2972.                 $server['p'][$player_key]['name']     = lgsl_cut_string($buffer);
  2973.                 $server['p'][$player_key]['team']     = lgsl_cut_string($buffer);
  2974.                 $server['p'][$player_key]['score']   = lgsl_unpack(lgsl_cut_byte($buffer, 1), "c");
  2975.                 $server['p'][$player_key]['damage'] = lgsl_unpack(lgsl_cut_byte($buffer, 1), "C");
  2976.                 $server['p'][$player_key]['deaths'] = lgsl_unpack(lgsl_cut_byte($buffer, 1), "C");
  2977.                 $server['p'][$player_key]['teamkills'] = lgsl_unpack(lgsl_cut_byte($buffer, 1), "C");
  2978.                 $server['p'][$player_key]['accuracy']  = lgsl_unpack(lgsl_cut_byte($buffer, 1), "C")."%";
  2979.                 $server['p'][$player_key]['health'] = lgsl_unpack(lgsl_cut_byte($buffer, 1), "c");
  2980.                 $server['p'][$player_key]['spree']   = lgsl_unpack(lgsl_cut_byte($buffer, 1), "C");
  2981.                 $server['p'][$player_key]['weapon'] = lgsl_unpack(lgsl_cut_byte($buffer, 1), "C");
  2982.             }
  2983.             else
  2984.             {
  2985.                 $server['p'][$player_key]['pid']       = lgsl_unpack(lgsl_cut_byte($buffer, 1), "C");
  2986.                 $server['p'][$player_key]['name']     = lgsl_cut_string($buffer);
  2987.                 $server['p'][$player_key]['team']     = lgsl_cut_string($buffer);
  2988.                 $server['p'][$player_key]['score']   = lgsl_unpack(lgsl_cut_byte($buffer, 1), "c");
  2989.                 $server['p'][$player_key]['deaths'] = lgsl_unpack(lgsl_cut_byte($buffer, 1), "C");
  2990.                 $server['p'][$player_key]['teamkills'] = lgsl_unpack(lgsl_cut_byte($buffer, 1), "C");
  2991.                 $server['p'][$player_key]['accuracy']  = lgsl_unpack(lgsl_cut_byte($buffer, 1), "C")."%";
  2992.                 $server['p'][$player_key]['health'] = lgsl_unpack(lgsl_cut_byte($buffer, 1), "c");
  2993.                 $server['p'][$player_key]['armour'] = lgsl_unpack(lgsl_cut_byte($buffer, 1), "C");
  2994.                 $server['p'][$player_key]['weapon'] = lgsl_unpack(lgsl_cut_byte($buffer, 1), "C");
  2995.             }
  2996.  
  2997.             $player_key++;
  2998.             }
  2999.         }
  3000.  
  3001.     //---------------------------------------------------------+
  3002.  
  3003.         return TRUE;
  3004.     }
  3005.  
  3006. //------------------------------------------------------------------------------------------------------------+
  3007. //------------------------------------------------------------------------------------------------------------+
  3008.  
  3009.     function lgsl_query_25(&$server, &$lgsl_need, &$lgsl_fp)
  3010.     {
  3011.     //---------------------------------------------------------+
  3012.     //  REFERENCE: http://www.tribesnext.com
  3013.  
  3014.         fwrite($lgsl_fp,"\x12\x02\x21\x21\x21\x21");
  3015.  
  3016.         $buffer = fread($lgsl_fp, 4096);
  3017.  
  3018.         if (!$buffer) { return FALSE; }
  3019.  
  3020.         $buffer = substr($buffer, 6); // REMOVE HEADER
  3021.  
  3022.     //---------------------------------------------------------+
  3023.  
  3024.         $server['s']['game']       = lgsl_cut_pascal($buffer);
  3025.         $server['e']['gamemode']   = lgsl_cut_pascal($buffer);
  3026.         $server['s']['map']     = lgsl_cut_pascal($buffer);
  3027.         $server['e']['bit_flags']  = ord(lgsl_cut_byte($buffer, 1));
  3028.         $server['s']['players'] = ord(lgsl_cut_byte($buffer, 1));
  3029.         $server['s']['playersmax'] = ord(lgsl_cut_byte($buffer, 1));
  3030.         $server['e']['bots']       = ord(lgsl_cut_byte($buffer, 1));
  3031.         $server['e']['cpu']     = lgsl_unpack(lgsl_cut_byte($buffer, 2), "S");
  3032.         $server['e']['motd']       = lgsl_cut_pascal($buffer);
  3033.         $server['e']['unknown'] = lgsl_unpack(lgsl_cut_byte($buffer, 2), "S");
  3034.  
  3035.         $server['e']['dedicated']  = ($server['e']['bit_flags'] & 1)  ? "1" : "0";
  3036.         $server['s']['password']   = ($server['e']['bit_flags'] & 2)  ? "1" : "0";
  3037.         $server['e']['os']       = ($server['e']['bit_flags'] & 4)  ? "L" : "W";
  3038.         $server['e']['tournament'] = ($server['e']['bit_flags'] & 8)  ? "1" : "0";
  3039.         $server['e']['no_alias']   = ($server['e']['bit_flags'] & 16) ? "1" : "0";
  3040.  
  3041.         unset($server['e']['bit_flags']);
  3042.  
  3043.     //---------------------------------------------------------+
  3044.  
  3045.         $team_total = lgsl_cut_string($buffer, 0, "\x0A");
  3046.  
  3047.         for ($i=0; $i<$team_total; $i++)
  3048.         {
  3049.             $server['t'][$i]['name']  = lgsl_cut_string($buffer, 0, "\x09");
  3050.             $server['t'][$i]['score'] = lgsl_cut_string($buffer, 0, "\x0A");
  3051.         }
  3052.  
  3053.         $player_total = lgsl_cut_string($buffer, 0, "\x0A");
  3054.  
  3055.         for ($i=0; $i<$player_total; $i++)
  3056.         {
  3057.             lgsl_cut_byte($buffer, 1); // ? 16
  3058.             lgsl_cut_byte($buffer, 1); // ? 8 or 14 = BOT / 12 = ALIAS / 11 = NORMAL
  3059.             if (ord($buffer[0]) < 32) { lgsl_cut_byte($buffer, 1); } // ? 8 PREFIXES SOME NAMES
  3060.  
  3061.             $server['p'][$i]['name']  = lgsl_cut_string($buffer, 0, "\x11");
  3062.                                   lgsl_cut_string($buffer, 0, "\x09"); // ALWAYS BLANK
  3063.             $server['p'][$i]['team']  = lgsl_cut_string($buffer, 0, "\x09");
  3064.             $server['p'][$i]['score'] = lgsl_cut_string($buffer, 0, "\x0A");
  3065.         }
  3066.  
  3067.     //---------------------------------------------------------+
  3068.  
  3069.         return TRUE;
  3070.     }
  3071.  
  3072. //------------------------------------------------------------------------------------------------------------+
  3073. //------------------------------------------------------------------------------------------------------------+
  3074.  
  3075.     function lgsl_query_26(&$server, &$lgsl_need, &$lgsl_fp)
  3076.     {
  3077.     //---------------------------------------------------------+
  3078.     //  REFERENCE:
  3079.     //  http://hazardaaclan.com/wiki/doku.php?id=aa3_server_query
  3080.     //  http://aluigi.altervista.org/papers.htm#aa3authdec
  3081.  
  3082.         if (!function_exists('gzuncompress')) { return FALSE; } // REQUIRES http://www.php.net/zlib
  3083.  
  3084.         $packet = "\x0A\x00playerName\x06\x06\x00query\x00";
  3085.         lgsl_gs_crypt($server['b']['type'], $packet, TRUE);
  3086.         fwrite($lgsl_fp, "\x4A\x35\xFF\xFF\x02\x00\x02\x00\x01\x00{$packet}");
  3087.  
  3088.         $buffer = array();
  3089.         $packet_count = 0;
  3090.         $packet_total = 4;
  3091.  
  3092.         do
  3093.         {
  3094.             $packet_count ++;
  3095.             $packet = fread($lgsl_fp, 4096);
  3096.  
  3097.             if (!isset($packet[5])) { return FALSE; }
  3098.  
  3099.             if ($packet[5] == "\x03") // MULTI PACKET
  3100.             {
  3101.             $packet_order = ord($packet[10]);
  3102.             $packet_total = ord($packet[12]);
  3103.             $packet = substr($packet, 14);
  3104.             $buffer[$packet_order] = $packet;
  3105.             }
  3106.             elseif ($packet[5] == "\x02") // SINGLE PACKET
  3107.             {
  3108.             $buffer[0] = substr($packet, 10);
  3109.             break;
  3110.             }
  3111.             else
  3112.             {
  3113.             return FALSE;
  3114.             }
  3115.         }
  3116.         while ($packet_count < $packet_total);
  3117.  
  3118.     //---------------------------------------------------------+
  3119.  
  3120.         ksort($buffer);
  3121.  
  3122.         $buffer = implode("", $buffer);
  3123.  
  3124.         lgsl_gs_crypt($server['b']['type'], $buffer, FALSE);
  3125.  
  3126.         $buffer = @gzuncompress($buffer);
  3127.  
  3128.         if (!$buffer) { return FALSE; }
  3129.  
  3130.     //---------------------------------------------------------+
  3131.  
  3132.         $raw = array();
  3133.  
  3134.         do
  3135.         {
  3136.             $raw_name = lgsl_cut_pascal($buffer, 2);
  3137.             $raw_type = lgsl_cut_byte($buffer, 1);
  3138.  
  3139.             switch ($raw_type)
  3140.             {
  3141.             // SINGLE INTEGER
  3142.             case "\x02":
  3143.             $raw[$raw_name] = lgsl_unpack(lgsl_cut_byte($buffer, 4), "i");
  3144.             break;
  3145.  
  3146.             // ARRAY OF STRINGS
  3147.             case "\x07":
  3148.             $raw_total = lgsl_unpack(lgsl_cut_byte($buffer, 2), "S");
  3149.  
  3150.             for ($i=0; $i<$raw_total;$i++)
  3151.             {
  3152.                 $raw_value = lgsl_cut_pascal($buffer, 2);
  3153.                 if (substr($raw_value, -1) == "\x00") { $raw_value = substr($raw_value, 0, -1); } // SOME STRINGS HAVE NULLS
  3154.                 $raw[$raw_name][] = $raw_value;
  3155.             }
  3156.             break;
  3157.  
  3158.             // 01=BOOLEAN|03=SHORT INTEGER|04=DOUBLE
  3159.             // 05=CHAR|06=STRING|09=ARRAY OF INTEGERS
  3160.             default:
  3161.             break 2;
  3162.             }
  3163.         }
  3164.         while ($buffer);
  3165.  
  3166.         if (!isset($raw['attributeNames'])  || !is_array($raw['attributeNames']))  { return FALSE; }
  3167.         if (!isset($raw['attributeValues']) || !is_array($raw['attributeValues'])) { return FALSE; }
  3168.  
  3169.     //---------------------------------------------------------+
  3170.  
  3171.         foreach ($raw['attributeNames'] as $key => $field)
  3172.         {
  3173.             $field = strtolower($field);
  3174.  
  3175.             preg_match("/^player(.*)(\d+)$/U", $field, $match);
  3176.  
  3177.             if (isset($match[1]))
  3178.             {
  3179.             // IGNORE POINTLESS PLAYER FIELDS
  3180.             if ($match[1] == "mapname")      { continue; }
  3181.             if ($match[1] == "version")      { continue; }
  3182.             if ($match[1] == "servermapname")   { continue; }
  3183.             if ($match[1] == "serveripaddress") { continue; }
  3184.  
  3185.             // LGSL STANDARD ( SWAP NAME AS ITS ACTUALLY THE ACCOUNT NAME )
  3186.             if ($match[1] == "name")        { $match[1] = "username"; }
  3187.             if ($match[1] == "soldiername") { $match[1] = "name"; }
  3188.  
  3189.             $server['p'][$match[2]][$match[1]] = $raw['attributeValues'][$key];
  3190.             }
  3191.             else
  3192.             {
  3193.             if (substr($field, 0, 6) == "server") { $field = substr($field, 6); }
  3194.             $server['e'][$field] = $raw['attributeValues'][$key];
  3195.             }
  3196.         }
  3197.  
  3198.         $lgsl_conversion = array("gamename"=>"name","mapname"=>"map","playercount"=>"players","maxplayers"=>"playersmax","flagpassword"=>"password");
  3199.         foreach ($lgsl_conversion as $e => $s) { $server['s'][$s] = $server['e'][$e]; unset($server['ea'][$e]); } // LGSL STANDARD
  3200.         $server['s']['playersmax'] += intval($server['e']['maxspectators']); // ADD SPECTATOR SLOTS TO MAX PLAYERS
  3201.  
  3202.     //---------------------------------------------------------+
  3203.  
  3204.         return TRUE;
  3205.     }
  3206.  
  3207. //------------------------------------------------------------------------------------------------------------+
  3208. //------------------------------------------------------------------------------------------------------------+
  3209.  
  3210.     function lgsl_query_27(&$server, &$lgsl_need, &$lgsl_fp)
  3211.     {
  3212.     //---------------------------------------------------------+
  3213.     //  REFERENCE:
  3214.     //  http://skulltag.com/wiki/Launcher_protocol
  3215.     //  http://en.wikipedia.org/wiki/Huffman_coding
  3216.     //  http://www.greycube.com/help/lgsl_other/skulltag_huffman.txt
  3217.  
  3218.         $huffman_table = array(
  3219.         "010","110111","101110010","00100","10011011","00101","100110101","100001100","100101100","001110100","011001001","11001000","101100001","100100111","001111111","101110000","101110001","001111011",
  3220.         "11011011","101111100","100001110","110011111","101100000","001111100","0011000","001111000","10001100","100101011","100010000","101111011","100100110","100110010","0111","1111000","00010001",
  3221.         "00011010","00011000","00010101","00010000","00110111","00110110","00011100","01100101","1101001","00110100","10110011","10110100","1111011","10111100","10111010","11001001","11010101","11111110",
  3222.         "11111100","10001110","11110011","001101011","10000000","000101101","11010000","001110111","100000010","11100111","001100101","11100110","00111001","10001010","00010011","001110110","10001111",
  3223.         "000111110","11000111","11010111","11100011","000101000","001100111","11010100","000111010","10010111","100000111","000100100","001110001","11111010","100100011","11110100","000110111","001111010",
  3224.         "100010011","100110001","11101","110001011","101110110","101111110","100100010","100101001","01101","100100100","101100101","110100011","100111100","110110001","100010010","101101101","011001110",
  3225.         "011001101","11111101","100010001","100110000","110001000","110110000","0001001010","110001010","101101010","000110110","10110001","110001101","110101101","110001100","000111111","110010101",
  3226.         "111000100","11011001","110010110","110011110","000101100","001110101","101111101","1001110","0000","1000010","0001110111","0001100101","1010","11001110","0110011000","0110011001","1000011011",
  3227.         "1001100110","0011110011","0011001100","11111001","0110010001","0001010011","1000011010","0001001011","1001101001","101110111","1000001101","1000011111","1100000101","0110000000","1011011101",
  3228.         "11110101","0001111011","1101000101","1101000100","1001000010","0110000001","1011001000","100101010","1100110","111100101","1100101111","0001100111","1110000","0011111100","11111011","1100101110",
  3229.         "101110011","1001100111","1001111111","1011011100","111110001","101111010","1011010110","1001010000","1001000011","1001111110","0011111011","1000011110","1000101100","01100001","00010111",
  3230.         "1000000110","110000101","0001111010","0011001101","0110011110","110010100","111000101","0011001001","0011110010","110000001","101101111","0011111101","110110100","11100100","1011001001",
  3231.         "0011001000","0001110110","111111111","110101100","111111110","1000001011","1001011010","110000000","000111100","111110000","011000001","1001111010","111001011","011000111","1001000001",
  3232.         "1001111100","1000110111","1001101000","0110001100","1001111011","0011010101","1000101101","0011111010","0001100100","01100010","110000100","101101100","0110011111","1001011011","1000101110",
  3233.         "111100100","1000110110","0110001101","1001000000","110110101","1000001000","1000001001","1100000100","110001001","1000000111","1001111101","111001010","0011010100","1000101111","101111111",
  3234.         "0001010010","0011100000","0001100110","1000001010","0011100001","11000011","1011010111","1000001100","100011010","0110010000","100100101","1001010001","110000011");
  3235.  
  3236.     //---------------------------------------------------------+
  3237.  
  3238.         fwrite($lgsl_fp, "\x02\xB8\x49\x1A\x9C\x8B\xB5\x3F\x1E\x8F\x07");
  3239.  
  3240.         $packet = fread($lgsl_fp, 4096);
  3241.  
  3242.         if (!$packet) { return FALSE; }
  3243.  
  3244.         $packet = substr($packet, 1); // REMOVE HEADER
  3245.  
  3246.     //---------------------------------------------------------+
  3247.  
  3248.         $packet_binary = "";
  3249.  
  3250.         for ($i=0; $i<strlen($packet); $i++)
  3251.         {
  3252.             $packet_binary .= strrev(sprintf("%08b", ord($packet[$i])));
  3253.         }
  3254.  
  3255.         $buffer = "";
  3256.  
  3257.         while ($packet_binary)
  3258.         {
  3259.             foreach ($huffman_table as $ascii => $huffman_binary)
  3260.             {
  3261.                 $huffman_length = strlen($huffman_binary);
  3262.  
  3263.                 if (substr($packet_binary, 0, $huffman_length) === $huffman_binary)
  3264.                 {
  3265.                     $packet_binary = substr($packet_binary, $huffman_length);
  3266.                     $buffer .= chr($ascii);
  3267.                     continue 2;
  3268.                 }
  3269.             }
  3270.             break;
  3271.         }
  3272.  
  3273.     //---------------------------------------------------------+
  3274.  
  3275.         $response_status        = lgsl_unpack(lgsl_cut_byte($buffer, 4), "l"); if ($response_status != "5660023") { return FALSE; }
  3276.         $response_time        = lgsl_unpack(lgsl_cut_byte($buffer, 4), "l");
  3277.         $server['e']['version'] = lgsl_cut_string($buffer);
  3278.         $response_flag        = lgsl_unpack(lgsl_cut_byte($buffer, 4), "l");
  3279.  
  3280.     //---------------------------------------------------------+
  3281.  
  3282.         if ($response_flag & 0x00000001) { $server['s']['name']    = lgsl_cut_string($buffer); }
  3283.         if ($response_flag & 0x00000002) { $server['e']['wadurl']    = lgsl_cut_string($buffer); }
  3284.         if ($response_flag & 0x00000004) { $server['e']['email']      = lgsl_cut_string($buffer); }
  3285.         if ($response_flag & 0x00000008) { $server['s']['map']      = lgsl_cut_string($buffer); }
  3286.         if ($response_flag & 0x00000010) { $server['s']['playersmax'] = ord(lgsl_cut_byte($buffer, 1)); }
  3287.         if ($response_flag & 0x00000020) { $server['e']['playersmax'] = ord(lgsl_cut_byte($buffer, 1)); }
  3288.         if ($response_flag & 0x00000040)
  3289.         {
  3290.             $pwad_total = ord(lgsl_cut_byte($buffer, 1));
  3291.  
  3292.             $server['e']['pwads'] = "";
  3293.  
  3294.             for ($i=0; $i<$pwad_total; $i++)
  3295.             {
  3296.             $server['e']['pwads'] .= lgsl_cut_string($buffer)." ";
  3297.             }
  3298.         }
  3299.         if ($response_flag & 0x00000080)
  3300.         {
  3301.             $server['e']['gametype'] = ord(lgsl_cut_byte($buffer, 1));
  3302.             $server['e']['instagib'] = ord(lgsl_cut_byte($buffer, 1));
  3303.             $server['e']['buckshot'] = ord(lgsl_cut_byte($buffer, 1));
  3304.         }
  3305.         if ($response_flag & 0x00000100) { $server['s']['game']      = lgsl_cut_string($buffer); }
  3306.         if ($response_flag & 0x00000200) { $server['e']['iwad']      = lgsl_cut_string($buffer); }
  3307.         if ($response_flag & 0x00000400) { $server['s']['password']  = ord(lgsl_cut_byte($buffer, 1)); }
  3308.         if ($response_flag & 0x00000800) { $server['e']['playpassword'] = ord(lgsl_cut_byte($buffer, 1)); }
  3309.         if ($response_flag & 0x00001000) { $server['e']['skill']        = ord(lgsl_cut_byte($buffer, 1)) + 1; }
  3310.         if ($response_flag & 0x00002000) { $server['e']['botskill']  = ord(lgsl_cut_byte($buffer, 1)) + 1; }
  3311.         if ($response_flag & 0x00004000)
  3312.         {
  3313.             $server['e']['dmflags']  = lgsl_unpack(lgsl_cut_byte($buffer, 4), "l");
  3314.             $server['e']['dmflags2']    = lgsl_unpack(lgsl_cut_byte($buffer, 4), "l");
  3315.             $server['e']['compatflags'] = lgsl_unpack(lgsl_cut_byte($buffer, 4), "l");
  3316.         }
  3317.         if ($response_flag & 0x00010000)
  3318.         {
  3319.             $server['e']['fraglimit'] = lgsl_unpack(lgsl_cut_byte($buffer, 2), "s");
  3320.             $timelimit              = lgsl_unpack(lgsl_cut_byte($buffer, 2), "S");
  3321.  
  3322.             if ($timelimit) // FUTURE VERSION MAY ALWAYS RETURN THIS
  3323.             {
  3324.             $server['e']['timeleft'] = lgsl_time(lgsl_unpack(lgsl_cut_byte($buffer, 2), "S") * 60);
  3325.             }
  3326.  
  3327.             $server['e']['timelimit']  = lgsl_time($timelimit * 60);
  3328.             $server['e']['duellimit']  = lgsl_unpack(lgsl_cut_byte($buffer, 2), "s");
  3329.             $server['e']['pointlimit'] = lgsl_unpack(lgsl_cut_byte($buffer, 2), "s");
  3330.             $server['e']['winlimit']   = lgsl_unpack(lgsl_cut_byte($buffer, 2), "s");
  3331.         }
  3332.         if ($response_flag & 0x00020000) { $server['e']['teamdamage'] = lgsl_unpack(lgsl_cut_byte($buffer, 4), "f"); }
  3333.         if ($response_flag & 0x00040000) // DEPRECIATED
  3334.         {
  3335.             $server['t'][0]['score'] = lgsl_unpack(lgsl_cut_byte($buffer, 2), "s");
  3336.             $server['t'][1]['score'] = lgsl_unpack(lgsl_cut_byte($buffer, 2), "s");
  3337.         }
  3338.         if ($response_flag & 0x00080000) { $server['s']['players'] = ord(lgsl_cut_byte($buffer, 1)); }
  3339.         if ($response_flag & 0x00100000)
  3340.         {
  3341.             for ($i=0; $i<$server['s']['players']; $i++)
  3342.             {
  3343.                 $server['p'][$i]['name']      = lgsl_parse_color(lgsl_cut_string($buffer), $server['b']['type']);
  3344.                 $server['p'][$i]['score']    = lgsl_unpack(lgsl_cut_byte($buffer, 2), "s");
  3345.                 $server['p'][$i]['ping']      = lgsl_unpack(lgsl_cut_byte($buffer, 2), "S");
  3346.                 $server['p'][$i]['spectator'] = ord(lgsl_cut_byte($buffer, 1));
  3347.                 $server['p'][$i]['bot']    = ord(lgsl_cut_byte($buffer, 1));
  3348.  
  3349.                 if (($response_flag & 0x00200000) && ($response_flag & 0x00400000))
  3350.                 {
  3351.                     $server['p'][$i]['team'] = ord(lgsl_cut_byte($buffer, 1));
  3352.                 }
  3353.  
  3354.                 $server['p'][$i]['time'] = lgsl_time(ord(lgsl_cut_byte($buffer, 1)) * 60);
  3355.             }
  3356.         }
  3357.         if ($response_flag & 0x00200000)
  3358.         {
  3359.             $team_total = ord(lgsl_cut_byte($buffer, 1));
  3360.  
  3361.             if ($response_flag & 0x00400000)
  3362.             {
  3363.                 for ($i=0; $i<$team_total; $i++) { $server['t'][$i]['name'] = lgsl_cut_string($buffer); }
  3364.             }
  3365.             if ($response_flag & 0x00800000)
  3366.             {
  3367.                 for ($i=0; $i<$team_total; $i++) { $server['t'][$i]['color'] = lgsl_unpack(lgsl_cut_byte($buffer, 4), "l"); }
  3368.             }
  3369.             if ($response_flag & 0x01000000)
  3370.             {
  3371.                 for ($i=0; $i<$team_total; $i++) { $server['t'][$i]['score'] = lgsl_unpack(lgsl_cut_byte($buffer, 2), "s"); }
  3372.             }
  3373.  
  3374.             for ($i=0; $i<$server['s']['players']; $i++)
  3375.             {
  3376.                 if ($server['t'][$i]['name']) { $server['p'][$i]['team'] = $server['t'][$i]['name']; }
  3377.             }
  3378.         }
  3379.  
  3380.     //---------------------------------------------------------+
  3381.  
  3382.         return TRUE;
  3383.     }
  3384.  
  3385. //------------------------------------------------------------------------------------------------------------+
  3386. //------------------------------------------------------------------------------------------------------------+
  3387.  
  3388.     function lgsl_query_28(&$server, &$lgsl_need, &$lgsl_fp)
  3389.     {
  3390.     //---------------------------------------------------------+
  3391.     //  REFERENCE: http://doomutils.ucoz.com
  3392.  
  3393.         fwrite($lgsl_fp, "\xA3\xDB\x0B\x00"."\xFC\xFD\xFE\xFF"."\x01\x00\x00\x00"."\x21\x21\x21\x21");
  3394.  
  3395.         $buffer = fread($lgsl_fp, 4096);
  3396.  
  3397.         if (!$buffer) { return FALSE; }
  3398.  
  3399.     //---------------------------------------------------------+
  3400.  
  3401.         $response_status    = lgsl_unpack(lgsl_cut_byte($buffer, 4), "l"); if ($response_status != "5560022") { return FALSE; }
  3402.         $response_version   = lgsl_unpack(lgsl_cut_byte($buffer, 4), "l");
  3403.         $response_time      = lgsl_unpack(lgsl_cut_byte($buffer, 4), "l");
  3404.  
  3405.         $server['e']['invited']     = ord(lgsl_cut_byte($buffer, 1));
  3406.         $server['e']['version']     = lgsl_unpack(lgsl_cut_byte($buffer, 2), "S");
  3407.         $server['s']['name']        = lgsl_cut_string($buffer);
  3408.         $server['s']['players']     = ord(lgsl_cut_byte($buffer, 1));
  3409.         $server['s']['playersmax']  = ord(lgsl_cut_byte($buffer, 1));
  3410.         $server['s']['map']         = lgsl_cut_string($buffer);
  3411.  
  3412.         $pwad_total = ord(lgsl_cut_byte($buffer, 1));
  3413.  
  3414.         for ($i=0; $i<$pwad_total; $i++)
  3415.         {
  3416.             $server['e']['pwads']   .= lgsl_cut_string($buffer)." ";
  3417.             $pwad_optional           = ord(lgsl_cut_byte($buffer, 1));
  3418.             $pwad_alternative        = lgsl_cut_string($buffer);
  3419.         }
  3420.  
  3421.         $server['e']['gametype']    = ord(lgsl_cut_byte($buffer, 1));
  3422.         $server['s']['game']        = lgsl_cut_string($buffer);
  3423.         $server['e']['iwad']        = lgsl_cut_string($buffer);
  3424.         $iwad_altenative            = lgsl_cut_string($buffer);
  3425.         $server['e']['skill']       = ord(lgsl_cut_byte($buffer, 1)) + 1;
  3426.         $server['e']['wadurl']      = lgsl_cut_string($buffer);
  3427.         $server['e']['email']       = lgsl_cut_string($buffer);
  3428.         $server['e']['dmflags']     = lgsl_unpack(lgsl_cut_byte($buffer, 4), "l");
  3429.         $server['e']['dmflags2']    = lgsl_unpack(lgsl_cut_byte($buffer, 4), "l");
  3430.         $server['s']['password']    = ord(lgsl_cut_byte($buffer, 1));
  3431.         $server['e']['inviteonly']  = ord(lgsl_cut_byte($buffer, 1));
  3432.         $server['e']['players']     = ord(lgsl_cut_byte($buffer, 1));
  3433.         $server['e']['playersmax']  = ord(lgsl_cut_byte($buffer, 1));
  3434.         $server['e']['timelimit']   = lgsl_time(lgsl_unpack(lgsl_cut_byte($buffer, 2), "S") * 60);
  3435.         $server['e']['timeleft']    = lgsl_time(lgsl_unpack(lgsl_cut_byte($buffer, 2), "S") * 60);
  3436.         $server['e']['fraglimit']   = lgsl_unpack(lgsl_cut_byte($buffer, 2), "s");
  3437.         $server['e']['gravity']     = lgsl_unpack(lgsl_cut_byte($buffer, 4), "f");
  3438.         $server['e']['aircontrol']  = lgsl_unpack(lgsl_cut_byte($buffer, 4), "f");
  3439.         $server['e']['playersmin']  = ord(lgsl_cut_byte($buffer, 1));
  3440.         $server['e']['removebots']  = ord(lgsl_cut_byte($buffer, 1));
  3441.         $server['e']['voting']      = ord(lgsl_cut_byte($buffer, 1));
  3442.         $server['e']['serverinfo']  = lgsl_cut_string($buffer);
  3443.         $server['e']['startup']     = lgsl_unpack(lgsl_cut_byte($buffer, 4), "l");
  3444.  
  3445.         for ($i=0; $i<$server['s']['players']; $i++)
  3446.         {
  3447.             $server['p'][$i]['name']        = lgsl_cut_string($buffer);
  3448.             $server['p'][$i]['score']       = lgsl_unpack(lgsl_cut_byte($buffer, 2), "s");
  3449.             $server['p'][$i]['death']       = lgsl_unpack(lgsl_cut_byte($buffer, 2), "s");
  3450.             $server['p'][$i]['ping']        = lgsl_unpack(lgsl_cut_byte($buffer, 2), "S");
  3451.             $server['p'][$i]['time']        = lgsl_time(lgsl_unpack(lgsl_cut_byte($buffer, 2), "S") * 60);
  3452.             $server['p'][$i]['bot']         = ord(lgsl_cut_byte($buffer, 1));
  3453.             $server['p'][$i]['spectator']   = ord(lgsl_cut_byte($buffer, 1));
  3454.             $server['p'][$i]['team']        = ord(lgsl_cut_byte($buffer, 1));
  3455.             $server['p'][$i]['country']     = lgsl_cut_byte($buffer, 2);
  3456.         }
  3457.  
  3458.         $team_total                 = ord(lgsl_cut_byte($buffer, 1));
  3459.         $server['e']['pointlimit']  = lgsl_unpack(lgsl_cut_byte($buffer, 2), "s");
  3460.         $server['e']['teamdamage']  = lgsl_unpack(lgsl_cut_byte($buffer, 4), "f");
  3461.  
  3462.         for ($i=0; $i<$team_total; $i++) // RETURNS 4 TEAMS BUT IGNORE THOSE NOT IN USE
  3463.         {
  3464.             $server['t']['team'][$i]['name']    = lgsl_cut_string($buffer);
  3465.             $server['t']['team'][$i]['color']   = lgsl_unpack(lgsl_cut_byte($buffer, 4), "l");
  3466.             $server['t']['team'][$i]['score']   = lgsl_unpack(lgsl_cut_byte($buffer, 2), "s");
  3467.         }
  3468.  
  3469.         for ($i=0; $i<$server['s']['players']; $i++)
  3470.         {
  3471.             if ($server['t'][$i]['name']) { $server['p'][$i]['team'] = $server['t'][$i]['name']; }
  3472.         }
  3473.  
  3474.     //---------------------------------------------------------+
  3475.  
  3476.         return TRUE;
  3477.     }
  3478.  
  3479. //------------------------------------------------------------------------------------------------------------+
  3480. //------------------------------------------------------------------------------------------------------------+
  3481.  
  3482.     function lgsl_query_29(&$server, &$lgsl_need, &$lgsl_fp)
  3483.     {
  3484.     //---------------------------------------------------------+
  3485.     //  REFERENCE: http://www.cs2d.com/servers.php
  3486.  
  3487.         if ($lgsl_need['s'] || $lgsl_need['e'])
  3488.         {
  3489.             $lgsl_need['s'] = FALSE;
  3490.             $lgsl_need['e'] = FALSE;
  3491.  
  3492.             fwrite($lgsl_fp, "\x01\x00\x03\x10\x21\xFB\x01\x75\x00");
  3493.  
  3494.             $buffer = fread($lgsl_fp, 4096);
  3495.  
  3496.             if (!$buffer) { return FALSE; }
  3497.  
  3498.             $buffer = substr($buffer, 4); // REMOVE HEADER
  3499.  
  3500.             $server['e']['bit_flags']  = ord(lgsl_cut_byte($buffer, 1)) - 48;
  3501.             $server['s']['name']       = lgsl_cut_pascal($buffer);
  3502.             $server['s']['map']     = lgsl_cut_pascal($buffer);
  3503.             $server['s']['players'] = ord(lgsl_cut_byte($buffer, 1));
  3504.             $server['s']['playersmax'] = ord(lgsl_cut_byte($buffer, 1));
  3505.             $server['e']['gamemode']   = ord(lgsl_cut_byte($buffer, 1));
  3506.             $server['e']['bots']       = ord(lgsl_cut_byte($buffer, 1));
  3507.  
  3508.             $server['s']['password']        = ($server['e']['bit_flags'] & 1) ? "1" : "0";
  3509.             $server['e']['registered_only'] = ($server['e']['bit_flags'] & 2) ? "1" : "0";
  3510.             $server['e']['fog_of_war']    = ($server['e']['bit_flags'] & 4) ? "1" : "0";
  3511.             $server['e']['friendlyfire']    = ($server['e']['bit_flags'] & 8) ? "1" : "0";
  3512.         }
  3513.  
  3514.         if ($lgsl_need['p'])
  3515.         {
  3516.             $lgsl_need['p'] = FALSE;
  3517.  
  3518.             fwrite($lgsl_fp, "\x01\x00\xFB\x05");
  3519.  
  3520.             $buffer = fread($lgsl_fp, 4096);
  3521.  
  3522.             if (!$buffer) { return FALSE; }
  3523.  
  3524.             $buffer = substr($buffer, 4); // REMOVE HEADER
  3525.  
  3526.             $player_total = ord(lgsl_cut_byte($buffer, 1));
  3527.  
  3528.             for ($i=0; $i<$player_total; $i++)
  3529.             {
  3530.             $server['p'][$i]['pid'] = ord(lgsl_cut_byte($buffer, 1));
  3531.             $server['p'][$i]['name']   = lgsl_cut_pascal($buffer);
  3532.             $server['p'][$i]['team']   = ord(lgsl_cut_byte($buffer, 1));
  3533.             $server['p'][$i]['score']  = lgsl_unpack(lgsl_cut_byte($buffer, 4), "l");
  3534.             $server['p'][$i]['deaths'] = lgsl_unpack(lgsl_cut_byte($buffer, 4), "l");
  3535.             }
  3536.         }
  3537.  
  3538.     //---------------------------------------------------------+
  3539.  
  3540.         return TRUE;
  3541.     }
  3542.  
  3543. //------------------------------------------------------------------------------------------------------------+
  3544. //------------------------------------------------------------------------------------------------------------+
  3545.  
  3546.     function lgsl_query_30(&$server, &$lgsl_need, &$lgsl_fp)
  3547.     {
  3548.     //---------------------------------------------------------+
  3549.     //  REFERENCE: http://blogs.battlefield.ea.com/battlefield_bad_company/archive/2010/02/05/remote-administration-interface-for-bfbc2-pc.aspx
  3550.     //  THIS USES TCP COMMUNICATION
  3551.  
  3552.         if ($lgsl_need['s'] || $lgsl_need['e'])
  3553.         {
  3554.             fwrite($lgsl_fp, "\x00\x00\x00\x00\x1B\x00\x00\x00\x01\x00\x00\x00\x0A\x00\x00\x00serverInfo\x00");
  3555.         }
  3556.         elseif ($lgsl_need['p'])
  3557.         {
  3558.             fwrite($lgsl_fp, "\x00\x00\x00\x00\x24\x00\x00\x00\x02\x00\x00\x00\x0B\x00\x00\x00listPlayers\x00\x03\x00\x00\x00all\x00");
  3559.         }
  3560.  
  3561.     //---------------------------------------------------------+
  3562.  
  3563.         $buffer = fread($lgsl_fp, 4096);
  3564.  
  3565.         if (!$buffer) { return FALSE; }
  3566.  
  3567.         $length = lgsl_unpack(substr($buffer, 4, 4), "L");
  3568.  
  3569.         while (strlen($buffer) < $length)
  3570.         {
  3571.             $packet = fread($lgsl_fp, 4096);
  3572.  
  3573.             if ($packet) { $buffer .= $packet; } else { break; }
  3574.         }
  3575.  
  3576.     //---------------------------------------------------------+
  3577.  
  3578.         $buffer = substr($buffer, 12); // REMOVE HEADER
  3579.  
  3580.         $response_type = lgsl_cut_pascal($buffer, 4, 0, 1);
  3581.  
  3582.         if ($response_type != "OK") { return FALSE; }
  3583.  
  3584.     //---------------------------------------------------------+
  3585.  
  3586.         if ($lgsl_need['s'] || $lgsl_need['e'])
  3587.         {
  3588.             $lgsl_need['s'] = FALSE;
  3589.             $lgsl_need['e'] = FALSE;
  3590.  
  3591.             $server['s']['name']            = lgsl_cut_pascal($buffer, 4, 0, 1);
  3592.             $server['s']['players']      = lgsl_cut_pascal($buffer, 4, 0, 1);
  3593.             $server['s']['playersmax']    = lgsl_cut_pascal($buffer, 4, 0, 1);
  3594.             $server['e']['gamemode']        = lgsl_cut_pascal($buffer, 4, 0, 1);
  3595.             $server['s']['map']          = lgsl_cut_pascal($buffer, 4, 0, 1);
  3596.             $server['e']['score_attackers'] = lgsl_cut_pascal($buffer, 4, 0, 1);
  3597.             $server['e']['score_defenders'] = lgsl_cut_pascal($buffer, 4, 0, 1);
  3598.  
  3599.             // CONVERT MAP NUMBER TO DESCRIPTIVE NAME
  3600.  
  3601.             $server['e']['level'] = $server['s']['map'];
  3602.             $map_check = strtolower($server['s']['map']);
  3603.             if   (strpos($map_check, "mp_001") !== FALSE) { $server['s']['map'] = "Panama Canal";   }
  3604.             elseif (strpos($map_check, "mp_002") !== FALSE) { $server['s']['map'] = "Valparaiso";    }
  3605.             elseif (strpos($map_check, "mp_003") !== FALSE) { $server['s']['map'] = "Laguna Alta";  }
  3606.             elseif (strpos($map_check, "mp_004") !== FALSE) { $server['s']['map'] = "Isla Inocentes"; }
  3607.             elseif (strpos($map_check, "mp_005") !== FALSE) { $server['s']['map'] = "Atacama Desert"; }
  3608.             elseif (strpos($map_check, "mp_006") !== FALSE) { $server['s']['map'] = "Arica Harbor";   }
  3609.             elseif (strpos($map_check, "mp_007") !== FALSE) { $server['s']['map'] = "White Pass";    }
  3610.             elseif (strpos($map_check, "mp_008") !== FALSE) { $server['s']['map'] = "Nelson Bay";    }
  3611.             elseif (strpos($map_check, "mp_009") !== FALSE) { $server['s']['map'] = "Laguna Presa";   }
  3612.             elseif (strpos($map_check, "mp_012") !== FALSE) { $server['s']['map'] = "Port Valdez";  }
  3613.             elseif (strpos($map_check, "mp_01_elimination") !== FALSE) { $server['s']['map'] = "Bagram Hangar"; }
  3614.             elseif (strpos($map_check, "mp_01") !== FALSE) { $server['s']['map'] = "Mazar-i-Sharif Airfield";   }
  3615.             elseif (strpos($map_check, "mp_02_koth2") !== FALSE) { $server['s']['map'] = "Shah-i-Khot Village";  }
  3616.             elseif (strpos($map_check, "mp_02_koth") !== FALSE) { $server['s']['map'] = "Hindu Kush Pass";   }
  3617.             elseif (strpos($map_check, "mp_02") !== FALSE) { $server['s']['map'] = "Shah-i-Khot Mountains";  }
  3618.             elseif (strpos($map_check, "mp_03") !== FALSE) { $server['s']['map'] = "Khyber Caves"; }
  3619.             elseif (strpos($map_check, "mp_04_koth") !== FALSE) { $server['s']['map'] = "Helmand River Hill"; }
  3620.             elseif (strpos($map_check, "mp_04") !== FALSE) { $server['s']['map'] = "Helmand Valley"; }
  3621.             elseif (strpos($map_check, "mp_05") !== FALSE) { $server['s']['map'] = "Kandahar Marketplace"; }
  3622.             elseif (strpos($map_check, "mp_06") !== FALSE) { $server['s']['map'] = "Diwagal Camp";   }
  3623.             elseif (strpos($map_check, "mp_07") !== FALSE) { $server['s']['map'] = "Korengal Outpost"; }
  3624.             elseif (strpos($map_check, "mp_08") !== FALSE) { $server['s']['map'] = "Kunar Base";     }
  3625.             elseif (strpos($map_check, "mp_09") !== FALSE) { $server['s']['map'] = "Kabul City Ruins";   }
  3626.             elseif (strpos($map_check, "mp_10") !== FALSE) { $server['s']['map'] = "Garmzir Town";  }
  3627.         }
  3628.  
  3629.     //---------------------------------------------------------+
  3630.  
  3631.         elseif ($lgsl_need['p'])
  3632.         {
  3633.             $lgsl_need['p'] = FALSE;
  3634.  
  3635.             $field_total = lgsl_cut_pascal($buffer, 4, 0, 1);
  3636.             $field_list  = array();
  3637.  
  3638.             for ($i=0; $i<$field_total; $i++)
  3639.             {
  3640.                 $field_list[] = strtolower(lgsl_cut_pascal($buffer, 4, 0, 1));
  3641.             }
  3642.  
  3643.             $player_squad = array("","Alpha","Bravo","Charlie","Delta","Echo","Foxtrot","Golf","Hotel");
  3644.             $player_team  = array("","Attackers","Defenders");
  3645.             $player_total = lgsl_cut_pascal($buffer, 4, 0, 1);
  3646.  
  3647.             for ($i=0; $i<$player_total; $i++)
  3648.             {
  3649.                 foreach ($field_list as $field)
  3650.                 {
  3651.                     $value = lgsl_cut_pascal($buffer, 4, 0, 1);
  3652.  
  3653.                     switch ($field)
  3654.                     {
  3655.                         case "clantag": $server['p'][$i]['name']    = $value;                                                                               break;
  3656.                         case "name":    $server['p'][$i]['name']    = empty($server['p'][$i]['name']) ? $value : "[{$server['p'][$i]['name']}] {$value}";   break;
  3657.                         case "teamid":  $server['p'][$i]['team']    = isset($player_team[$value]) ? $player_team[$value] : $value;                      break;
  3658.                         case "squadid": $server['p'][$i]['squad']   = isset($player_squad[$value]) ? $player_squad[$value] : $value;                        break;
  3659.                         default:        $server['p'][$i][$field]    = $value;                                                                               break;
  3660.                     }
  3661.                 }
  3662.             }
  3663.         }
  3664.  
  3665.     //---------------------------------------------------------+
  3666.  
  3667.         return TRUE;
  3668.     }
  3669.  
  3670. //------------------------------------------------------------------------------------------------------------+
  3671. //------------------------------------------------------------------------------------------------------------+
  3672.  
  3673.     function lgsl_query_31(&$server, &$lgsl_need, &$lgsl_fp)
  3674.     {
  3675.     //---------------------------------------------------------+
  3676.     //  AVP 2010 ONLY ROUGHLY FOLLOWS THE SOURCE QUERY FORMAT
  3677.     //  SERVER RULES ARE ON THE END OF THE INFO RESPONSE
  3678.  
  3679.         fwrite($lgsl_fp, "\xFF\xFF\xFF\xFF\x54Source Engine Query\x00");
  3680.  
  3681.         $buffer = fread($lgsl_fp, 4096);
  3682.  
  3683.         if (!$buffer) { return FALSE; }
  3684.  
  3685.         $buffer = substr($buffer, 5); // REMOVE HEADER
  3686.  
  3687.         $server['e']['netcode']  = ord(lgsl_cut_byte($buffer, 1));
  3688.         $server['s']['name']        = lgsl_cut_string($buffer);
  3689.         $server['s']['map']      = lgsl_cut_string($buffer);
  3690.         $server['s']['game']        = lgsl_cut_string($buffer);
  3691.         $server['e']['description'] = lgsl_cut_string($buffer);
  3692.         $server['e']['appid']      = lgsl_unpack(lgsl_cut_byte($buffer, 2), "S");
  3693.         $server['s']['players']  = ord(lgsl_cut_byte($buffer, 1));
  3694.         $server['s']['playersmax']  = ord(lgsl_cut_byte($buffer, 1));
  3695.         $server['e']['bots']        = ord(lgsl_cut_byte($buffer, 1));
  3696.         $server['e']['dedicated']   = lgsl_cut_byte($buffer, 1);
  3697.         $server['e']['os']        = lgsl_cut_byte($buffer, 1);
  3698.         $server['s']['password']    = ord(lgsl_cut_byte($buffer, 1));
  3699.         $server['e']['anticheat']   = ord(lgsl_cut_byte($buffer, 1));
  3700.         $server['e']['version']  = lgsl_cut_string($buffer);
  3701.  
  3702.         $buffer = substr($buffer, 1);
  3703.         $server['e']['hostport']     = lgsl_unpack(lgsl_cut_byte($buffer, 2), "S");
  3704.         @$server['e']['friendlyfire'] = $buffer[124];
  3705.  
  3706.         // DOES NOT RETURN PLAYER INFORMATION
  3707.  
  3708.     //---------------------------------------------------------+
  3709.  
  3710.         return TRUE;
  3711.     }
  3712.  
  3713. //------------------------------------------------------------------------------------------------------------+
  3714. //------------------------------------------------------------------------------------------------------------+
  3715.  
  3716.     function lgsl_query_32(&$server, &$lgsl_need, &$lgsl_fp)
  3717.     {
  3718.     //---------------------------------------------------------+
  3719.  
  3720.         fwrite($lgsl_fp, "\x05\x00\x00\x01\x0A");
  3721.  
  3722.         $buffer = fread($lgsl_fp, 4096);
  3723.  
  3724.         if (!$buffer) { return FALSE; }
  3725.  
  3726.         $buffer = substr($buffer, 5); // REMOVE HEADER
  3727.  
  3728.         $server['s']['name']       = lgsl_cut_pascal($buffer);
  3729.         $server['s']['map']     = lgsl_cut_pascal($buffer);
  3730.         $server['s']['players'] = ord(lgsl_cut_byte($buffer, 1));
  3731.         $server['s']['playersmax'] = 0; // HELD ON MASTER
  3732.  
  3733.         // DOES NOT RETURN PLAYER INFORMATION
  3734.  
  3735.     //---------------------------------------------------------+
  3736.  
  3737.         return TRUE;
  3738.     }
  3739.  
  3740. //------------------------------------------------------------------------------------------------------------+
  3741. //------------------------------------------------------------------------------------------------------------+
  3742.     function lgsl_query_33(&$server, &$lgsl_need, &$lgsl_fp)
  3743.     {
  3744.     //---------------------------------------------------------+
  3745.     //  REFERENCE: http://blogs.battlefield.ea.com/battlefield_bad_company/archive/2010/02/05/remote-administration-interface-for-bfbc2-pc.aspx
  3746.     //  THIS USES TCP COMMUNICATION
  3747.     //  Modified for BF3
  3748.  
  3749.         if ($lgsl_need['s'] || $lgsl_need['e'])
  3750.         {
  3751.             fwrite($lgsl_fp, "\x00\x00\x00\x00\x1B\x00\x00\x00\x01\x00\x00\x00\x0A\x00\x00\x00serverInfo\x00");
  3752.         }
  3753.         elseif ($lgsl_need['p'])
  3754.         {
  3755.             fwrite($lgsl_fp, "\x00\x00\x00\x00\x24\x00\x00\x00\x02\x00\x00\x00\x0B\x00\x00\x00listPlayers\x00\x03\x00\x00\x00all\x00");
  3756.         }
  3757.  
  3758.     //---------------------------------------------------------+
  3759.  
  3760.         $buffer = fread($lgsl_fp, 4096);
  3761.  
  3762.         if (!$buffer) { return FALSE; }
  3763.  
  3764.         $buffer = substr($buffer, 12); // REMOVE HEADER
  3765.  
  3766.         $response_type = lgsl_cut_pascal($buffer, 4, 0, 1);
  3767.  
  3768.         if ($response_type != "OK") { return FALSE; }
  3769.  
  3770.     //---------------------------------------------------------+
  3771.  
  3772.         if ($lgsl_need['s'] || $lgsl_need['e'])
  3773.         {
  3774.             $lgsl_need['s'] = FALSE;
  3775.             $lgsl_need['e'] = FALSE;
  3776.  
  3777.             $server['s']['name']            = lgsl_cut_pascal($buffer, 4, 0, 1);
  3778.             $server['s']['players']      = lgsl_cut_pascal($buffer, 4, 0, 1);
  3779.             $server['s']['playersmax']    = lgsl_cut_pascal($buffer, 4, 0, 1);
  3780.             $server['e']['gamemode']        = lgsl_cut_pascal($buffer, 4, 0, 1);
  3781.             $server['s']['map']          = lgsl_cut_pascal($buffer, 4, 0, 1);
  3782.             $server['e']['score_attackers'] = lgsl_cut_pascal($buffer, 4, 0, 1);
  3783.             $server['e']['score_defenders'] = lgsl_cut_pascal($buffer, 4, 0, 1);
  3784.  
  3785.             // CONVERT MAP NUMBER TO DESCRIPTIVE NAME
  3786.  
  3787.             $server['e']['level'] = $server['s']['map'];
  3788.             $map_check = strtolower($server['s']['map']);
  3789.  
  3790.             if          (strpos($map_check, "mp_001") !== FALSE) { $server['s']['map'] = "Grand Bazaar";    }
  3791.             elseif (strpos($map_check, "mp_003") !== FALSE) { $server['s']['map'] = "Teheran Highway";  }
  3792.             elseif (strpos($map_check, "mp_007") !== FALSE) { $server['s']['map'] = "Caspian Border";   }
  3793.             elseif (strpos($map_check, "mp_011") !== FALSE) { $server['s']['map'] = "Seine Crossing";   }
  3794.             elseif (strpos($map_check, "mp_012") !== FALSE) { $server['s']['map'] = "Operation Firestorm";  }
  3795.             elseif (strpos($map_check, "mp_013") !== FALSE) { $server['s']['map'] = "Damavand Peak";    }
  3796.             elseif (strpos($map_check, "mp_017") !== FALSE) { $server['s']['map'] = "Noshahr Canals";   }
  3797.             elseif (strpos($map_check, "mp_018") !== FALSE) { $server['s']['map'] = "Kharg Island"; }
  3798.             elseif (strpos($map_check, "mp_subway") !== FALSE) { $server['s']['map'] = "Operation Metro";   }
  3799.         }
  3800.  
  3801.     //---------------------------------------------------------+
  3802.  
  3803.         elseif ($lgsl_need['p'])
  3804.         {
  3805.             $lgsl_need['p'] = FALSE;
  3806.  
  3807.             $field_total = lgsl_cut_pascal($buffer, 4, 0, 1);
  3808.             $field_list  = array();
  3809.  
  3810.             for ($i=0; $i<$field_total; $i++)
  3811.             {
  3812.             $field_list[] = strtolower(lgsl_cut_pascal($buffer, 4, 0, 1));
  3813.             }
  3814.  
  3815.             $player_squad = array("","Alpha","Bravo","Charlie","Delta","Echo","Foxtrot","Golf","Hotel");
  3816.             $player_team  = array("","Attackers","Defenders");
  3817.             $player_total = lgsl_cut_pascal($buffer, 4, 0, 1);
  3818.  
  3819.             for ($i=0; $i<$player_total; $i++)
  3820.             {
  3821.                 foreach ($field_list as $field)
  3822.                 {
  3823.                     $value = lgsl_cut_pascal($buffer, 4, 0, 1);
  3824.                     switch ($field)
  3825.                     {
  3826.                         case "clantag": $server['p'][$i]['name']  = $value;                                                                          break;
  3827.                         case "name":    $server['p'][$i]['name']  = empty($server['p'][$i]['name']) ? $value : "[{$server['p'][$i]['name']}] {$value}"; break;
  3828.                         case "teamid":  $server['p'][$i]['team']  = isset($player_team[$value]) ? $player_team[$value] : $value;                        break;
  3829.                         case "squadid": $server['p'][$i]['squad'] = isset($player_squad[$value]) ? $player_squad[$value] : $value;                    break;
  3830.                         default:        $server['p'][$i][$field]  = $value;                                                                          break;
  3831.                     }
  3832.                 }
  3833.             }
  3834.         }
  3835.  
  3836.     //---------------------------------------------------------+
  3837.  
  3838.         return TRUE;
  3839.     }
  3840.  
  3841. //------------------------------------------------------------------------------------------------------------+
  3842. //------------------------------------------------------------------------------------------------------------+
  3843.     function lgsl_query_34(&$server, &$lgsl_need, &$lgsl_fp)
  3844.     {
  3845.         require_once('MurmurQuery.php');
  3846.  
  3847.         // Set the parameters.
  3848.         // Note: port, timeout and format options are not necessary if you're going to use the default values.
  3849.         $settings       =   array
  3850.         (
  3851.             'host'      =>  $server['b']['ip'],
  3852.             'port'      =>  $server['b']['q_port'],
  3853.             'timeout'   =>  200,
  3854.             'format'    =>  'json'
  3855.         );
  3856.         // Create new instance
  3857.         $murmur = new MurmurQuery();
  3858.  
  3859.         // Load in the settings
  3860.         $murmur->setup($settings);
  3861.  
  3862.         // Query the server
  3863.         $murmur->query();
  3864.  
  3865.         if($murmur->is_online())
  3866.         {
  3867.             $status = $murmur->get_status();
  3868.             $server['s']['name']        = $status['original']['name'];
  3869.             $server['s']['playersmax']  = $status['original']['x_gtmurmur_max_users'];
  3870.             $server['s']['map']         = "murmur";
  3871.  
  3872.             // Get the users array
  3873.             $users = $murmur->get_users();
  3874.  
  3875.             // Get the channels array
  3876.             $channels = $murmur->get_channels();
  3877.  
  3878.             if(count($users) > 0)
  3879.             {
  3880.             $server['s']['players'] = count($users);
  3881.            
  3882.             $i=0;
  3883.             foreach($users as $user)
  3884.             {
  3885.                 $server['p'][$i]['name']    = $user['name'];
  3886.                 $server['p'][$i]['score']   = $user['idlesecs'];
  3887.                 $server['p'][$i]['time']    = $user['onlinesecs'];
  3888.                 $i++;
  3889.             }
  3890.             }
  3891.             // Display the original response data
  3892.     /*      echo '<pre>';
  3893.             print_r($status['original']);
  3894.             echo '</pre>'; */
  3895.             return TRUE;
  3896.         }
  3897.     }
  3898.  
  3899. //------------------------------------------------------------------------------------------------------------+
  3900. //------------------------------------------------------------------------------------------------------------+
  3901.     function lgsl_query_35(&$server, &$lgsl_need, &$lgsl_fp)
  3902.     {
  3903.         //http://www.rigsofrods.com/servers
  3904.         //RoR Servers List via Curl.
  3905.         $serverlist_url = "http://www.rigsofrods.com/servers";
  3906.         $ip = $server['b']['ip'];
  3907.         $ip = gethostbyname($ip);
  3908.         $port = $server['b']['c_port'];
  3909.         $ch = curl_init();
  3910.         curl_setopt($ch, CURLOPT_URL, $serverlist_url);
  3911.         curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)');
  3912.         curl_setopt($ch, CURLOPT_HTTPHEADER,array("Accept-Language: es-es,en"));
  3913.         curl_setopt($ch, CURLOPT_TIMEOUT, 10);
  3914.         curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
  3915.         curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  3916.             //Guardar Pagina
  3917.         $result = curl_exec($ch);
  3918.         curl_close($ch);
  3919.                 //Parser
  3920.         preg_match_all("(<tr><td style=\"vertical-align:top;\">(.*)</tr>)siU", $result, $matches);
  3921.         foreach ( $matches[1] as $servers )
  3922.         {
  3923.             if (preg_match("/$ip:$port/",$servers))
  3924.             {
  3925.                 //server name
  3926.                 preg_match_all("((.*)<br/><div style=\"font-size\:0\.8em\;margin-top\:5px\;color\:#666666\;\">)siU", $servers, $hostname);
  3927.                 $server_name = str_replace('(<span style="color:#00aa00;">ranked</span>)', "", $hostname[1][0]);
  3928.                 $server_name = str_replace('(<span style="color:#aa0000;">password</span>)', "", $server_name);
  3929.                 $server['s']['name'] = trim($server_name);
  3930.                 //players
  3931.                 preg_match_all("(</div></td><td style=\"vertical-align\:top\;\"><span style=\"color\:#......\;\">(.*)</td><td style=\"vertical-align\:top\;\">)siU", $servers, $playerscnt);
  3932.                 $pieces = explode('</span> / ', $playerscnt[1][0]);
  3933.                 $server['s']['players'] = $pieces[0];          
  3934.                 $server['s']['playersmax'] = str_replace(' <span style="color:#aa0000;">[full]</span>', "", $pieces[1]);
  3935.                 //map
  3936.                 preg_match_all("(</td><td style=\"vertical-align:top;\">(.*)</td><td style=\"vertical-align:top;\"><span style=\"color)siU", $servers, $mapname);
  3937.                 $mapstring = $mapname[1][0];
  3938.                 $mapstring = trim($mapstring);
  3939.                 $mapstring = str_replace('<span style="color:#00aa00;">'.$pieces[0].'</span> / '.$pieces[1], "", $mapstring);
  3940.                 $mapstring = str_replace('<span style="color:#aa0000;">'.$pieces[0].'</span> / '.$pieces[1], "", $mapstring);
  3941.                 $mapstring = str_replace('</td><td style="vertical-align:top;">', "", $mapstring);
  3942.                 $mapstring = str_replace('<a href="http://www.rigsofrods.com/repository/index/Search.keywords:', "", $mapstring);
  3943.                 $mapstring = str_replace('</a>', "", $mapstring);
  3944.                 $map_pieces = explode('">', $mapstring);
  3945.                 $mapstring = $map_pieces[0];
  3946.                 $mapstring = str_replace('.terrn', "", $mapstring);
  3947.                 preg_match_all("(terrn\">(.*)</a>)siU", $mapstring, $mapresult);
  3948.                 @$mapname = $mapresult[1][0];
  3949.                 if(empty($mapname))
  3950.                     $server['s']['map'] = $mapstring;
  3951.                 else
  3952.                     $server['s']['map'] = $mapname;
  3953.                 //players list
  3954.                 preg_match_all("(<td style=\"vertical-align:top;font-size:0.9em;\"><span style=\"color:#888888;\">(.*)</td>)siU", $servers, $playerslist);
  3955.                 $players_array[0] = "";
  3956.                 foreach ( $playerslist[1] as $player_row )
  3957.                 {
  3958.                     preg_match_all("(</span>(.*) <)siU", $player_row, $player_name);
  3959.                     $i = 0;
  3960.                    
  3961.                     foreach ( $player_name[1] as $player )
  3962.                     {
  3963.                         trim($player);
  3964.                         $server['p'][$i]['name'] = $player;
  3965.                         $i++;
  3966.                     }
  3967.                 }
  3968.                 return TRUE;
  3969.             }
  3970.         }
  3971.     }
  3972. //------------------------------------------------------------------------------------------------------------+
  3973. //------------------------------------------------------------------------------------------------------------+
  3974.     function lgsl_query_36(&$server, &$lgsl_need, &$lgsl_fp)
  3975.     {
  3976.         //RoR LGSL parses the log file server.log
  3977.         require_once('modules/gamemanager/home_handling_functions.php');
  3978.         require_once("modules/config_games/server_config_parser.php");
  3979.         require_once('includes/lib_remote.php');
  3980.         global $db;
  3981.         $ip = $server['b']['ip'];
  3982.         $port = $server['b']['c_port'];
  3983.         $home_info = $server_home = $db->getGameHomeByIP($ip, $port);
  3984.         $remote = new OGPRemoteLibrary($home_info['agent_ip'],$home_info['agent_port'],$home_info['encryption_key'],$home_info['timeout']);
  3985.         $server_xml = read_server_config(SERVER_CONFIG_LOCATION."/".$home_info['home_cfg_file']);
  3986.         $data = "";
  3987.         $home_id = sprintf('%09d', $home_info['home_id']);
  3988.         $screenlog = "screenlog.OGP_HOME_".$home_id;
  3989.         $home_log = $remote->remote_readfile($home_info['home_path'].'/'.$server_xml->exe_location.$screenlog,$data);
  3990.         $data = substr($data, -10000, 10000);
  3991.         if ( !empty($data) )
  3992.         {
  3993.             //Parser
  3994.             preg_match_all("(\| INFO\|(.*)\\n)siU", $data, $matches);
  3995.             $matches = array_reverse($matches);
  3996.             $rows = "";
  3997.             foreach ( $matches[1] as $info_row )
  3998.             {
  3999.             $rows .= $info_row;
  4000.             $info_row = $info_row."INFO<br>";
  4001.             if (preg_match_all("(servername:(.*)INFO)siU", $info_row, $info))
  4002.             {
  4003.                 foreach ( $info[1] as $value )
  4004.                 {
  4005.                     $value = trim($value);
  4006.                     $remote->remote_writefile($home_info['home_path'].'/servername.txt',$value);
  4007.                     $value = str_replace('_', " ", $value);
  4008.                     $server['s']['name'] = $value;
  4009.                 }
  4010.             }
  4011.             if (preg_match_all("(terrain:(.*)INFO)siU", $info_row, $info))
  4012.             {
  4013.                 foreach ( $info[1] as $value )
  4014.                 {
  4015.                     $value = trim($value);
  4016.                     $remote->remote_writefile($home_info['home_path'].'/terrain.txt',$value);
  4017.                     $server['s']['map'] = $value;
  4018.                 }
  4019.             }
  4020.             if (preg_match_all("(maxclients:(.*)INFO)siU", $info_row, $info))
  4021.             {
  4022.                 foreach ( $info[1] as $value )
  4023.                 {
  4024.                     $value = trim($value);
  4025.                     $remote->remote_writefile($home_info['home_path'].'/maxclients.txt',$value);
  4026.                     $server['s']['playersmax'] = $value;
  4027.                 }
  4028.             }
  4029.             }
  4030.             if(empty($server['s']['name']))
  4031.             {
  4032.                 $remote->remote_readfile($home_info['home_path'].'/servername.txt',$value2);
  4033.                 $value2 = trim($value2);
  4034.                 $value2 = str_replace('_', " ", $value2);
  4035.                 $server['s']['name'] = $value2;
  4036.                 $remote->remote_readfile($home_info['home_path'].'/terrain.txt',$value2);
  4037.                 $value2 = trim($value2);
  4038.                 $server['s']['map'] = $value2;
  4039.                 $remote->remote_readfile($home_info['home_path'].'/maxclients.txt',$value2);
  4040.                 $value2 = trim($value2);
  4041.                 $server['s']['playersmax'] = $value2;
  4042.             }
  4043.                     unset($matches,$info_row);
  4044.             preg_match_all("(----------(.*)\|--------)siU", $rows, $matches);
  4045.             $matches[1] = array_reverse($matches[1]);
  4046.             $info_row = str_replace('-', "", $matches[1][0]);
  4047.             if (preg_match_all("(FO\|(.*)\|.IN)siU", $info_row, $info))
  4048.             {
  4049.                 $i = 0;
  4050.                 foreach ( $info[1] as $value )
  4051.                 {
  4052.                     $value = trim($value);
  4053.                     $value = str_replace('|', "", $value);
  4054.                     $player = explode("  ", $value);
  4055.                     $playersort = array_reverse($player);
  4056.                     $playersort = explode(",", $playersort[0]);
  4057.                     $server['p'][$i]['name'] = $playersort[1];
  4058.                     $server['p'][$i]['score'] = $playersort[0];
  4059.                     $i++;
  4060.                 }
  4061.                 $server['s']['players'] = $i;
  4062.             }
  4063.             $screen_running = $remote->is_screen_running(OGP_SCREEN_TYPE_HOME,$home_info['home_id']) === 1;
  4064.             if($screen_running)
  4065.             {
  4066.                 return TRUE;
  4067.             }
  4068.         }
  4069.     }
  4070. //------------------------------------------------------------------------------------------------------------+
  4071. //------------------------------------------------------------------------------------------------------------+
  4072.     function lgsl_query_37(&$server, &$lgsl_need, &$lgsl_fp)
  4073.     {
  4074.         //Shouhcast Server Query .
  4075.         $ip = $server['b']['ip'];
  4076.         $ip = gethostbyname($ip);
  4077.         $port = $server['b']['c_port'];
  4078.         $serversumary_url = "http://$ip:$port/stats?sid=1";
  4079.         $plain_xml = file_get_contents($serversumary_url);
  4080.         $xml = ( isset( $plain_xml ) and $plain_xml != "" ) ? new SimpleXMLElement( file_get_contents($serversumary_url) ) : FALSE;
  4081.         if ( $xml )
  4082.         {
  4083.         /*  echo $xml->CURRENTLISTENERS;echo "<br>";
  4084.             echo $xml->PEAKLISTENERS;echo "<br>";
  4085.             echo $xml->MAXLISTENERS;echo "<br>";
  4086.             echo $xml->UNIQUELISTENERS;echo "<br>";
  4087.             echo $xml->AVERAGETIME;echo "<br>";
  4088.             echo $xml->SERVERGENRE;echo "<br>";
  4089.             echo $xml->SERVERURL;echo "<br>";
  4090.             echo $xml->SERVERTITLE;echo "<br>";
  4091.             echo $xml->SONGTITLE;echo "<br>";
  4092.             echo $xml->NEXTTITLE;echo "<br>";
  4093.             echo $xml->STREAMHITS;echo "<br>";
  4094.             echo $xml->STREAMSTATUS;echo "<br>";
  4095.             echo $xml->STREAMPATH;echo "<br>";
  4096.             echo $xml->BITRATE;echo "<br>";
  4097.             echo $xml->CONTENT;echo "<br>";
  4098.             echo $xml->VERSION;echo "<br>";  */
  4099.  
  4100.             $server['s']['name']        = !empty( $xml->SERVERTITLE ) ? $xml->SERVERTITLE." (".$xml->SERVERGENRE.") Next : <b>".$xml->NEXTTITLE."</b>" : "No one is broadcasting.";
  4101.             $server['s']['map']      = $xml->SONGTITLE;
  4102.             $server['s']['players']  = $xml->CURRENTLISTENERS;
  4103.             $server['s']['playersmax']  = $xml->MAXLISTENERS;
  4104.             return TRUE;
  4105.         }
  4106.     }
  4107. //------------------------------------------------------------------------------------------------------------+
  4108. //------------------------------------------------------------------------------------------------------------+
  4109.     function lgsl_query_38(&$server, &$lgsl_need, &$lgsl_fp)
  4110.     {
  4111.         //Virtualbox
  4112.         require_once('includes/lib_remote.php');
  4113.         global $db;
  4114.         $ip = $server['b']['ip'];
  4115.         $port = $server['b']['c_port'];
  4116.         $home_info = $server_home = $db->getGameHomeByIP($ip, $port);
  4117.         $remote = new OGPRemoteLibrary($home_info['agent_ip'],$home_info['agent_port'],$home_info['encryption_key'],$home_info['timeout']);
  4118.         $data = "";
  4119.         $data = $remote->exec("VBoxManage showvminfo \"".$home_info['home_name']."\"");
  4120.         if ( !empty($data) )
  4121.         {
  4122.             $settings = explode("\n", $data);
  4123.             $i = 0;
  4124.             foreach ( $settings as $setting )
  4125.             {
  4126.                 $setting = trim($setting);
  4127.                 $setting = explode(":", $setting);
  4128.                 if($setting[0] != "" and $setting[1] != "")
  4129.                 {
  4130.                     if($setting[0] == "Client name")
  4131.                     {
  4132.                         $server['p'][$i]['name'] = $setting[0];
  4133.                         $server['p'][$i]['score'] = $setting[1];
  4134.                         $i++;
  4135.                     }
  4136.                     if($setting[0] == "User name")
  4137.                     {
  4138.                         $server['p'][$i]['name'] = $setting[0];
  4139.                         $server['p'][$i]['score'] = $setting[1];
  4140.                         $i++;
  4141.                     }
  4142.                     if($setting[0] == "Client IP")
  4143.                     {
  4144.                         $server['p'][$i]['name'] = $setting[0];
  4145.                         $server['p'][$i]['score'] = $setting[1];
  4146.                         $i++;
  4147.                     }
  4148.                    
  4149.                     if($setting[0] == "Guest OS")
  4150.                     {
  4151.                         $map = trim($setting[1]);
  4152.                         $server['s']['map'] = $map;
  4153.                     }
  4154.                     if($setting[0] == "Name")
  4155.                     {
  4156.                         $map = trim($setting[1]);
  4157.                         $server['s']['name'] = $map;
  4158.                     }
  4159.                 }
  4160.             }
  4161.             $server['s']['players'] = $i;
  4162.             $server['s']['playersmax'] = $i;
  4163.         }      
  4164.         $screen_running = $remote->is_screen_running(OGP_SCREEN_TYPE_HOME,$home_info['home_id']) === 1;
  4165.         if($screen_running)
  4166.         {
  4167.             return TRUE;
  4168.         }
  4169.     }
  4170. //------------------------------------------------------------------------------------------------------------+
  4171. //------------------------------------------------------------------------------------------------------------+
  4172.     function lgsl_query_39(&$server, &$lgsl_need, &$lgsl_fp)
  4173.     {
  4174.         //IVMP
  4175.         $ip = $server['b']['ip'];
  4176.         $port = $server['b']['c_port'];
  4177.         require_once('ivmpquery.php');
  4178.  
  4179.         $q = new IVMPQuery;
  4180.  
  4181.         if(!$q->Query($ip,$port,$errno,$errstr,2))
  4182.         {
  4183.             return FALSE;
  4184.         }
  4185.         else
  4186.         {
  4187.             $server_data = $q->ServerData();
  4188.             $server['s']['players'] = $server_data['players'];
  4189.             $server['s']['playersmax'] = $server_data['maxplayers'];
  4190.             $server['s']['name'] = $server_data['hostname'];
  4191.             $server['s']['map'] = "gtaiv";
  4192.  
  4193.             $users = $q->Players();
  4194.             if( $server_data['players'] > 0)
  4195.             {
  4196.                 $i=0;
  4197.                 foreach($users as $user)
  4198.                 {
  4199.                     $server['p'][$i]['name']  = $user;
  4200.                     $i++;
  4201.                 }
  4202.             }
  4203.             if(isset($server['s']['name']) and $server['s']['name'] != "")
  4204.             $q->Close();
  4205.             return TRUE;
  4206.         }
  4207.     }
  4208. //------------------------------------------------------------------------------------------------------------+
  4209. //------------------------------------------------------------------------------------------------------------+
  4210.     function lgsl_query_40(&$server, &$lgsl_need, &$lgsl_fp)
  4211.     {
  4212.     //---------------------------------------------------------+
  4213.     //  REFERENCE: http://developer.valvesoftware.com/wiki/Server_Queries
  4214.  
  4215.         fwrite($lgsl_fp, "\xFF\xFF\xFF\xFF\x54Source Engine Query\x00");
  4216.         $buffer = fread($lgsl_fp, 4096);
  4217.         if (!$buffer) { return FALSE; }
  4218.  
  4219.         $header = lgsl_cut_byte($buffer, 4);
  4220.         if ($header != "\xFF\xFF\xFF\xFF") { return FALSE; } // SOMETHING WENT WRONG
  4221.  
  4222.         lgsl_cut_byte($buffer, 2);
  4223.         $server['s']['name']        = lgsl_cut_string($buffer);
  4224.         $players_string          = lgsl_cut_string($buffer);
  4225.         $players_string          = str_replace('Players: ','',$players_string);
  4226.         list($server['s']['players'],$server['s']['playersmax']) = explode('/',$players_string);
  4227.         $server['s']['game']        = lgsl_cut_string($buffer);
  4228.         $server['s']['map']      = str_replace(':','',lgsl_cut_string($buffer));
  4229.         lgsl_cut_byte($buffer, 5);
  4230.         $server['e']['dedicated']   = lgsl_cut_byte($buffer, 1);
  4231.         $server['e']['os']        = lgsl_cut_byte($buffer, 1);
  4232.         $server['s']['password']    = ord(lgsl_cut_byte($buffer, 1));
  4233.         lgsl_cut_byte($buffer, 1);
  4234.         $server['e']['version']  = lgsl_cut_string($buffer);
  4235.         return TRUE;
  4236.     }
  4237. //------------------------------------------------------------------------------------------------------------+
  4238. //------------------------------------------------------------------------------------------------------------+
  4239.     function lgsl_query_41(&$server, &$lgsl_need, &$lgsl_fp)
  4240.     {
  4241.         fwrite($lgsl_fp, "\xFF\xFF\xFF\xFFgetinfo xxx");
  4242.         $buffer = fread($lgsl_fp, 4096);
  4243.  
  4244.         if (!$buffer) {
  4245.             return false;
  4246.         }
  4247.  
  4248.         lgsl_cut_byte($buffer, 18);
  4249.  
  4250.         $data = explode('\\', $buffer);
  4251.  
  4252.         for ($i = 0; $i < count($data); $i += 2) {
  4253.             if ($data[$i] == 'sv_maxclients') {
  4254.                 $server['s']['playersmax'] = $data[$i + 1];
  4255.             }
  4256.  
  4257.             if ($data[$i] == 'clients') {
  4258.                 $server['s']['players'] = $data[$i + 1];
  4259.             }
  4260.  
  4261.             if ($data[$i] == 'challenge') {
  4262.                 $server['e']['challenge'] = $data[$i + 1];
  4263.             }
  4264.  
  4265.             if ($data[$i] == 'gamename') {
  4266.                 $server['e']['gamename'] = $data[$i + 1];
  4267.             }
  4268.  
  4269.             if ($data[$i] == 'protocol') {
  4270.                 $server['e']['protocol'] = $data[$i + 1];
  4271.             }
  4272.  
  4273.             if ($data[$i] == 'hostname') {
  4274.                 $server['s']['name'] = $data[$i + 1];
  4275.             }
  4276.  
  4277.             if ($data[$i] == 'gametype') {
  4278.                 $server['s']['game'] = $data[$i + 1];
  4279.             }
  4280.  
  4281.             if ($data[$i] == 'mapname') {
  4282.                 $server['s']['map'] = $data[$i + 1];
  4283.             }
  4284.  
  4285.             if ($data[$i] == 'iv') {
  4286.                 $server['e']['iv'] = $data[$i + 1];
  4287.             }
  4288.  
  4289.         }
  4290.  
  4291.         return true;
  4292.     }
  4293. //------------------------------------------------------------------------------------------------------------+
  4294. //------------------------------------------------------------------------------------------------------------+
  4295.     function lgsl_query_feed(&$server, $request, $lgsl_feed_method, $lgsl_feed_url, $home_info = False)
  4296.     {
  4297.         $lgsl_feed_error = 0;
  4298.         if(is_array($home_info) && !empty($home_info))
  4299.         {
  4300.             require_once('includes/lib_remote.php');
  4301.             $remote = new OGPRemoteLibrary($home_info['agent_ip'], $home_info['agent_port'], $home_info['encryption_key'], $home_info['timeout']);
  4302.             $http_reply = $remote->remote_query('lgsl', $server['b']['type'], $server['b']['ip'], $server['b']['c_port'], $server['b']['q_port'], $server['b']['s_port']);
  4303.             if($http_reply == NULL) exit("REMOTE LGSL: BAD RESPONSE");
  4304.         }
  4305.         else
  4306.         {
  4307.             $host = parse_url($lgsl_feed_url);
  4308.  
  4309.             if (empty($host['host']) || empty($host['path'])) { exit("LGSL FEED PROBLEM: INVALID URL"); }
  4310.  
  4311.             $host_query = "?type={$server['b']['type']}&ip={$server['b']['ip']}&c_port={$server['b']['c_port']}&q_port={$server['b']['q_port']}&s_port={$server['b']['s_port']}&request={$request}&version=5.8";
  4312.  
  4313.             if (function_exists("json_decode")) { $host_query .= function_exists("gzuncompress") ? "&format=4" : "&format=3"; }
  4314.             else                                { $host_query .= function_exists("gzuncompress") ? "&format=2" : "&format=1"; }
  4315.  
  4316.             $referrer = preg_replace("/(.*):\/\//i", "", $_SERVER['HTTP_HOST'])."/{$_SERVER['SCRIPT_NAME']}";
  4317.             $scheme = ( isset($_SERVER['HTTPS']) and get_true_boolean($_SERVER['HTTPS']) ) ? "https://" : "http://";
  4318.             $referrer = $scheme.str_replace("//", "/", $referrer);
  4319.             $referrer = empty($_SERVER['QUERY_STRING']) ? $referrer : "{$referrer}?{$_SERVER['QUERY_STRING']}";
  4320.             $destport = isset($host['port']) ? $host['port'] : ( $host['scheme'] == "https" ? "443" : "80" );
  4321.         //---------------------------------------------------------+
  4322.            
  4323.             if (function_exists('curl_init') && function_exists('curl_setopt') && function_exists('curl_exec') && $lgsl_feed_method == 1)
  4324.             {
  4325.                 $lgsl_curl = curl_init();
  4326.  
  4327.                 curl_setopt($lgsl_curl, CURLOPT_HEADER, 0);
  4328.                 curl_setopt($lgsl_curl, CURLOPT_HTTPGET, 1);
  4329.                 curl_setopt($lgsl_curl, CURLOPT_TIMEOUT, 6);
  4330.                 curl_setopt($lgsl_curl, CURLOPT_ENCODING, "");
  4331.                 curl_setopt($lgsl_curl, CURLOPT_FORBID_REUSE, 1);
  4332.                 curl_setopt($lgsl_curl, CURLOPT_FRESH_CONNECT, 1);
  4333.                 curl_setopt($lgsl_curl, CURLOPT_RETURNTRANSFER, 1);
  4334.                 curl_setopt($lgsl_curl, CURLOPT_CONNECTTIMEOUT, 6);
  4335.                 curl_setopt($lgsl_curl, CURLOPT_REFERER, $referrer);
  4336.                 if($host['scheme'] == "https")
  4337.                 {
  4338.                     curl_setopt($lgsl_curl, CURLOPT_SSL_VERIFYPEER, FALSE);
  4339.                     curl_setopt($lgsl_curl, CURLOPT_SSL_VERIFYHOST, FALSE);
  4340.                 }
  4341.                 curl_setopt($lgsl_curl, CURLOPT_URL, "$host[scheme]://{$host['host']}:$destport{$host['path']}{$host_query}");
  4342.                
  4343.                 $http_reply = curl_exec($lgsl_curl);
  4344.  
  4345.                 if (curl_error($lgsl_curl))
  4346.                 {
  4347.                     $lgsl_feed_error = 1;
  4348.                 }
  4349.  
  4350.                 curl_close($lgsl_curl);
  4351.             }
  4352.  
  4353.         //---------------------------------------------------------+
  4354.  
  4355.             elseif (function_exists('fsockopen'))
  4356.             {
  4357.                 $ssl = $host['scheme'] == "https" ? "ssl://" : "";
  4358.                 $lgsl_fp = @fsockopen($ssl.$host['host'], $destport, $errno, $errstr, 6);
  4359.  
  4360.                 if (!$lgsl_fp)
  4361.                 {
  4362.                     $lgsl_feed_error = 1;
  4363.                 }
  4364.                 else
  4365.                 {
  4366.                     stream_set_timeout($lgsl_fp, 6, 0);
  4367.                     stream_set_blocking($lgsl_fp, TRUE);
  4368.  
  4369.                     $http_send  = "GET {$host['path']}{$host_query} HTTP/1.0\r\n";
  4370.                     $http_send .= "Host: {$host['host']}\r\n";
  4371.                     $http_send .= "Referer: {$referrer}\r\n";
  4372.                     $http_send .= "Pragma: no-cache\r\n";
  4373.                     $http_send .= "Cache-Control: max-age=0\r\n";
  4374.                     $http_send .= "Accept-Encoding: \r\n";
  4375.                     $http_send .= "Accept-Language: en-us,en;q=0.5\r\n";
  4376.                     $http_send .= "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n";
  4377.                     $http_send .= "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n";
  4378.                     $http_send .= "User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.9.1.4) Gecko/20091028\r\n";
  4379.                     $http_send .= "Connection: Close\r\n\r\n";
  4380.  
  4381.                     fwrite($lgsl_fp, $http_send);
  4382.  
  4383.                     $http_reply = "";
  4384.  
  4385.                     while (!feof($lgsl_fp))
  4386.                     {
  4387.                         $http_chunk = fread($lgsl_fp, 4096);
  4388.                         if ($http_chunk === "") { break; }
  4389.                         $http_reply .= $http_chunk;
  4390.                     }
  4391.  
  4392.                     @fclose($lgsl_fp);
  4393.                 }
  4394.             }
  4395.         //---------------------------------------------------------+
  4396.  
  4397.             else
  4398.             {
  4399.                 exit("LGSL FEED PROBLEM: NO CURL OR FSOCKOPEN SUPPORT");
  4400.             }
  4401.         }
  4402.     //---------------------------------------------------------+
  4403.  
  4404.         if (!$lgsl_feed_error)
  4405.         {
  4406.             if (preg_match("/_F([1-4])_(.*)_F([1-4])_/U", $http_reply, $match))
  4407.             {
  4408.                 if   ($match[1] == 4 && $match[3] == 4) { $server = json_decode(gzuncompress(base64_decode($match[2])), TRUE); }
  4409.                 elseif ($match[1] == 3 && $match[3] == 3) { $server = json_decode(          (base64_decode($match[2])), TRUE); }
  4410.                 elseif ($match[1] == 2 && $match[3] == 2) { $server = unserialize(gzuncompress(base64_decode($match[2]))); }
  4411.                 elseif ($match[1] == 1 && $match[3] == 1) { $server = unserialize(          (base64_decode($match[2]))); }
  4412.             }
  4413.             elseif (preg_match("/_SLGSLF_(.*)_SLGSLF_/U", $http_reply, $match))
  4414.             {
  4415.                 $server = unserialize($match[1]);
  4416.             }
  4417.             else
  4418.             {
  4419.                 $lgsl_feed_error = 2;
  4420.             }
  4421.  
  4422.             if (!$lgsl_feed_error && empty($server))
  4423.             {
  4424.                 $lgsl_feed_error = 3;
  4425.             }
  4426.         }
  4427.  
  4428.     //---------------------------------------------------------+
  4429.  
  4430.         switch($lgsl_feed_error)
  4431.         {
  4432.             case 1: // CONNECTION PROBLEM - FEED MAYBE TEMPORARLY OFFLINE
  4433.             $server['s']['name'] = "---";
  4434.             $server['s']['map']  = "---";
  4435.             $server['e'] = array("feed" => "Failed To Connect");
  4436.             $server['p'] = array();
  4437.             break;
  4438.  
  4439.             case 2: // NO FEED DATA - MAYBE WRONG FEED URL
  4440.             exit("<div style='width:100%;overflow:auto'>FEED MISSING FROM: {$host['host']}{$host['path']} RETURNED: ".htmlspecialchars($http_reply, ENT_QUOTES)." :END</div>");
  4441.             break;
  4442.  
  4443.             case 3: // UNABLE TO UNPACK FEED DATA - MAYBE ERRORS ON FEED
  4444.             exit("<div style='width:100%;overflow:auto'>FEED CORRUPTION FROM: {$host['host']}{$host['path']} RETURNED: ".htmlspecialchars($http_reply, ENT_QUOTES)." :END</div>");
  4445.             break;
  4446.         }
  4447.  
  4448.     //---------------------------------------------------------+
  4449.  
  4450.         // FALSE IS SO LOCAL OFFLINE CODE TAKES OVER
  4451.         return $server['b']['status'] ? TRUE : FALSE;
  4452.     }
  4453.  
  4454. //------------------------------------------------------------------------------------------------------------+
  4455. //------------------------------------------------------------------------------------------------------------+
  4456.  
  4457.     function lgsl_parse_color($string, $type)
  4458.     {
  4459.         switch($type)
  4460.         {
  4461.             case "1":
  4462.                 $string = preg_replace("/\^x.../", "", $string);
  4463.                 $string = preg_replace("/\^./", "", $string);
  4464.  
  4465.                 $string_length = strlen($string);
  4466.                 for ($i=0; $i<$string_length; $i++)
  4467.                 {
  4468.                     $char = ord($string[$i]);
  4469.                     if ($char > 160) { $char = $char - 128; }
  4470.                     if ($char > 126) { $char = 46; }
  4471.                     if ($char == 16) { $char = 91; }
  4472.                     if ($char == 17) { $char = 93; }
  4473.                     if ($char  < 32) { $char = 46; }
  4474.                     $string[$i] = chr($char);
  4475.                 }
  4476.                 break;
  4477.  
  4478.             case "2":
  4479.                 $string = preg_replace("/\^[\x20-\x7E]/", "", $string);
  4480.                 break;
  4481.  
  4482.             case "doomskulltag":
  4483.                 $string = preg_replace("/\\x1c./", "", $string);
  4484.                 break;
  4485.  
  4486.             case "farcry":
  4487.                 $string = preg_replace("/\\$\d/", "", $string);
  4488.                 break;
  4489.  
  4490.             case "painkiller":
  4491.                 $string = preg_replace("/#./", "", $string);
  4492.                 break;
  4493.  
  4494.             case "quakeworld":
  4495.                 $string_length = strlen($string);
  4496.                 for ($i=0; $i<$string_length; $i++)
  4497.                 {
  4498.                     $char = ord($string[$i]);
  4499.                     if ($char > 141) { $char = $char - 128; }
  4500.                     if ($char < 32)  { $char = $char + 30;  }
  4501.                     $string[$i] = chr($char);
  4502.                 }
  4503.                 break;
  4504.  
  4505.             case "savage":
  4506.                 $string = preg_replace("/\^[a-z]/",   "", $string);
  4507.                 $string = preg_replace("/\^[0-9]+/",  "", $string);
  4508.                 $string = preg_replace("/lan .*\^/U", "", $string);
  4509.                 $string = preg_replace("/con .*\^/U", "", $string);
  4510.                 break;
  4511.  
  4512.             case "swat4":
  4513.                 $string = preg_replace("/\[c=......\]/Usi", "", $string);
  4514.                 break;
  4515.         }
  4516.         return $string;
  4517.     }
  4518.  
  4519. //---------------------------------------------------------+
  4520.  
  4521.     function lgsl_time($seconds)
  4522.     {
  4523.         if ($seconds === "") { return ""; }
  4524.  
  4525.         $n = $seconds < 0 ? "-" : "";
  4526.  
  4527.         $seconds = abs($seconds);
  4528.  
  4529.         $h = intval($seconds / 3600);
  4530.         $m = intval($seconds / 60  ) % 60;
  4531.         $s = intval($seconds       ) % 60;
  4532.  
  4533.         $h = str_pad($h, "2", "0", STR_PAD_LEFT);
  4534.         $m = str_pad($m, "2", "0", STR_PAD_LEFT);
  4535.         $s = str_pad($s, "2", "0", STR_PAD_LEFT);
  4536.  
  4537.         return "{$n}{$h}:{$m}:{$s}";
  4538.     }
  4539.  
  4540. //---------------------------------------------------------+
  4541.  
  4542.     function lgsl_unpack($string, $format)
  4543.     {
  4544.         list(,$string) = @unpack($format, $string);
  4545.  
  4546.         return $string;
  4547.     }
  4548.  
  4549. //---------------------------------------------------------+
  4550.  
  4551.     function lgsl_cut_byte(&$buffer, $length)
  4552.     {
  4553.         $string = substr($buffer, 0, $length);
  4554.         $buffer = substr($buffer, $length);
  4555.  
  4556.         return $string;
  4557.     }
  4558.  
  4559. //---------------------------------------------------------+
  4560.  
  4561.     function lgsl_cut_string(&$buffer, $start_byte = 0, $end_marker = "\x00")
  4562.     {
  4563.         $buffer = substr($buffer, $start_byte);
  4564.         $length = strpos($buffer, $end_marker);
  4565.  
  4566.         if ($length === FALSE) { $length = strlen($buffer); }
  4567.  
  4568.         $string = substr($buffer, 0, $length);
  4569.         $buffer = substr($buffer, $length + strlen($end_marker));
  4570.  
  4571.         return $string;
  4572.     }
  4573.  
  4574. //---------------------------------------------------------+
  4575.  
  4576.     function lgsl_cut_pascal(&$buffer, $start_byte = 1, $length_adjust = 0, $end_byte = 0)
  4577.     {
  4578.         $length = ord(substr($buffer, 0, $start_byte)) + $length_adjust;
  4579.         $string = substr($buffer, $start_byte, $length);
  4580.         $buffer = substr($buffer, $start_byte + $length + $end_byte);
  4581.  
  4582.         return $string;
  4583.     }
  4584.  
  4585. //---------------------------------------------------------+
  4586.  
  4587.     function lgsl_get_string($buffer, $start_byte = 0, $end_marker = "\x00")
  4588.     {
  4589.         $buffer = substr($buffer, $start_byte);
  4590.         $length = strpos($buffer, $end_marker);
  4591.  
  4592.         if ($length === FALSE) { $length = strlen($buffer); }
  4593.  
  4594.         $string = substr($buffer, 0, $length);
  4595.  
  4596.         return $string;
  4597.     }
  4598.  
  4599. //---------------------------------------------------------+
  4600.  
  4601.     function lgsl_gs_crypt($type, &$buffer, $encrypt = FALSE)
  4602.     {
  4603.         $master_key = pack("H*",
  4604.         "f5c5914b27235dc0dc274200ddd187c32fe02aed5fc5c079518f49208e4c5548aaef313c5d2e7c91dc580d3cd9e1aec577595325d3c5c84b44a020802becb17e".
  4605.         "7d6b6b87e8a4ebc8e4cafbaf5720f9600818b334ad2695ba0f19e1fbd48d0139f05e9059e98a15c79ebabb4f3aa8039d8720aef2bf1b4693a67a20a114b8505b".
  4606.         "693cf5b24a236503582ecdb8109a7d89a8d90d660b96435b4656ecec3fff2086e94c54988843d2aa55adefb2d47fc804c0024a7897e993b2326e8990e425f7c8".
  4607.         "38aef55f2002f22d84479f43849de260a8a2de6a7de09225c275a172729e65be687182bde68cb17b3fd77bf513c8045f0b6696d3a501b255db0632e36c0e7806".
  4608.         "c5c193b5b9a9c621f0ac9a0ee72196edbb336e7431b75eba95d02191048ab7c3874578218d79a2623e308184fdac98a1568c09b8907d8411e29c53823a3a68bc".
  4609.         "c785547ebb29401822da7fa59c6fc412cf2a9201f31336bcdffe78501058b1d7814e920ceee7aca8fa798f10f0a8ba19a1deae864e1c77f974880e5571a4380b".
  4610.         "52d3357ec8cbf8ff6ff7e8f3fa6223f923e4a7bb1918054bcd2a115e466307f39d964c051983f8b2e5db0b39332ec08c94d9b36a4594ab5e868bc888e4586687".
  4611.         "b6e62b2bb06ad0903544e379d744896f95346a0238b2b72c6d38ed1bf011185bad1910812cfe2c5b38db10433088f2e5a3746e7302467d35e8f07722fad1f7d4".
  4612.         "283fbea23fa6f50f710491b1f0a8dd3a187939e7f344de57c256ffb063791fc556d3791570a873537c3f05f8ca08aa1eb2e3f641e0fb46fde7394f8fb4c216d7".
  4613.         "55c020b405a21b8e4340136fc9583800afd87a677d3d9b6b95585ba502d6db2dec504f25b612340e29be64700682f4f012908e2672916ba83d35deb58d826d83".
  4614.         "d75a61f726876747d78df10a31f6acb36cb64dec47b7da11c7e7177dcc097965a50065e8e5f91732e20647604c00c0fa451f7ee140d93515b7b5e6f9e0c92ad0".
  4615.         "29648ab1e0ea363c5a19d12832c54c0ae67baa7e029217ede5f97cd07ebf3aaf14c020f4646e3792e2472409299868b9ee1ce7a69a30203218289523d848a2ee".
  4616.         "42b96edf05f24182491dfb048c17f815aa8983d9ab72723defbe9750cd694bc1318c92862ed7b7ab1e37472b986a7f4745224fd723e4e6ef53ff6d5f51f1b8cd".
  4617.         "34b32b9ac92968e5ec8b631aa750e7cec51e7fddca5da1cdc836c0243ab2a2f86d072479c117738fafba4d72db6fee13274d652a7c76ff962c1389b32f95f3c0".
  4618.         "04d178b71646fe084507e7dd4b4db98405cb72399f78f989c188fb2ed6e18e5aa417adae504d33ad8414f9e3a6e466837062e8ea91664f63134539679b119d6b".
  4619.         "3918f833ceddc249933b0ae83e0965b38fb86d3da02622d02f57c7282e5f0cdb18f71e7450c538ddca55588575f80754dd0c89840bcf7e246e8f041309069f15".
  4620.         "a49c27fa0a5913c72be881ae27ff6b0332701d96dc295576d2a9bc0fd266f5604da647f78d1c2ced95c4cf8a929c55bf524198898b444c67040d7c7debcc3cc9".
  4621.         "7cab1a8fe190f4db097beaccea9a34e38380b43bd2b2bf98f471c02894aaaf3944680988497aa74d293238d503a4df19d90af204fdcbb1875170a96b7f3e288c".
  4622.         "0f24e1c8b9ce4f77f2b03944c2abbacba69331a244923c38f731f368d10eca82dd503bdece016064c68cb38a4e3408712959cb5216dc42bf5365eb789c484bcc".
  4623.         "5813a1f1680fc5606e8da06bd5a68a73bd593fcd4aeb9aca06bb258f84a38dd0d4c6c0c355c4d5e0e1a97abaa11869f26285a99db4dfb8eab0b0f53e80d2486b".
  4624.         "9a6cc63affac0b830b12434ddbc1c4ef3ee46af67fcc711b88a352d2b324c0acfb35bfbe74865afd7f3293a944cd9f69230a206c5112ed9858497ddc118c0338".
  4625.         "63f1a974b033a225c74e83c9d1bec1a3e6a7b2b7ddab58aec40fe4bed9e2fd1beaded608c695dafaf4d683fdf3b9175d1283d7d99b47c40209a555c317e29bad".
  4626.         "574ac49e78ae91896b527d27f04d89b10d5f754b953d1218bf01fc06086c031ff334eab692e9c6fb221ac0f3027283ac5350d860f2d6125d31edf4b7ac806f21".
  4627.         "abeb04f84230e8c17455e54a27d6862cfb3279370eae1cdb1f84c10209e89241182c307b45a6b97520a62bc263c66f78d27b52ad9728f5d78c1626297b1d1cdd".
  4628.         "e47fd67d9f1f4846a3643810359f2cc6b22a662683836eb48f6e1605be3a830fe29f0c54412e7d82aefff9748a2fddb368dd0103161e2a17da69216e22adf6b5".
  4629.         "7ce255e400279188655820eedd5a1935aa3d8cf621fa312bab89cbb3071bfbe7e0635126de8217bd5c342f35824511769ac6b72de09b87012cd85f2cbef53e11".
  4630.         "9aba484771b15bddda183501230ae6a16fcde55a161df16f178e04478a3711437dc91eeabe92e14b44d2f49036532be42c425346df9d91288aa409a63272e061".
  4631.         "baaaca491cc04c44b2ac739290baa76d9fdc7b66733548af6411a6ba790c4962ddf033e63fab462bc0ccbfa45d45ce377d32f4c7e905cab5fbbb524f8c2907d0".
  4632.         "41b304d1f38f348efd34a7d51c118445d05353b5f0449f368450782df457ca55169bdfa817a94e1082faf4115cf3d6d890481affb2feb95145691f152485465d".
  4633.         "0f8dba4cde2079784574fadbe805222e3a132934f1a419cda032b310fd7dfa2830d3f3385d646ba0c373cba4d624a6267300014cdd2dd5e87999aa5b0e5df0a8".
  4634.         "de50f3473918474ccf82f9c8ab9f31379a9d8d00bead3bc8b9d00f4ebba9c7b0ea882454e3a785e096d7887b3a507f089dba88925df12c633241ed2f9f68905b".
  4635.         "66775d1d0ca3cc312f7be8641856be8de24248e55dd737df8410e23e9457024f534261f09ab278821b1c89da824f7f546a4163f4d53ccf07ee9bd59adb673822".
  4636.         "87092b94a7847141a796a6abf90f7bfa5d8967bfba2275283863bfc3f8283f0e5b223748a55dff04f3c6bf228bb1e0bfd2c80289abf5819e165268b4e687bcf4".
  4637.         "a33f1c42c47a6236ca14c26778ad2cbe013c20807e45276d49a4e0df7df7c42d2c73f298f61fc8e778ba953a71c6b7d1779624552df0f3896a790671a3a981fa".
  4638.         "17914d856321d0997ff4b2d05944335ceac60b63b1d827eab5ef7483990e9bd1b5453a473e1efd476ba1e093466cb21dc72e35dc12bb8c8d3bb29db420251590".
  4639.         "32441b8a7e9458cad9cdc1551ce52312bb27d858a8ae319e525b38f20242a60933b2a21bd858e147cc6ee702983c84bf535d1575a54dc46c03cdb42a39d1a64e".
  4640.         "433d9bea41f9915f7d9d462d4308baccb19bb1adc3e0125715950f7c7f8b54312826204fd512386da587bad7bf81069dc554fd8fd77153832225e56a7fa4046b".
  4641.         "d588ed258dc7e54ccf1c021f9800376376bdcfc62116555ab0e06b3161b3b7a6a7a87de2371215207c43fce54c82feddc5d444b08f6a30c0095007d526da1b02".
  4642.         "41563a9360f86ef3b824294bd174679f4dee74912acdeb00ac96a713ad86dc212a544b7420fa6c83d5dec48400e1f11f8163e20c932bc893820a8261939e0f85".
  4643.         "fdb416c6a0a18cc0182d675702a8362694f23ce686962150f862357fe84a0b572068c7e0578909d7f82c87cd17e7ef50e5566eab694ac76edb4b6d8a85cd2910".
  4644.         "0b93272b0a524a24db8db7d4622fae63d982e4090fb519e30736d5b5152d58a234919d216d0294628841cba91ed72d985ba92f7cc548378e7ddf812816ad99dd".
  4645.         "27adffdf5b6d762a79a942d8af9a8f0ac81afc98869dcdcc06835478947ced5ccbb22d02624e207c774042fa8c133221c362bef69582c52ca9c014db1ec2d351".
  4646.         "a1d72bb01c06e32ca0a4ecfe923737f0f7145b27c943a9be1f174dd46d3af58e7a2f612177affd11ae7e1b9231aadb46bcb732ee79de7e62f467721f06d8e9e5".
  4647.         "59b526bb702ddbc0f0b46a2162458c15c0154cbb1b1edad3fa198a0781279ecc5e5391269c335bc94b2f21da781cf943cd0e700206128fe1f1e3af4e70bfbaec".
  4648.         "1c7ae4884c7e7544050036b001f87fc2f10762888701c160010e7691ea2b53b646d22178ebf1a56eb9cba86ffa2b570d846e231037d403298103c61732b04113".
  4649.         "ff7ec74e0a671332f7df9da231f995c1fb53523c17c23105312b7d8ab63e5f6a0e7b9d106f3ce575d14befb3a5803aabcc9edb5f1ddf9dcabff4efbd785b169d".
  4650.         "f7fb1b991faf63f064b5fc8f2c7fcac4b35a61f19c92dec36a6aadf02dc3942dde51d7225aefeaf6b7527183c2adc832c6bc8735bc7be2c18ad3d70653f91581".
  4651.         "ce42a275ef6715932ae7513d0ecb726be54c167cc89445a08cb8e12fc583aee815b3947bd1ac781fcbfbdda25fe3e931a21c47058197ceffbe9bd2ac6394b2d5".
  4652.         "95c3e10076c3aceba33b1556029edfbc04849e0d66713f7beeb1517dcd43279a5073ec9fa221bfaceef0f639e771a44156778cbb696af28e2437eea3fc025d27".
  4653.         "70b1409d978e4ec808c58288d525ac977db0ace80d9554925bf8767b8e91a9bf1ed25deabdbb93315ca08f711ae3f768a911eeacd93bfa6db3957da83c0fd945".
  4654.         "a7e596b66530aa7347e04590fd31db6b49485a9ea8208c0aab4068f482b185aaed6ee69e32f9ff7b882763da34f6e3bce94c79353ef6849d47e6345d8727e076".
  4655.         "f1aa0133c2399e4d777525fe9aa29e75d23df6e829f9058580413d5c24f85568beb1343430f393adee28ab54e220b4c884fa6ebc2825705f863ba7d82977f653".
  4656.         "edb2088abd84ad52a1810a52abc6e7c3b5687f3bf4744941ce48c876205f2497b641e6e4bb565ab816425c348e1f034104efda9a21723b00cdadc6ed2af6b225".
  4657.         "524ae512afba6bc19c471e14bbba042dba641424005a816f25aee44ee84cf2f729b79b1b9d58218f0274d92168c9bb1cd1c141b5f8341a3a4dc78c0ddf08dfd4".
  4658.         "110b4eb0b71b265fe70aa5a4b2186cafad5ff94dafd5b4b4560bac45cb47c4c863274ac2d84af46b75bfde496d39984ff0af8ab7d98bc12c02ce782b23268d03".
  4659.         "864826b0201d8d1e0c09c9ab229a2f7fe1504795bafa8b8ae13fb046a2f35233a49b772b57862ada835951742439693ed9f3a080aea7a1309de4ae04b1ce3d78".
  4660.         "72cdd85a3544906afaf55aff8255bdb2367c7ecf184c91c8f4c60a1301b80f8bb9f0ff6d80ac6e1c9d6c9fafbc65199790e0a9c323e68b105f5c56eed2f60294".
  4661.         "5ab59d79698829ba092cc97f37dd023595d3fa014e718cda23d6bdbbfd70c2c6cc1b9121d22eae0bde7b94277dc8e5e096d60351f2740ddb986c7e10e0af8a40".
  4662.         "e9bd526f863cde028dd253e18013d3c76c2006a9ab9ec3e7b6b1aca865b2ace8c8debb50ae1efbc0e49dd69f128c28bd02d79f22717e2679d5142540733cb278".
  4663.         "0969944106122d5f2baf97f7e09ef67b894cd191411126ad962e4b9c5a0bbe83215563662ce5f063ce2a76c2e09613539fbb094d389e739ca0a3fc34bd1692ba".
  4664.         "f0601e2122a70fdf68ede6c431090896622362c59801000727718f4b551f32340fc5f740e15fc0a023791aa57a6cc97af3077f5d71d33cbc864049b30cb11ea5".
  4665.         "23c15141ea5ac620aec5f81e6661bf8f01a3c817ac1ab592570b63764402e4934d776df03cadae448c5d9082c30c00737e4bbe5c184a1167507d9b99bdd05592".
  4666.         "456ac25dadb5beafe282028611db969c44db7bfb2cad349c0ecbebc281a00ad4f70cfd889b3533833ab845f86403e6a1970da6b5c8b8e82e9f42a82c7c14e535".
  4667.         "16b3d9efbaae6ca6b9c93977f17f58ec29a1a8bb188fb15f377bf50d37e84781ca1716052f657a361cbe44eb227002a57390873e54b8695f76fe0f84f873e021".
  4668.         "c92945f3d7b54861be3c237701c140c3a4e1b84fa4bab910cd265393e0172293d6fc40fa1872e175d7d3f06153a9eca3f8db85c2166f68415eda3bf4aee35adc".
  4669.         "0231cd6cfe5d3a23b51fb0105176b9cdadc28304d27fef698cf4155235d07ecfaf5a2c5f8610a63ee809b0e0260251c33873dceebdda1ec3725d1376031e45cc".
  4670.         "731a870b39edc97b549b96624c891984acf7a422584bc56f2104256f15da552d0a8376a546b6966153728ca1f38514df0d458375e99bc01fa498b07abb33803f".
  4671.         "da07c4149e6e5773f9ec65ac3c87ca7c515f263de3cda2d53edbc20c47486ee33f9810c8226bbc9c52fcadb1f01fe28bf099b8afb9f1798e0b9815210c559187".
  4672.         "c562b5e45350a5d0708c2fb96bad405ef4b8b535066ed02da198e4a3a4eaf075450c87f6d9840c8e00b8e316bcc7a5c6113fefbd72b0c7f6860fcecc8a3f33fb".
  4673.         "a2999e4f3f3e3da5d7bfcf5d22a93f4d16ae6dd053685dfc7223628f92086735d09551bd29e8d0f537d06f33536fce8360d7443f583e9079685efce0347c1ffa".
  4674.         "fedd0b7d1125f0dfc9bb21460079f286abbbeb549bb744aeea0b7a6bc66a272c8af945621b57b8380d40fa067c3060b9d44b79bd4333ec96d47632124a9aad0a".
  4675.         "2df287eda9312f70f12f544fd7bdef9e6cc5e110effb8dbdebb821571f0fa95301db9da0bb60b77af6d5b7de00ca26039f1dda92f7a777c75d02fc340f1b81b5".
  4676.         "e7c5efc6aaa6ffe3b77db348b7a5973a9465cb1e01841fa10f398318bfb73a4f8f53a4bded656f35db0ef00685826d8eac3aa0941623b3401ffdaba927bc91f4".
  4677.         "808818548a60f653e9f340f79e40d666525923c4847ac3c0a9b36f3069620b0aea677ee7afa2c333987d9a5afade1b0e1e22ef7470228b07c9f482a6c343a37c".
  4678.         "462a749c02d4cc86447cc16c3c68955afa80e63a3a41aaa1375c7ca0cffa0335e96e599e1b6841ae5693b5fa6ff437c3c1dca20075b7a58aafa81845af0aa8f6".
  4679.         "30520d89a362d667447045c2b39f88f573f6b76b95ea4a98950ad797570b841975e9841306223dbefd21a4f092d69452c4539c664e27e110622ae7a7db5073d6".
  4680.         "17eb023b36f28a13eeeebdbd964df63dcb18762950b6bd3eeead2a25b9bba48060ac8b82af3f41ecafbb7134140ca8cc687b92eded8bdabd9567e50950ed617a".
  4681.         "a114d3db8648f9ab48a622456aec56fe79cfa6225fc7fd3fb0607f9dbc1bd861b316600fc10163fe8098ea685bc3fe06435f51cb1ce7ffebae67b3114fadf8c8".
  4682.         "808a4044bb06638d05bc9a73c44c5b1eb7c83cdb4bde51ffa85413a97fbd534ddb17dc899fc4e2ced6ed81eeb117b4c77f9ecd03251367649a5649ec58567907".
  4683.         "4fc8c2702dc42a58308f4023fb2cd30c79ecb9a952cde77dfcf92d8ef234811c327112abd568c49d4bf693f611d07e433fcd0a396530c6a279eb3ba567d780b7".
  4684.         "271b6bfc7f1683a6b9159e143788662e8c5f73dd25ab623633efe781edd647b32003c9f3eaf236d968244e4561bc855848b839bfb93af2ea3e230a30089230c4".
  4685.         "2e593ed3b9be53d677a7c9da744ee1961aaccac237f9e0bc1f886a92d5f335c6c0b0250ea76fbdcd85ae9cf6afe7ab25fd6b4753be6505b986757b003b94a089".
  4686.         "d6a42b1fb24d2249ec917bb0ad50c8bd31265f82071a0816c3f8985edf0311205f83eaf8ff5587a3c7c24938a3f0cf9ff438b567d71407a51292e6d7e3f939e6".
  4687.         "cdbecd49e913793f73cb964406934907ca4d48f44bec301bdf0110986757fcac6c2cca84eb7c5fad1662d1a833d24fa356771d6b772759a4837d9872d23ff1ab".
  4688.         "219597aadc062f317d6cbc044bf65dc5ddda95ddc34d68584b7db991c8441a43e0511f71b88dda141f36b7cb326650c3244b989f1b992d2baa318e2a76dd1c34".
  4689.         "a946c843255f65c6896eac3a6774ceff50b6f66b752672f5ce8dc84149ba6b227da844254d01bf470f6c987e8b5df2168414bcee11ad8c131d16e43addbdd493".
  4690.         "595117f4f211c5d6460ee1be41e72b42c21252ce6dcd9838e53b0e1fd8d1864c2d3d219b82d42d0446865848431658732a78f0d9348f8044fa7f576d11562d25".
  4691.         "d7b681f714c4b43532543d27069a21d1d152e646c56d75229bb198f87676108306e68fa49751f3b1d678bbf1ea38b2e0712d896882b5ea1494136f23a7e1d528".
  4692.         "ca456c6c2a2cfc8cb6b6e7e6526aaa1da082653492b624936213569892706d8f9c6496b1193ec5a4294e3c1da14b25c24337cf9bb3490ea3f8a54e0a5b9f77af".
  4693.         "fc70fe8dcb7687a9f45c7ae3ee8f2a94fa58e6c920cce1f447fd60526fa71b6f1048a3dcc7680e3b20ac66d78290bfc3878e72d4876e014036b0b80b6be4bf2e".
  4694.         "a358125bea811b51af76a0077b3a615750a9ca3368d1d17e060a0d37bfd3b13c91412ca83298b06aea3048607f718c04667dcfc7faa4ac5a594be1c1551140ba".
  4695.         "9c1ea7cebc074b1fbd338eef831fa3eb1f39088bcf1cf13bf706b1d287e12b165f4fb3e6c4586067c5e2f461c4cc86400b456428e8767c1b57a7bc3e64a8abe6".
  4696.         "d253646f8796763b2a33de35c6f1667d06f30bb12c0fd0e28e4859ebdc2f96236af4a895d9a7d6fb90cbb60084db28a0c628faf7653c316ec69b5c5103aea495".
  4697.         "792efd58ec42bc950f8608d5fa6834aab7bd2aaece33b3e16756f518a5410e8957dd534437e8c152451d86beb20124e8fb9e672d13fb7e98e153c124fdb2eaf7".
  4698.         "f94a23efffeea25ec31f821e492d9de00a6d056c67e565f734f864d425035bb13620b7a1f44ec02ab7a6b1c4a38511b6902cfcf199d3918eb07da11d634add44".
  4699.         "0860d123fa2b8003f87270777c6415e32f1b34dd6e1e22df3a78684e1169fce84b61cf461544f4e891fcd9d1f5a1e5fef148aeddbfcc922f5d7bfd3bd2480e8a".
  4700.         "3318c75ce0afc24ca179fc0e832ab64368c174407bf2cd45a72cd5c9e7dd0b9def7500cec54d4d692938a1bb18289189d4b2445640d8abc9a0b70c3ffc8ba3c8".
  4701.         "d483119a4f63851a57cf30f48c88616785a5ee00cb9221db45dd8dff118ca33bb4ae254937891f2c971edc8614fa3fc43e56f297a44a234fb1737f23d44a15f0".
  4702.         "6a9e364fe1daa8e28bf72927526296202713f76dc8342e3843483b479ff793697b11a934bdc206905dd020e2f321cf8d65c245a8e7c4275f87301211800f0751".
  4703.         "4e9cb59b88540f5441e6b09b4b73112d855ba0dffd4affd670c4f76ec11ac07a6cc2201ac65c83b3b3e4dc10d991ef4424cd001d34f0393dc262957df641469a".
  4704.         "e00f74c527f8c99f50432c5ff4c4260ec6998b7ef2a0223290762126542d8aa89bfd241ac59e3a9a6c6f13afc9d69a771d124d16359525e4b374605b699e32bd".
  4705.         "fb393d9397767bce32ab2d5557d05c33fa54183b0d5facc73a097441aa34abf7d6ac36fb35d6be7f19d0c26c7ad564c06f8a4f616ff4819c53e8b29e782b8791".
  4706.         "c4039e5d049bd36819ae6d01a113eae6260e25150b935ee364011558dea97e1ee0e7f2938b7368ad9a5a86bae4f89a9ffbd06638566a785cb6ad3982b133ce6a".
  4707.         "3edb13aa2c4ad4db7052ac646fcf336b375efb6a360d448862f2b711db3d8e657a706c14013664beae06b1a067fd078b0a8800c01dd610d583bee4fa4634e4f3".
  4708.         "5251372b8144a7194ed60dc2539283ce909e7d65338a9050b09b66b647f30b6d595d7e03d9a77029afce140df7717f64949ae1362f94602dc2e70840e3117ab1".
  4709.         "a26cc8e8ffd068ec225f0b75b2de63e3511f4485c87fb0087e4421675f3754bc4bc9c0a38db6392661e8a59802d83f887cf81aa99ed13a10b4b8a176144f76ce".
  4710.         "3a192cc77b09e3f8a087db488f3d304d048623f46a031ba9251896cd08ff601dd0b933f5110b4cc9d943b5705b2435fa1c0adaad6c3aed88022f57cc3d71048f".
  4711.         "9d5f420cfaf737b8a9f2434601b296b14384618fa9b76e6acbf1b55ad7130f582f36920a5aff71e15d120b11d6e0dd374554803538f3b12305512cf24322ed52".
  4712.         "cd7ce5f409efd2f2752684bc326bf4548fa17169028c819ba342ee672682860a6de09752f509caad897484160895dc712b70bd05d588fe218fd85718b9b833ff".
  4713.         "2c18e2566416ce1e52c3d7dc696cca1ad02b9b99e2953f92d8fe7ac0e4d75bd2ae2834b9ad8e87f179cdaf5e75609abdf1236787fe366347c32991f20c7faf41".
  4714.         "b65da4ed5edc3cab1134a4ee0a3b565cab7c6dcd6f93feb528ddf0a1e992f6ad4814e51d338433dc5b52fddd8e780a312d12c80c4dbdaf8818b1c84883d8be41".
  4715.         "186de5fdeeb9c7b7542a8429e53645a313cd8c9a53c3790b9fcf0143421da3bb586762790c91b0110f68b5fd111338560437d7d77457fb5587efb40a90ed1c02".
  4716.         "838ba4e83b0c6adb175d94b6e14767a4f4a127e80f79be7741f4dc446c520176fd5b0412cc4d7a8f3d293e438d50e4e79e52bbc2c3bc6707d97b6289f1b39733".
  4717.         "48c9351b66be55b2152bee9b76c42dc057d12134180488f45aee9491fe72f8634e3beeda8006869a829d2d58614150ab489dca7af268c09dde668cc20428ff88".
  4718.         "366a3c0119446bdba29c39b0723fcd639393d397d138ab241c187beac647d8f73e5e42b3468e3958e0e73908c081ce0b6c894f0409f3bd321807a1633860a8e7".
  4719.         "49cb4a10875a65b3f0a073f48f141747c88afe9039ef0795752dbd07ef51a2dadb40bb09bb9d4fcb328f68af28f8d76085fccaef4afe848a93c4cac43f55863a".
  4720.         "21b540e6d408eb55fdfbd2a0c13fbae6fdf68e51423737f6966105d1ed57570bb521adb9576b06988d7d5a6445fe77d177076d47ca45b437a9780b376d49689e".
  4721.         "6b0be983d90f46dbf935e14b53f3bf7ac7aec7fc1b92c14f161e59ae2620f7552206f22a365c91476943b8b51e920661efc19d040070407ba1cf011d3a0e072e".
  4722.         "68d10e064619aa2184d7e848729b254af6b83db15fca2134d0d54efc761fff25c1169d608ed2434de8ae3cafb8c3af0b5b23a16183b5ead5dc5d175c955f4db5".
  4723.         "454623d611244c462776118992ba03e8e20e6e1d9d6101d2286d7e040d5a56f22d6e3ae86bd6a0605c8b34d7a385fee5f3c9b6d0cf550f7aa67f338d8a014dfd".
  4724.         "639cade855e8d25df73ea01bc5635bb5e032269b2a10f6b2baea7c4a88ede42caf91d7c9d3b2802608fdc361e23ee8cdcc1c954da86f929e9721130ef6d74e99".
  4725.         "180f8c8c2263b41f538e105bc5f411f8dd1c2d3e0dc4540ff9cbdb9a6c44524ebcdfe37d9427a43dc24fd28c2fc25baef96490ae847b435ef4eea87db030829d".
  4726.         "06b4c5d9271c8ffda114c336f5d82f9e6ca0d140112f364b1613cfe84c6e924629cba51a7d21f92ce26802bda0651340a8aad0c1ef439acc5552634304321cf6".
  4727.         "02851751630d671a8cce7028f1cc6fdbce64f762c8ed522c2a81c2886986999a85d41a87d2ba5281dcbc2dbd728559470017e12fd70a97a771de499d2953c49b".
  4728.         "0e60abac5ced203dd26bb75df922938723b1341bb07b0250d7af1bf91788994f8ed193221dd829e6665b114763e490fd8482955b097ac3b5b124bf92ae8ce902".
  4729.         "1897b67db820cbfd646fe2c61e63baa972651a47bb1aae56f5e623a1167beff84166ea78cc9854b21a9478ebf3a1429226213c20a7a9ce8031eced508b937263".
  4730.         "1357591069d5c482c0f6f99e4a6084f34fdab7b26399b4efcb0e5217e4e9115d0f6011bcfe55e0f05d3d8850febab0a6100bab8142a3913662a568f9d32367bf".
  4731.         "5db46b6572cb76bd6a49d84bd567e1f834bbd705dd395c1609e9eba7fe8b9c59f1c4cb2561461204805c25a384140314e515f84050949529050279393884f8d0");
  4732.  
  4733.         if ($type == "aarmy3") { $game_key = "c6mw4it2kg7sz5o0813d9qyufenhj\x00"; } else { exit("UNKNOWN GAME CRYPT KEY"); }
  4734.  
  4735.         $buffer_length   = strlen($buffer);
  4736.         $game_key_length = strlen($game_key);
  4737.  
  4738.         if ($encrypt == TRUE)
  4739.         {
  4740.             for ($i=1; $i<$buffer_length; $i++) { $buffer[$i] = chr(ord($buffer[$i]) ^ ord($buffer[$i-1])); }
  4741.             for ($i=0; $i<$buffer_length; $i++) { $buffer[$i] = chr(ord($buffer[$i]) ^ ord($game_key[($i%128) % $game_key_length]) ^ ord($master_key[$i%128]) ^ ord($master_key[$i])); }
  4742.         }
  4743.         else
  4744.         {
  4745.             for ($i=0; $i<$buffer_length; $i++) { $buffer[$i] = chr(ord($buffer[$i]) ^ ord($master_key[$i]) ^ ord($master_key[$i%128]) ^ ord($game_key[($i%128) % $game_key_length])); }
  4746.             for ($i=$buffer_length; $i>0; $i--) { $buffer[$i] = chr(ord($buffer[$i]) ^ ord($buffer[$i-1])); }
  4747.         }
  4748.     }
  4749.  
  4750. //------------------------------------------------------------------------------------------------------------+
  4751. //--------- PLEASE MAKE A DONATION OR SIGN THE GUESTBOOK AT GREYCUBE.COM IF YOU REMOVE THIS CREDIT -----------+
  4752.  
  4753.     function lgsl_version()
  4754.     {
  4755.         return "LGSL 5.8 Beta 21 By Richard Perry";
  4756.     }
  4757.  
  4758. //------------------------------------------------------------------------------------------------------------+
  4759. //------------------------------------------------------------------------------------------------------------+
  4760.  
  4761. } // END OF DOUBLE LOAD PROTECTION
  4762.  
  4763. //------------------------------------------------------------------------------------------------------------+
  4764. //------------------------------------------------------------------------------------------------------------+
  4765.  
  4766. ?>
Add Comment
Please, Sign In to add comment