PageRenderTime 77ms CodeModel.GetById 29ms 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

Large files files are truncated, but you can click here to view the full file

  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;

Large files files are truncated, but you can click here to view the full file