PageRenderTime 47ms CodeModel.GetById 13ms RepoModel.GetById 0ms app.codeStats 1ms

/vendors/lgsl/lgsl_protocol.php

http://skygames.googlecode.com/
PHP | 2655 lines | 1634 code | 553 blank | 468 comment | 397 complexity | 4150729481f5f70aaf0a80966085fd19 MD5 | raw file
Possible License(s): GPL-2.0, LGPL-2.1, CC-BY-SA-3.0
  1. <?php
  2. /*----------------------------------------------------------------------------------------------------------\
  3. | |
  4. | [ LIVE GAME SERVER LIST ] [ Š RICHARD PERRY FROM GREYCUBE.COM ] |
  5. | |
  6. | Released under the terms and conditions of the GNU General Public License Version 3 (http://gnu.org) |
  7. | |
  8. |-------------------------------------------------------------------------------------------------------------
  9. | [ EDITOR STYLE SETTINGS: LUCIDA CONSOLE, SIZE 10, TAB = 2 SPACES, BOLD GLOBALLY TURNED OFF ] |
  10. \-----------------------------------------------------------------------------------------------------------*/
  11. //------------------------------------------------------------------------------------------------------------+
  12. //------------------------------------------------------------------------------------------------------------+
  13. if (!function_exists('lgsl_type_list')) {
  14. function lgsl_type_list()
  15. {
  16. $lgsl_type_list = array("aarmy" => "Americas Army",
  17. "arma" => "ArmA: Armed Assault",
  18. "avp2" => "Aliens VS. Predator 2",
  19. "bfvietnam" => "Battlefield Vietnam",
  20. "bf1942" => "Battlefield 1942",
  21. "bf2" => "Battlefield 2",
  22. "bf2142" => "Battlefield 2142",
  23. "callofduty" => "Call Of Duty",
  24. "callofdutyuo" => "Call Of Duty: United Offensive",
  25. "callofduty2" => "Call Of Duty 2",
  26. "callofduty4" => "Call Of Duty 4",
  27. "cncrenegade" => "Command and Conquer: Renegade",
  28. "crysis" => "Crysis",
  29. "doom3" => "Doom 3",
  30. "dh2005" => "Deer Hunter 2005",
  31. "farcry" => "Far Cry",
  32. "fear" => "F.E.A.R.",
  33. "flashpoint" => "Operation Flashpoint",
  34. "freelancer" => "Freelancer",
  35. "frontlines" => "Frontlines: Fuel Of War",
  36. "ghostrecon" => "Ghost Recon",
  37. "graw" => "Ghost Recon: Advanced Warfighter",
  38. "graw2" => "Ghost Recon: Advanced Warfighter 2",
  39. "gtr2" => "GTR 2",
  40. "had2" => "Hidden and Dangerous 2",
  41. "halflife" => "Half-Life 1 ( Steam )",
  42. "halflifewon" => "Half-Life 1 ( WON )",
  43. "halo" => "Halo",
  44. "il2" => "IL-2 Sturmovik",
  45. "jediknight2" => "JediKnight 2",
  46. "mohaa" => "Medal of Honor: Allied Assault",
  47. "mohaab" => "Medal of Honor: Allied Assault Breakthrough",
  48. "mohaas" => "Medal of Honor: Allied Assault Spearhead",
  49. "mohpa" => "Medal of Honor: Pacific Assault",
  50. "mta" => "Multi Theft Auto",
  51. "nascar2004" => "Nascar Thunder 2004",
  52. "neverwinter" => "NeverWinter Nights",
  53. "neverwinter2" => "NeverWinter Nights 2",
  54. "painkiller" => "PainKiller",
  55. "quakeworld" => "Quake World",
  56. "quakewars" => "Enemy Territory: Quake Wars",
  57. "quake2" => "Quake 2",
  58. "quake3" => "Quake 3",
  59. "quake4" => "Quake 4",
  60. "ravenshield" => "Raven Shield",
  61. "rfactor" => "RFactor",
  62. "samp" => "San Andreas Multiplayer",
  63. "savage" => "Savage",
  64. "savage2" => "Savage 2",
  65. "serioussam" => "Serious Sam",
  66. "serioussam2" => "Serious Sam 2",
  67. "sof2" => "Soldier of Fortune 2",
  68. "soldat" => "Soldat",
  69. "source" => "Source ( Half-Life 2 )",
  70. "stalker" => "S.T.A.L.K.E.R.",
  71. "startrekef" => "StarTrek Elite-Force",
  72. "swat4" => "SWAT 4",
  73. "test" => "Test ( For PHP Developers )",
  74. "ut" => "Unreal Tournament",
  75. "ut2003" => "Unreal Tournament 2003",
  76. "ut2004" => "Unreal Tournament 2004",
  77. "ut3" => "Unreal Tournament 3",
  78. "vietcong" => "Vietcong",
  79. "vietcong2" => "Vietcong 2",
  80. "warsow" => "Warsow",
  81. "wolfenstein" => "Wolfenstein");
  82. return $lgsl_type_list;
  83. }}
  84. //------------------------------------------------------------------------------------------------------------+
  85. //------------------------------------------------------------------------------------------------------------+
  86. if (!function_exists('lgsl_protocol_list')) {
  87. function lgsl_protocol_list()
  88. {
  89. $lgsl_protocol_list = array("aarmy" => "09",
  90. "aarmy_" => "03",
  91. "arma" => "09",
  92. "avp2" => "03",
  93. "bfvietnam" => "09",
  94. "bf1942" => "03",
  95. "bf2" => "06",
  96. "bf2142" => "06",
  97. "callofduty" => "02",
  98. "callofdutyuo" => "02",
  99. "callofduty2" => "02",
  100. "callofduty4" => "02",
  101. "cncrenegade" => "03",
  102. "crysis" => "06",
  103. "doom3" => "10",
  104. "dh2005" => "09",
  105. "had2" => "03",
  106. "halflife" => "05",
  107. "halflifewon" => "05",
  108. "halo" => "03",
  109. "il2" => "03",
  110. "farcry" => "08",
  111. "fear" => "09",
  112. "flashpoint" => "03",
  113. "freelancer" => "14",
  114. "frontlines" => "20",
  115. "ghostrecon" => "19",
  116. "graw" => "06",
  117. "graw2" => "09",
  118. "gtr2" => "15",
  119. "jediknight2" => "02",
  120. "mohaa" => "03",
  121. "mohaab" => "03",
  122. "mohaas" => "03",
  123. "mohpa" => "03",
  124. "mohaa_" => "02",
  125. "mohaab_" => "02",
  126. "mohaas_" => "02",
  127. "mohpa_" => "02",
  128. "mta" => "08",
  129. "nascar2004" => "09",
  130. "neverwinter" => "09",
  131. "neverwinter2" => "09",
  132. "painkiller" => "08",
  133. "painkiller_" => "09",
  134. "quakeworld" => "07",
  135. "quakewars" => "10",
  136. "quake2" => "02",
  137. "quake3" => "02",
  138. "quake4" => "10",
  139. "ravenshield" => "04",
  140. "rfactor" => "16",
  141. "samp" => "12",
  142. "savage" => "17",
  143. "savage2" => "18",
  144. "serioussam" => "03",
  145. "serioussam2" => "09",
  146. "sof2" => "02",
  147. "soldat" => "08",
  148. "source" => "05",
  149. "stalker" => "06",
  150. "startrekef" => "02",
  151. "swat4" => "03",
  152. "test" => "01",
  153. "warsow" => "02",
  154. "ut" => "03",
  155. "ut2003" => "13",
  156. "ut2003_" => "03",
  157. "ut2004" => "13",
  158. "ut2004_" => "03",
  159. "ut3" => "11",
  160. "vietcong" => "03",
  161. "vietcong2" => "09",
  162. "wolfenstein" => "02");
  163. return $lgsl_protocol_list;
  164. }}
  165. //------------------------------------------------------------------------------------------------------------+
  166. //------------------------------------------------------------------------------------------------------------+
  167. if (!function_exists('lgsl_software_link')) {
  168. function lgsl_software_link($ip, $q_port, $c_port, $s_port, $type)
  169. {
  170. $lgsl_software_link = array("aarmy" => "qtracker://{IP}:{S_PORT}?game=ArmyOperations&amp;action=show",
  171. "arma" => "qtracker://{IP}:{S_PORT}?game=ArmedAssault&amp;action=show",
  172. "avp2" => "qtracker://{IP}:{S_PORT}?game=AliensversusPredator2&amp;action=show",
  173. "bfvietnam" => "qtracker://{IP}:{S_PORT}?game=BattlefieldVietnam&amp;action=show",
  174. "bf1942" => "qtracker://{IP}:{S_PORT}?game=Battlefield1942&amp;action=show",
  175. "bf2" => "qtracker://{IP}:{S_PORT}?game=Battlefield2&amp;action=show",
  176. "bf2142" => "qtracker://{IP}:{S_PORT}?game=Battlefield2142&amp;action=show",
  177. "callofduty" => "qtracker://{IP}:{S_PORT}?game=CallOfDuty&amp;action=show",
  178. "callofdutyuo" => "qtracker://{IP}:{S_PORT}?game=CallOfDutyUnitedOffensive&amp;action=show",
  179. "callofduty2" => "qtracker://{IP}:{S_PORT}?game=CallOfDuty2&amp;action=show",
  180. "callofduty4" => "qtracker://{IP}:{S_PORT}?game=CallOfDuty4&amp;action=show",
  181. "cncrenegade" => "qtracker://{IP}:{S_PORT}?game=CommandConquerRenegade&amp;action=show",
  182. "crysis" => "qtracker://{IP}:{S_PORT}?game=Crysis&amp;action=show",
  183. "doom3" => "qtracker://{IP}:{S_PORT}?game=Doom3&amp;action=show",
  184. "dh2005" => "http://en.wikipedia.org/wiki/Deer_Hunter_(computer_game)",
  185. "farcry" => "eye://NEW://{IP}:{S_PORT}",
  186. "fear" => "qtracker://{IP}:{S_PORT}?game=FEAR&amp;action=show",
  187. "flashpoint" => "qtracker://{IP}:{S_PORT}?game=OperationFlashpoint&amp;action=show",
  188. "freelancer" => "eye://DX://{IP}:{S_PORT}",
  189. "frontlines" => "http://en.wikipedia.org/wiki/Frontlines:_Fuel_of_War",
  190. "ghostrecon" => "eye://GR://{IP}:{S_PORT}",
  191. "graw" => "qtracker://{IP}:{S_PORT}?game=GhostRecon&action=show",
  192. "graw2" => "http://en.wikipedia.org/wiki/Tom_Clancy's_Ghost_Recon_Advanced_Warfighter_2",
  193. "gtr2" => "http://en.wikipedia.org/wiki/GTR2",
  194. "had2" => "http://en.wikipedia.org/wiki/Hidden_&_Dangerous_2",
  195. "halflife" => "qtracker://{IP}:{S_PORT}?game=HalfLife&amp;action=show",
  196. "halflifewon" => "qtracker://{IP}:{S_PORT}?game=HalfLife_WON2&amp;action=show",
  197. "halo" => "qtracker://{IP}:{S_PORT}?game=Halo&amp;action=show",
  198. "il2" => "eye://OLD://{IP}:{S_PORT}",
  199. "jediknight2" => "qtracker://{IP}:{S_PORT}?game=JediKnight2&amp;action=show",
  200. "mohaa" => "qtracker://{IP}:{S_PORT}?game=MedalofHonorAlliedAssault&amp;action=show",
  201. "mohaab" => "qtracker://{IP}:{S_PORT}?game=MedalofHonorAlliedAssaultBreakthrough&amp;action=show",
  202. "mohaas" => "qtracker://{IP}:{S_PORT}?game=MedalofHonorAlliedAssaultSpearhead&amp;action=show",
  203. "mohpa" => "qtracker://{IP}:{S_PORT}?game=MedalofHonorPacificAssault&amp;action=show",
  204. "mta" => "http://en.wikipedia.org/wiki/Multi_Theft_Auto",
  205. "nascar2004" => "http://en.wikipedia.org/wiki/NASCAR_Thunder_2004",
  206. "neverwinter" => "qtracker://{IP}:{S_PORT}?game=NeverwinterNights&amp;action=show",
  207. "neverwinter2" => "qtracker://{IP}:{S_PORT}?game=NeverwinterNights&amp;action=show",
  208. "painkiller" => "qtracker://{IP}:{S_PORT}?game=Painkiller&amp;action=show",
  209. "quakeworld" => "qtracker://{IP}:{S_PORT}?game=QuakeWorld&amp;action=show",
  210. "quakewars" => "qtracker://{IP}:{S_PORT}?game=EnemyTerritoryQuakeWars&amp;action=show",
  211. "quake2" => "qtracker://{IP}:{S_PORT}?game=Quake2&amp;action=show",
  212. "quake3" => "qtracker://{IP}:{S_PORT}?game=Quake3&amp;action=show",
  213. "quake4" => "qtracker://{IP}:{S_PORT}?game=Quake4&amp;action=show",
  214. "ravenshield" => "eye://RVS://{IP}:{S_PORT}",
  215. "rfactor" => "rfactor://{IP}:{S_PORT}",
  216. "samp" => "http://www.sa-mp.com",
  217. "savage" => "http://en.wikipedia.org/wiki/Savage:_The_Battle_for_Newerth",
  218. "savage2" => "http://en.wikipedia.org/wiki/Savage_2:_A_Tortured_Soul",
  219. "serioussam" => "qtracker://{IP}:{S_PORT}?game=SeriousSam&amp;action=show",
  220. "serioussam2" => "qtracker://{IP}:{S_PORT}?game=Serious_Sam2&amp;action=show",
  221. "sof2" => "qtracker://{IP}:{S_PORT}?game=SoldierOfFortune2&amp;action=show",
  222. "soldat" => "eye://NEW://{IP}:{S_PORT}",
  223. "source" => "qtracker://{IP}:{S_PORT}?game=HalfLife2&amp;action=show",
  224. "stalker" => "qtracker://{IP}:{S_PORT}?game=STALKER_ShadowChernobyl&amp;action=show",
  225. "startrekef" => "EYE://EF://{IP}:{S_PORT}",
  226. "swat4" => "qtracker://{IP}:{S_PORT}?game=SWAT4&amp;action=show",
  227. "test" => "http://www.greycube.com",
  228. "ut" => "qtracker://{IP}:{S_PORT}?game=UnrealTournament&amp;action=show",
  229. "ut2003" => "qtracker://{IP}:{S_PORT}?game=UnrealTournament2003&amp;action=show",
  230. "ut2004" => "qtracker://{IP}:{S_PORT}?game=UnrealTournament2004&amp;action=show",
  231. "ut3" => "qtracker://{IP}:{S_PORT}?game=UnrealTournament3&amp;action=show",
  232. "vietcong" => "qtracker://{IP}:{S_PORT}?game=Vietcong&amp;action=show",
  233. "vietcong2" => "qtracker://{IP}:{S_PORT}?game=Vietcong2&amp;action=show",
  234. "warsow" => "qtracker://{IP}:{S_PORT}?game=Warsow&amp;action=show",
  235. "wolfenstein" => "qtracker://{IP}:{S_PORT}?game=ReturntoCastleWolfenstein&amp;action=show");
  236. // IF THE SOFTWARE PORT IS NOT SET USE THE QUERY PORT
  237. if (!$s_port) { $s_port = $q_port; }
  238. // INSERT DATA INTO STATIC LINK AND RETURN
  239. return str_replace (array("{IP}", "{Q_PORT}", "{C_PORT}", "{S_PORT}"), array($ip, $q_port, $c_port, $s_port), $lgsl_software_link[$type]);
  240. }}
  241. //------------------------------------------------------------------------------------------------------------+
  242. //------------------------------------------------------------------------------------------------------------+
  243. if (!function_exists('lgsl_port_conversion')) {
  244. function lgsl_port_conversion($q_port, $c_port, $s_port, $type)
  245. {
  246. switch ($type) // GAMES WHERE Q_PORT IS NOT EQUAL TO C_PORT
  247. {
  248. case "aarmy" : $c_to_q = 1; $c_def = 1716; $q_def = 1717; $c_to_s = 0; break;
  249. case "bfvietnam" : $c_to_q = 0; $c_def = 15567; $q_def = 23000; $c_to_s = 0; break;
  250. case "bf1942" : $c_to_q = 0; $c_def = 14567; $q_def = 23000; $c_to_s = 0; break;
  251. case "bf2" : $c_to_q = 0; $c_def = 16567; $q_def = 29900; $c_to_s = 0; break;
  252. case "bf2142" : $c_to_q = 0; $c_def = 17567; $q_def = 29900; $c_to_s = 0; break;
  253. case "dh2005" : $c_to_q = 0; $c_def = 23459; $q_def = 34567; $c_to_s = 0; break;
  254. case "farcry" : $c_to_q = 123; $c_def = 49001; $q_def = 49124; $c_to_s = 0; break;
  255. case "flashpoint" : $c_to_q = 1; $c_def = 2302; $q_def = 2303; $c_to_s = 0; break;
  256. case "frontlines" : $c_to_q = 2; $c_def = 5476; $q_def = 5478; $c_to_s = 0; break;
  257. case "ghostrecon" : $c_to_q = 2; $c_def = 2346; $q_def = 2348; $c_to_s = 0; break;
  258. case "gtr2" : $c_to_q = 1; $c_def = 34297; $q_def = 34298; $c_to_s = 0; break;
  259. case "had2" : $c_to_q = 3; $c_def = 11001; $q_def = 11004; $c_to_s = 0; break;
  260. case "mohaa" : $c_to_q = 97; $c_def = 12203; $q_def = 12300; $c_to_s = 0; break;
  261. case "mohaab" : $c_to_q = 97; $c_def = 12203; $q_def = 12300; $c_to_s = 0; break;
  262. case "mohaas" : $c_to_q = 97; $c_def = 12203; $q_def = 12300; $c_to_s = 0; break;
  263. case "mohpa" : $c_to_q = 97; $c_def = 13203; $q_def = 13300; $c_to_s = 0; break;
  264. case "mta" : $c_to_q = 123; $c_def = 22003; $q_def = 22126; $c_to_s = 0; break;
  265. case "painkiller" : $c_to_q = 123; $c_def = 3455; $q_def = 3578; $c_to_s = 0; break;
  266. case "ravenshield" : $c_to_q = 1000; $c_def = 7777; $q_def = 8777; $c_to_s = 0; break;
  267. case "rfactor" : $c_to_q = -100; $c_def = 34397; $q_def = 34297; $c_to_s = 0; break;
  268. case "serioussam" : $c_to_q = 1; $c_def = 25600; $q_def = 25601; $c_to_s = 0; break;
  269. case "soldat" : $c_to_q = 123; $c_def = 23073; $q_def = 23196; $c_to_s = 0; break;
  270. case "stalker" : $c_to_q = 2; $c_def = 5447; $q_def = 5445; $c_to_s = 0; break;
  271. case "swat4" : $c_to_q = 1; $c_def = 10780; $q_def = 10781; $c_to_s = 0; break;
  272. case "ut" : $c_to_q = 1; $c_def = 7777; $q_def = 7778; $c_to_s = 0; break;
  273. case "ut2003" : $c_to_q = 1; $c_def = 7757; $q_def = 7758; $c_to_s = 10; break;
  274. case "ut2003_" : $c_to_q = 10; $c_def = 7757; $q_def = 7767; $c_to_s = 0; break;
  275. case "ut2004" : $c_to_q = 1; $c_def = 7777; $q_def = 7778; $c_to_s = 10; break;
  276. case "ut2004_" : $c_to_q = 10; $c_def = 7777; $q_def = 7787; $c_to_s = 0; break;
  277. case "ut3" : $c_to_q = 0; $c_def = 7777; $q_def = 6500; $c_to_s = 0; break;
  278. case "vietcong" : $c_to_q = 10000; $c_def = 5425; $q_def = 15425; $c_to_s = 0; break;
  279. case "vietcong2" : $c_to_q = 0; $c_def = 5001; $q_def = 19967; $c_to_s = 0; break;
  280. default : $c_to_q = 0; $c_def = $q_port; $q_def = $c_port; $c_to_s = 0; break;
  281. }
  282. if (!$c_port && !$q_port)
  283. {
  284. $c_port = $c_def;
  285. $q_port = $q_def;
  286. }
  287. if ($c_port && !$q_port)
  288. {
  289. $q_port = $c_to_q ? $c_port + $c_to_q : $q_def;
  290. }
  291. if ($q_port && !$c_port)
  292. {
  293. $c_port = $c_to_q ? $q_port - $c_to_q : $c_def;
  294. }
  295. if ($c_port && !$s_port)
  296. {
  297. $s_port = $c_to_s ? $c_port + $c_to_s : 0;
  298. }
  299. return array(intval($q_port), intval($c_port), intval($s_port));
  300. }}
  301. //------------------------------------------------------------------------------------------------------------+
  302. //------------------------------------------------------------------------------------------------------------+
  303. if (!function_exists('lgsl_query_live')) {
  304. function lgsl_query_live($ip, $q_port, $c_port, $s_port, $type, $request)
  305. {
  306. //---------------------------------------------------------+
  307. $lgsl_protocol_list = lgsl_protocol_list();
  308. if (!$lgsl_protocol_list[$type])
  309. {
  310. echo "LGSL PROBLEM: ".($type ? "INVALID TYPE '$type'" : "MISSING TYPE")." FOR $ip:$q_port:$c_port:$s_port"; exit;
  311. }
  312. if (!function_exists("lgsl_query_{$lgsl_protocol_list[$type]}"))
  313. {
  314. echo "LGSL PROBLEM: FUNCTION DOES NOT EXIST FOR: $type"; exit;
  315. }
  316. //---------------------------------------------------------+
  317. $status = 1;
  318. global $lgsl_config; // FEED IS CONFIGURED IN A SEPERATE FILE
  319. if (isset($lgsl_config['feed']) && $lgsl_config['feed']['method'] && $lgsl_config['feed']['url'])
  320. {
  321. $server = lgsl_query_feed($ip, $q_port, $c_port, $s_port, $type, $request, $lgsl_config['feed']['method'], $lgsl_config['feed']['url']);
  322. }
  323. elseif ($type == "test")
  324. {
  325. $server = call_user_func("lgsl_query_{$lgsl_protocol_list[$type]}", $type, $request, array());
  326. }
  327. else
  328. {
  329. $server = lgsl_query_direct($ip, $q_port, $type, $request, "lgsl_query_{$lgsl_protocol_list[$type]}");
  330. }
  331. //---------------------------------------------------------+
  332. // IF OFFLINE ARRAYS ARE SET TO TRIGGER OTHER CODE AND PREVENT FOEACH ERRORS
  333. if (!$server)
  334. {
  335. $status = 0;
  336. $server = array();
  337. $server['s'] = array();
  338. $server['e'] = array();
  339. $server['p'] = array();
  340. }
  341. //---------------------------------------------------------+
  342. // [s] IS A CONSISTANT FORMAT EVEN IF SERVER IS OFFLINE
  343. if (isset($server['s']))
  344. {
  345. if (isset($server['s']['game']) && !$server['s']['game']) { $server['s']['game'] = $type; }
  346. if (isset($server['s']['map']))
  347. {
  348. $tmp = str_replace("\\", "/", $server['s']['map']); // REMOVE ANY
  349. $tmp = explode("/", $tmp); // FOLDERS
  350. $server['s']['map'] = array_pop($tmp); // FROM MAP
  351. }
  352. if (isset($server['s']['password']))
  353. {
  354. if (strtolower($server['s']['password']) == "false") { $server['s']['password'] = 0; }
  355. if (strtolower($server['s']['password']) == "true") { $server['s']['password'] = 1; }
  356. }
  357. if (isset($server['s']['password']))
  358. $server['s']['password'] = intval($server['s']['password']);
  359. if (isset($server['s']['players']))
  360. {
  361. $server['s']['players'] = intval($server['s']['players']);
  362. if ($server['s']['players'] < 0) { $server['s']['players'] = 0; }
  363. }
  364. if (isset($server['s']['playersmax']))
  365. {
  366. $server['s']['playersmax'] = intval($server['s']['playersmax']);
  367. if ($server['s']['playersmax'] < 0) { $server['s']['playersmax'] = 0; }
  368. }
  369. }
  370. //---------------------------------------------------------+
  371. // [b] IS ALWAYS RETURNED
  372. $server['b']['ip'] = $ip;
  373. $server['b']['q_port'] = $q_port;
  374. $server['b']['c_port'] = $c_port;
  375. $server['b']['s_port'] = $s_port;
  376. $server['b']['type'] = $type;
  377. $server['b']['request'] = $request;
  378. $server['b']['status'] = $status;
  379. //---------------------------------------------------------+
  380. return $server;
  381. }}
  382. //------------------------------------------------------------------------------------------------------------+
  383. //------------------------------------------------------------------------------------------------------------+
  384. if (!function_exists('lgsl_query_direct')) {
  385. function lgsl_query_direct($ip, $q_port, $type, $request, $function_name)
  386. {
  387. //---------------------------------------------------------+
  388. // GAMES THAT NEED [s] QUERY TO COMPLETE [e]
  389. if (strpos($request, "e") !== FALSE && ($type == "halflifewon" || $type == "halflife" || $type == "source" || $type == "samp" || $type == "ut2004"))
  390. {
  391. $request .= "s";
  392. }
  393. // GAMES THAT NEED [e] QUERY TO COMPLETE [s]
  394. if (strpos($request, "s") !== FALSE && $type == "ut2004")
  395. {
  396. $request .= "e";
  397. }
  398. // GAMES THAT NEED [e] QUERY TO COMPLETE [p]
  399. if ((strpos($request, "p") !== FALSE) && $type == "bf1942")
  400. {
  401. $request .= "e";
  402. }
  403. //---------------------------------------------------------+
  404. global $lgsl_fp;
  405. $lgsl_fp = @fsockopen("udp://$ip", $q_port, $errno, $errstr, 1);
  406. if (!$lgsl_fp) { return FALSE; }
  407. //---------------------------------------------------------+
  408. global $lgsl_config;
  409. if ($lgsl_config['timeout'] = intval($lgsl_config['timeout']))
  410. {
  411. stream_set_timeout($lgsl_fp, $lgsl_config['timeout']);
  412. }
  413. else
  414. {
  415. stream_set_timeout($lgsl_fp, 0, 500000);
  416. }
  417. stream_set_blocking($lgsl_fp, TRUE);
  418. //---------------------------------------------------------+
  419. $server = array();
  420. if (strpos($request, "e") !== FALSE && !isset($server['e'])) // [e] MUST GO BEFORE [s]
  421. {
  422. $server = call_user_func($function_name, $type, "e", $server);
  423. if (!$server) { @fclose($lgsl_fp); return FALSE; }
  424. }
  425. if (strpos($request, "s") !== FALSE && !isset($server['s']))
  426. {
  427. $e_wipe = isset($server['e']) ? FALSE : TRUE;
  428. $server = call_user_func($function_name, $type, "s", $server);
  429. if (!$server) { @fclose($lgsl_fp); return FALSE; }
  430. if ($e_wipe) { unset($server['e']); } // DO NOT RETURN PARTIAL [e] GIVEN BY [s]
  431. }
  432. if (strpos($request, "p") !== FALSE && !isset($server['p']))
  433. {
  434. $e_wipe = isset($server['e']) ? FALSE : TRUE;
  435. if (isset($server['s']) && !$server['s']['players']) // SERVER EMPTY SO SKIP REQUESTING PLAYER DETAILS
  436. {
  437. $server['p'] = array();
  438. }
  439. else
  440. {
  441. $server = call_user_func($function_name, $type, "p", $server);
  442. }
  443. if (!$server) { @fclose($lgsl_fp); return FALSE; }
  444. if ($e_wipe) { unset($server['e']); } // DO NOT RETURN PARTIAL [e] GIVEN BY [p]
  445. }
  446. @fclose($lgsl_fp);
  447. //---------------------------------------------------------+
  448. return $server;
  449. }}
  450. //------------------------------------------------------------------------------------------------------------+
  451. //------------------------------------------------------------------------------------------------------------+
  452. if (!function_exists('lgsl_query_01')) {
  453. function lgsl_query_01($type, $request, $server)
  454. {
  455. //---------------------------------------------------------+
  456. // PROTOCOL FOR DEVELOPING WITHOUT USING LIVE SERVERS TO HELP ENSURE RETURNED
  457. // DATA IS SANITIZED AND THAT LONG SERVER AND PLAYER NAMES ARE HANDLED PROPERLY
  458. $server['s'] = array ("game" => "testgame",
  459. "name" => "testservernamethatsoften'really'longandcancontainsymbols<hr />thatwill\"screw\"uphtmlunlessentitied",
  460. "map" => "test_map",
  461. "players" => rand(0, 16),
  462. "playersmax" => rand(16, 32),
  463. "password" => rand(0, 1));
  464. //---------------------------------------------------------+
  465. $server['e'] = array ("testextra1" => time(),
  466. "testextra2" => 123,
  467. "testextra3" => "alpha",
  468. "testextra4" => "",
  469. "testextra5" => "<b>Charlie</b>",
  470. "testextra6" => "MapCycleGolfHotelIndiaJulietKiloLimaMikeNovemberOscarPapaGolfHotelIndiaJulietKiloLimaMikeNovemberOscarPapa");
  471. //---------------------------------------------------------+
  472. $server['p']['0']['name'] = "Delta";
  473. $server['p']['0']['score'] = "12";
  474. $server['p']['0']['ping'] = "34";
  475. $server['p']['1']['name'] = "\xc3\xa9\x63\x68\x6f\x20\xd0\xb8-d0\xb3\xd1\x80\xd0\xbe\xd0\xba"; // TEST UTF PLAYER NAMES
  476. $server['p']['1']['score'] = "56";
  477. $server['p']['1']['ping'] = "78";
  478. $server['p']['2']['name'] = "Foxtrot";
  479. $server['p']['2']['score'] = "90";
  480. $server['p']['2']['ping'] = "12";
  481. $server['p']['2']['name'] = "GolfHotelIndiaJulietKiloLimaMikeNovemberOscarPapa"; // TEST LONG PLAYER NAMES
  482. $server['p']['2']['score'] = "90";
  483. $server['p']['2']['ping'] = "12";
  484. //---------------------------------------------------------+
  485. if (rand(0, 10) == 5) { $server['p'] = array(); } // TEST SERVER WITH NO PLAYERS
  486. if (rand(0, 10) == 5) { return FALSE; } // TEST SERVER GOING OFFLINE
  487. //---------------------------------------------------------+
  488. return $server;
  489. }}
  490. //------------------------------------------------------------------------------------------------------------+
  491. //------------------------------------------------------------------------------------------------------------+
  492. if (!function_exists('lgsl_query_02')) {
  493. function lgsl_query_02($type, $request, $server)
  494. {
  495. //---------------------------------------------------------+
  496. global $lgsl_fp;
  497. if ($type == "mohaa_" || $type == "mohaab_" || $type == "mohaas_" || $type == "mohpa_")
  498. {
  499. fwrite($lgsl_fp, "\xFF\xFF\xFF\xFF\x02getstatus" );
  500. }
  501. elseif ($type == "quake2") { fwrite($lgsl_fp, "\xFF\xFF\xFF\xFFstatus"); }
  502. elseif ($type == "warsow") { fwrite($lgsl_fp, "\xFF\xFF\xFF\xFFgetinfo"); }
  503. else { fwrite($lgsl_fp, "\xFF\xFF\xFF\xFFgetstatus"); }
  504. $buffer = fread($lgsl_fp, 4096);
  505. if (!$buffer) { return FALSE; }
  506. //---------------------------------------------------------+
  507. $part = explode("\n", $buffer); // SPLIT INTO PARTS: HEADER/SETTINGS/PLAYERS/FOOTER
  508. array_pop($part); // REMOVE FOOTER WHICH IS EITHER NULL OR "\challenge\"
  509. $item = explode("\\", $part[1]); // SPLIT PART INTO ITEMS
  510. foreach ($item as $item_key => $data_key)
  511. {
  512. if (!($item_key % 2)) { continue; } // SKIP EVEN ITEM KEY
  513. $data_key = strtolower(lgsl_parse_color($data_key, "1"));
  514. $server['e'][$data_key] = lgsl_parse_color($item[$item_key + 1], "1");
  515. }
  516. //---------------------------------------------------------+
  517. $server['s']['game'] = $server['e']['gamename'];
  518. $server['s']['name'] = $server['e']['sv_hostname'];
  519. $server['s']['map'] = $server['e']['mapname'];
  520. $server['s']['players'] = isset($part['2']) && $part['2'] ? count($part) - 2 : 0;
  521. $server['s']['playersmax'] = $server['e']['sv_maxclients'];
  522. if (isset($server['e']['g_needpass']))
  523. $server['s']['password'] = $server['e']['g_needpass'];
  524. else
  525. $server['s']['password'] = "";
  526. if (!$server['s']['name']) { $server['s']['name'] = $server['e']['hostname']; } // HOSTNAME ALTERNATIVE
  527. if (isset($server['e']['pswrd'])) { $server['s']['password'] = $server['e']['pswrd']; } // CALL OF DUTY
  528. if (isset($server['e']['needpass'])) { $server['s']['password'] = $server['e']['needpass']; } // QUAKE2
  529. if (isset($server['e']['maxclients'])) { $server['s']['playersmax'] = $server['e']['maxclients']; } // QUAKE2
  530. //---------------------------------------------------------+
  531. array_shift($part); // REMOVE HEADER AND SHIFT KEYS
  532. array_shift($part); // REMOVE SETTING AND SHIFT KEYS
  533. $server['p'] = array();
  534. foreach ($part as $player_key => $data)
  535. {
  536. if (!$data) { continue; }
  537. if ($type == "warsow") // WARSOW: (SCORE) (PING) "(NAME)" "(TEAM)"
  538. {
  539. preg_match("/(.*) (.*) \"(.*)\" (.*)/", $data, $match);
  540. $server['p'][$player_key]['score'] = $match[1];
  541. $server['p'][$player_key]['ping'] = $match[2];
  542. $server['p'][$player_key]['name'] = $match[3];
  543. $server['p'][$player_key]['team'] = $match[4];
  544. }
  545. elseif ($type == "mohaa_" || $type == "mohaab_" || $type == "mohaas_") // MOH: (PING) "(NAME)"
  546. {
  547. preg_match("/(.*) \"(.*)\"/", $data, $match);
  548. $server['p'][$player_key]['ping'] = $match[1];
  549. $server['p'][$player_key]['name'] = $match[2];
  550. }
  551. elseif ($type == "mohpa_") // MOH: (?) (SCORE) (?) (TIME) (?) "(RANK?)" "(NAME)"
  552. {
  553. preg_match("/(.*) (.*) (.*) (.*) (.*) \"(.*)\" \"(.*)\"/", $data, $match);
  554. $server['p'][$player_key]['score'] = $match[2];
  555. $server['p'][$player_key]['deaths'] = $match[3];
  556. $server['p'][$player_key]['time'] = lgsl_time($match[4]);
  557. $server['p'][$player_key]['rank'] = $match[6];
  558. $server['p'][$player_key]['name'] = $match[7];
  559. }
  560. elseif ($type == "sof2") // SOF: (SCORE) (PING) (DEATHS) "(NAME)"
  561. {
  562. preg_match("/(.*) (.*) (.*) \"(.*)\"/", $data, $match);
  563. $server['p'][$player_key]['score'] = $match[1];
  564. $server['p'][$player_key]['ping'] = $match[2];
  565. $server['p'][$player_key]['deaths'] = $match[3];
  566. $server['p'][$player_key]['name'] = $match[4];
  567. }
  568. else // OTHER: (SCORE) (PING) "(NAME)"
  569. {
  570. preg_match("/(.*) (.*) \"(.*)\"/", $data, $match);
  571. $server['p'][$player_key]['score'] = $match[1];
  572. $server['p'][$player_key]['ping'] = $match[2];
  573. $server['p'][$player_key]['name'] = $match[3];
  574. }
  575. $server['p'][$player_key]['name'] = lgsl_parse_color($server['p'][$player_key]['name'], "1");
  576. }
  577. //---------------------------------------------------------+
  578. return $server;
  579. }}
  580. //------------------------------------------------------------------------------------------------------------+
  581. //------------------------------------------------------------------------------------------------------------+
  582. if (!function_exists('lgsl_query_03')) {
  583. function lgsl_query_03($type, $request, $server)
  584. {
  585. //---------------------------------------------------------+
  586. global $lgsl_fp;
  587. if ($type == "cncrenegade") { fwrite($lgsl_fp, "\\status\\" ); $server['p'] = array(); }
  588. elseif ($request == "p") { fwrite($lgsl_fp, "\\players\\" ); $server['p'] = array(); }
  589. else { fwrite($lgsl_fp, "\\basic\\\\info\\\\rules\\" ); $server['e'] = array(); }
  590. //---------------------------------------------------------+
  591. $packet1 = fread($lgsl_fp, 4096);
  592. if (!$packet1) { return FALSE; }
  593. preg_match_all("/(queryid\\\(.*)\.1|final\\\)/Us", $packet1, $match);
  594. if (count(array_unique($match[1])) < 2)
  595. {
  596. $packet2 = fread($lgsl_fp, 4096);
  597. if (!$packet2) { return FALSE; }
  598. preg_match_all("/(queryid\\\(.*)\.1|queryid\\\(.*)\.2|final\\\)/Us", $packet1.$packet2, $match);
  599. if (count(array_unique($match[1])) < 3)
  600. {
  601. $packet3 = fread($lgsl_fp, 4096);
  602. if (!$packet3) { return FALSE; }
  603. }
  604. }
  605. $buffer = $packet1.$packet2.$packet3; // JOIN ORDER DOES NOT MATTER
  606. if ($type == "avp2" && $request == "p") { $buffer = preg_replace("/\\\[0-9]+~/", "\\", $buffer); } // REMOVE ID PREFIX FROM NAMES
  607. $item = explode("\\", $buffer); // SPLIT INTO ITEMS
  608. //---------------------------------------------------------+
  609. foreach ($item as $item_key => $data_key)
  610. {
  611. if (!($item_key % 2)) { continue; } // SKIP EVEN ITEM KEY
  612. if ($data_key == "") { continue; } // SKIP BLANK DATA KEY
  613. if ($data_key == "final") { continue; } // SKIP PACKET STUFF
  614. if ($data_key == "queryid") { continue; } // SKIP PACKET STUFF
  615. $data_key = strtolower($data_key); // LOWERCASE KEY
  616. $tmp = explode("_", $data_key, 2); // SPLIT FOR CHECKS
  617. if (!isset($tmp[1]) || !is_numeric($tmp[1]) || $tmp[0] == "teamname") // EXTRA DATA
  618. {
  619. $server['e'][$data_key] = $item[$item_key + 1];
  620. }
  621. else // PLAYER DATA
  622. {
  623. if ($tmp[0] == "player") { $tmp[0] = "name"; } // CONVERT KEYS TO STANDARD FIELDS
  624. elseif ($tmp[0] == "playername") { $tmp[0] = "name"; }
  625. elseif ($tmp[0] == "frags") { $tmp[0] = "score"; }
  626. elseif ($tmp[0] == "ngsecret") { $tmp[0] = "stats"; }
  627. $server['p'][$tmp[1]][$tmp[0]] = $item[$item_key + 1];
  628. }
  629. }
  630. //---------------------------------------------------------+
  631. if ($server['e']['mapname'])
  632. {
  633. if (!$server['e']['gamename'] || $type == "bf1942") { $server['s']['game'] = $server['e']['gameid']; }
  634. else { $server['s']['game'] = $server['e']['gamename']; }
  635. if (!$server['e']['sv_hostname']) { $server['s']['name'] = $server['e']['hostname']; }
  636. else { $server['s']['name'] = $server['e']['sv_hostname']; }
  637. $server['s']['name'] = lgsl_parse_color($server['s']['name'], $type);
  638. $server['s']['map'] = $server['e']['mapname'];
  639. $server['s']['players'] = $server['e']['numplayers'];
  640. $server['s']['playersmax'] = $server['e']['maxplayers'];
  641. $server['s']['password'] = $server['e']['password'];
  642. }
  643. //---------------------------------------------------------+
  644. if ($server['p']) // NEED TO RE-SET PLAYER KEYS AS THERE MAY BE GAPS
  645. {
  646. $player_tmp = array();
  647. $player_key = 0;
  648. foreach ($server['p'] as $player)
  649. {
  650. if ($player_key >= $server['s']['players']) { continue; } // SKIP GHOST PLAYERS THAT BF1942 RETURNS
  651. $player_tmp[$player_key] = $player;
  652. $player_key++;
  653. }
  654. $server['p'] = $player_tmp;
  655. }
  656. //---------------------------------------------------------+
  657. return $server;
  658. }}
  659. //------------------------------------------------------------------------------------------------------------+
  660. //------------------------------------------------------------------------------------------------------------+
  661. if (!function_exists('lgsl_query_04')) {
  662. function lgsl_query_04($type, $request, $server)
  663. {
  664. //---------------------------------------------------------+
  665. global $lgsl_fp;
  666. fwrite($lgsl_fp, "REPORT");
  667. $buffer = fread($lgsl_fp, 4096);
  668. if (!$buffer) { return FALSE; }
  669. //---------------------------------------------------------+
  670. $lgsl_ravenshield_key = array("A1" => "playersmax",
  671. "A2" => "tkpenalty",
  672. "B1" => "players",
  673. "B2" => "allowradar",
  674. "D2" => "version",
  675. "E1" => "mapname",
  676. "E2" => "lid",
  677. "F1" => "maptype",
  678. "F2" => "gid",
  679. "G1" => "password",
  680. "G2" => "hostport",
  681. "H1" => "dedicated",
  682. "H2" => "terroristcount",
  683. "I1" => "hostname",
  684. "I2" => "aibackup",
  685. "J1" => "mapcycletypes",
  686. "J2" => "rotatemaponsuccess",
  687. "K1" => "mapcycle",
  688. "K2" => "forcefirstpersonweapons",
  689. "L1" => "players_name",
  690. "L2" => "gamename",
  691. "L3" => "punkbuster",
  692. "M1" => "players_time",
  693. "N1" => "players_ping",
  694. "O1" => "players_score",
  695. "P1" => "queryport",
  696. "Q1" => "rounds",
  697. "R1" => "roundtime",
  698. "S1" => "bombtimer",
  699. "T1" => "bomb",
  700. "W1" => "allowteammatenames",
  701. "X1" => "iserver",
  702. "Y1" => "friendlyfire",
  703. "Z1" => "autobalance");
  704. //---------------------------------------------------------+
  705. $item = explode("\xB6", $buffer); // SPLIT INTO ITEMS
  706. foreach ($item as $data_value)
  707. {
  708. $tmp = explode(" ", $data_value, 2);
  709. $data_key = $lgsl_ravenshield_key[$tmp[0]] ? $lgsl_ravenshield_key[$tmp[0]] : $tmp[0]; // CONVERT TO HUMAN FRIENDLY KEY
  710. $server['e'][$data_key] = trim($tmp[1]); // ALL VALUES NEED TRIMMING
  711. }
  712. $server['e']['mapcycle'] = str_replace("/"," ", $server['e']['mapcycle']); // CONVERT SLASH TO SPACE SO
  713. $server['e']['mapcycletypes'] = str_replace("/"," ", $server['e']['mapcycletypes']); // LONG LISTS WRAP NATURALLY
  714. //---------------------------------------------------------+
  715. $server['s']['game'] = $server['e']['gamename'];
  716. $server['s']['name'] = $server['e']['hostname'];
  717. $server['s']['map'] = $server['e']['mapname'];
  718. $server['s']['players'] = $server['e']['players'];
  719. $server['s']['playersmax'] = $server['e']['playersmax'];
  720. $server['s']['password'] = $server['e']['password'];
  721. //---------------------------------------------------------+
  722. $server['p'] = array();
  723. $player_name = $server['e']['players_name'] ? explode("/", substr($server['e']['players_name'], 1)) : array(); unset($server['e']['players_name']);
  724. $player_time = $server['e']['players_time'] ? explode("/", substr($server['e']['players_time'], 1)) : array(); unset($server['e']['players_time']);
  725. $player_ping = $server['e']['players_ping'] ? explode("/", substr($server['e']['players_ping'], 1)) : array(); unset($server['e']['players_ping']);
  726. $player_score = $server['e']['players_score'] ? explode("/", substr($server['e']['players_score'], 1)) : array(); unset($server['e']['players_score']);
  727. foreach ($player_name as $key => $name)
  728. {
  729. $server['p'][$key]['name'] = $player_name[$key];
  730. $server['p'][$key]['time'] = $player_time[$key];
  731. $server['p'][$key]['ping'] = $player_ping[$key];
  732. $server['p'][$key]['score'] = $player_score[$key];
  733. }
  734. //---------------------------------------------------------+
  735. return $server;
  736. }}
  737. //------------------------------------------------------------------------------------------------------------+
  738. //------------------------------------------------------------------------------------------------------------+
  739. if (!function_exists('lgsl_query_05')) {
  740. function lgsl_query_05($type, $request, $server)
  741. {
  742. //---------------------------------------------------------+
  743. // REFERENCE: http://developer.valvesoftware.com/wiki/Server_Queries
  744. global $lgsl_fp;
  745. if ($type == "halflifewon")
  746. {
  747. if ($request == "s") { fwrite($lgsl_fp, "\xFF\xFF\xFF\xFFdetails\x00"); }
  748. elseif ($request == "e") { fwrite($lgsl_fp, "\xFF\xFF\xFF\xFFrules\x00"); }
  749. elseif ($request == "p") { fwrite($lgsl_fp, "\xFF\xFF\xFF\xFFplayers\x00"); }
  750. }
  751. else
  752. {
  753. if ($request == "e" || $request == "p")
  754. {
  755. fwrite($lgsl_fp, "\xFF\xFF\xFF\xFF\x57");
  756. $challenge_packet = fread($lgsl_fp, 4096);
  757. if (!$challenge_packet) { return FALSE; }
  758. $challenge_code = substr($challenge_packet, 5, 4);
  759. }
  760. if ($request == "s") { fwrite($lgsl_fp, "\xFF\xFF\xFF\xFF\x54Source Engine Query\x00"); }
  761. elseif ($request == "e") { fwrite($lgsl_fp, "\xFF\xFF\xFF\xFF\x56{$challenge_code}"); }
  762. elseif ($request == "p") { fwrite($lgsl_fp, "\xFF\xFF\xFF\xFF\x55{$challenge_code}"); }
  763. }
  764. //---------------------------------------------------------+
  765. $packet_count = 0;
  766. $packet_bzip2 = FALSE;
  767. do
  768. {
  769. $packet_count ++;
  770. $packet = fread($lgsl_fp, 4096);
  771. if (!$packet) { return FALSE; }
  772. if ($packet[0] != "\xFE") // SINGLE PACKET
  773. {
  774. $buffer[0] = $packet;
  775. break;
  776. }
  777. if ((ord($packet[8]) & 0xF) > 1) // HALF-LIFE 1 MULTI-PACKET
  778. {
  779. $packet_total = ord($packet[8]) & 0xF; // UPPER NIBBLE
  780. $packet_index = ord($packet[8]) >> 4; // LOWER NIBBLE
  781. $buffer[$packet_index] = substr($packet, 9);
  782. }
  783. else
  784. {
  785. $packet_total = ord($packet[8]);
  786. $packet_index = ord($packet[9]);
  787. if ((ord($packet[7]) & 128)) // SOURCE BZIP2
  788. {
  789. $packet_bzip2 = TRUE;
  790. $buffer[$packet_index] = substr($packet, 18);
  791. }
  792. else // SOURCE MULTI-PACKET
  793. {
  794. $buffer[$packet_index] = substr($packet, 12);
  795. }
  796. }
  797. }
  798. while ($packet_count < $packet_total);
  799. $buffer = implode("", $buffer);
  800. if ($packet_bzip2) // REQUIRES http://php.net/bzip2
  801. {
  802. if (!function_exists("bzdecompress"))
  803. {
  804. $server['e']['bzip2'] = "Unavailable";
  805. return $server;
  806. }
  807. $buffer = bzdecompress($buffer);
  808. }
  809. $buffer = substr($buffer, 4); // REMOVE PACKET HEADER
  810. //---------------------------------------------------------+
  811. $response_type = lgsl_cut_byte($buffer, 1);
  812. if ($response_type == "I") // SOURCE INFO ( HALF-LIFE 2 )
  813. {
  814. $server['e']['netcode'] = ord(lgsl_cut_byte($buffer, 1));
  815. $server['s']['name'] = lgsl_cut_string($buffer);
  816. $server['s']['map'] = lgsl_cut_string($buffer);
  817. $server['s']['game'] = lgsl_cut_string($buffer);
  818. $server['e']['description'] = lgsl_cut_string($buffer);
  819. $server['e']['appid'] = lgsl_unpack(lgsl_cut_byte($buffer, 2), "S");
  820. $server['s']['players'] = ord(lgsl_cut_byte($buffer, 1));
  821. $server['s']['playersmax'] = ord(lgsl_cut_byte($buffer, 1));
  822. $server['e']['bots'] = ord(lgsl_cut_byte($buffer, 1));
  823. $server['e']['dedicated'] = lgsl_cut_byte($buffer, 1);
  824. $server['e']['os'] = lgsl_cut_byte($buffer, 1);
  825. $server['s']['password'] = ord(lgsl_cut_byte($buffer, 1));
  826. $server['e']['anticheat'] = ord(lgsl_cut_byte($buffer, 1));
  827. $server['e']['version'] = lgsl_cut_string($buffer);
  828. }
  829. elseif ($response_type == "m") // HALF-LIFE 1 INFO
  830. {
  831. $server_ip = lgsl_cut_string($buffer);
  832. $server['s']['name'] = lgsl_cut_string($buffer);
  833. $server['s']['map'] = lgsl_cut_string($buffer);
  834. $server['s']['game'] = lgsl_cut_string($buffer);
  835. $server['e']['description'] = lgsl_cut_string($buffer);
  836. $server['s']['players'] = ord(lgsl_cut_byte($buffer, 1));
  837. $server['s']['playersmax'] = ord(lgsl_cut_byte($buffer, 1));
  838. $server['e']['netcode'] = ord(lgsl_cut_byte($buffer, 1));
  839. $server['e']['dedicated'] = lgsl_cut_byte($buffer, 1);
  840. $server['e']['os'] = lgsl_cut_byte($buffer, 1);
  841. $server['s']['password'] = ord(lgsl_cut_byte($buffer, 1));
  842. if (ord(lgsl_cut_byte($buffer, 1))) // MOD FIELDS ( OFF FOR SOME HALFLIFEWON-VALVE SERVERS )
  843. {
  844. $server['e']['mod_url_info'] = lgsl_cut_string($buffer);
  845. $server['e']['mod_url_download'] = lgsl_cut_string($buffer);
  846. $buffer = substr($buffer, 1);
  847. $server['e']['mod_version'] = lgsl_unpack(lgsl_cut_byte($buffer, 4), "l");
  848. $server['e']['mod_size'] = lgsl_unpack(lgsl_cut_byte($buffer, 4), "l");
  849. $server['e']['mod_server_side'] = ord(lgsl_cut_byte($buffer, 1));
  850. $server['e']['mod_custom_dll'] = ord(lgsl_cut_byte($buffer, 1));
  851. }
  852. $server['e']['anticheat'] = ord(lgsl_cut_byte($buffer, 1));
  853. $server['e']['bots'] = ord(lgsl_cut_byte($buffer, 1));
  854. }
  855. elseif ($response_type == "E") // SOURCE AND HALF-LIFE 1 RULES
  856. {
  857. $returned = lgsl_unpack(lgsl_cut_byte($buffer, 2), "S");
  858. while ($buffer)
  859. {
  860. $item_key = strtolower(lgsl_cut_string($buffer));
  861. $item_value = lgsl_cut_string($buffer);
  862. $server['e'][$item_key] = $item_value;
  863. }
  864. }
  865. elseif ($response_type == "D") // SOURCE AND HALF-LIFE 1 PLAYERS
  866. {
  867. $returned = ord(lgsl_cut_byte($buffer, 1));
  868. $server['p'] = array();
  869. $player_key = 0;
  870. while ($buffer)
  871. {
  872. $server['p'][$player_key]['pid'] = ord(lgsl_cut_byte($buffer, 1));
  873. $server['p'][$player_key]['name'] = lgsl_cut_string($buffer);
  874. $server['p'][$player_key]['score'] = lgsl_unpack(lgsl_cut_byte($buffer, 4), "l");
  875. $server['p'][$player_key]['time'] = lgsl_time(lgsl_unpack(lgsl_cut_byte($buffer, 4), "f"));
  876. $player_key ++;
  877. }
  878. }
  879. //---------------------------------------------------------+
  880. return $server;
  881. }}
  882. //------------------------------------------------------------------------------------------------------------+
  883. //------------------------------------------------------------------------------------------------------------+
  884. if (!function_exists('lgsl_query_06')) {
  885. function lgsl_query_06($type, $request, $server)
  886. {
  887. //---------------------------------------------------------+
  888. global $lgsl_fp;
  889. if ($type == "bf2142" || $type == "stalker" || $type == "crysis")
  890. {
  891. fwrite($lgsl_fp, "\xFE\xFD\x09\x21\x21\x21\x21\xFF\xFF\xFF\x01");
  892. $challenge_packet = fread($lgsl_fp, 4096);
  893. if (!$challenge_packet) { return FALSE; }
  894. $challenge_code = substr($challenge_packet, 5, -1); // REMOVE PACKET HEADER AND TRAILING NULL CHARACTER
  895. // IF CODE IS RETURNED ( SOME STALKER SERVERS RETURN BLANK INDICATING THE CODE IS NOT NEEDED )
  896. // CONVERT DECIMAL |TO| HEX AS 8 CHARACTER STRING |TO| 4 PAIRS OF HEX |TO| 4 PAIRS OF DECIMAL |TO| 4 PAIRS OF ASCII
  897. $challenge_code = $challenge_code ? chr($challenge_code >> 24).chr($challenge_code >> 16).chr($challenge_code >> 8).chr($challenge_code >> 0) : "";
  898. }
  899. fwrite($lgsl_fp, "\xFE\xFD\x00\x21\x21\x21\x21".$challenge_code."\xFF\xFF\xFF\x01");
  900. //---------------------------------------------------------+
  901. $packet_check = "/(hostname\\x00|player_\\x00|score_\\x00|ping_\\x00|deaths_\\x00|pid_\\x00|skill_\\x00|team_\\x00|team_t\\x00|score_t\\x00)/Us";
  902. if ($type == "bf2") { $packet_check_expected = 10; }
  903. elseif ($type == "bf2124") { $packet_check_expected = 10; }
  904. elseif ($type == "graw") { $packet_check_expected = 3; }
  905. elseif ($type == "stalker") { $packet_check_expected = 6; }
  906. elseif ($type == "crysis") { $packet_check_expected = 1; }
  907. else { $packet_check_expected = 1; }
  908. //---------------------------------------------------------+
  909. $packet1 = fread($lgsl_fp, 4096); // GET FIRST PACKET
  910. if (!trim($packet1)) { return FALSE; } // DO NOT CONTINUE IF EMPTY
  911. preg_match_all($packet_check, $packet1, $match); // SCAN RETURNED DATA
  912. if (count(array_unique($match[1])) < $packet_check_expected) // DATA INCOMPLETE
  913. {
  914. $packet2 = fread($lgsl_fp, 4096); // GET SECOND PACKET
  915. if (!trim($packet2)) { return FALSE; } // DO NOT CONTINUE IF EMPTY
  916. preg_match_all($packet_check, $packet1.$packet2, $match); // SCAN RETURNED DATA
  917. if (count(array_unique($match[1])) < $packet_check_expected) // DATA INCOMPLETE
  918. {
  919. $packet3 = fread($lgsl_fp, 4096); // GET THIRD PACKET
  920. if (!trim($packet3)) { return FALSE; } // DO NOT CONTINUE IF EMPTY
  921. preg_match_all($packet_check, $packet1.$packet2.$packet3, $match); // SCAN RETURNED DATA
  922. if (count(array_unique($match[1])) < $packet_check_expected) // DATA INCOMPLETE
  923. {
  924. return FALSE; // DO NOT CONTINUE
  925. }
  926. }
  927. }
  928. //---------------------------------------------------------+
  929. // SWAP PACKETS THAT ARE SENT IN THE WRONG ORDER
  930. if (strpos($packet3, "hostname\x00") !== FALSE ) { $tmp = $packet3; $packet3 = $packet1; $packet1 = $tmp; }
  931. if (strpos($packet2, "hostname\x00") !== FALSE ) { $tmp = $packet2; $packet2 = $packet1; $packet1 = $tmp; }
  932. if (strpos($packet2, "score_t") !== FALSE ) { $tmp = $packet3; $packet3 = $packet2; $packet2 = $tmp; }
  933. //---------------------------------------------------------+
  934. // REMOVE INCOMPLETE FIELDS FROM THE END OF MULTI-PACKETS
  935. if ($packet2 && substr($packet1, -1) != "\x00\x00")
  936. {
  937. $tmp = explode("\x00", $packet1); // EXPLODE INTO BITS
  938. array_pop($tmp); // REMOVE x00
  939. array_pop($tmp); // REMOVE INCOMPLETE FIELD
  940. $tmp = implode("\x00", $tmp); // RE-JOIN BITS
  941. $tmp .= "\x00\x00"; // ADD END x00x00
  942. $packet1 = $tmp; // SET PACKET
  943. }
  944. if ($packet3 && substr($packet2, -2) != "\x00\x00")
  945. {
  946. $tmp = explode("\x00", $packet2); // EXPLODE INTO BITS
  947. array_pop($tmp); // REMOVE x00
  948. array_pop($tmp); // REMOVE INCOMPLETE FIELD
  949. $tmp = implode("\x00", $tmp); // RE-JOIN BITS
  950. $tmp .= "\x00\x00"; // ADD END x00x00
  951. $packet2 = $tmp; // SET PACKET
  952. }
  953. //---------------------------------------------------------+
  954. $buffer = $packet1.$packet2.$packet3; // JOIN PACKETS
  955. $buffer = substr($buffer, 16); // REMOVE HEADER
  956. $buffer = preg_replace("/\\x00\\x00....splitnum/Us", "", $buffer); // REMOVE MULTI-PACKET HEADERS
  957. $part = explode("\x01", $buffer, 2); // SPLIT INTO SETTINGS/PLAYERS
  958. //---------------------------------------------------------+
  959. $item = explode("\x00", $part[0]); // SPLIT PART INTO ITEMS
  960. foreach ($item as $item_key => $data_key)
  961. {
  962. if ($item_key % 2) { continue; } // SKIP ODD ITEM KEY
  963. if ($data_key == "") { continue; } // SKIP BLANK DATA KEY
  964. $data_key = strtolower($data_key); // LOWERCASE DATA KEY
  965. $server['e'][$data_key] = $item[$item_key + 1];
  966. }
  967. //---------------------------------------------------------+
  968. $server['s']['game'] = $server['e']['gamename'];
  969. $server['s']['name'] = $server['e']['hostname'];
  970. $server['s']['map'] = $server['e']['mapname'];
  971. $server['s']['players'] = $server['e']['numplayers'];
  972. $server['s']['playersmax'] = $server['e']['maxplayers'];
  973. $server['s']['password'] = $server['e']['password'];
  974. //---------------------------------------------------------+
  975. $server['p'] = array();
  976. if ($server['s']['players'] == 0) { return $server; } // NO PLAYERS
  977. $player_name = preg_match_all("/player_\\x00.(.*)\\x00\\x00/Us", $part[1], $match);
  978. $player_name = $match[1][0] ? explode( "\x00", $match[1][0]."\x00".$match[1][1]) : "";
  979. $player_score = preg_match_all( "/score_\\x00.(.*)\\x00\\x00/Us", $part[1], $match);
  980. $player_score = $match[1][0] ? explode( "\x00", $match[1][0]."\x00".$match[1][1]) : "";
  981. $player_ping = preg_match_all( "/ping_\\x00.(.*)\\x00\\x00/Us", $part[1], $match);
  982. $player_ping = $match[1][0] ? explode( "\x00", $match[1][0]."\x00".$match[1][1]) : "";
  983. $player_deaths = preg_match_all("/deaths_\\x00.(.*)\\x00\\x00/Us", $part[1], $match);
  984. $player_deaths = $match[1][0] ? explode( "\x00", $match[1][0]."\x00".$match[1][1]) : "";
  985. $player_pid = preg_match_all( "/pid_\\x00.(.*)\\x00\\x00/Us", $part[1], $match);
  986. $player_pid = $match[1][0] ? explode( "\x00", $match[1][0]."\x00".$match[1][1]) : "";
  987. $player_skill = preg_match_all( "/skill_\\x00.(.*)\\x00\\x00/Us", $part[1], $match);
  988. $player_skill = $match[1][0] ? explode( "\x00", $match[1][0]."\x00".$match[1][1]) : "";
  989. $player_team = preg_match_all( "/team_\\x00.(.*)\\x00\\x00/Us", $part[1], $match);
  990. $player_team = $match[1][0] ? explode( "\x00", $match[1][0]."\x00".$match[1][1]) : "";
  991. $player_team_name = preg_match_all( "/team_t\\x00.(.*)\\x00\\x00/Us", $part[1], $match);
  992. $player_team_name = $match[1][0] ? explode( "\x00", $match[1][0]."\x00".$match[1][1]) : "";
  993. foreach ($player_name as $key => $name)
  994. {
  995. if (!$name) { continue; } // IGNORE EMPTY NAMES
  996. if ($player_name) { $server['p'][$key]['name'] = $player_name[$key]; }
  997. if ($player_score) { $server['p'][$key]['score'] = $player_score[$key]; }
  998. if ($player_ping) { $server['p'][$key]['ping'] = $player_ping[$key]; }
  999. if ($player_deaths) { $server['p'][$key]['deaths'] = $player_deaths[$key]; }
  1000. if ($player_pid) { $server['p'][$key]['pid'] = $player_pid[$key]; }
  1001. if ($player_skill) { $server['p'][$key]['skill'] = $player_skill[$key]; }
  1002. if ($player_team) { $server['p'][$key]['team'] = $player_team_name ? $player_team_name[$player_team[$key] - 1] : $player_team[$key]; } // -1 BECAUSE: TEAM=1/2 TEAMNAME=0/1
  1003. }
  1004. //---------------------------------------------------------+
  1005. return $server;
  1006. }}
  1007. //------------------------------------------------------------------------------------------------------------+
  1008. //------------------------------------------------------------------------------------------------------------+
  1009. if (!function_exists('lgsl_query_07')) {
  1010. function lgsl_query_07($type, $request, $server)
  1011. {
  1012. //---------------------------------------------------------+
  1013. global $lgsl_fp;
  1014. fwrite($lgsl_fp, "\xFF\xFF\xFF\xFFstatus\x00");
  1015. $buffer = fread($lgsl_fp, 4096);
  1016. if (!$buffer) { return FALSE; }
  1017. //---------------------------------------------------------+
  1018. $buffer = substr($buffer, 6, -2); // REMOVE PACKET HEADER AND FOOTER
  1019. $part = explode("\n", $buffer); // SPLIT INTO SETTINGS/PLAYER/PLAYER/PLAYER
  1020. //---------------------------------------------------------+
  1021. $item = explode("\\", $part[0]); // SPLIT PART INTO ITEMS
  1022. foreach ($item as $item_key => $data_key)
  1023. {
  1024. if ($item_key % 2) { continue; } // SKIP ODD ITEM KEY
  1025. $data_key = strtolower($data_key); // LOWERCASE DATA KEY
  1026. $server['e'][$data_key] = $item[$item_key + 1];
  1027. }
  1028. //---------------------------------------------------------+
  1029. array_shift($part); // REMOVE SETTINGS AND SHIFT KEYS
  1030. $server['p'] = array();
  1031. foreach ($part as $key => $data)
  1032. {
  1033. preg_match("/(.*) (.*) (.*) (.*) \"(.*)\" \"(.*)\" (.*) (.*)/s", $data, $match); // GREEDY MATCH FOR SKINS
  1034. $server['p'][$key]['pid'] = $match[1];
  1035. $server['p'][$key]['score'] = $match[2];
  1036. $server['p'][$key]['time'] = $match[3];
  1037. $server['p'][$key]['ping'] = $match[4];
  1038. $server['p'][$key]['name'] = lgsl_parse_color($match[5], $type);
  1039. $server['p'][$key]['skin'] = $match[6];
  1040. $server['p'][$key]['skin_top'] = $match[7];
  1041. $server['p'][$key]['skin_bottom'] = $match[8];
  1042. }
  1043. //---------------------------------------------------------+
  1044. $server['s']['game'] = $server['e']['*gamedir'];
  1045. $server['s']['name'] = $server['e']['hostname'];
  1046. $server['s']['map'] = $server['e']['map'];
  1047. $server['s']['players'] = $server['p'] ? count($server['p']) : 0;
  1048. $server['s']['playersmax'] = $server['e']['maxclients'];
  1049. $server['s']['password'] = $server['e']['needpass'] > 0 && $server['e']['needpass'] < 4 ? 1 : 0;
  1050. //---------------------------------------------------------+
  1051. return $server;
  1052. }}
  1053. //------------------------------------------------------------------------------------------------------------+
  1054. //------------------------------------------------------------------------------------------------------------+
  1055. if (!function_exists('lgsl_query_08')) {
  1056. function lgsl_query_08($type, $request, $server)
  1057. {
  1058. //---------------------------------------------------------+
  1059. global $lgsl_fp;
  1060. fwrite($lgsl_fp, "s");
  1061. $buffer = fread($lgsl_fp, 4096);
  1062. if (!$buffer) { return FALSE; }
  1063. //---------------------------------------------------------+
  1064. $buffer = substr($buffer, 4); // REMOVE PACKET HEADER
  1065. $server['e']['gamename'] = lgsl_cut_pascal($buffer, 1, -1);
  1066. $server['e']['hostport'] = lgsl_cut_pascal($buffer, 1, -1);
  1067. $server['s']['name'] = lgsl_parse_color(lgsl_cut_pascal($buffer, 1, -1), $type);
  1068. $server['e']['gamemode'] = lgsl_cut_pascal($buffer, 1, -1);
  1069. $server['s']['map'] = lgsl_cut_pascal($buffer, 1, -1);
  1070. $server['e']['version'] = lgsl_cut_pascal($buffer, 1, -1);
  1071. $server['s']['password'] = lgsl_cut_pascal($buffer, 1, -1);
  1072. $server['s']['players'] = lgsl_cut_pascal($buffer, 1, -1);
  1073. $server['s']['playersmax'] = lgsl_cut_pascal($buffer, 1, -1);
  1074. while ($buffer && $buffer[0] != "\x01")
  1075. {
  1076. $item_key = strtolower(lgsl_cut_pascal($buffer, 1, -1));
  1077. $item_value = lgsl_cut_pascal($buffer, 1, -1);
  1078. $server['e'][$item_key] = $item_value;
  1079. }
  1080. $buffer = substr($buffer, 1); // REMOVE END MARKER
  1081. //---------------------------------------------------------+
  1082. $server['p'] = array();
  1083. while ($buffer)
  1084. {
  1085. $field_character = lgsl_cut_byte($buffer, 1); // BITWISE OF FIELDS ( HARD CODED BELOW BECAUSE GAMES DO NOT USE IT PROPERLY )
  1086. if ($field_character == "\x3D") { $field_list = array("name", "score", "", "time"); } // FARCRY PLAYERS CONNECTING
  1087. elseif ($type == "farcry") { $field_list = array("name", "team", "", "score", "ping", "time"); } // FARCRY PLAYERS JOINED
  1088. elseif ($type == "mta") { $field_list = array("name", "", "score", "ping", "" ); }
  1089. elseif ($type == "painkiller") { $field_list = array("name", "", "skin", "score", "ping", "" ); }
  1090. elseif ($type == "soldat") { $field_list = array("name", "team", "", "score", "ping", "time"); }
  1091. foreach ($field_list as $item_key)
  1092. {
  1093. $item_value = lgsl_cut_pascal($buffer, 1, -1);
  1094. if (!$item_key) { continue; }
  1095. if ($item_key == "name") { lgsl_parse_color($item_value, $type); }
  1096. $server['p'][$player_key][$item_key] = $item_value;
  1097. }
  1098. $player_key ++;
  1099. }
  1100. //---------------------------------------------------------+
  1101. return $server;
  1102. }}
  1103. //------------------------------------------------------------------------------------------------------------+
  1104. //------------------------------------------------------------------------------------------------------------+
  1105. if (!function_exists('lgsl_query_09')) {
  1106. function lgsl_query_09($type, $request, $server)
  1107. {
  1108. //---------------------------------------------------------+
  1109. global $lgsl_fp;
  1110. if ($request == "s" || $request == "e") { fwrite($lgsl_fp, "\xFE\xFD\x00\x21\x21\x21\x21\xFF\x00\x00\x00"); }
  1111. elseif ($request == "p") { fwrite($lgsl_fp, "\xFE\xFD\x00\x21\x21\x21\x21\x00\xFF\x00\x00"); }
  1112. $buffer = fread($lgsl_fp, 4096);
  1113. if (!$buffer) { return FALSE; }
  1114. //---------------------------------------------------------+
  1115. if ($request == "s" || $request == "e")
  1116. {
  1117. $buffer = substr($buffer, 5, -2); // REMOVE PACKET HEADER AND FOOTER
  1118. $item = explode("\x00", $buffer); // SPLIT INTO ITEMS
  1119. foreach ($item as $item_key => $data_key)
  1120. {
  1121. if ($item_key % 2) { continue; } // SKIP EVEN ITEM KEY
  1122. $data_key = strtolower($data_key); // LOWERCASE DATA KEY
  1123. $server['e'][$data_key] = $item[$item_key + 1];
  1124. }
  1125. $server['s']['name'] = $server['e']['hostname'];
  1126. $server['s']['map'] = $server['e']['mapname'];
  1127. $server['s']['players'] = $server['e']['numplayers'];
  1128. $server['s']['playersmax'] = $server['e']['maxplayers'];
  1129. $server['s']['password'] = $server['e']['password'];
  1130. if ($server['e']['game_id']) { $server['s']['game'] = $server['e']['game_id']; } // BFVIETNAM
  1131. elseif ($server['e']['gsgamename']) { $server['s']['game'] = $server['e']['gsgamename']; } // FEAR
  1132. elseif ($server['e']['gamename']) { $server['s']['game'] = $server['e']['gamename']; } // AARMY
  1133. if ($type == "arma")
  1134. {
  1135. $server['s']['map'] = $server['e']['mission'];
  1136. }
  1137. elseif ($type == "vietcong2")
  1138. {
  1139. $server['e']['extinfo_autobalance'] = ord($server['e']['extinfo'][18]) == 2 ? "off" : "on";
  1140. // [ 13 = Vietnam and RPG Mode 19 1b 99 9b ] [ 22 23 = Mounted MG Limit ]
  1141. // [ 27 = Idle Limit ] [ 18 = Auto Balance ] [ 55 = Chat and Blind Spectator 5a 5c da dc ]
  1142. }
  1143. }
  1144. //---------------------------------------------------------+
  1145. if ($request == "p")
  1146. {
  1147. $buffer = substr($buffer, 7, -1); // REMOVE HEADER / PLAYER TOTAL / FOOTER
  1148. $server['p'] = array();
  1149. if (strpos($buffer, "\x00\x00") === FALSE) { return $server; } // NO PLAYERS
  1150. $buffer = explode("\x00\x00",$buffer, 2); // SPLIT FIELDS FROM ITEMS
  1151. $buffer[0] = str_replace("_", "", $buffer[0]); // REMOVE UNDERSCORES FROM FIELDS
  1152. $buffer[0] = str_replace("player", "name", $buffer[0]); // CONVERT TO STANDARD
  1153. $field_list = explode("\x00",$buffer[0]); // SPLIT UP FIELDS
  1154. $item = explode("\x00",$buffer[1]); // SPLIT UP ITEMS
  1155. $item_position = 0;
  1156. $item_total = count($item);
  1157. $player_key = 0;
  1158. do
  1159. {
  1160. foreach ($field_list as $field)
  1161. {
  1162. $server['p'][$player_key][$field] = $item[$item_position];
  1163. $item_position ++; // MOVE TO NEXT ITEM
  1164. }
  1165. $player_key ++; // MOVE TO NEXT PLAYER
  1166. }
  1167. while ($item_position < $item_total);
  1168. }
  1169. if ($type == "serioussam2") { $server['p'] = array(); } // IGNORE "Unknown Player" THAT SERIOUS SAM 2 RETURNS
  1170. //---------------------------------------------------------+
  1171. return $server;
  1172. }}
  1173. //------------------------------------------------------------------------------------------------------------+
  1174. //------------------------------------------------------------------------------------------------------------+
  1175. if (!function_exists('lgsl_query_10')) {
  1176. function lgsl_query_10($type, $request, $server)
  1177. {
  1178. //---------------------------------------------------------+
  1179. global $lgsl_fp;
  1180. if ($type == "quakewars") { fwrite($lgsl_fp, "\xFF\xFFgetInfoEX\xFF"); }
  1181. else { fwrite($lgsl_fp, "\xFF\xFFgetInfo\xFF"); }
  1182. $buffer = fread($lgsl_fp, 4096);
  1183. if (!$buffer) { return FALSE; }
  1184. //---------------------------------------------------------+
  1185. if ($type == "quakewars") { $buffer = substr($buffer, 33); } // REMOVE PACKET HEADER ( EXTENDED )
  1186. else { $buffer = substr($buffer, 23); }
  1187. $buffer = lgsl_parse_color($buffer, "2");
  1188. //---------------------------------------------------------+
  1189. while ($buffer && $buffer[0] != "\x00")
  1190. {
  1191. $item_key = strtolower(lgsl_cut_string($buffer));
  1192. $item_value = lgsl_cut_string($buffer);
  1193. $server['e'][$item_key] = $item_value;
  1194. }
  1195. //---------------------------------------------------------+
  1196. $buffer = substr($buffer, 2);
  1197. $server['p'] = array();
  1198. $player_key = 0;
  1199. //---------------------------------------------------------+
  1200. if ($type == "quakewars")
  1201. {
  1202. while ($buffer && $buffer[0] != "\x20") // QUAKEWARS: (PID)(PING)(NAME)(TAGPOSITION)(TAG)(BOT)
  1203. {
  1204. $server['p'][$player_key]['pid'] = ord(lgsl_cut_byte($buffer, 1));
  1205. $server['p'][$player_key]['ping'] = lgsl_unpack(lgsl_cut_byte($buffer, 2), "S");
  1206. $player_name = lgsl_cut_string($buffer);
  1207. $player_tag_position = ord(lgsl_cut_byte($buffer, 1));
  1208. $player_tag = lgsl_cut_string($buffer);
  1209. $server['p'][$player_key]['bot'] = ord(lgsl_cut_byte($buffer, 1));
  1210. if ($player_tag_position == "") { $server['p'][$player_key]['name'] = $player_name; }
  1211. elseif ($player_tag_position == "1") { $server['p'][$player_key]['name'] = $player_name." ".$player_tag; }
  1212. else { $server['p'][$player_key]['name'] = $player_tag." ".$player_name; }
  1213. $player_key ++;
  1214. }
  1215. $buffer = substr($buffer, 1);
  1216. $server['e']['si_osmask'] = lgsl_unpack(lgsl_cut_byte($buffer, 4), "I");
  1217. $server['e']['si_ranked'] = ord(lgsl_cut_byte($buffer, 1));
  1218. $server['e']['si_timeleft'] = lgsl_time(lgsl_unpack(lgsl_cut_byte($buffer, 4), "I") / 1000);
  1219. $server['e']['si_gamestate'] = ord(lgsl_cut_byte($buffer, 1));
  1220. $buffer = substr($buffer, 2);
  1221. $player_key = 0;
  1222. while ($buffer && $buffer[0] != "\x20") // QUAKEWARS EXTENDED: (PID)(XP)(TEAM)(KILLS)(DEATHS)
  1223. {
  1224. $server['p'][$player_key]['pidex'] = ord(lgsl_cut_byte($buffer, 1));
  1225. $server['p'][$player_key]['xp'] = intval(lgsl_unpack(lgsl_cut_byte($buffer, 4), "f"));
  1226. $server['p'][$player_key]['team'] = lgsl_cut_string($buffer);
  1227. $server['p'][$player_key]['score'] = lgsl_unpack(lgsl_cut_byte($buffer, 4), "i");
  1228. $server['p'][$player_key]['deaths'] = lgsl_unpack(lgsl_cut_byte($buffer, 4), "i");
  1229. $player_key ++;
  1230. }
  1231. }
  1232. //---------------------------------------------------------+
  1233. elseif ($type == "quake4") // QUAKE4: (PID)(PING)(RATE)(NULLNULL)(NAME)(TAG)
  1234. {
  1235. while ($buffer && $buffer[0] != "\x20")
  1236. {
  1237. $server['p'][$player_key]['pid'] = ord(lgsl_cut_byte($buffer, 1));
  1238. $server['p'][$player_key]['ping'] = lgsl_unpack(lgsl_cut_byte($buffer, 2), "S");
  1239. $server['p'][$player_key]['rate'] = lgsl_unpack(lgsl_cut_byte($buffer, 2), "S");
  1240. $buffer = substr($buffer, 2);
  1241. $player_name = lgsl_cut_string($buffer);
  1242. $player_tag = lgsl_cut_string($buffer);
  1243. $server['p'][$player_key]['name'] = $player_tag ? $player_tag." ".$player_name : $player_name;
  1244. $player_key ++;
  1245. }
  1246. }
  1247. //---------------------------------------------------------+
  1248. elseif ($type == "doom3") // DOOM3: (PID)(PING)(RATE)(NULLNULL)(NAME)
  1249. {
  1250. while ($buffer && $buffer[0] != "\x20")
  1251. {
  1252. $server['p'][$player_key]['pid'] = ord(lgsl_cut_byte($buffer, 1));
  1253. $server['p'][$player_key]['ping'] = lgsl_unpack(lgsl_cut_byte($buffer, 2), "S");
  1254. $server['p'][$player_key]['rate'] = lgsl_unpack(lgsl_cut_byte($buffer, 2), "S");
  1255. $buffer = substr($buffer, 2);
  1256. $server['p'][$player_key]['name'] = lgsl_cut_string($buffer);
  1257. $player_key ++;
  1258. }
  1259. }
  1260. //---------------------------------------------------------+
  1261. $server['s']['game'] = $server['e']['gamename'];
  1262. $server['s']['name'] = $server['e']['si_name'];
  1263. $server['s']['map'] = $server['e']['si_map'];
  1264. $server['s']['players'] = $server['p'] ? count($server['p']) : 0;
  1265. $server['s']['playersmax'] = $server['e']['si_maxplayers'];
  1266. if ($type == "quakewars")
  1267. {
  1268. $server['s']['map'] = str_replace(".entities", "", $server['s']['map']);
  1269. $server['s']['password'] = $server['e']['si_needpass'];
  1270. }
  1271. else
  1272. {
  1273. $server['s']['password'] = $server['e']['si_usepass'];
  1274. }
  1275. //---------------------------------------------------------+
  1276. return $server;
  1277. }}
  1278. //------------------------------------------------------------------------------------------------------------+
  1279. //------------------------------------------------------------------------------------------------------------+
  1280. if (!function_exists('lgsl_query_11')) {
  1281. function lgsl_query_11($type, $request, $server)
  1282. {
  1283. //---------------------------------------------------------+
  1284. // REFERENCE: http://wiki.unrealadmin.org/UT3_query_protocol
  1285. global $lgsl_fp;
  1286. fwrite($lgsl_fp, "\xFE\xFD\x09\x21\x21\x21\x21\xFF\xFF\xFF\x01");
  1287. $challenge_packet = fread($lgsl_fp, 4096);
  1288. if (!$challenge_packet) { return FALSE; }
  1289. $challenge_code = substr($challenge_packet, 5, -1); // REMOVE PACKET HEADER AND TRAILING NULL CHARACTER
  1290. // IF CODE IS RETURNED CONVERT DECIMAL |TO| HEX AS 8 CHARACTER STRING |TO| 4 PAIRS OF HEX |TO| 4 PAIRS OF DECIMAL |TO| 4 PAIRS OF ASCII
  1291. $challenge_code = $challenge_code ? chr($challenge_code >> 24).chr($challenge_code >> 16).chr($challenge_code >> 8).chr($challenge_code >> 0) : "";
  1292. fwrite($lgsl_fp, "\xFE\xFD\x00\x21\x21\x21\x21".$challenge_code."\xFF\xFF\xFF\x01");
  1293. $buffer = fread($lgsl_fp, 4096);
  1294. if (!$buffer) { return FALSE; }
  1295. //---------------------------------------------------------+
  1296. $lgsl_ut3_key = array("s0" => "bots_skill",
  1297. "s1" => "unknown_1",
  1298. "s6" => "pure",
  1299. "s7" => "password",
  1300. "s8" => "bots_vs",
  1301. "s9" => "unknown_2",
  1302. "s10" => "forcerespawn",
  1303. "s11" => "unknown_3",
  1304. "s12" => "unknown_4",
  1305. "s13" => "unknown_5",
  1306. "s14" => "unknown_6",
  1307. "s32779" => "unknown_7",
  1308. "p268435703" => "bots",
  1309. "p268435704" => "goalscore",
  1310. "p268435705" => "timelimit",
  1311. "p268435717" => "mutators_default",
  1312. "p1073741825" => "mapname",
  1313. "p1073741826" => "gametype",
  1314. "p1073741827" => "description",
  1315. "p1073741828" => "mutators_custom");
  1316. //---------------------------------------------------------+
  1317. $buffer = substr($buffer, 16); // REMOVE PACKET HEADER
  1318. $buffer = explode("\x01", $buffer, 2); // SPLIT SETTINGS AND PLAYERS
  1319. $item = explode("\x00", $buffer[0]); // SPLIT INTO ITEMS
  1320. foreach ($item as $item_key => $data_key)
  1321. {
  1322. if ($item_key % 2) { continue; } // SKIP ITEM ODD KEY
  1323. if ($data_key == "") { continue; } // SKIP BLANK DATA KEY
  1324. if ($data_key == "mapname") { continue; } // SKIP AS THIS IS REALLY SCREWED UP ON THE CURRENT UT3 SERVERS
  1325. $data_key = $lgsl_ut3_key[$data_key] ? $lgsl_ut3_key[$data_key] : strtolower($data_key); // CONVERT TO HUMAN FRIENDLY KEY
  1326. $server['e'][$data_key] = $item[$item_key + 1];
  1327. }
  1328. //---------------------------------------------------------+
  1329. $tmp = $server['e']['mutators_default'];
  1330. $server['e']['mutators_default'] = "";
  1331. if ($tmp & 1) { $server['e']['mutators_default'] .= " BigHead"; }
  1332. if ($tmp & 2) { $server['e']['mutators_default'] .= " FriendlyFire"; }
  1333. if ($tmp & 4) { $server['e']['mutators_default'] .= " Handicap"; }
  1334. if ($tmp & 8) { $server['e']['mutators_default'] .= " Instagib"; }
  1335. if ($tmp & 16) { $server['e']['mutators_default'] .= " LowGrav"; }
  1336. if ($tmp & 64) { $server['e']['mutators_default'] .= " NoPowerups"; }
  1337. if ($tmp & 128) { $server['e']['mutators_default'] .= " NoTranslocator"; }
  1338. if ($tmp & 256) { $server['e']['mutators_default'] .= " Slomo"; }
  1339. if ($tmp & 1024) { $server['e']['mutators_default'] .= " SpeedFreak"; }
  1340. if ($tmp & 2048) { $server['e']['mutators_default'] .= " SuperBerserk"; }
  1341. if ($tmp & 8192) { $server['e']['mutators_default'] .= " WeaponReplacement"; }
  1342. if ($tmp & 16384) { $server['e']['mutators_default'] .= " WeaponsRespawn"; }
  1343. $server['e']['mutators_default'] = str_replace(" ", " / ", trim($server['e']['mutators_default']));
  1344. $server['e']['mutators_custom'] = str_replace("\x1c", " / ", $server['e']['mutators_custom']);
  1345. //---------------------------------------------------------+
  1346. $server['s']['name'] = $server['e']['hostname'];
  1347. $server['s']['map'] = $server['e']['mapname'];
  1348. $server['s']['players'] = $server['e']['numplayers'];
  1349. $server['s']['playersmax'] = $server['e']['maxplayers'];
  1350. $server['s']['password'] = $server['e']['password'];
  1351. //---------------------------------------------------------+
  1352. $server['p'] = array(); // DOES NOT RETURN PLAYER INFORMATION
  1353. //---------------------------------------------------------+
  1354. return $server;
  1355. }}
  1356. //------------------------------------------------------------------------------------------------------------+
  1357. //------------------------------------------------------------------------------------------------------------+
  1358. if (!function_exists('lgsl_query_12')) {
  1359. function lgsl_query_12($type, $request, $server)
  1360. {
  1361. //---------------------------------------------------------+
  1362. global $lgsl_fp;
  1363. if ($request == "s") { fwrite($lgsl_fp, "SAMP\x21\x21\x21\x21\x00\x00i"); } // THIS SIMPLIFIED QUERY WORKS BUT INCASE
  1364. elseif ($request == "e") { fwrite($lgsl_fp, "SAMP\x21\x21\x21\x21\x00\x00r"); } // IT BREAKS THE OFFICIAL EXAMPLE USES
  1365. elseif ($request == "p") { fwrite($lgsl_fp, "SAMP\x21\x21\x21\x21\x00\x00d"); } // THE SERVER IP IN HEX INSTEAD OF x21
  1366. $buffer = fread($lgsl_fp, 4096);
  1367. if (!substr($buffer, 0, 4) == "SAMP") { return FALSE; }
  1368. //---------------------------------------------------------+
  1369. $buffer = substr($buffer, 11); // REMOVE PACKET HEADER
  1370. //---------------------------------------------------------+
  1371. if ($request == "s")
  1372. {
  1373. $server['s']['password'] = ord(lgsl_cut_byte($buffer, 1));
  1374. $server['s']['players'] = ord(lgsl_cut_byte($buffer, 2));
  1375. $server['s']['playersmax'] = ord(lgsl_cut_byte($buffer, 2));
  1376. $server['s']['name'] = lgsl_cut_pascal($buffer, 4);
  1377. $server['e']['gametype'] = lgsl_cut_pascal($buffer, 4);
  1378. $server['s']['map'] = lgsl_cut_pascal($buffer, 4);
  1379. }
  1380. //---------------------------------------------------------+
  1381. if ($request == "e")
  1382. {
  1383. $item_total = ord(lgsl_cut_byte($buffer, 2));
  1384. for ($i=0; $i<$item_total; $i++)
  1385. {
  1386. if (!$buffer) { return FALSE; }
  1387. $data_key = strtolower(lgsl_cut_pascal($buffer, 1));
  1388. $data_value = lgsl_cut_pascal($buffer, 1);
  1389. $server['e'][$data_key] = $data_value;
  1390. }
  1391. }
  1392. //---------------------------------------------------------+
  1393. if ($request == "p")
  1394. {
  1395. $server['p'] = array();
  1396. $player_total = ord(lgsl_cut_byte($buffer, 2));
  1397. for ($i=0; $i<$player_total; $i++)
  1398. {
  1399. if (!$buffer) { return FALSE; }
  1400. $server['p'][$i]['pid'] = ord(lgsl_cut_byte($buffer, 1));
  1401. $server['p'][$i]['name'] = lgsl_cut_pascal($buffer, 1);
  1402. $server['p'][$i]['score'] = lgsl_unpack(lgsl_cut_byte($buffer, 4), "S");
  1403. $server['p'][$i]['ping'] = lgsl_unpack(lgsl_cut_byte($buffer, 4), "S");
  1404. }
  1405. }
  1406. //---------------------------------------------------------+
  1407. return $server;
  1408. }}
  1409. //------------------------------------------------------------------------------------------------------------+
  1410. //------------------------------------------------------------------------------------------------------------+
  1411. if (!function_exists('lgsl_query_13')) {
  1412. function lgsl_query_13($type, $request, $server)
  1413. {
  1414. //---------------------------------------------------------+
  1415. global $lgsl_fp;
  1416. fwrite($lgsl_fp, "\x79\x00\x00\x00\x00"); // REQUEST [s]
  1417. fwrite($lgsl_fp, "\x79\x00\x00\x00\x01"); // REQUEST [e]
  1418. fwrite($lgsl_fp, "\x79\x00\x00\x00\x02"); // REQUEST [p]
  1419. //---------------------------------------------------------+
  1420. while ($packet = fread($lgsl_fp, 4096))
  1421. {
  1422. if ($packet[4] == "\x00") { $buffer_s .= substr($packet, 5); }
  1423. elseif ($packet[4] == "\x01") { $buffer_e .= substr($packet, 5); }
  1424. elseif ($packet[4] == "\x02") { $buffer_p .= substr($packet, 5); }
  1425. }
  1426. if (!$buffer_s) { return FALSE; }
  1427. //---------------------------------------------------------+
  1428. $buffer_s = str_replace("\xa0", "\x20", $buffer_s); // REPLACE SPECIAL SPACE WITH NORMAL SPACE
  1429. $buffer_s = substr($buffer_s, 5);
  1430. $server['e']['hostport'] = lgsl_unpack(lgsl_cut_byte($buffer_s, 4), "S");
  1431. $buffer_s = substr($buffer_s, 4);
  1432. $server['s']['name'] = substr(lgsl_cut_string($buffer_s), 1); // PASCAL NOT USED HERE AS
  1433. $server['s']['map'] = substr(lgsl_cut_string($buffer_s), 1); // ITS SOMETIMES INCORRECT
  1434. $server['e']['gametype'] = substr(lgsl_cut_string($buffer_s), 1);
  1435. $server['s']['players'] = lgsl_unpack(lgsl_cut_byte($buffer_s, 4), "S");
  1436. $server['s']['playersmax'] = lgsl_unpack(lgsl_cut_byte($buffer_s, 4), "S");
  1437. //---------------------------------------------------------+
  1438. while ($buffer_e && $buffer_e[0] != "\x00")
  1439. {
  1440. $item_key = strtolower(lgsl_cut_pascal($buffer_e, 1, -1, 1));
  1441. $item_value = lgsl_cut_pascal($buffer_e, 1, -1, 1);
  1442. $item_key = str_replace("\x1B\xFF\xFF\x01", "", $item_key); // REMOVE MOD
  1443. $item_value = str_replace("\x1B\xFF\xFF\x01", "", $item_value); // GARBAGE
  1444. $server['e'][$item_key] = $item_value;
  1445. }
  1446. //---------------------------------------------------------+
  1447. $server['p'] = array();
  1448. $player_key = 0;
  1449. while ($buffer_p && $buffer_p[0] != "\x00")
  1450. {
  1451. $server['p'][$player_key]['pid'] = lgsl_unpack(lgsl_cut_byte($buffer_p, 4), "S");
  1452. $server['p'][$player_key]['name'] = lgsl_cut_pascal($buffer_p, 1, -1, 1);
  1453. $server['p'][$player_key]['ping'] = lgsl_unpack(lgsl_cut_byte($buffer_p, 4), "S");
  1454. $server['p'][$player_key]['score'] = lgsl_unpack(lgsl_cut_byte($buffer_p, 4), "s");
  1455. $tmp = lgsl_cut_byte($buffer_p, 4);
  1456. if ($tmp[3] == "\x20") { $server['p'][$player_key]['team'] = 1; }
  1457. elseif ($tmp[3] == "\x40") { $server['p'][$player_key]['team'] = 2; }
  1458. $player_key ++;
  1459. }
  1460. //---------------------------------------------------------+
  1461. return $server;
  1462. }}
  1463. //------------------------------------------------------------------------------------------------------------+
  1464. //------------------------------------------------------------------------------------------------------------+
  1465. if (!function_exists('lgsl_query_14')) {
  1466. function lgsl_query_14($type, $request, $server)
  1467. {
  1468. //---------------------------------------------------------+
  1469. global $lgsl_fp;
  1470. fwrite($lgsl_fp, "\x00\x02\xf1\x26\x01\x26\xf0\x90\xa6\xf0\x26\x57\x4e\xac\xa0\xec\xf8\x68\xe4\x8d\x21");
  1471. $buffer = fread($lgsl_fp, 4096);
  1472. if (!$buffer) { return FALSE; }
  1473. //---------------------------------------------------------+
  1474. $buffer = substr($buffer, 4);
  1475. $server_name_length = lgsl_unpack(lgsl_cut_byte($buffer, 4), "i") - 90;
  1476. $buffer = substr($buffer, 1);
  1477. $server['s']['password'] = ord(lgsl_cut_byte($buffer, 1));
  1478. $buffer = substr($buffer, 10);
  1479. $server['s']['playersmax'] = lgsl_unpack(lgsl_cut_byte($buffer, 4), "I") - 1;
  1480. $buffer = substr($buffer, 4);
  1481. $server['s']['players'] = lgsl_unpack(lgsl_cut_byte($buffer, 4), "I") - 1;
  1482. $buffer = substr($buffer, 60);
  1483. $server['s']['name'] = str_replace("\x00", "", lgsl_cut_byte($buffer, $server_name_length));
  1484. $buffer = substr($buffer, 2);
  1485. $server['e']['unknown_1'] = lgsl_cut_string($buffer, ":");
  1486. $server['e']['unknown_2'] = lgsl_cut_string($buffer, ":");
  1487. $server['e']['unknown_3'] = lgsl_cut_string($buffer, ":");
  1488. $server['e']['unknown_4'] = lgsl_cut_string($buffer, ":");
  1489. $server['e']['unknown_5'] = lgsl_cut_string($buffer, ":");
  1490. $server['e']['motd'] = str_replace("\x00", "", $buffer);
  1491. $server['s']['map'] = "freelancer";
  1492. $server['p'] = array(); // DOES NOT RETURN PLAYER INFORMATION
  1493. //---------------------------------------------------------+
  1494. return $server;
  1495. }}
  1496. //------------------------------------------------------------------------------------------------------------+
  1497. //------------------------------------------------------------------------------------------------------------+
  1498. if (!function_exists('lgsl_query_15')) {
  1499. function lgsl_query_15($type, $request, $server)
  1500. {
  1501. //---------------------------------------------------------+
  1502. global $lgsl_fp;
  1503. fwrite($lgsl_fp, "GTR2_Direct_IP_Search\x00");
  1504. $buffer = fread($lgsl_fp, 4096);
  1505. if (!$buffer) { return FALSE; }
  1506. //---------------------------------------------------------+
  1507. $buffer = str_replace("\xFE", "\xFF", $buffer);
  1508. $buffer = explode("\xFF", $buffer);
  1509. $server['s']['name'] = $buffer[3];
  1510. $server['s']['game'] = $buffer[7];
  1511. $server['e']['version'] = $buffer[11];
  1512. $server['e']['hostport'] = $buffer[15];
  1513. $server['s']['map'] = $buffer[19];
  1514. $server['s']['players'] = $buffer[25];
  1515. $server['s']['playersmax'] = $buffer[27];
  1516. $server['e']['mode'] = $buffer[31];
  1517. $server['p'] = array(); // DOES NOT RETURN PLAYER INFORMATION
  1518. //---------------------------------------------------------+
  1519. return $server;
  1520. }}
  1521. //------------------------------------------------------------------------------------------------------------+
  1522. //------------------------------------------------------------------------------------------------------------+
  1523. if (!function_exists('lgsl_query_16')) {
  1524. function lgsl_query_16($type, $request, $server)
  1525. {
  1526. //---------------------------------------------------------+
  1527. // REFERENCE:
  1528. // http://www.planetpointy.co.uk/software/rfactorsspy.shtml
  1529. // http://users.pandora.be/viperius/mUtil/
  1530. // USES FIXED DATA POSITIONS WITH RANDOM CHARACTERS FILLING THE GAPS
  1531. global $lgsl_fp;
  1532. fwrite($lgsl_fp, "rF_S");
  1533. $buffer = fread($lgsl_fp, 4096);
  1534. if (!$buffer) { return FALSE; }
  1535. //---------------------------------------------------------+
  1536. // $server['e']['gamename'] = lgsl_get_string($buffer);
  1537. $buffer = substr($buffer, 8);
  1538. // $server['e']['fullupdate'] = lgsl_unpack($buffer[0], "C");
  1539. $server['e']['region'] = lgsl_unpack($buffer[1] .$buffer[2], "S");
  1540. // $server['e']['ip'] = ($buffer[3] .$buffer[4].$buffer[5].$buffer[6]); // UNSIGNED LONG
  1541. // $server['e']['size'] = lgsl_unpack($buffer[7] .$buffer[8], "S");
  1542. $server['e']['version'] = lgsl_unpack($buffer[9] .$buffer[10], "S");
  1543. // $server['e']['version_racecast'] = lgsl_unpack($buffer[11].$buffer[12], "S");
  1544. $server['e']['hostport'] = lgsl_unpack($buffer[13].$buffer[14], "S");
  1545. // $server['e']['queryport'] = lgsl_unpack($buffer[15].$buffer[16], "S");
  1546. $buffer = substr($buffer, 17);
  1547. $server['s']['game'] = lgsl_get_string($buffer);
  1548. $buffer = substr($buffer, 20);
  1549. $server['s']['name'] = lgsl_get_string($buffer);
  1550. $buffer = substr($buffer, 28);
  1551. $server['s']['map'] = lgsl_get_string($buffer);
  1552. $buffer = substr($buffer, 32);
  1553. $server['e']['motd'] = lgsl_get_string($buffer);
  1554. $buffer = substr($buffer, 96);
  1555. $server['e']['packed_aids'] = lgsl_unpack($buffer[0].$buffer[1], "S");
  1556. // $server['e']['ping'] = lgsl_unpack($buffer[2].$buffer[3], "S");
  1557. $server['e']['packed_flags'] = lgsl_unpack($buffer[4], "C");
  1558. $server['e']['rate'] = lgsl_unpack($buffer[5], "C");
  1559. $server['s']['players'] = lgsl_unpack($buffer[6], "C");
  1560. $server['s']['playersmax'] = lgsl_unpack($buffer[7], "C");
  1561. $server['e']['bots'] = lgsl_unpack($buffer[8], "C");
  1562. $server['e']['packed_special'] = lgsl_unpack($buffer[9], "C");
  1563. $server['e']['damage'] = lgsl_unpack($buffer[10], "C");
  1564. $server['e']['packed_rules'] = lgsl_unpack($buffer[11].$buffer[12], "S");
  1565. $server['e']['credits1'] = lgsl_unpack($buffer[13], "C");
  1566. $server['e']['credits2'] = lgsl_unpack($buffer[14].$buffer[15], "S");
  1567. $server['e']['time'] = lgsl_time(lgsl_unpack($buffer[16].$buffer[17], "S"));
  1568. $server['e']['laps'] = lgsl_unpack($buffer[18].$buffer[19], "s") / 16;
  1569. $buffer = substr($buffer, 23);
  1570. $server['e']['vehicles'] = lgsl_get_string($buffer);
  1571. //---------------------------------------------------------+
  1572. $server['s']['password'] = ($server['e']['packed_special'] & 2) ? 1 : 0;
  1573. $server['e']['racecast'] = ($server['e']['packed_special'] & 4) ? 1 : 0;
  1574. $server['e']['fixedsetups'] = ($server['e']['packed_special'] & 16) ? 1 : 0;
  1575. $tmp = $server['e']['packed_aids'];
  1576. if ($tmp & 1) { $server['e']['aids'] .= " TractionControl"; }
  1577. if ($tmp & 2) { $server['e']['aids'] .= " AntiLockBraking"; }
  1578. if ($tmp & 4) { $server['e']['aids'] .= " StabilityControl"; }
  1579. if ($tmp & 8) { $server['e']['aids'] .= " AutoShifting"; }
  1580. if ($tmp & 16) { $server['e']['aids'] .= " AutoClutch"; }
  1581. if ($tmp & 32) { $server['e']['aids'] .= " Invulnerability"; }
  1582. if ($tmp & 64) { $server['e']['aids'] .= " OppositeLock"; }
  1583. if ($tmp & 128) { $server['e']['aids'] .= " SteeringHelp"; }
  1584. if ($tmp & 256) { $server['e']['aids'] .= " BrakingHelp"; }
  1585. if ($tmp & 512) { $server['e']['aids'] .= " SpinRecovery"; }
  1586. if ($tmp & 1024) { $server['e']['aids'] .= " AutoPitstop"; }
  1587. $server['e']['aids'] = str_replace(" ", " / ", trim($server['e']['aids']));
  1588. $server['e']['vehicles'] = str_replace("|", " / ", $server['e']['vehicles']);
  1589. unset($server['e']['packed_aids']);
  1590. unset($server['e']['packed_flags']);
  1591. unset($server['e']['packed_special']);
  1592. unset($server['e']['packed_rules']);
  1593. //---------------------------------------------------------+
  1594. $server['p'] = array(); // DOES NOT RETURN PLAYER INFORMATION
  1595. //---------------------------------------------------------+
  1596. return $server;
  1597. }}
  1598. //------------------------------------------------------------------------------------------------------------+
  1599. //------------------------------------------------------------------------------------------------------------+
  1600. if (!function_exists('lgsl_query_17')) {
  1601. function lgsl_query_17($type, $request, $server)
  1602. {
  1603. //---------------------------------------------------------+
  1604. // REFERENCE: http://masterserver.savage.s2games.com/
  1605. global $lgsl_fp;
  1606. fwrite($lgsl_fp, "\x9e\x4c\x23\x00\x00\xce\x21\x21\x21\x21");
  1607. $buffer = fread($lgsl_fp, 4096);
  1608. if (!$buffer) { return FALSE; }
  1609. //---------------------------------------------------------+
  1610. $buffer = substr($buffer, 12); // REMOVE PACKET HEADER
  1611. while ($data_key = strtolower(lgsl_cut_string($buffer, "\xFE")))
  1612. {
  1613. if ($data_key == "players") { break; }
  1614. $data_value = lgsl_cut_string($buffer, "\xFF");
  1615. $server['e'][$data_key] = $data_value;
  1616. }
  1617. $server['s']['name'] = lgsl_parse_color($server['e']['name'], $type);
  1618. $server['s']['map'] = $server['e']['world'];
  1619. $server['s']['players'] = $server['e']['cnum'];
  1620. $server['s']['playersmax'] = $server['e']['cmax'];
  1621. $server['s']['password'] = $server['e']['pass'];
  1622. //---------------------------------------------------------+
  1623. $team_list = array("skip", $server['e']['race1'], $server['e']['race2'], "spectator");
  1624. $server['p'] = array();
  1625. $player_key = 0;
  1626. foreach ($team_list as $team)
  1627. {
  1628. while ($tmp = strtolower(lgsl_cut_string($buffer, "\x0a")))
  1629. {
  1630. if ($tmp[0] != "\x20") { break; }
  1631. $server['p'][$player_key]['name'] = lgsl_parse_color(substr($tmp, 1), $type);
  1632. $server['p'][$player_key]['team'] = $team;
  1633. $player_key++;
  1634. }
  1635. }
  1636. //---------------------------------------------------------+
  1637. return $server;
  1638. }}
  1639. //------------------------------------------------------------------------------------------------------------+
  1640. //------------------------------------------------------------------------------------------------------------+
  1641. if (!function_exists('lgsl_query_18')) {
  1642. function lgsl_query_18($type, $request, $server)
  1643. {
  1644. //---------------------------------------------------------+
  1645. // REFERENCE: http://masterserver.savage2.s2games.com/
  1646. global $lgsl_fp;
  1647. fwrite($lgsl_fp, "\x01");
  1648. $buffer = fread($lgsl_fp, 4096);
  1649. if (!$buffer) { return FALSE; }
  1650. //---------------------------------------------------------+
  1651. $buffer = substr($buffer, 12); // REMOVE PACKET HEADER
  1652. $server['s']['name'] = lgsl_cut_string($buffer);
  1653. $server['s']['players'] = ord(lgsl_cut_byte($buffer, 1));
  1654. $server['s']['playersmax'] = ord(lgsl_cut_byte($buffer, 1));
  1655. $server['e']['time'] = lgsl_cut_string($buffer);
  1656. $server['s']['map'] = lgsl_cut_string($buffer);
  1657. $server['e']['nextmap'] = lgsl_cut_string($buffer);
  1658. $server['e']['location'] = lgsl_cut_string($buffer);
  1659. $server['e']['minimum_players'] = ord(lgsl_cut_string($buffer));
  1660. $server['e']['gametype'] = lgsl_cut_string($buffer);
  1661. $server['e']['version'] = lgsl_cut_string($buffer);
  1662. $server['e']['minimum_level'] = ord(lgsl_cut_byte($buffer, 1));
  1663. $server['p'] = array(); // DOES NOT RETURN PLAYER INFORMATION
  1664. //---------------------------------------------------------+
  1665. return $server;
  1666. }}
  1667. //------------------------------------------------------------------------------------------------------------+
  1668. //------------------------------------------------------------------------------------------------------------+
  1669. if (!function_exists('lgsl_query_19')) {
  1670. function lgsl_query_19($type, $request, $server)
  1671. {
  1672. //---------------------------------------------------------+
  1673. global $lgsl_fp;
  1674. fwrite($lgsl_fp, "\xc0\xde\xf1\x11\x42\x06\x00\xf5\x03\x21\x21\x21\x21");
  1675. $buffer = fread($lgsl_fp, 4096);
  1676. if (!$buffer) { return FALSE; }
  1677. //---------------------------------------------------------+
  1678. $buffer = substr($buffer, 25); // REMOVE PACKET HEADER
  1679. $server['s']['name'] = lgsl_get_string(lgsl_cut_pascal($buffer, 4, 3, -3));
  1680. $server['s']['map'] = lgsl_get_string(lgsl_cut_pascal($buffer, 4, 3, -3));
  1681. $server['e']['nextmap'] = lgsl_get_string(lgsl_cut_pascal($buffer, 4, 3, -3));
  1682. $server['e']['gametype'] = lgsl_get_string(lgsl_cut_pascal($buffer, 4, 3, -3));
  1683. $buffer = substr($buffer, 1);
  1684. $server['s']['password'] = ord(lgsl_cut_byte($buffer, 1));
  1685. $server['s']['playersmax'] = ord(lgsl_cut_byte($buffer, 4));
  1686. $server['s']['players'] = ord(lgsl_cut_byte($buffer, 4));
  1687. //---------------------------------------------------------+
  1688. $server['p'] = array();
  1689. for ($player_key = 0; $player_key < $server['s']['players']; $player_key++)
  1690. {
  1691. $server['p'][$player_key]['name'] = lgsl_get_string(lgsl_cut_pascal($buffer, 4, 3, -3));
  1692. }
  1693. //---------------------------------------------------------+
  1694. $buffer = substr($buffer, 17);
  1695. $server['e']['version'] = lgsl_get_string(lgsl_cut_pascal($buffer, 4, 3, -3));
  1696. $server['e']['mods'] = lgsl_get_string(lgsl_cut_pascal($buffer, 4, 3, -3));
  1697. $server['e']['dedicated'] = ord(lgsl_cut_byte($buffer, 1));
  1698. $server['e']['time'] = lgsl_time(lgsl_unpack(lgsl_cut_byte($buffer, 4), "f"));
  1699. $server['e']['status'] = ord(lgsl_cut_byte($buffer, 4));
  1700. $server['e']['gamemode'] = ord(lgsl_cut_byte($buffer, 4));
  1701. $server['e']['motd'] = lgsl_get_string(lgsl_cut_pascal($buffer, 4, 3, -3));
  1702. $server['e']['respawns'] = ord(lgsl_cut_byte($buffer, 4));
  1703. $server['e']['time_limit'] = lgsl_time(lgsl_unpack(lgsl_cut_byte($buffer, 4), "f"));
  1704. $server['e']['voting'] = ord(lgsl_cut_byte($buffer, 4));
  1705. $buffer = substr($buffer, 2);
  1706. //---------------------------------------------------------+
  1707. for ($player_key = 0; $player_key < $server['s']['players']; $player_key++)
  1708. {
  1709. $server['p'][$player_key]['team'] = ord(lgsl_cut_byte($buffer, 4));
  1710. $unknown = ord(lgsl_cut_byte($buffer, 1));
  1711. }
  1712. //---------------------------------------------------------+
  1713. $buffer = substr($buffer, 7);
  1714. $server['e']['platoon_1_color'] = ord(lgsl_cut_byte($buffer, 8));
  1715. $server['e']['platoon_2_color'] = ord(lgsl_cut_byte($buffer, 8));
  1716. $server['e']['platoon_3_color'] = ord(lgsl_cut_byte($buffer, 8));
  1717. $server['e']['platoon_4_color'] = ord(lgsl_cut_byte($buffer, 8));
  1718. $server['e']['timer_on'] = ord(lgsl_cut_byte($buffer, 1));
  1719. $server['e']['timer_time'] = lgsl_time(lgsl_unpack(lgsl_cut_byte($buffer, 4), "f"));
  1720. $server['e']['time_debriefing'] = lgsl_time(lgsl_unpack(lgsl_cut_byte($buffer, 4), "f"));
  1721. $server['e']['time_respawn_min'] = lgsl_time(lgsl_unpack(lgsl_cut_byte($buffer, 4), "f"));
  1722. $server['e']['time_respawn_max'] = lgsl_time(lgsl_unpack(lgsl_cut_byte($buffer, 4), "f"));
  1723. $server['e']['time_respawn_safe'] = lgsl_time(lgsl_unpack(lgsl_cut_byte($buffer, 4), "f"));
  1724. $server['e']['difficulty'] = ord(lgsl_cut_byte($buffer, 4));
  1725. $server['e']['respawn_total'] = ord(lgsl_cut_byte($buffer, 4));
  1726. $server['e']['random_insertions'] = ord(lgsl_cut_byte($buffer, 1));
  1727. $server['e']['spectators'] = ord(lgsl_cut_byte($buffer, 1));
  1728. $server['e']['arcademode'] = ord(lgsl_cut_byte($buffer, 1));
  1729. $server['e']['ai_backup'] = ord(lgsl_cut_byte($buffer, 1));
  1730. $server['e']['random_teams'] = ord(lgsl_cut_byte($buffer, 1));
  1731. $server['e']['time_starting'] = lgsl_time(lgsl_unpack(lgsl_cut_byte($buffer, 4), "f"));
  1732. $server['e']['identify_friends'] = ord(lgsl_cut_byte($buffer, 1));
  1733. $server['e']['identify_threats'] = ord(lgsl_cut_byte($buffer, 1));
  1734. $buffer = substr($buffer, 5);
  1735. $server['e']['restrictions'] = lgsl_get_string(lgsl_cut_pascal($buffer, 4, 3, -3));
  1736. //---------------------------------------------------------+
  1737. switch ($server['e']['status'])
  1738. {
  1739. case 3: $server['e']['status'] = "Joining"; break;
  1740. case 4: $server['e']['status'] = "Joining"; break;
  1741. case 5: $server['e']['status'] = "Joining"; break;
  1742. }
  1743. switch ($server['e']['gamemode'])
  1744. {
  1745. case 2: $server['e']['gamemode'] = "Co-Op"; break;
  1746. case 3: $server['e']['gamemode'] = "Solo"; break;
  1747. case 4: $server['e']['gamemode'] = "Team"; break;
  1748. }
  1749. switch ($server['e']['respawns'])
  1750. {
  1751. case 0: $server['e']['respawns'] = "None"; break;
  1752. case 1: $server['e']['respawns'] = "Individual"; break;
  1753. case 2: $server['e']['respawns'] = "Team"; break;
  1754. case 3: $server['e']['respawns'] = "Infinite"; break;
  1755. }
  1756. switch ($server['e']['difficulty'])
  1757. {
  1758. case 0: $server['e']['difficulty'] = "Recruit"; break;
  1759. case 1: $server['e']['difficulty'] = "Veteran"; break;
  1760. case 2: $server['e']['difficulty'] = "Elite"; break;
  1761. }
  1762. //---------------------------------------------------------+
  1763. return $server;
  1764. }}
  1765. //------------------------------------------------------------------------------------------------------------+
  1766. //------------------------------------------------------------------------------------------------------------+
  1767. if (!function_exists('lgsl_query_20')) {
  1768. function lgsl_query_20($type, $request, $server)
  1769. {
  1770. //---------------------------------------------------------+
  1771. global $lgsl_fp;
  1772. fwrite($lgsl_fp, "\xFF\xFF\xFF\xFFFLSQ");
  1773. $buffer = fread($lgsl_fp, 4096);
  1774. if (!$buffer) { return FALSE; }
  1775. //---------------------------------------------------------+
  1776. $buffer = substr($buffer, 6); // REMOVE PACKET HEADER
  1777. $server['s']['name'] = lgsl_cut_string($buffer);
  1778. $server['s']['map'] = lgsl_cut_string($buffer);
  1779. $server['s']['game'] = lgsl_cut_string($buffer);
  1780. $server['e']['gametype'] = lgsl_cut_string($buffer);
  1781. $server['e']['description'] = lgsl_cut_string($buffer);
  1782. $server['e']['version'] = lgsl_cut_string($buffer);
  1783. $server['e']['hostport'] = lgsl_unpack(lgsl_cut_byte($buffer, 2), "n");
  1784. $server['s']['players'] = lgsl_unpack(lgsl_cut_byte($buffer, 1), "C");
  1785. $server['s']['playersmax'] = lgsl_unpack(lgsl_cut_byte($buffer, 1), "C");
  1786. $server['e']['dedicated'] = lgsl_cut_byte($buffer, 1);
  1787. $server['e']['os'] = lgsl_cut_byte($buffer, 1);
  1788. $server['s']['password'] = lgsl_unpack(lgsl_cut_byte($buffer, 1), "C");
  1789. $server['e']['anticheat'] = lgsl_unpack(lgsl_cut_byte($buffer, 1), "C");
  1790. $server['e']['cpu_load'] = round(3.03 * lgsl_unpack(lgsl_cut_byte($buffer, 1), "C"))."%";
  1791. $server['e']['round'] = lgsl_unpack(lgsl_cut_byte($buffer, 1), "C");
  1792. $server['e']['roundsmax'] = lgsl_unpack(lgsl_cut_byte($buffer, 1), "C");
  1793. $server['e']['timeleft'] = lgsl_time(lgsl_unpack(lgsl_cut_byte($buffer, 2), "S") / 250);
  1794. //---------------------------------------------------------+
  1795. $server['p'] = array(); // DOES NOT RETURN PLAYER INFORMATION
  1796. //---------------------------------------------------------+
  1797. return $server;
  1798. }}
  1799. //------------------------------------------------------------------------------------------------------------+
  1800. //------------------------------------------------------------------------------------------------------------+
  1801. if (!function_exists('lgsl_query_feed')) {
  1802. function lgsl_query_feed($ip, $q_port, $c_port, $s_port, $type, $request, $lgsl_feed_method, $lgsl_feed_url)
  1803. {
  1804. //---------------------------------------------------------+
  1805. $host = parse_url($lgsl_feed_url);
  1806. if (!$host['path']) { echo "LGSL FEED PROBLEM: INVALID URL"; exit; }
  1807. $host['path'] .= "?ip={$ip}&q_port={$q_port}&c_port={$c_port}&s_port={$s_port}&type={$type}&request={$request}";
  1808. $referrer = preg_replace("/(.*):\/\//i", "", $_SERVER['SERVER_NAME']);
  1809. $referrer = $referrer."/".$_SERVER['PHP_SELF'];
  1810. $referrer = str_replace("//", "/", $referrer);
  1811. $referrer = "http://{$referrer}?{$_SERVER['QUERY_STRING']}";
  1812. //---------------------------------------------------------+
  1813. if (function_exists('curl_init') && function_exists('curl_setopt') && function_exists('curl_exec') && $lgsl_feed_method == 1)
  1814. {
  1815. unset($lgsl_curl); $lgsl_curl = curl_init();
  1816. curl_setopt($lgsl_curl, CURLOPT_HEADER, 0);
  1817. curl_setopt($lgsl_curl, CURLOPT_HTTPGET, 1);
  1818. curl_setopt($lgsl_curl, CURLOPT_TIMEOUT, 6);
  1819. curl_setopt($lgsl_curl, CURLOPT_ENCODING, "");
  1820. curl_setopt($lgsl_curl, CURLOPT_FRESH_CONNECT, 1);
  1821. curl_setopt($lgsl_curl, CURLOPT_RETURNTRANSFER, 1);
  1822. curl_setopt($lgsl_curl, CURLOPT_CONNECTTIMEOUT, 6);
  1823. curl_setopt($lgsl_curl, CURLOPT_REFERER, $referrer);
  1824. curl_setopt($lgsl_curl, CURLOPT_URL, $host['host'].$host['path']);
  1825. $response = curl_exec($lgsl_curl);
  1826. if (curl_error($lgsl_curl))
  1827. {
  1828. $lgsl_feed_error = 1;
  1829. }
  1830. curl_close($lgsl_curl);
  1831. }
  1832. //---------------------------------------------------------+
  1833. elseif (function_exists('fsockopen'))
  1834. {
  1835. $fp = @fsockopen($host['host'], "80", $errno, $errstr, 6);
  1836. if (!$fp)
  1837. {
  1838. $lgsl_feed_error = 1;
  1839. }
  1840. else
  1841. {
  1842. stream_set_timeout($fp, 6, 0);
  1843. stream_set_blocking($fp, TRUE);
  1844. unset($request);
  1845. unset($response);
  1846. $request .= "GET $host[path] HTTP/1.0\r\n";
  1847. $request .= "Host: $host[host]\r\n";
  1848. $request .= "User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.2.1) Gecko/20021204\r\n";
  1849. $request .= "Accept: text/xml,application/xml,application/xhtml+xml,";
  1850. $request .= "text/html;q=0.9,text/plain;q=0.8,video/x-mng,image/png,";
  1851. $request .= "image/jpeg,image/gif;q=0.2,text/css,*/*;q=0.1\r\n";
  1852. $request .= "Accept-Language: en-us, en;q=0.50\r\n";
  1853. $request .= "Accept-Encoding: \r\n";
  1854. $request .= "Accept-Charset: ISO-8859-1, utf-8;q=0.66, *;q=0.66\r\n";
  1855. $request .= "Referer: $referrer\r\n";
  1856. $request .= "Cache-Control: max-age=0\r\n";
  1857. $request .= "Connection: Close\r\n\r\n";
  1858. fwrite($fp, $request);
  1859. while (!feof($fp))
  1860. {
  1861. $response .= fread($fp, 4096);
  1862. }
  1863. fclose($fp);
  1864. }
  1865. }
  1866. //---------------------------------------------------------+
  1867. else
  1868. {
  1869. echo "LGSL FEED PROBLEM: NO CURL OR FSOCKOPEN SUPPORT"; exit;
  1870. }
  1871. //---------------------------------------------------------+
  1872. if (!$lgsl_feed_error && strpos($response, "_SLGSLF_") === FALSE)
  1873. {
  1874. $lgsl_feed_error = 2;
  1875. }
  1876. if (!$lgsl_feed_error)
  1877. {
  1878. $response = explode("_SLGSLF_", $response);
  1879. $server = unserialize($response[1]);
  1880. if (!$server)
  1881. {
  1882. $lgsl_feed_error = 3;
  1883. }
  1884. }
  1885. //---------------------------------------------------------+
  1886. if ($lgsl_feed_error == "1")
  1887. {
  1888. // CONNECTION PROBLEM - FEED MAYBE TEMPORARLY OFFLINE
  1889. $server['s'] = array();
  1890. $server['e'] = array();
  1891. $server['p'] = array();
  1892. $server['s']['name'] = "FEED PROBLEM";
  1893. $server['s']['map'] = "FEED PROBLEM";
  1894. }
  1895. elseif ($lgsl_feed_error == "2")
  1896. {
  1897. // NO FEED DATA - MAYBE WRONG FEED URL
  1898. echo "<div style='width:100%;overflow:auto'>
  1899. FEED MISSING FROM: $host[host]$host[path] RETURNED: ".lgsl_string_html($response)." :END
  1900. </div>";
  1901. exit;
  1902. }
  1903. elseif ($lgsl_feed_error == "3")
  1904. {
  1905. // UNABLE TO UNPACK FEED DATA - MAYBE ERRORS ON FEED
  1906. echo "<div style='width:100%;overflow:auto'>
  1907. FEED CORRUPTION FROM: $host[host]$host[path] RETURNED: ".lgsl_string_html($response)." :END
  1908. </div>";
  1909. exit;
  1910. }
  1911. elseif ($lgsl_feed_error == "4")
  1912. {
  1913. // UNABLE TO UNPACK FEED DATA - MAYBE ERRORS ON FEED
  1914. echo "<div style='width:100%;overflow:auto'>
  1915. FEED CORRUPTION FROM: $host[host]$host[path] RETURNED: ".lgsl_string_html($response)." :END
  1916. </div>";
  1917. exit;
  1918. }
  1919. //---------------------------------------------------------+
  1920. // PREVENT FEED CACHE MAKING SERVER LOOK LIKE ITS ONLINE
  1921. if (!$server['b']['status'])
  1922. {
  1923. return FALSE;
  1924. }
  1925. //---------------------------------------------------------+
  1926. return $server;
  1927. }}
  1928. //------------------------------------------------------------------------------------------------------------+
  1929. //------------------------------------------------------------------------------------------------------------+
  1930. if (!function_exists('lgsl_parse_color')) {
  1931. function lgsl_parse_color($string, $type)
  1932. {
  1933. switch($type)
  1934. {
  1935. case "1":
  1936. $string = preg_replace("/\^./", "", $string);
  1937. break;
  1938. case "2":
  1939. $string = preg_replace("/\^[\x20-\x7E]/", "", $string);
  1940. break;
  1941. case "swat4":
  1942. $string = preg_replace("/\[c=......\]/Usi", "", $string);
  1943. break;
  1944. case "farcry":
  1945. $string = preg_replace("/\\$\d/", "", $string);
  1946. break;
  1947. case "painkiller":
  1948. $string = preg_replace("/#./", "", $string);
  1949. break;
  1950. case "savage1":
  1951. $string = preg_replace("/\^[a-z]/", "", $string);
  1952. $string = preg_replace("/\^[0-9]+/", "", $string);
  1953. $string = preg_replace("/ lan .*\^/U", "", $string);
  1954. $string = preg_replace("/ con .*\^/U", "", $string);
  1955. break;
  1956. case "quakeworld":
  1957. $string_length = strlen($string);
  1958. for ($char_pos=0; $char_pos<$string_length; $char_pos++)
  1959. {
  1960. $char = ord($string[$char_pos]);
  1961. if ($char > 141) { $char = chr($char - 128); }
  1962. if ($char < 32) { $char = chr($char + 30); }
  1963. $string[$char_pos] = chr($char);
  1964. }
  1965. break;
  1966. }
  1967. return $string;
  1968. }}
  1969. //---------------------------------------------------------+
  1970. if (!function_exists('lgsl_time')) {
  1971. function lgsl_time($seconds)
  1972. {
  1973. if ($seconds < 0) { return ""; }
  1974. $h = intval(intval($seconds) / 3600);
  1975. $m = intval(($seconds / 60) % 60);
  1976. $s = intval($seconds % 60);
  1977. $h = str_pad($h, "2", "0", STR_PAD_LEFT);
  1978. $m = str_pad($m, "2", "0", STR_PAD_LEFT);
  1979. $s = str_pad($s, "2", "0", STR_PAD_LEFT);
  1980. return "{$h}:{$m}:{$s}";
  1981. }}
  1982. //---------------------------------------------------------+
  1983. if (!function_exists('lgsl_unpack')) {
  1984. function lgsl_unpack($string, $format)
  1985. {
  1986. list(,$string) = unpack($format, $string);
  1987. return $string;
  1988. }}
  1989. //---------------------------------------------------------+
  1990. if (!function_exists('lgsl_cut_byte')) {
  1991. function lgsl_cut_byte(&$buffer, $length)
  1992. {
  1993. $string = substr($buffer, 0, $length);
  1994. $buffer = substr($buffer, $length);
  1995. return $string;
  1996. }}
  1997. //---------------------------------------------------------+
  1998. if (!function_exists('lgsl_cut_string')) {
  1999. function lgsl_cut_string(&$buffer, $end_marker = "\x00")
  2000. {
  2001. $length = strpos($buffer, $end_marker);
  2002. if ($length === FALSE)
  2003. {
  2004. $length = strlen($buffer);
  2005. }
  2006. $string = substr($buffer, 0, $length);
  2007. $buffer = substr($buffer, $length + strlen($end_marker));
  2008. return $string;
  2009. }}
  2010. //---------------------------------------------------------+
  2011. if (!function_exists('lgsl_cut_pascal')) {
  2012. function lgsl_cut_pascal(&$buffer, $start_byte = 1, $length_adjust = 0, $end_byte = 0)
  2013. {
  2014. $length = ord(substr($buffer, 0, $start_byte)) + $length_adjust;
  2015. $string = substr($buffer, $start_byte, $length);
  2016. $buffer = substr($buffer, $start_byte + $length + $end_byte);
  2017. return $string;
  2018. }}
  2019. //---------------------------------------------------------+
  2020. if (!function_exists('lgsl_get_string')) {
  2021. function lgsl_get_string($buffer, $end_marker = "\x00")
  2022. {
  2023. $length = strpos($buffer, $end_marker);
  2024. if ($length === FALSE)
  2025. {
  2026. $length = strlen($buffer);
  2027. }
  2028. $string = substr($buffer, 0, $length);
  2029. return $string;
  2030. }}
  2031. //------------------------------------------------------------------------------------------------------------+
  2032. //--------- PLEASE MAKE A DONATION OR SIGN THE GUESTBOOK AT GREYCUBE.COM IF YOU REMOVE THIS CREDIT -----------+
  2033. if (!function_exists('lgsl_version')) {
  2034. function lgsl_version()
  2035. {
  2036. return "LGSL 4.9 By Richard Perry";
  2037. }}
  2038. //------------------------------------------------------------------------------------------------------------+
  2039. //------------------------------------------------------------------------------------------------------------+
  2040. ?>