Advertisement
Guest User

Untitled

a guest
Sep 7th, 2013
502
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 20.57 KB | None | 0 0
  1. <?
  2. ############################################################################
  3. # This is free software; you may redistribute it and/or modify
  4. # it under the terms of the GNU General Public License as
  5. # published by the Free Software Foundation; either version 2,
  6. # or (at your option) any later version.
  7. #
  8. # This is distributed in the hope that it will be useful, but
  9. # WITHOUT ANY WARRANTY; without even the implied warranty of
  10. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. # GNU General Public License for more details.
  12. ############################################################################
  13. /*
  14. * Advanced cached class by adriahu
  15. * Version 1.3 beta
  16. */
  17.  
  18. define ('DEBUG_CACHED', TRUE);
  19.  
  20. if (DEBUG_CACHED && !defined('DEBUG_INC')) include "cached_dbg.class.php";
  21. if (!defined('CONNECTION_INC')) include "cached_conn.class.php";
  22.  
  23. ############################################################################
  24.  
  25. define ('AdminVersion', 0);
  26. # d - version (normal=60)
  27. # check admin version
  28. define ('CheckCharacter', 1);
  29. # d - charId
  30. # offline/online
  31. define ('SetCharacterLocation', 2);
  32. # ddddd - charId, worldId, x, y, z
  33. # teleport char
  34. define ('SetBuilderCharacter', 3);
  35. # dd - charId, builderLevel
  36. # (char offline!)
  37. define ('ChangeCharacterName', 4);
  38. # dS - charId, newName
  39. # (char offline!)
  40. define ('KickCharacter', 5);
  41. # d - charId
  42. define ('AddSkill', 6);
  43. # ddd - charId, skillId, skillLevel
  44. define ('DelSkill', 7);
  45. # dd - charId, skillId
  46. define ('ModSkill', 8);
  47. # ddd - charId, skillId, skillLevel
  48. define ('SetOnetimeQuest', 9);
  49. # ddd - charId, questId, questState
  50. define ('SetQuest', 10);
  51. # ddd - charId, questId, questState
  52. define ('DelQuest', 11);
  53. # dd - charId, questId
  54. define ('AddItem', 12);
  55. # (not work)
  56. define ('DelItem', 13);
  57. # dddd - charId, wareHouse, itemDbId, itemAmount
  58. define ('ModItem', 14);
  59. # dddddddddd - charId, wareHouse, itemDbId, newItemType, newItemAmount,\
  60. # newEnchant, newEroded, newBless, newIdent, newWished
  61. # (char offline!)
  62. define ('ModChar', 15);
  63. # ddddddd - charId, newSp, newExp, newAlign, newPk, newPkPardon, newDuel
  64. # (class_id sql modify needed)
  65. define ('ModChar2', 16);
  66. # (char offline!)
  67. # ddddddd - charId, newGender, newRace, newClass, newFace, newHairShape,\
  68. # newHairColor
  69. define ('ModCharPledge', 17);
  70. # change or add char title
  71. # dS - charId, title
  72. define ('PunishChar', 18);
  73. # ddd - charId, punishId(1-shopBan(not work),2-chatBan),\
  74. # remainTime min (0=remove)
  75. define ('SetBuilderAccount', 19);
  76. # Sd - accountName, builderLevel
  77. define ('DisableCharacter', 20);
  78. # (not logged!)
  79. # dd - charId, option(1-remove from char list)
  80. define ('EnableCharacter', 21);
  81. # (first DisableCharacter)
  82. # dd - charId, accountId
  83. define ('GetCharacters', 22);
  84. # (not work, timeouts)
  85. define ('SetBookMark', 23);
  86. # dSdddd - charId, bookmarkName, worldId, x, y, z
  87. define ('DelBookMark', 24);
  88. # dS - charId, bookmarkName
  89. define ('DelPledgeCrest', 25);
  90. # d - pledgeId
  91. define ('ModPledgeName', 26);
  92. # (need sql fix uppercase letters)
  93. # dS - pledgeId, newPledgeName
  94. define ('SetProhibited', 27);
  95. # (in table lin2world..user_prohibit)
  96. # dS - option(1-add,2-del), charName
  97. define ('SeizeItem', 28);
  98. # (char offline!)
  99. # dddd - option(1-on,2-off), charId, wareHouse, itemDbId
  100. define ('ModChar3', 29);
  101. # (char offline!)
  102. # ddddddd - charId, deltaSp, deltaExp, deltaAlign, deltaPk,\
  103. # deltaPkPardon, deltaDuel
  104. define ('MoveItem', 30);
  105. # (char offline!)
  106. # ddddd - charId, wareHouse, itemDbId, receiverCharId, receiverWareHouse
  107. define ('MoveCharacter', 31);
  108. # ddS - charId, accountId, accountName
  109. define ('CommentWrite', 32);
  110. # write comment to lin2world..user_comment
  111. # dSS - charId, comment, writer
  112. define ('CommentDelete', 33);
  113. # dd - commentId, option(0-undelete,1-delete(flag only))
  114. define ('DeleteChar', 34);
  115. # (char offline!)
  116. # d - charId
  117. define ('RestoreChar', 35);
  118. # ddS - charId, accountId, accountName
  119. define ('PledgeOust', 36);
  120. # (char offline!)
  121. # d - charId
  122. define ('PledgeChangeOwner', 37);
  123. # (not work)
  124. # dd - pledgeId, newOwnerId
  125. define ('PledgeDelete', 38);
  126. # (not work)
  127. # d - pledgeId
  128. define ('BanChar', 39);
  129. # (char offline!)
  130. # dd - charId, banHour(0-remove)
  131. define ('MoveItem2', 40);
  132. # (char offline!)
  133. # dddd - charId, itemDbId, receiverCharId, wareHouse
  134. define ('PrintAllAccountData', 41);
  135. # (in CacheD console)
  136. define ('PrintAllItemData', 42);
  137. # (not work)
  138. define ('CopyChar', 43);
  139. # dSdS - srcCharId, newCharName, destAccountId, destAccountName
  140. define ('CreatePet', 44);
  141. # dddddddd - charId, petCollarClassId, npcClassId, exp, level, hp, mp,\
  142. # meal
  143. define ('SendHome', 45);
  144. # d - charId
  145. define ('ChangePledgeLevel', 46);
  146. # dd - pledgeId, pledgeLevel
  147. define ('CreatePledge', 47);
  148. # Sd - pledgeName, ownerCharId
  149. define ('SetSkillAll', 48);
  150. # d - charId
  151. define ('RestoreChar2', 49);
  152. # (need sql fix uppercase letters)
  153. # dSdS - charId, newCharName, accountId, accountName
  154. define ('ManAnnounce', 50);
  155. # manage login announce
  156. # ddS - action(1,2=addOrReplace, 3=delete), announceId, announceTxt
  157. define ('ManIntAnnounce', 51);
  158. # manage interval announce
  159. # dddS - action(1,2=addOrReplace, 3=delete), announceInterval,\
  160. # announceId, announceTxt
  161. define ('ModWeekPlay', 52);
  162. # play time limit ;) (maybe for relax server)
  163. # ddd - charId, action(1-add, 2-del), min
  164. define ('SeizeItem2', 53);
  165. # (char offline!)
  166. # dd - option(1-seize,2-free(to wareHouse)), itemDbId
  167. define ('DelItem2', 54);
  168. # (char offline!)
  169. # d - itemDbId
  170. define ('AddItem2', 55);
  171. # (char offline!)
  172. # dddddddddd - charId, wareHouse, itemId, amount, enchant, eroded, bless,\
  173. # ident, wished
  174. define ('GetCharacters2', 56);
  175. # output_packet
  176. # d - accountId
  177. define ('DelMacro', 57);
  178. # (char offline!)
  179. # dd - charId, macroDbId
  180. define ('DelMonRaceTicket', 58);
  181. # (char offline!)
  182. # ddd - charId, itemDbId, ticketDbId
  183. define ('DelRecipe', 59);
  184. # (char offline!)
  185. # dd - charId, recipeDbId
  186. define ('DelLotto', 60);
  187. # (not work, timeouts)
  188. define ('ModifyPledgePower', 61);
  189. # ddS - charId, unknownINT, power_flag
  190. # (for example\
  191. # '1110000000000000000000000000000000000000000000000000000000000000')
  192. define ('EventPoint', 62);
  193. # (server crash!, buffer overflow)
  194. # ???????????????
  195. define ('GetPledge', 63);
  196. # output_packet
  197. # d - pledgeId
  198. define ('EventPoint2', 64); #renamed
  199. # (not used)
  200. define ('CreateCharacter', 65); #???? sprawdzic
  201. # SSddddddddffdddddddddd - newCharName, accountName, accountId, gender,\
  202. # raceId, classId, worldId, x, y, z, (float)hp, (float)mp, sp, exp, lvl,\
  203. # align, PK, duel, pkpardon, face, hairShape, hairColor
  204. # return new_char_id
  205. define ('AddItems', 66);
  206. # dd d*(dddddddd) - charId, unknown(>0), count*(wareHouse, itemId,
  207. # amount, enchant, eroded, bless, ident, wished)
  208. define ('AddSkills', 67);
  209. # ddd*(dd) - charId, unknown(dont use 0), count*(skillId, skillLvl)
  210. define ('GetCharacters3', 68);
  211. # output_packet
  212. # d - accountId
  213. define ('SetSociality', 69);
  214. # (server crash!: CLog::Add -> CLog::AddV -> Log::AddV - vswprintf_s)
  215. # dd - charId, sociality
  216. define ('SetInstantAnnounce', 70);
  217. # S - announceTxt
  218. define ('DelHenna', 71);
  219. # (server crash!: CLog::Add -> CLog::AddV -> Log::AddV - vswprintf_s)
  220. # dd - charId, hennaId
  221. define ('AddHenna', 72);
  222. # (server crash!: CLog::Add -> CLog::AddV -> Log::AddV - vswprintf_s)
  223. # dd - charId, hennaId
  224. define ('ReserveCharName', 73); #renamed
  225. # dSdd - option(0=add,1=del), name, accountId, used
  226. define ('AddHennas', 74);
  227. # (server crash!: CLog::Add -> CLog::AddV -> Log::AddV - vswprintf_s)
  228. define ('GetCastleList', 75);
  229. # output_packet
  230. # void
  231. define ('ModifyCharProperty', 76);
  232. # (char offline!)
  233. # dddddddd - charId, sp, exp, subJobClass, pk, pkpardon, duel, subjobId
  234. define ('ModifyCharAbilityDelta', 77);
  235. # (char offline!)
  236. # dddddddd - charId, subJobSp, subJobExp, align, pk, pkpardon, duel,\
  237. # subjobId
  238. define ('ModifyCharAbility', 78); #renamed
  239. # (char offline!)
  240. # dddddddd - charId, subJobSp, subJobExp, align, pk, pkpardon, duel,\
  241. # subJobId
  242. define ('DelHenna2', 79);
  243. # (char offline!)
  244. # ddd - charId, hennaId, subJobId
  245. define ('AddHenna2', 80);
  246. # (char offline!)
  247. # ddd - charId, hennaId, subJobId
  248. define ('AddSkill2', 81);
  249. # dddd - charId, skillId, skillLevel, subJobId
  250. define ('DelSkill2', 82);
  251. # ddd - charId, skillId, subJobId
  252. define ('ModifySkill2', 83);
  253. # dddd - charId, skillId, skillLevel, subJobId
  254. define ('AddMacro', 84);
  255. # (char offline!)
  256. # return macroId for AddMacroInfo packet
  257. # dSSSd - charId, macroName, macroToolTip, macroIconName, macroIconType
  258. define ('GetSSQStatus', 85);
  259. # output_packet
  260. # void
  261. define ('GetSSQMainEventRecord', 86);
  262. # output_packet
  263. # void
  264. define ('ModifyDepositedSSQItem', 87);
  265. # (char offline!)
  266. # dddd - charId, option(1=pointsAndItems,2=items), sealStoneId, amount
  267. define ('ChangePetName', 88);
  268. # ddS - charId, petId (from table pet_data), newPetName
  269. define ('ChangeSubJob', 89);
  270. # (char offline!)
  271. # dd - charId, subJobId
  272. define ('StopChar', 90);
  273. # (char offline!) freeze char
  274. # dd - charId, min
  275. define ('CancelPersonalShop', 91);
  276. # (char offline!) shop ban
  277. # dd - charId, min
  278. define ('AddMacroInfo', 92);
  279. # (char offline!)
  280. # ddddddS - charId, macroId, macroOrder, macroInt1, macroInt2, macroInt3,\
  281. # macroStr
  282. define ('CreateCharacter2', 93); #??????
  283. # SSddddddddffddddddddddddf - newCharName, accountName, accountId,\
  284. # gender, raceId, classId, worldId, x, y, z, (float)hp, (float)mp, sp,\
  285. # exp, lvl, align, PK, duel, pkpardon, face, hairShape, hairColor,\
  286. # SubjobId, MainClassId, (float)CP
  287. define ('AddSkills2', 94);
  288. # dd d*(ddd) - charId, unknown(dont use 0! server crash!),\
  289. # count*(skillId, skillLevel, subJobId)
  290. define ('AddHennas2', 95);
  291. # ddd*(d) - charId, unknown(dont use 0! server crash!),\
  292. # count(max=3)*(hennaId)
  293. # don't work properly, always add henna with subjob_id = NULL
  294. define ('AddSubjobs', 96);
  295. # dd d*(dddddddddd) - charId, unknown(dont use 0! server crash!),
  296. # count*(classId, HP, MP, SP, EXP, Level, subJobId, henna1Id, henna2Id,\
  297. # henna3Id)
  298. define ('GetPledge2', 97);
  299. # output_packet
  300. # d - pledgeId
  301. define ('DelPledgeEmblem', 98);
  302. # d - pledgeId
  303. define ('RegisterAccount', 99);
  304. # insert accountName into lin2world..account_ch2
  305. # S - accountName
  306. define ('DelPledgeAnnounce', 100);
  307. # d - pledgeId
  308. define ('SendPrivateAnnounce', 101);
  309. # dS - charId, announceTxt
  310. define ('GetAgitList', 102);
  311. # output_packet
  312. # void
  313. define ('GetPledgeMember', 103);
  314. # output_packet
  315. # d - pledgeId
  316. define ('EternalBan', 104);
  317. # (char offline!)
  318. # update user_ban table with status=2 and unlimited time
  319. # d - char_id
  320. define ('GetCharacters4', 105);
  321. # output_packet
  322. # d - accountId
  323. define ('SetNobless', 106); #need fixed cached. thx Ra1n0
  324. # dd - charId, noblessType
  325. define ('SetHero', 107); #need fixed cached. thx Ra1n0
  326. # dd - charId, heroType
  327. define ('SetPartyLocation', 108);
  328. # dddd - charId, x, y, z
  329. define ('ModOlympiadPoint', 109);
  330. # dddd - charId, previousPoint, olympiadPoint, mode(1=absolute, 2=delta)
  331.  
  332. $outPackets = array # (patter_count, pattern)
  333. (
  334. GetCharacters2 => array(7, 'VSVSVVVS'),
  335. # V S V S V V \
  336. # char_id, char_name, account_id, account_name, level, class_id,\
  337. # V S
  338. # pledge_id, pledge_name
  339. GetCharacters3 => array(7, 'VSVSVVVSV'),
  340. # V S V S V V \
  341. # char_id, char_name, account_id, account_name, level, class_id,\
  342. # V S, V
  343. # pledge_id, pledge_name, online
  344. GetCharacters4 => array(7, 'VSVSVVVSVSVV'),
  345. # V S V S V V \
  346. # char_id, char_name, account_id, account_name, level, class_id,\
  347. # V S, V S V V
  348. # pledge_id, pledge_name, online, logout, noblessType, heroType
  349. GetPledge => array(1, 'SVSVVVS'),
  350. # S V S V V \
  351. # pledge_name, ruler_id, rurel_name, pledge_lvl, players_count,\
  352. # V S
  353. # ally_id, ally_name
  354. GetPledge2 => array(1, 'SVSVVVSV'),
  355. # S V S V V \
  356. # pledge_name, ruler_id, rurel_name, pledge_lvl, players_count,\
  357. # V S V
  358. # ally_id, ally_name, ally_master_pledge_id
  359. GetPledgeMember => array(40, 'VSVV'),
  360. # V S V V
  361. # char_id, char_name, class_id, online
  362. GetCastleList => array(9, 'VVSVSVSVVV'),
  363. # V V S V S V \
  364. # castle_id, pledge_id, pledge_name, ruler_id, ruler_name, ally_id,\
  365. # S V V V
  366. # ally_name, next_war_time, tax_rate, tax_rate_to_change
  367. GetAgitList => array(40, 'VSVSVSVV'),
  368. # V S V S V S \
  369. # agit_id, agit_name, pledge_id, pledge_name, ruler_id, ruler_name,\
  370. # V V
  371. # next_auction_time, next_war_time
  372. GetSSQStatus => array(1, 'VVVVVVVVVVV'),
  373. # V V V V V V V V \
  374. # twilight_point, dawn_point, seal1, seal2, seal3, seal4, seal5, seal6,\
  375. # V V V
  376. # seal7, time, status
  377. GetSSQMainEventRecord => array(5, 'VVVVVVVVVVVVVVVVV'),
  378. # V V VVVVVVVVVVVVVVV
  379. # ssq_round, room_no?, ????????????????????
  380. );
  381.  
  382. $errors = array
  383. (
  384. 1 => 'Error',
  385. 2 => 'Arguments need',
  386. 3 => 'Arguments invalid',
  387. 4 => 'Char not found',
  388. 5 => 'Warehouse not found',
  389. 6 => 'Account not found',
  390. 7 => 'Char in game',
  391. 8 => 'Too many chars',
  392. 9 => 'Char in pledge',
  393. 10 => 'Char pledge owner',
  394. 11 => 'Cannot ban',
  395. 12 => 'Name exist',
  396. 13 => 'Obsolete',
  397. 14 => 'Invalid char name',
  398. 15 => 'Char not in game',
  399. 16 => 'Same char',
  400. 17 => 'Char not in pledge',
  401. 18 => 'Char pledge master',
  402. 19 => 'Server not connected',
  403. 20 => 'Create pet failed',
  404. 21 => 'Pledge exist',
  405. 22 => 'No chars',
  406. 23 => 'Invalid announce id',
  407. 24 => 'Pledge not found',
  408. 25 => 'Castle not found',
  409. 26 => 'Pet not found',
  410. 28 => 'Bad admin version',
  411. 29 => 'Alredy moved',
  412. 31 => 'Create char failed',
  413. 32 => 'ModifyDepositedSSQItem error 1',
  414. 34 => 'Alredy hero',
  415. );
  416.  
  417. ############################################################################
  418.  
  419. function toUCS($str)
  420. {
  421. return mb_convert_encoding($str, "UCS-2LE", "UTF-8")."\x00\x00";
  422. }
  423.  
  424. function toISO($str)
  425. {
  426. return mb_convert_encoding($str, "UTF-8", "UCS-2LE");
  427. }
  428.  
  429. function cutBytes(&$in, $bytes)
  430. {
  431. $in = substr($in,$bytes,strlen($in)-$bytes);
  432. }
  433.  
  434. ############################################################################
  435.  
  436. class CacheD
  437. {
  438. function __construct($host = '127.0.0.1', $port = 2012,
  439. $adminNick = 'admin', $timeout = 2)
  440. {
  441. $this->timeout = $timeout;
  442. $this->Error = 0;
  443. $this->ErrorTxt = '';
  444. $this->adminNick = toUCS($adminNick);
  445. $this->retPacket = '';
  446. $this->CacheDSock = new Connection($host, $port, $timeout);
  447. }
  448.  
  449. function __destruct()
  450. {
  451. if (@$this->CacheDSock && $this->CacheDSock->connected())
  452. $this->CacheDSock->write("\x00");
  453. }
  454.  
  455. function error($str, $dbg = '')
  456. {
  457. if (DEBUG_CACHED && $dbg) print hexdump($dbg);
  458. if (DEBUG_CACHED) print backtrace();
  459. die($str);
  460. }
  461.  
  462. function execute($packet)
  463. {
  464. if(!$packet) $this->error("Empty packet!");
  465. $this->Error = 0;
  466. $this->ErrorTxt = '';
  467. $this->CacheDSock->write($packet);
  468. $header = $this->CacheDSock->read(3);
  469. if (DEBUG_CACHED) $this->retPacket .= $header;
  470. $header = unpack('vlength/CpacketId', $header);
  471. $length = $header['length']-3;
  472. $packetId = $header['packetId'];
  473. if($length < 4) $this->error('Bad CacheD response [1]!');
  474. $buf = $this->CacheDSock->read(4);
  475. if (DEBUG_CACHED) $this->retPacket .= $buf;
  476. $length -= 4;
  477. $ok = unpack('Vok', $buf);
  478. $ok = (bool)$ok['ok'];
  479. if (!$length)
  480. {
  481. return $ok;
  482. }
  483. elseif ($length < 4)
  484. {
  485. if (DEBUG_CACHED) print hexdump($this->CacheDSock->read($length));
  486. $this->error('Bad CacheD response [2]!');
  487. }
  488. elseif ($length == 4)
  489. {
  490. $buf = $this->CacheDSock->read(4);
  491. if (DEBUG_CACHED) $this->retPacket .= $buf;
  492. $length -= 4;
  493. $errorId = unpack('VerrorId', $buf);
  494. $errorId = $errorId['errorId'];
  495. if (!$ok)
  496. {
  497. if ($packetId != CheckCharacter) #mini fix
  498. {
  499. $this->Error = $errorId;
  500. $this->ErrorTxt = $this->getErrorTxt($errorId);
  501. }
  502. }
  503. else
  504. {
  505. $ret = unpack ('Vret', $buf);
  506. return $ret['ret'];
  507. }
  508. return $ok;
  509. }
  510. else
  511. {
  512. $buf = $this->CacheDSock->read($length);
  513. if (DEBUG_CACHED) $this->retPacket .= $buf;
  514. return $buf; #extra data
  515. }
  516. }
  517.  
  518. function getErrorTxt($id)
  519. {
  520. global $errors;
  521. if (isset($errors[$id])) return $errors[$id];
  522. return "Unknown error [id=$id]";
  523. }
  524.  
  525. function sendPacket($paketId)
  526. {
  527. global $outPackets;
  528. $argList = func_get_args();
  529. $packet = $this->preparePacket($argList);
  530. if (DEBUG_CACHED)
  531. {
  532. print hexdump($packet, 'packet');
  533. $this->retPacket = '';
  534. }
  535. $response = $this->execute($packet);
  536. if (DEBUG_CACHED) print hexdump($this->retPacket, 'ret packet');
  537. if (isset($outPackets[$paketId]))
  538. $response = $this->dissasemble($paketId, $response);
  539. return $response;
  540. }
  541.  
  542. function preparePacket(&$argList)
  543. {
  544. $paketId = array_shift($argList);
  545. if ($paketId > 109) $this->error("Illegal packet ID [$paketId]");
  546. $packet = pack('C', $paketId);
  547. foreach ($argList as $arg)
  548. {
  549. if (is_int($arg))
  550. $packet .= pack ('V', $arg);
  551. elseif (is_float($arg))
  552. $packet .= pack ('d', $arg);
  553. elseif (is_string($arg))
  554. $packet .= toUCS($arg);
  555. }
  556. $packet .= $this->adminNick;
  557. $packet = pack('S', strlen($packet)+2).$packet;
  558. return $packet;
  559. }
  560.  
  561. function getV(&$packet, $type)
  562. {
  563. $ret = '';
  564. switch ($type)
  565. {
  566. case 'V':
  567. if (DEBUG_CACHED) print hexdump(substr($packet,0,4));
  568. $ret = unpack('Vret', substr($packet,0,4));
  569. cutBytes($packet,4);
  570. return $ret['ret'];
  571. break;
  572. case 'S':
  573. if (strpos ($packet, "\x00\x00") !== 0)
  574. {
  575. list ($ret, $packet) = explode ("\x00\x00\x00", $packet, 2);
  576. if (DEBUG_CACHED) print hexdump($ret."\x00");
  577. $ret = toISO($ret."\x00");
  578. return $ret;
  579. }
  580. else #empty string
  581. {
  582. if (DEBUG_CACHED) print hexdump("\x00\x00");
  583. cutBytes($packet,2);
  584. return '';
  585. }
  586. break;
  587. }
  588. }
  589.  
  590. function dissasemble($paketId, $response)
  591. {
  592. global $outPackets;
  593. $ret = array();
  594. $ret_all = array();
  595. list($count, $pattern) = $outPackets[$paketId];
  596. if ($count-1) $pattern = str_repeat($pattern.' ', $count);
  597. $len = strlen($pattern);
  598. for ($i = 0; $i < $len; $i++)
  599. {
  600. if ($pattern[$i] == ' ')
  601. {
  602. $ret_all[] = $ret;
  603. $ret = array();
  604. continue;
  605. }
  606. if (!$response) break;
  607. $data = $this->getV($response, $pattern[$i]);
  608. if (DEBUG_CACHED) print $data;
  609. $ret[] = $data;
  610. }
  611. if ($ret_all) return $ret_all;
  612. return $ret;
  613. }
  614. }
  615. ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement