PageRenderTime 63ms CodeModel.GetById 15ms RepoModel.GetById 0ms app.codeStats 1ms

/ext_scripts/lgsl/lgsl_files/lgsl_protocol.php

http://lansuite.googlecode.com/
PHP | 4191 lines | 2575 code | 830 blank | 786 comment | 578 complexity | 055fc938486e9b6f3cf1fba4a7c1181b MD5 | raw file
Possible License(s): LGPL-3.0, AGPL-1.0, LGPL-2.1

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_version')) { // START OF DOUBLE LOAD PROTECTION
  14. //------------------------------------------------------------------------------------------------------------+
  15. //------------------------------------------------------------------------------------------------------------+
  16. function lgsl_type_list()
  17. {
  18. return array(
  19. "aarmy" => "Americas Army",
  20. "aarmy3" => "Americas Army 3",
  21. "arcasimracing" => "Arca Sim Racing",
  22. "arma" => "ArmA: Armed Assault",
  23. "arma2" => "ArmA 2",
  24. "avp2" => "Aliens VS. Predator 2",
  25. "avp2010" => "Aliens VS. Predator ( 2010 By Rebellion )",
  26. "bfbc2" => "Battlefield Bad Company 2",
  27. "bfvietnam" => "Battlefield Vietnam",
  28. "bf1942" => "Battlefield 1942",
  29. "bf2" => "Battlefield 2",
  30. "bf3" => "Battlefield 3",
  31. "bf2142" => "Battlefield 2142",
  32. "callofduty" => "Call Of Duty",
  33. "callofdutyuo" => "Call Of Duty: United Offensive",
  34. "callofdutywaw" => "Call Of Duty: World at War",
  35. "callofduty2" => "Call Of Duty 2",
  36. "callofduty4" => "Call Of Duty 4",
  37. "callofdutymw2" => "Call of Duty Modern Warfare 2",
  38. "cncrenegade" => "Command and Conquer: Renegade",
  39. "crysis" => "Crysis",
  40. "crysiswars" => "Crysis Wars",
  41. "cs2d" => "Counter-Strike 2D",
  42. "cube" => "Cube Engine",
  43. "doomskulltag" => "Doom - Skulltag",
  44. "doomzdaemon" => "Doom - ZDaemon",
  45. "doom3" => "Doom 3",
  46. "dh2005" => "Deer Hunter 2005",
  47. "farcry" => "Far Cry",
  48. "fear" => "F.E.A.R.",
  49. "flashpoint" => "Operation Flashpoint",
  50. "freelancer" => "Freelancer",
  51. "frontlines" => "Frontlines: Fuel Of War",
  52. "f1c9902" => "F1 Challenge 99-02",
  53. "gamespy1" => "Generic GameSpy 1",
  54. "gamespy2" => "Generic GameSpy 2",
  55. "gamespy3" => "Generic GameSpy 3",
  56. "ghostrecon" => "Ghost Recon",
  57. "graw" => "Ghost Recon: Advanced Warfighter",
  58. "graw2" => "Ghost Recon: Advanced Warfighter 2",
  59. "gtr2" => "GTR 2",
  60. "had2" => "Hidden and Dangerous 2",
  61. "halflife" => "Half-Life - Steam",
  62. "halflifewon" => "Half-Life - WON",
  63. "halo" => "Halo",
  64. "il2" => "IL-2 Sturmovik",
  65. "jediknight2" => "JediKnight 2: Jedi Outcast",
  66. "jediknightja" => "JediKnight: Jedi Academy",
  67. "killingfloor" => "Killing Floor",
  68. "kingpin" => "Kingpin: Life of Crime",
  69. "modernwarfare3"=> "CoD: Modern Warfare 3",
  70. "moh" => "Medal of Honor",
  71. "mohaa" => "Medal of Honor: Allied Assault",
  72. "mohaab" => "Medal of Honor: Allied Assault Breakthrough",
  73. "mohaas" => "Medal of Honor: Allied Assault Spearhead",
  74. "mohpa" => "Medal of Honor: Pacific Assault",
  75. "mta" => "Multi Theft Auto",
  76. "nascar2004" => "Nascar Thunder 2004",
  77. "neverwinter" => "NeverWinter Nights",
  78. "neverwinter2" => "NeverWinter Nights 2",
  79. "nexuiz" => "Nexuiz",
  80. "openttd" => "Open Transport Tycoon Deluxe",
  81. "painkiller" => "PainKiller",
  82. "plainsight" => "Plain Sight",
  83. "prey" => "Prey",
  84. "quakeworld" => "Quake World",
  85. "quakewars" => "Enemy Territory: Quake Wars",
  86. "quake2" => "Quake 2",
  87. "quake3" => "Quake 3",
  88. "quake4" => "Quake 4",
  89. "ravenshield" => "Raven Shield",
  90. "redorchestra" => "Red Orchestra",
  91. "rfactor" => "RFactor",
  92. "samp" => "San Andreas Multiplayer",
  93. "savage" => "Savage",
  94. "savage2" => "Savage 2",
  95. "serioussam" => "Serious Sam",
  96. "serioussam2" => "Serious Sam 2",
  97. "shatteredh" => "Shattered Horizon",
  98. "sof2" => "Soldier of Fortune 2",
  99. "soldat" => "Soldat",
  100. "source" => "Source ( Half-Life 2 )",
  101. "stalker" => "S.T.A.L.K.E.R.",
  102. "stalkercs" => "S.T.A.L.K.E.R. Clear Sky",
  103. "startrekef" => "StarTrek Elite-Force",
  104. "starwarsbf" => "Star Wars: Battlefront",
  105. "starwarsbf2" => "Star Wars: Battlefront 2",
  106. "starwarsrc" => "Star Wars: Republic Commando",
  107. "swat4" => "SWAT 4",
  108. "test" => "Test ( For PHP Developers )",
  109. "teeworlds" => "Teeworlds",
  110. "tribes" => "Tribes ( Starsiege )",
  111. "tribes2" => "Tribes 2",
  112. "tribesv" => "Tribes Vengeance",
  113. "urbanterror" => "UrbanTerror",
  114. "ut" => "Unreal Tournament",
  115. "ut2003" => "Unreal Tournament 2003",
  116. "ut2004" => "Unreal Tournament 2004",
  117. "ut3" => "Unreal Tournament 3",
  118. "vcmp" => "Vice City Multiplayer",
  119. "vietcong" => "Vietcong",
  120. "vietcong2" => "Vietcong 2",
  121. "warsow" => "Warsow",
  122. "warsowold" => "Warsow ( 0.4.2 and older )",
  123. "wolfet" => "Wolfenstein: Enemy Territory",
  124. "wolfrtcw" => "Wolfenstein: Return To Castle Wolfenstein",
  125. "wolf2009" => "Wolfenstein ( 2009 By Raven )");
  126. }
  127. //------------------------------------------------------------------------------------------------------------+
  128. //------------------------------------------------------------------------------------------------------------+
  129. function lgsl_protocol_list()
  130. {
  131. return array(
  132. "aarmy" => "09",
  133. "aarmy_" => "03",
  134. "aarmy3" => "26",
  135. "arcasimracing" => "16",
  136. "arma" => "09",
  137. "arma2" => "09",
  138. "avp2" => "03",
  139. "avp2010" => "31",
  140. "bfbc2" => "30",
  141. "bfvietnam" => "09",
  142. "bf1942" => "03",
  143. "bf2" => "06",
  144. "bf3" => "33",
  145. "bf2142" => "06",
  146. "callofduty" => "02",
  147. "callofdutyuo" => "02",
  148. "callofdutywaw" => "02",
  149. "callofduty2" => "02",
  150. "callofduty4" => "02",
  151. "callofdutymw2" => "02",
  152. "cncrenegade" => "03",
  153. "crysis" => "06",
  154. "crysiswars" => "06",
  155. "cs2d" => "29",
  156. "cube" => "24",
  157. "doomskulltag" => "27",
  158. "doomzdaemon" => "28",
  159. "doom3" => "10",
  160. "dh2005" => "09",
  161. "had2" => "03",
  162. "halflife" => "05",
  163. "halflifewon" => "05",
  164. "halo" => "03",
  165. "il2" => "03",
  166. "farcry" => "08",
  167. "fear" => "09",
  168. "flashpoint" => "03",
  169. "freelancer" => "14",
  170. "frontlines" => "20",
  171. "f1c9902" => "03",
  172. "gamespy1" => "03",
  173. "gamespy2" => "09",
  174. "gamespy3" => "06",
  175. "ghostrecon" => "19",
  176. "graw" => "06",
  177. "graw2" => "09",
  178. "gtr2" => "15",
  179. "jediknight2" => "02",
  180. "jediknightja" => "02",
  181. "killingfloor" => "13",
  182. "kingpin" => "03",
  183. "modernwarfare3"=> "31",
  184. "moh" => "30",
  185. "mohaa" => "03",
  186. "mohaab" => "03",
  187. "mohaas" => "03",
  188. "mohpa" => "03",
  189. "mohaa_" => "02",
  190. "mohaab_" => "02",
  191. "mohaas_" => "02",
  192. "mohpa_" => "02",
  193. "mta" => "08",
  194. "nascar2004" => "09",
  195. "neverwinter" => "09",
  196. "neverwinter2" => "09",
  197. "nexuiz" => "02",
  198. "openttd" => "22",
  199. "painkiller" => "08",
  200. "painkiller_" => "09",
  201. "plainsight" => "32",
  202. "prey" => "10",
  203. "quakeworld" => "07",
  204. "quakewars" => "10",
  205. "quake2" => "02",
  206. "quake3" => "02",
  207. "quake4" => "10",
  208. "ravenshield" => "04",
  209. "redorchestra" => "13",
  210. "rfactor" => "16",
  211. "samp" => "12",
  212. "savage" => "17",
  213. "savage2" => "18",
  214. "serioussam" => "03",
  215. "serioussam2" => "09",
  216. "shatteredh" => "05",
  217. "sof2" => "02",
  218. "soldat" => "08",
  219. "source" => "05",
  220. "stalker" => "06",
  221. "stalkercs" => "09",
  222. "startrekef" => "02",
  223. "starwarsbf" => "09",
  224. "starwarsbf2" => "09",
  225. "starwarsrc" => "09",
  226. "swat4" => "03",
  227. "test" => "01",
  228. "teeworlds" => "21",
  229. "tribes" => "23",
  230. "tribes2" => "25",
  231. "tribesv" => "09",
  232. "warsow" => "02",
  233. "warsowold" => "02",
  234. "urbanterror" => "02",
  235. "ut" => "03",
  236. "ut2003" => "13",
  237. "ut2003_" => "03",
  238. "ut2004" => "13",
  239. "ut2004_" => "03",
  240. "ut3" => "11",
  241. "vcmp" => "12",
  242. "vietcong" => "03",
  243. "vietcong2" => "09",
  244. "wolfet" => "02",
  245. "wolfrtcw" => "02",
  246. "wolf2009" => "10");
  247. return $lgsl_protocol_list;
  248. }
  249. //------------------------------------------------------------------------------------------------------------+
  250. //------------------------------------------------------------------------------------------------------------+
  251. function lgsl_software_link($type, $ip, $c_port, $q_port, $s_port)
  252. {
  253. $lgsl_software_link = array(
  254. "aarmy" => "qtracker://{IP}:{S_PORT}?game=ArmyOperations&action=show",
  255. "aarmy3" => "qtracker://{IP}:{S_PORT}?game=AmericasArmy3&action=show",
  256. "arcasimracing" => "http://en.wikipedia.org/wiki/ARCA_Sim_Racing",
  257. "arma" => "qtracker://{IP}:{S_PORT}?game=ArmedAssault&action=show",
  258. "arma2" => "http://en.wikipedia.org/wiki/ARMA_2",
  259. "avp2" => "qtracker://{IP}:{S_PORT}?game=AliensversusPredator2&action=show",
  260. "avp2010" => "http://en.wikipedia.org/wiki/Aliens_vs._Predator_%28video_game%29",
  261. "bfbc2" => "http://en.wikipedia.org/wiki/Battlefield_bad_company_2",
  262. "bfvietnam" => "qtracker://{IP}:{S_PORT}?game=BattlefieldVietnam&action=show",
  263. "bf1942" => "qtracker://{IP}:{S_PORT}?game=Battlefield1942&action=show",
  264. "bf2" => "qtracker://{IP}:{S_PORT}?game=Battlefield2&action=show",
  265. "bf3" => "http://en.wikipedia.org/wiki/Battlefield_3",
  266. "bf2142" => "qtracker://{IP}:{S_PORT}?game=Battlefield2142&action=show",
  267. "callofduty" => "qtracker://{IP}:{S_PORT}?game=CallOfDuty&action=show",
  268. "callofdutyuo" => "qtracker://{IP}:{S_PORT}?game=CallOfDutyUnitedOffensive&action=show",
  269. "callofdutywaw" => "qtracker://{IP}:{S_PORT}?game=CallOfDutyWorldAtWar&action=show",
  270. "callofduty2" => "qtracker://{IP}:{S_PORT}?game=CallOfDuty2&action=show",
  271. "callofduty4" => "qtracker://{IP}:{S_PORT}?game=CallOfDuty4&action=show",
  272. "callofdutymw2" => "aiw://connect/{IP}:{S_PORT}",
  273. "cncrenegade" => "qtracker://{IP}:{S_PORT}?game=CommandConquerRenegade&action=show",
  274. "crysis" => "qtracker://{IP}:{S_PORT}?game=Crysis&action=show",
  275. "crysiswars" => "qtracker://{IP}:{S_PORT}?game=CrysisWars&action=show",
  276. "cs2d" => "http://www.cs2d.com",
  277. "cube" => "http://cubeengine.com",
  278. "doomskulltag" => "http://skulltag.com",
  279. "doomzdaemon" => "http://www.zdaemon.org",
  280. "doom3" => "qtracker://{IP}:{S_PORT}?game=Doom3&action=show",
  281. "dh2005" => "http://en.wikipedia.org/wiki/Deer_Hunter_(computer_game)",
  282. "farcry" => "qtracker://{IP}:{S_PORT}?game=FarCry&action=show",
  283. "fear" => "qtracker://{IP}:{S_PORT}?game=FEAR&action=show",
  284. "flashpoint" => "qtracker://{IP}:{S_PORT}?game=OperationFlashpoint&action=show",
  285. "freelancer" => "http://en.wikipedia.org/wiki/Freelancer_(computer_game)",
  286. "frontlines" => "http://en.wikipedia.org/wiki/Frontlines:_Fuel_of_War",
  287. "f1c9902" => "http://en.wikipedia.org/wiki/EA_Sports_F1_Series",
  288. "gamespy1" => "http://www.greycube.com",
  289. "gamespy2" => "http://www.greycube.com",
  290. "gamespy3" => "http://www.greycube.com",
  291. "ghostrecon" => "http://en.wikipedia.org/wiki/Tom_Clancy's_Ghost_Recon",
  292. "graw" => "qtracker://{IP}:{S_PORT}?game=GhostRecon&action=show",
  293. "graw2" => "http://en.wikipedia.org/wiki/Tom_Clancy's_Ghost_Recon_Advanced_Warfighter_2",
  294. "gtr2" => "http://en.wikipedia.org/wiki/GTR2",
  295. "had2" => "http://en.wikipedia.org/wiki/Hidden_&_Dangerous_2",
  296. "halflife" => "steam://connect/{IP}:{S_PORT}",
  297. "halflifewon" => "qtracker://{IP}:{S_PORT}?game=HalfLife_WON2&action=show",
  298. "halo" => "qtracker://{IP}:{S_PORT}?game=Halo&action=show",
  299. "il2" => "http://en.wikipedia.org/wiki/IL-2_Sturmovik_(game)",
  300. "jediknight2" => "qtracker://{IP}:{S_PORT}?game=JediKnight2&action=show",
  301. "jediknightja" => "qtracker://{IP}:{S_PORT}?game=JediKnightJediAcademy&action=show",
  302. "killingfloor" => "qtracker://{IP}:{S_PORT}?game=KillingFloor&action=show",
  303. "kingpin" => "qtracker://{IP}:{S_PORT}?game=Kingpin&action=show",
  304. "modernwarfare3"=> "http://en.wikipedia.org/wiki/Call_of_Duty:_Modern_Warfare_3",
  305. "mohaa" => "qtracker://{IP}:{S_PORT}?game=MedalofHonorAlliedAssault&action=show",
  306. "mohaab" => "qtracker://{IP}:{S_PORT}?game=MedalofHonorAlliedAssaultBreakthrough&action=show",
  307. "mohaas" => "qtracker://{IP}:{S_PORT}?game=MedalofHonorAlliedAssaultSpearhead&action=show",
  308. "mohpa" => "qtracker://{IP}:{S_PORT}?game=MedalofHonorPacificAssault&action=show",
  309. "mta" => "http://en.wikipedia.org/wiki/Multi_Theft_Auto",
  310. "nascar2004" => "http://en.wikipedia.org/wiki/NASCAR_Thunder_2004",
  311. "neverwinter" => "qtracker://{IP}:{S_PORT}?game=NeverwinterNights&action=show",
  312. "neverwinter2" => "qtracker://{IP}:{S_PORT}?game=NeverwinterNights&action=show",
  313. "nexuiz" => "qtracker://{IP}:{S_PORT}?game=Nexuiz&action=show",
  314. "openttd" => "http://wwww.openttd.org",
  315. "painkiller" => "qtracker://{IP}:{S_PORT}?game=Painkiller&action=show",
  316. "plainsight" => "http://www.plainsightgame.com",
  317. "prey" => "qtracker://{IP}:{S_PORT}?game=Prey&action=show",
  318. "quakeworld" => "qtracker://{IP}:{S_PORT}?game=QuakeWorld&action=show",
  319. "quakewars" => "qtracker://{IP}:{S_PORT}?game=EnemyTerritoryQuakeWars&action=show",
  320. "quake2" => "qtracker://{IP}:{S_PORT}?game=Quake2&action=show",
  321. "quake3" => "qtracker://{IP}:{S_PORT}?game=Quake3&action=show",
  322. "quake4" => "qtracker://{IP}:{S_PORT}?game=Quake4&action=show",
  323. "ravenshield" => "http://en.wikipedia.org/wiki/Tom_Clancy's_Rainbow_Six_3",
  324. "redorchestra" => "qtracker://{IP}:{S_PORT}?game=RedOrchestra&action=show",
  325. "rfactor" => "rfactor://{IP}:{S_PORT}",
  326. "samp" => "http://www.sa-mp.com",
  327. "savage" => "http://en.wikipedia.org/wiki/Savage:_The_Battle_for_Newerth",
  328. "savage2" => "http://en.wikipedia.org/wiki/Savage_2:_A_Tortured_Soul",
  329. "serioussam" => "qtracker://{IP}:{S_PORT}?game=SeriousSam&action=show",
  330. "serioussam2" => "qtracker://{IP}:{S_PORT}?game=Serious_Sam2&action=show",
  331. "shatteredh" => "http://en.wikipedia.org/wiki/Shattered_Horizon",
  332. "sof2" => "qtracker://{IP}:{S_PORT}?game=SoldierOfFortune2&action=show",
  333. "soldat" => "http://www.soldat.pl",
  334. "source" => "steam://connect/{IP}:{S_PORT}",
  335. "stalker" => "qtracker://{IP}:{S_PORT}?game=STALKER_ShadowChernobyl&action=show",
  336. "stalkercs" => "qtracker://{IP}:{S_PORT}?game=STALKER_ClearSky&action=show",
  337. "startrekef" => "http://en.wikipedia.org/wiki/Star_Trek:_Voyager:_Elite_Force",
  338. "starwarsbf" => "qtracker://{IP}:{S_PORT}?game=StarWarsBattlefront&action=show",
  339. "starwarsbf2" => "qtracker://{IP}:{S_PORT}?game=StarWarsBattlefront2&action=show",
  340. "starwarsrc" => "qtracker://{IP}:{S_PORT}?game=StarWarsRepublicCommando&action=show",
  341. "swat4" => "qtracker://{IP}:{S_PORT}?game=SWAT4&action=show",
  342. "test" => "http://www.greycube.com",
  343. "teeworlds" => "http://www.teeworlds.com",
  344. "tribes" => "qtracker://{IP}:{S_PORT}?game=Tribes&action=show",
  345. "tribes2" => "qtracker://{IP}:{S_PORT}?game=Tribes2&action=show",
  346. "tribesv" => "qtracker://{IP}:{S_PORT}?game=TribesVengeance&action=show",
  347. "urbanterror" => "qtracker://{IP}:{S_PORT}?game=UrbanTerror&action=show",
  348. "ut" => "qtracker://{IP}:{S_PORT}?game=UnrealTournament&action=show",
  349. "ut2003" => "qtracker://{IP}:{S_PORT}?game=UnrealTournament2003&action=show",
  350. "ut2004" => "qtracker://{IP}:{S_PORT}?game=UnrealTournament2004&action=show",
  351. "ut3" => "qtracker://{IP}:{S_PORT}?game=UnrealTournament3&action=show",
  352. "vcmp" => "http://vicecitymultiplayer.com",
  353. "vietcong" => "qtracker://{IP}:{S_PORT}?game=Vietcong&action=show",
  354. "vietcong2" => "qtracker://{IP}:{S_PORT}?game=Vietcong2&action=show",
  355. "warsow" => "qtracker://{IP}:{S_PORT}?game=Warsow&action=show",
  356. "warsowold" => "qtracker://{IP}:{S_PORT}?game=Warsow&action=show",
  357. "wolfet" => "qtracker://{IP}:{S_PORT}?game=WolfensteinEnemyTerritory&action=show",
  358. "wolfrtcw" => "qtracker://{IP}:{S_PORT}?game=ReturntoCastleWolfenstein&action=show",
  359. "wolf2009" => "http://en.wikipedia.org/wiki/Wolfenstein_(2009_video_game)");
  360. // SOFTWARE PORT IS THE QUERY PORT UNLESS SET
  361. if (!$s_port) { $s_port = $q_port; }
  362. // TRY USING THE STANDARD LAUNCH LINK FOR ALTERNATE PROTOCOLS IF ONE IS NOT SET
  363. if (!isset($lgsl_software_link[$type])) { $type = str_replace("_", "", $type); }
  364. // INSERT DATA INTO STATIC LINK - CONVERT SPECIAL CHARACTERS - RETURN
  365. return htmlentities(str_replace(array("{IP}", "{C_PORT}", "{Q_PORT}", "{S_PORT}"), array($ip, $c_port, $q_port, $s_port), $lgsl_software_link[$type]), ENT_QUOTES);
  366. }
  367. //------------------------------------------------------------------------------------------------------------+
  368. //------------------------------------------------------------------------------------------------------------+
  369. function lgsl_port_conversion($type, $c_port, $q_port, $s_port)
  370. {
  371. switch ($type) // GAMES WHERE Q_PORT IS NOT EQUAL TO C_PORT
  372. {
  373. case "aarmy" : $c_to_q = 1; $c_def = 1716; $q_def = 1717; $c_to_s = 0; break;
  374. case "aarmy3" : $c_to_q = 0; $c_def = 8777; $q_def = 39300; $c_to_s = 0; break;
  375. case "arcasimracing" : $c_to_q = -100; $c_def = 34397; $q_def = 34297; $c_to_s = 0; break;
  376. case "bfbc2" : $c_to_q = 0; $c_def = 19567; $q_def = 48888; $c_to_s = 0; break;
  377. case "bfvietnam" : $c_to_q = 0; $c_def = 15567; $q_def = 23000; $c_to_s = 0; break;
  378. case "bf1942" : $c_to_q = 0; $c_def = 14567; $q_def = 23000; $c_to_s = 0; break;
  379. case "bf2" : $c_to_q = 0; $c_def = 16567; $q_def = 29900; $c_to_s = 0; break;
  380. case "bf3" : $c_to_q = 22000; $c_def = 25200; $q_def = 47200; $c_to_s = 0; break;
  381. case "bf2142" : $c_to_q = 0; $c_def = 17567; $q_def = 29900; $c_to_s = 0; break;
  382. case "cube" : $c_to_q = 1; $c_def = 28785; $q_def = 28786; $c_to_s = 0; break;
  383. case "dh2005" : $c_to_q = 0; $c_def = 23459; $q_def = 34567; $c_to_s = 0; break;
  384. case "farcry" : $c_to_q = 123; $c_def = 49001; $q_def = 49124; $c_to_s = 0; break;
  385. case "flashpoint" : $c_to_q = 1; $c_def = 2302; $q_def = 2303; $c_to_s = 0; break;
  386. case "frontlines" : $c_to_q = 2; $c_def = 5476; $q_def = 5478; $c_to_s = 0; break;
  387. case "ghostrecon" : $c_to_q = 2; $c_def = 2346; $q_def = 2348; $c_to_s = 0; break;
  388. case "gtr2" : $c_to_q = 1; $c_def = 34297; $q_def = 34298; $c_to_s = 0; break;
  389. case "had2" : $c_to_q = 3; $c_def = 11001; $q_def = 11004; $c_to_s = 0; break;
  390. case "kingpin" : $c_to_q = -10; $c_def = 31510; $q_def = 31500; $c_to_s = 0; break;
  391. case "killingfloor" : $c_to_q = 1; $c_def = 7708; $q_def = 7709; $c_to_s = 0; break;
  392. case "modernwarfare3": $c_to_q = -1; $c_def = 27015; $q_def = 27017; $c_to_s = 0; break;
  393. case "mohaa" : $c_to_q = 97; $c_def = 12203; $q_def = 12300; $c_to_s = 0; break;
  394. case "mohaab" : $c_to_q = 97; $c_def = 12203; $q_def = 12300; $c_to_s = 0; break;
  395. case "mohaas" : $c_to_q = 97; $c_def = 12203; $q_def = 12300; $c_to_s = 0; break;
  396. case "mohpa" : $c_to_q = 97; $c_def = 13203; $q_def = 13300; $c_to_s = 0; break;
  397. case "mta" : $c_to_q = 123; $c_def = 22003; $q_def = 22126; $c_to_s = 0; break;
  398. case "painkiller" : $c_to_q = 123; $c_def = 3455; $q_def = 3578; $c_to_s = 0; break;
  399. case "ravenshield" : $c_to_q = 1000; $c_def = 7777; $q_def = 8777; $c_to_s = 0; break;
  400. case "redorchestra" : $c_to_q = 1; $c_def = 7758; $q_def = 7759; $c_to_s = 0; break;
  401. case "rfactor" : $c_to_q = -100; $c_def = 34397; $q_def = 34297; $c_to_s = 0; break;
  402. case "serioussam" : $c_to_q = 1; $c_def = 25600; $q_def = 25601; $c_to_s = 0; break;
  403. case "soldat" : $c_to_q = 123; $c_def = 23073; $q_def = 23196; $c_to_s = 0; break;
  404. case "stalker" : $c_to_q = 2; $c_def = 5447; $q_def = 5445; $c_to_s = 0; break;
  405. case "stalkercs" : $c_to_q = 2; $c_def = 5447; $q_def = 5445; $c_to_s = 0; break;
  406. case "starwarsrc" : $c_to_q = 0; $c_def = 7777; $q_def = 11138; $c_to_s = 0; break;
  407. case "swat4" : $c_to_q = 1; $c_def = 10780; $q_def = 10781; $c_to_s = 0; break;
  408. case "tribesv" : $c_to_q = 1; $c_def = 7777; $q_def = 7778; $c_to_s = 0; break;
  409. case "ut" : $c_to_q = 1; $c_def = 7777; $q_def = 7778; $c_to_s = 0; break;
  410. case "ut2003" : $c_to_q = 1; $c_def = 7757; $q_def = 7758; $c_to_s = 10; break;
  411. case "ut2003_" : $c_to_q = 10; $c_def = 7757; $q_def = 7767; $c_to_s = 0; break;
  412. case "ut2004" : $c_to_q = 1; $c_def = 7777; $q_def = 7778; $c_to_s = 10; break;
  413. case "ut2004_" : $c_to_q = 10; $c_def = 7777; $q_def = 7787; $c_to_s = 0; break;
  414. case "ut3" : $c_to_q = 0; $c_def = 7777; $q_def = 6500; $c_to_s = 0; break;
  415. case "vietcong" : $c_to_q = 10000; $c_def = 5425; $q_def = 15425; $c_to_s = 0; break;
  416. case "vietcong2" : $c_to_q = 0; $c_def = 5001; $q_def = 19967; $c_to_s = 0; break;
  417. default : $c_to_q = 0; $c_def = 0; $q_def = 0; $c_to_s = 0; break;
  418. }
  419. if (!$c_port && !$q_port && $c_def) { $c_port = $c_def; $q_port = $q_def; }
  420. if (!$c_port && $q_port && $c_to_q) { $c_port = $q_port - $c_to_q; }
  421. elseif (!$c_port && $q_port && $c_def) { $c_port = $c_def; }
  422. elseif (!$c_port && $q_port) { $c_port = $q_port; }
  423. if (!$q_port && $c_port && $c_to_q) { $q_port = $c_port + $c_to_q; }
  424. elseif (!$q_port && $c_port && $q_def) { $q_port = $q_def; }
  425. elseif (!$q_port && $c_port) { $q_port = $c_port; }
  426. if (!$s_port && $c_to_s) { $s_port = $c_port + $c_to_s; }
  427. return array(intval($c_port), intval($q_port), intval($s_port));
  428. }
  429. //------------------------------------------------------------------------------------------------------------+
  430. //------------------------------------------------------------------------------------------------------------+
  431. function lgsl_query_live($type, $ip, $c_port, $q_port, $s_port, $request)
  432. {
  433. //---------------------------------------------------------+
  434. if (preg_match("/[^0-9a-z\.\-\[\]\:]/i", $ip))
  435. {
  436. exit("LGSL PROBLEM: INVALID IP OR HOSTNAME");
  437. }
  438. $lgsl_protocol_list = lgsl_protocol_list();
  439. if (!isset($lgsl_protocol_list[$type]))
  440. {
  441. exit("LGSL PROBLEM: ".($type ? "INVALID TYPE '{$type}'" : "MISSING TYPE")." FOR {$ip}, {$c_port}, {$q_port}, {$s_port}");
  442. }
  443. $lgsl_function = "lgsl_query_{$lgsl_protocol_list[$type]}";
  444. if (!function_exists($lgsl_function))
  445. {
  446. exit("LGSL PROBLEM: FUNCTION DOES NOT EXIST FOR: {$type}");
  447. }
  448. if (!intval($q_port))
  449. {
  450. exit("LGSL PROBLEM: INVALID QUERY PORT");
  451. }
  452. //---------------------------------------------------------+
  453. // ARRAYS ARE SETUP IN ADVANCE
  454. $server = array(
  455. "b" => array("type" => $type, "ip" => $ip, "c_port" => $c_port, "q_port" => $q_port, "s_port" => $s_port, "status" => 1),
  456. "s" => array("game" => "", "name" => "", "map" => "", "players" => 0, "playersmax" => 0, "password" => ""),
  457. "e" => array(),
  458. "p" => array(),
  459. "t" => array());
  460. //---------------------------------------------------------+
  461. // GET DATA
  462. if ($lgsl_function == "lgsl_query_01") // TEST BYPAssES THE REST
  463. {
  464. $lgsl_need = ""; $lgsl_fp = "";
  465. $response = call_user_func_array($lgsl_function, array(&$server, &$lgsl_need, &$lgsl_fp));
  466. return $server;
  467. }
  468. global $lgsl_config; // FEED ENABLED BY EXTERNAL CONFIG SETTING
  469. if (!empty($lgsl_config['feed']['method']) && !empty($lgsl_config['feed']['url']))
  470. {
  471. $response = lgsl_query_feed($server, $request, $lgsl_config['feed']['method'], $lgsl_config['feed']['url']);
  472. }
  473. elseif ($lgsl_function == "lgsl_query_30")
  474. {
  475. $response = lgsl_query_direct($server, $request, $lgsl_function, "tcp");
  476. }
  477. elseif ($lgsl_function == "lgsl_query_33")
  478. {
  479. $response = lgsl_query_direct($server, $request, $lgsl_function, "tcp");
  480. }
  481. else
  482. {
  483. $response = lgsl_query_direct($server, $request, $lgsl_function, "udp");
  484. }
  485. //---------------------------------------------------------+
  486. // FORMAT RESPONSE
  487. if (!$response) // SERVER OFFLINE
  488. {
  489. $server['b']['status'] = 0;
  490. }
  491. else
  492. {
  493. // IF NOT RETURNED USE THE TYPE AS THE GAME
  494. if (empty($server['s']['game'])) { $server['s']['game'] = $type; }
  495. if (empty($server['s']['map'])) { $server['s']['map'] = "-"; }
  496. // REMOVE FOLDERS FROM MAP NAMES
  497. if (($pos = strrpos($server['s']['map'], "/")) !== FALSE) { $server['s']['map'] = substr($server['s']['map'], $pos + 1); }
  498. if (($pos = strrpos($server['s']['map'], "\\")) !== FALSE) { $server['s']['map'] = substr($server['s']['map'], $pos + 1); }
  499. // PLAYER COUNT AND PASSWORD STATUS SHOULD BE NUMERIC
  500. $server['s']['players'] = intval($server['s']['players']);
  501. $server['s']['playersmax'] = intval($server['s']['playersmax']);
  502. if (strtolower($server['s']['password']) == "false") { $server['s']['password'] = 0; }
  503. if (strtolower($server['s']['password']) == "true") { $server['s']['password'] = 1; }
  504. $server['s']['password'] = intval($server['s']['password']);
  505. // REMOVE UN-REQUESTED AND UN-USED ARRAYS
  506. if (strpos($request, "p") === FALSE && empty($server['p']) && $server['s']['players'] != 0) { unset($server['p']); }
  507. if (strpos($request, "p") === FALSE && empty($server['t'])) { unset($server['t']); }
  508. if (strpos($request, "e") === FALSE && empty($server['e'])) { unset($server['e']); }
  509. if (strpos($request, "s") === FALSE && empty($server['s']['name']) && empty($server['s']['map'])) { unset($server['s']); }
  510. }
  511. //---------------------------------------------------------+
  512. return $server;
  513. }
  514. //------------------------------------------------------------------------------------------------------------+
  515. //------------------------------------------------------------------------------------------------------------+
  516. function lgsl_query_direct(&$server, $request, $lgsl_function, $scheme)
  517. {
  518. //---------------------------------------------------------+
  519. $lgsl_fp = @fsockopen("{$scheme}://{$server['b']['ip']}", $server['b']['q_port'], $errno, $errstr, 1);
  520. if (!$lgsl_fp) { return FALSE; }
  521. //---------------------------------------------------------+
  522. global $lgsl_config;
  523. $lgsl_config['timeout'] = intval($lgsl_config['timeout']);
  524. stream_set_timeout($lgsl_fp, $lgsl_config['timeout'], $lgsl_config['timeout'] ? 0 : 500000);
  525. stream_set_blocking($lgsl_fp, TRUE);
  526. //---------------------------------------------------------+
  527. // CHECK WHAT IS NEEDED
  528. $lgsl_need = array();
  529. $lgsl_need['s'] = strpos($request, "s") !== FALSE ? TRUE : FALSE;
  530. $lgsl_need['e'] = strpos($request, "e") !== FALSE ? TRUE : FALSE;
  531. $lgsl_need['p'] = strpos($request, "p") !== FALSE ? TRUE : FALSE;
  532. // ChANGE [e] TO [s][e] AS BASIC QUERIES OFTEN RETURN EXTRA INFO
  533. if ($lgsl_need['e'] && !$lgsl_need['s']) { $lgsl_need['s'] = TRUE; }
  534. //---------------------------------------------------------+
  535. // QUERY FUNCTION IS REPEATED TO REDUCE DUPLICATE CODE
  536. do
  537. {
  538. $lgsl_need_check = $lgsl_need;
  539. // CALL FUNCTION REQUIRES '&$variable' TO PASS 'BY REFERENCE'
  540. $response = call_user_func_array($lgsl_function, array(&$server, &$lgsl_need, &$lgsl_fp));
  541. // CHECK IF SERVER IS OFFLINE
  542. if (!$response) { break; }
  543. // CHECK IF NEED HAS NOT CHANGED - THIS SERVES TWO PURPOSES - TO PREVENT INFINITE LOOPS - AND TO
  544. // AVOID WRITING $lgsl_need = FALSE FALSE FALSE FOR GAMES THAT RETURN ALL DATA IN ONE RESPONSE
  545. if ($lgsl_need_check == $lgsl_need) { break; }
  546. // OPTIMIZATION THAT SKIPS REQUEST FOR PLAYER DETAILS WHEN THE SERVER IS KNOWN TO BE EMPTY
  547. if ($lgsl_need['p'] && $server['s']['players'] == "0") { $lgsl_need['p'] = FALSE; }
  548. }
  549. while ($lgsl_need['s'] == TRUE || $lgsl_need['e'] == TRUE || $lgsl_need['p'] == TRUE);
  550. //---------------------------------------------------------+
  551. @fclose($lgsl_fp);
  552. return $response;
  553. }
  554. //------------------------------------------------------------------------------------------------------------+
  555. //------------------------------------------------------------------------------------------------------------+
  556. function lgsl_query_01(&$server, &$lgsl_need, &$lgsl_fp)
  557. {
  558. //---------------------------------------------------------+
  559. // PROTOCOL FOR DEVELOPING WITHOUT USING LIVE SERVERS TO HELP ENSURE RETURNED
  560. // DATA IS SANITIZED AND THAT LONG SERVER AND PLAYER NAMES ARE HANDLED PROPERLY
  561. $server['s'] = array(
  562. "game" => "test_game",
  563. "name" => "test_ServerNameThatsOften'Really'LongAndCanHaveSymbols<hr />ThatWill\"Screw\"UpHtmlUnlessEntitied",
  564. "map" => "test_map",
  565. "players" => rand(0, 16),
  566. "playersmax" => rand(16, 32),
  567. "password" => rand(0, 1));
  568. //---------------------------------------------------------+
  569. $server['e'] = array(
  570. "testextra1" => "normal",
  571. "testextra2" => 123,
  572. "testextra3" => time(),
  573. "testextra4" => "",
  574. "testextra5" => "<b>Setting<hr />WithHtml</b>",
  575. "testextra6" => "ReallyLongSettingLikeSomeMapCyclesThatHaveNoSpacesAndCauseThePageToGoReallyWideIfNotBrokenUp");
  576. //---------------------------------------------------------+
  577. $server['p']['0']['name'] = "Normal";
  578. $server['p']['0']['score'] = "12";
  579. $server['p']['0']['ping'] = "34";
  580. $server['p']['1']['name'] = "\xc3\xa9\x63\x68\x6f\x20\xd0\xb8-d0\xb3\xd1\x80\xd0\xbe\xd0\xba"; // UTF PLAYER NAME
  581. $server['p']['1']['score'] = "56";
  582. $server['p']['1']['ping'] = "78";
  583. $server['p']['2']['name'] = "One&<Two>&Three&\"Four\"&'Five'";
  584. $server['p']['2']['score'] = "90";
  585. $server['p']['2']['ping'] = "12";
  586. $server['p']['3']['name'] = "ReallyLongPlayerNameBecauseTheyAreUberCoolAndAreInFiveClans";
  587. $server['p']['3']['score'] = "90";
  588. $server['p']['3']['ping'] = "12";
  589. //---------------------------------------------------------+
  590. if (rand(0, 10) == 5) { $server['p'] = array(); } // RANDOM NO PLAYERS
  591. if (rand(0, 10) == 5) { return FALSE; } // RANDOM GOING OFFLINE
  592. //---------------------------------------------------------+
  593. return TRUE;
  594. }
  595. //------------------------------------------------------------------------------------------------------------+
  596. //------------------------------------------------------------------------------------------------------------+
  597. function lgsl_query_02(&$server, &$lgsl_need, &$lgsl_fp)
  598. {
  599. //---------------------------------------------------------+
  600. if ($server['b']['type'] == "quake2") { fwrite($lgsl_fp, "\xFF\xFF\xFF\xFFstatus"); }
  601. elseif ($server['b']['type'] == "warsowold") { fwrite($lgsl_fp, "\xFF\xFF\xFF\xFFgetinfo"); }
  602. elseif (strpos($server['b']['type'], "moh") !== FALSE) { fwrite($lgsl_fp, "\xFF\xFF\xFF\xFF\x02getstatus"); } // mohaa_ mohaab_ mohaas_ mohpa_
  603. else { fwrite($lgsl_fp, "\xFF\xFF\xFF\xFFgetstatus"); }
  604. $buffer = fread($lgsl_fp, 4096);
  605. if (!$buffer) { return FALSE; }
  606. //---------------------------------------------------------+
  607. $part = explode("\n", $buffer); // SPLIT INTO PARTS: HEADER/SETTINGS/PLAYERS/FOOTER
  608. array_pop($part); // REMOVE FOOTER WHICH IS EITHER NULL OR "\challenge\"
  609. $item = explode("\\", $part[1]); // SPLIT PART INTO ITEMS
  610. foreach ($item as $item_key => $data_key)
  611. {
  612. if (!($item_key % 2)) { continue; } // SKIP EVEN KEYS
  613. $data_key = strtolower(lgsl_parse_color($data_key, "1"));
  614. $server['e'][$data_key] = lgsl_parse_color($item[$item_key+1], "1");
  615. }
  616. //---------------------------------------------------------+
  617. if (!empty($server['e']['hostname'])) { $server['s']['name'] = $server['e']['hostname']; }
  618. if (!empty($server['e']['sv_hostname'])) { $server['s']['name'] = $server['e']['sv_hostname']; }
  619. if (isset($server['e']['gamename'])) { $server['s']['game'] = $server['e']['gamename']; }
  620. if (isset($server['e']['mapname'])) { $server['s']['map'] = $server['e']['mapname']; }
  621. $server['s']['players'] = empty($part['2']) ? 0 : count($part) - 2;
  622. if (isset($server['e']['maxclients'])) { $server['s']['playersmax'] = $server['e']['maxclients']; } // QUAKE 2
  623. if (isset($server['e']['sv_maxclients'])) { $server['s']['playersmax'] = $server['e']['sv_maxclients']; }
  624. if (isset($server['e']['pswrd'])) { $server['s']['password'] = $server['e']['pswrd']; } // CALL OF DUTY
  625. if (isset($server['e']['needpass'])) { $server['s']['password'] = $server['e']['needpass']; } // QUAKE 2
  626. if (isset($server['e']['g_needpass'])) { $server['s']['password'] = $server['e']['g_needpass']; }
  627. array_shift($part); // REMOVE HEADER
  628. array_shift($part); // REMOVE SETTING
  629. //---------------------------------------------------------+
  630. if ($server['b']['type'] == "nexuiz") // (SCORE) (PING) (TEAM IF TEAM GAME) "(NAME)"
  631. {
  632. $pattern = "/(.*) (.*) (.*)\"(.*)\"/U"; $fields = array(1=>"score", 2=>"ping", 3=>"team", 4=>"name");
  633. }
  634. elseif ($server['b']['type'] == "warsow") // (SCORE) (PING) "(NAME)" (TEAM)
  635. {
  636. $pattern = "/(.*) (.*) \"(.*)\" (.*)/"; $fields = array(1=>"score", 2=>"ping", 3=>"name", 4=>"team");
  637. }
  638. elseif ($server['b']['type'] == "sof2") // (SCORE) (PING) (DEATHS) "(NAME)"
  639. {
  640. $pattern = "/(.*) (.*) (.*) \"(.*)\"/"; $fields = array(1=>"score", 2=>"ping", 3=>"deaths", 4=>"name");
  641. }
  642. elseif (strpos($server['b']['type'], "mohpa") !== FALSE) // (?) (SCORE) (?) (TIME) (?) "(RANK?)" "(NAME)"
  643. {
  644. $pattern = "/(.*) (.*) (.*) (.*) (.*) \"(.*)\" \"(.*)\"/"; $fields = array(2=>"score", 3=>"deaths", 4=>"time", 6=>"rank", 7=>"name");
  645. }
  646. elseif (strpos($server['b']['type'], "moh") !== FALSE) // (PING) "(NAME)"
  647. {
  648. $pattern = "/(.*) \"(.*)\"/"; $fields = array(1=>"ping", 2=>"name");
  649. }
  650. else // (SCORE) (PING) "(NAME)"
  651. {
  652. $pattern = "/(.*) (.*) \"(.*)\"/"; $fields = array(1=>"score", 2=>"ping", 3=>"name");
  653. }
  654. //---------------------------------------------------------+
  655. foreach ($part as $player_key => $data)
  656. {
  657. if (!$data) { continue; }
  658. preg_match($pattern, $data, $match);
  659. foreach ($fields as $match_key => $field_name)
  660. {
  661. if (isset($match[$match_key])) { $server['p'][$player_key][$field_name] = trim($match[$match_key]); }
  662. }
  663. $server['p'][$player_key]['name'] = lgsl_parse_color($server['p'][$player_key]['name'], "1");
  664. if (isset($server['p'][$player_key]['time']))
  665. {
  666. $server['p'][$player_key]['time'] = lgsl_time($server['p'][$player_key]['time']);
  667. }
  668. }
  669. //---------------------------------------------------------+
  670. return TRUE;
  671. }
  672. //------------------------------------------------------------------------------------------------------------+
  673. //------------------------------------------------------------------------------------------------------------+
  674. function lgsl_query_03(&$server, &$lgsl_need, &$lgsl_fp)
  675. {
  676. //---------------------------------------------------------+
  677. // BF1942 HAS A BUG WHERE IT RETURNS EXTRA NAMES - TO SKIP THESE 'GHOSTS' LATER WE NEED AN [s] REQUEST TO GET THE CURRENT NUMBER OF PLAYERS
  678. if ($server['b']['type'] == "bf1942" && $lgsl_need['p'] && !$lgsl_need['s'] && !isset($lgsl_need['sp'])) { $lgsl_need['s'] = TRUE; $lgsl_need['sp'] = TRUE; }
  679. if ($server['b']['type'] == "cncrenegade") { fwrite($lgsl_fp, "\\status\\"); }
  680. elseif ($lgsl_need['s'] || $lgsl_need['e']) { fwrite($lgsl_fp, "\\basic\\\\info\\\\rules\\"); $lgsl_need['s'] = FALSE; $lgsl_need['e'] = FALSE; }
  681. elseif ($lgsl_need['p']) { fwrite($lgsl_fp, "\\players\\"); $lgsl_need['p'] = FALSE; }
  682. //---------------------------------------------------------+
  683. $buffer = "";
  684. $packet_count = 0;
  685. $packet_total = 20;
  686. do
  687. {
  688. $packet = fread($lgsl_fp, 4096);
  689. // QUERY PORT CHECK AS THE CONNECTION PORT WILL ALSO RESPOND
  690. if (strpos($packet, "\\") === FALSE) { return FALSE; }
  691. // REMOVE SLASH PREFIX
  692. if ($packet[0] == "\\") { $packet = substr($packet, 1); }
  693. // QUICK AND DIRTY FIX FOR AVP2 HAVING PREFIXES ON THE PLAYER NAMES
  694. if (!$lgsl_need['s'] && !$lgsl_need['e'] && $server['b']['type'] == "avp2") { $packet = preg_replace("/\\\[0-9]+~/", "\\", $packet); }
  695. while ($packet)
  696. {
  697. $key = strtolower(lgsl_cut_string($packet, 0, "\\"));
  698. $value = trim(lgsl_cut_string($packet, 0, "\\"));
  699. // CHECK IF KEY IS PLAYER DATA
  700. if (preg_match("/(.*)_([0-9]+)$/", $key, $match))
  701. {
  702. // SEPERATE TEAM NAMES
  703. if ($match[1] == "teamname") { $server['t'][$match[2]]['name'] = $value; continue; }
  704. // CONVERT TO LGSL STANDARD
  705. if ($match[1] == "player") { $match[1] = "name"; }
  706. elseif ($match[1] == "playername") { $match[1] = "name"; }
  707. elseif ($match[1] == "frags") { $match[1] = "score"; }
  708. elseif ($match[1] == "ngsecret") { $match[1] = "stats"; }
  709. $server['p'][$match[2]][$match[1]] = $value; continue;
  710. }
  711. // SEPERATE QUERYID
  712. if ($key == "queryid") { $queryid = $value; continue; }
  713. // SERVER SETTING
  714. $server['e'][$key] = $value;
  715. }
  716. // FINAL PACKET NUMBER IS THE TOTAL
  717. if (isset($server['e']['final']))
  718. {
  719. preg_match("/([0-9]+)\.([0-9]+)/", $queryid, $match);
  720. $packet_total = intval($match[2]);
  721. unset($server['e']['final']);
  722. }
  723. $packet_count ++;
  724. }
  725. while ($packet_count < $packet_total);
  726. //---------------------------------------------------------+
  727. if ($server['e']['mapname'])
  728. {
  729. $server['s']['map'] = $server['e']['mapname'];
  730. if (!empty($server['e']['hostname'])) { $server['s']['name'] = $server['e']['hostname']; }
  731. if (!empty($server['e']['sv_hostname'])) { $server['s']['name'] = $server['e']['sv_hostname']; }
  732. if (!empty($server['e']['gamename'])) { $server['s']['game'] = $server['e']['gamename']; }
  733. if (!empty($server['e']['gameid']) && empty($server['e']['gamename'])) { $server['s']['game'] = $server['e']['gameid']; }
  734. if (!empty($server['e']['gameid']) && $server['b']['type'] == "bf1942") { $server['s']['game'] = $server['e']['gameid']; }
  735. if (isset($server['e']['mapname'])) { $server['s']['map'] = $server['e']['mapname']; }
  736. if (isset($server['e']['numplayers'])) { $server['s']['players'] = $server['e']['numplayers']; }
  737. if (isset($server['e']['maxplayers'])) { $server['s']['playersmax'] = $server['e']['maxplayers']; }
  738. if (isset($server['e']['password'])) { $server['s']['password'] = $server['e']['password']; }
  739. }
  740. //---------------------------------------------------------+
  741. if ($server['p'])
  742. {
  743. // REMOVE BF1942 GHOST PLAYERS WHICH ALSO RE-INDEXES PLAYER KEYS
  744. if ($server['b']['type'] == "bf1942" && $server['s']['players']) { $server['p'] = array_slice($server['p'], 0, $server['s']['players']); }
  745. // OPERATION FLASHPOINT BUG: 'GHOST' PLAYERS IN UN-USED 'TEAM' FIELD
  746. if ($server['b']['type'] == "flashpoint")
  747. {
  748. foreach ($server['p'] as $key => $value)
  749. {
  750. unset($server['p'][$key]['team']);
  751. }
  752. }
  753. // AVP2 BUG: PLAYER NUMBER PREFIXED TO NAMES
  754. if ($server['b']['type'] == "avp2")
  755. {
  756. foreach ($server['p'] as $key => $value)
  757. {
  758. $server['p'][$key]['name'] = preg_replace("/[0-9]+~/", "", $server['p'][$key]['name']);
  759. }
  760. }
  761. // CHANGE TEAM NUMBERS TO TEAM NAMES IF POSSIBLE
  762. if (isset($server['t'][0]['name']))
  763. {
  764. foreach ($server['p'] as $key => $value)
  765. {
  766. $team_key = $server['p'][$key]['team'] - 1;
  767. $server['p'][$key]['team'] = $server['t'][$team_key]['name'];
  768. }
  769. }
  770. // RE-INDEX PLAYER KEYS TO REMOVE ANY GAPS
  771. $server['p'] = array_values($server['p']);
  772. }
  773. return TRUE;
  774. }
  775. //------------------------------------------------------------------------------------------------------------+
  776. //------------------------------------------------------------------------------------------------------------+
  777. function lgsl_query_04(&$server, &$lgsl_need, &$lgsl_fp)
  778. {
  779. //---------------------------------------------------------+
  780. fwrite($lgsl_fp, "REPORT");
  781. $buffer = fread($lgsl_fp, 4096);
  782. if (!$buffer) { return FALSE; }
  783. //---------------------------------------------------------+
  784. $lgsl_ravenshield_key = array(
  785. "A1" => "playersmax",
  786. "A2" => "tkpenalty",
  787. "B1" => "players",
  788. "B2" => "allowradar",
  789. "D2" => "version",
  790. "E1" => "mapname",
  791. "E2" => "lid",
  792. "F1" => "maptype",
  793. "F2" => "gid",
  794. "G1" => "password",
  795. "G2" => "hostport",
  796. "H1" => "dedicated",
  797. "H2" => "terroristcount",
  798. "I1" => "hostname",
  799. "I2" => "aibackup",
  800. "J1" => "mapcycletypes",
  801. "J2" => "rotatemaponsuccess",
  802. "K1" => "mapcycle",
  803. "K2" => "forcefirstpersonweapons",
  804. "L1" => "players_name",
  805. "L2" => "gamename",
  806. "L3" => "punkbuster",
  807. "M1" => "players_time",
  808. "N1" => "players_ping",
  809. "O1" => "players_score",
  810. "P1" => "queryport",
  811. "Q1" => "rounds",
  812. "R1" => "roundtime",
  813. "S1" => "bombtimer",
  814. "T1" => "bomb",
  815. "W1" => "allowteammatenames",
  816. "X1" => "iserver",
  817. "Y1" => "friendlyfire",
  818. "Z1" => "autobalance");
  819. //---------------------------------------------------------+
  820. $item = explode("\xB6", $buffer);
  821. foreach ($item as $data_value)
  822. {
  823. $tmp = explode(" ", $data_value, 2);
  824. $data_key = isset($lgsl_ravenshield_key[$tmp[0]]) ? $lgsl_ravenshield_key[$tmp[0]] : $tmp[0]; // CONVERT TO DESCRIPTIVE KEYS
  825. $server['e'][$data_key] = trim($tmp[1]); // ALL VALUES NEED TRIMMING
  826. }
  827. $server['e']['mapcycle'] = str_replace("/"," ", $server['e']['mapcycle']); // CONVERT SLASH TO SPACE
  828. $server['e']['mapcycletypes'] = str_replace("/"," ", $server['e']['mapcycletypes']); // SO LONG LISTS WRAP
  829. //---------------------------------------------------------+
  830. $server['s']['game'] = $server['e']['gamename'];
  831. $server['s']['name'] = $server['e']['hostname'];
  832. $server['s']['map'] = $server['e']['mapname'];
  833. $server['s']['players'] = $server['e']['players'];
  834. $server['s']['playersmax'] = $server['e']['playersmax'];
  835. $server['s']['password'] = $server['e']['password'];
  836. //---------------------------------------------------------+
  837. $player_name = isset($server['e']['players_name']) ? explode("/", substr($server['e']['players_name'], 1)) : array(); unset($server['e']['players_name']);
  838. $player_time = isset($server['e']['players_time']) ? explode("/", substr($server['e']['players_time'], 1)) : array(); unset($server['e']['players_time']);
  839. $player_ping = isset($server['e']['players_ping']) ? explode("/", substr($server['e']['players_ping'], 1)) : array(); unset($server['e']['players_ping']);
  840. $player_score = isset($server['e']['players_score']) ? explode("/", substr($server['e']['players_score'], 1)) : array(); unset($server['e']['players_score']);
  841. foreach ($player_name as $key => $name)
  842. {
  843. $server['p'][$key]['name'] = $player_name[$key];
  844. $server['p'][$key]['time'] = $player_time[$key];
  845. $server['p'][$key]['ping'] = $player_ping[$key];
  846. $server['p'][$key]['score'] = $player_score[$key];
  847. }
  848. //---------------------------------------------------------+
  849. return TRUE;
  850. }
  851. //------------------------------------------------------------------------------------------------------------+
  852. //------------------------------------------------------------------------------------------------------------+
  853. function lgsl_query_05(&$server, &$lgsl_need, &$lgsl_fp)
  854. {
  855. //---------------------------------------------------------+
  856. // REFERENCE: http://developer.valvesoftware.com/wiki/Server_Queries
  857. if ($server['b']['type'] == "halflifewon")
  858. {
  859. if ($lgsl_need['s']) { fwrite($lgsl_fp, "\xFF\xFF\xFF\xFFdetails\x00"); }
  860. elseif ($lgsl_need['p']) { fwrite($lgsl_fp, "\xFF\xFF\xFF\xFFplayers\x00"); }
  861. elseif ($lgsl_need['e']) { fwrite($lgsl_fp, "\xFF\xFF\xFF\xFFrules\x00"); }
  862. }
  863. else
  864. {
  865. $challenge_code = isset($lgsl_need['challenge']) ? $lgsl_need['challenge'] : "\x00\x00\x00\x00";
  866. if ($lgsl_need['s']) { fwrite($lgsl_fp, "\xFF\xFF\xFF\xFF\x54Source Engine Query\x00"); }
  867. elseif ($lgsl_need['p']) { fwrite($lgsl_fp, "\xFF\xFF\xFF\xFF\x55{$challenge_code}"); }
  868. elseif ($lgsl_need['e']) { fwrite($lgsl_fp, "\xFF\xFF\xFF\xFF\x56{$challenge_code}"); }
  869. }
  870. //---------------------------------------------------------+
  871. // THE STANDARD HEADER POSITION REVEALS THE TYPE BUT IT MAY NOT ARRIVE FIRST
  872. // ONCE WE KNOW THE TYPE WE CAN FIND THE TOTAL NUMBER OF PACKETS EXPECTED
  873. $packet_temp = array();
  874. $packet_type = 0;
  875. $packet_count = 0;
  876. $packet_total = 4;
  877. do
  878. {
  879. $packet = fread($lgsl_fp, 4096); if (!$packet) { return FALSE; }
  880. //---------------------------------------------------------------------------------------------------------------------------------+
  881. // NEWER HL1 SERVERS REPLY TO A2S_INFO WITH 3 PACKETS ( HL1 FORMAT INFO, SOURCE FORMAT INFO, PLAYERS )
  882. // THIS DISCARDS UN-EXPECTED PACKET FORMATS ON THE GO ( AS READING IN ADVANCE CAUSES TIMEOUT DELAYS FOR OTHER SERVER VERSIONS )
  883. // ITS NOT PERFECT AS [s] CAN FLIP BETWEEN HL1 AND SOURCE FORMATS DEPENDING ON ARRIVAL ORDER ( MAYBE FIX WITH RETURN ON HL1 APPID )
  884. if ($lgsl_need['s']) { if ($packet[4] == "D") { continue; } }
  885. elseif ($lgsl_need['p']) { if ($packet[4] == "m" || $packet[4] == "I") { continue; } }
  886. elseif ($lgsl_need['e']) { if ($packet[4] == "m" || $packet[4] == "I" || $packet[4] == "D") { continue; } }
  887. //---------------------------------------------------------------------------------------------------------------------------------+
  888. if (substr($packet, 0, 5) == "\xFF\xFF\xFF\xFF\x41") { $lgsl_need['challenge'] = substr($packet, 5, 4); return TRUE; } // REPEAT WITH GIVEN CHALLENGE CODE
  889. elseif (substr($packet, 0, 4) == "\xFF\xFF\xFF\xFF") { $packet_total = 1; $packet_type = 1; } // SINGLE PACKET - HL1 OR HL2
  890. elseif (substr($packet, 9, 4) == "\xFF\xFF\xFF\xFF") { $packet_total = ord($packet[8]) & 0xF; $packet_type = 2; } // MULTI PACKET - HL1 ( TOTAL IS L…

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