lgsl_protocol.php 203 KB

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