ROAParse.cpp
上传用户:tianheyiqi
上传日期:2010-04-16
资源大小:282k
文件大小:91k
源码类别:

外挂编程

开发平台:

Visual C++

  1. #include <stdafx.h>
  2. #define parseFunction(code)
  3. int parse##code(char *pBuffer, int nLen) 
  4. {
  5. CString strOutput;
  6. strOutput.Format("[R] 0x%04X(%d) - %s", 0x##code, nLen, utlPrintHex(pBuffer, nLen));
  7. utlLogout(strOutput, eLogInfo, false);
  8. return(0);
  9. }
  10. #define parseFunction2(code, state1, state2)
  11. int parse##code(char *pBuffer, int nLen) 
  12. {
  13. utlChangeState(state1, state2);
  14. return(0);
  15. }
  16. #define parseDeclare(code)
  17. int parse##code(char *pBuffer, int nLen)
  18. parseFunction(006E); // Unknown
  19. parseFunction(0089); // Unknown
  20. parseFunction(008F); // Unknown
  21. parseFunction(0093); // Unknown
  22. parseFunction(0096); // Unknown
  23. parseFunction(00A5); // Storage opened(UNRESOLVED)
  24. parseFunction(00A6); // Storage item(UNRESOLVED)
  25. parseFunction(00B4);
  26. parseFunction(00B7);
  27. parseFunction(00BC);
  28. parseFunction(00BD); // Your status(UNRESOLVED)
  29. parseFunction(00BE);
  30. parseFunction(00C0);
  31. parseFunction(00C1);
  32. parseFunction(00C2);
  33. parseFunction(00C3);
  34. parseFunction(00C4);
  35. parseFunction(00C6);
  36. parseFunction(00C7);
  37. parseFunction(00CA);
  38. parseFunction(00CB);
  39. parseFunction(00D1);
  40. parseFunction(00D2);
  41. parseFunction(00D3);
  42. parseFunction(00D6);
  43. parseFunction(00D7);
  44. parseFunction(00D8);
  45. parseFunction(00DA);
  46. parseFunction(00DB);
  47. parseFunction(00DC);
  48. parseFunction(00DD);
  49. parseFunction(00DF);
  50. parseFunction(00E1);
  51. parseFunction(00E4);
  52. parseFunction(00E7);
  53. parseFunction(00E9);
  54. parseFunction(00EA);
  55. parseFunction(00EC);
  56. parseFunction(00EE);
  57. parseFunction(00F0);
  58. parseFunction(00F2);
  59. parseFunction(00F4);
  60. parseFunction(00F6);
  61. parseFunction(00F8);
  62. parseFunction(00FA);
  63. parseFunction(00FD);
  64. parseFunction(00FE);
  65. parseFunction(0100);
  66. parseFunction(0101);
  67. parseFunction(0104);
  68. parseFunction(0105);
  69. parseFunction(0106);
  70. parseFunction(0107);
  71. parseFunction(0109);
  72. parseFunction(010A);
  73. parseFunction(010B);
  74. parseFunction(0110);
  75. parseFunction(0111);
  76. parseFunction(0115);
  77. parseFunction(011C);
  78. parseFunction(011E);
  79. parseFunction(0121);
  80. parseFunction(0125);
  81. parseFunction(012C);
  82. parseFunction(012D);
  83. parseFunction(0131);
  84. parseFunction(0132);
  85. parseFunction(0133);
  86. parseFunction(0135);
  87. parseFunction(0136);
  88. parseFunction(0137);
  89. parseFunction(013A);
  90. parseFunction(013B);
  91. parseFunction(0141);
  92. parseFunction(0145);
  93. parseFunction(0146);
  94. parseFunction(0148);
  95. parseFunction(014B);
  96. parseFunction(014C);
  97. parseFunction(014E);
  98. parseFunction(0150);
  99. parseFunction(0152);
  100. parseFunction(0154);
  101. parseFunction(0156);
  102. parseFunction(015A);
  103. parseFunction(015C);
  104. parseFunction(0160);
  105. parseFunction(0162);
  106. parseFunction(0163);
  107. parseFunction(0166);
  108. parseFunction(0167);
  109. parseFunction(0169);
  110. parseFunction(016A);
  111. parseFunction(016D);
  112. parseFunction(016F);
  113. parseFunction(0171);
  114. parseFunction(0173);
  115. parseFunction(0174);
  116. parseFunction(0177);
  117. parseFunction(0179);
  118. parseFunction(017F);
  119. parseFunction(0180);
  120. parseFunction(0182);
  121. parseFunction(0183);
  122. parseFunction(0187);
  123. parseFunction(018A);
  124. parseFunction(018B);
  125. parseFunction(018E);
  126. parseFunction(0191);
  127. parseFunction(0192);
  128. parseFunction(0193);
  129. parseFunction(0194);
  130. parseFunction(0199);
  131. parseFunction(019B);
  132. parseFunction(01A0);
  133. parseFunction(01A2);
  134. parseFunction(01A4);
  135. parseFunction(01A6);
  136. parseFunction(01AA);
  137. parseFunction(01AC);
  138. parseFunction(01AD);
  139. parseFunction(01B3);
  140. parseFunction(01B5);
  141. parseFunction(01B6);
  142. parseFunction(01B9);
  143. parseFunction(01C4);
  144. parseFunction(01C9);
  145. parseFunction(01D2);
  146. parseFunction(01D3);
  147. parseFunction(01D4);
  148. parseFunction(01D5);
  149. parseFunction(01D6);
  150. parseFunction(01D7);
  151. parseFunction(01DB);
  152. parseFunction(01DC);
  153. parseFunction(01DD);
  154. parseFunction(01DF);
  155. parseFunction(01E1);
  156. parseFunction(01F4);
  157. //EPS5.0
  158. parseFunction(014A);
  159. parseFunction(0181);
  160. parseFunction(018C);
  161. parseFunction(01AB);
  162. parseFunction(01B1);
  163. parseFunction(0075); // Unknown
  164. parseFunction(0077); // Unknown
  165. parseFunction(007A); // Unknown
  166. parseFunction(007F); // Sync received
  167. parseDeclare(0069); // Login master server completed
  168. parseDeclare(006A); // Login master server failed
  169. parseDeclare(006B); // Characters received
  170. parseDeclare(006C); // Login game server failed
  171. parseDeclare(0071); // Char ID and Map IP received
  172. parseDeclare(0073); // Your coordinates received
  173. parseDeclare(0078); // Something exits
  174. parseDeclare(01D8); // Something exits
  175. parseDeclare(0079); // Something connected
  176. parseDeclare(01D9); // Something connected
  177. parseDeclare(007B); // Something appeared/moved
  178. parseDeclare(01DA); // Something appeared/moved
  179. parseDeclare(007C); // Something spawned
  180. parseDeclare(0080); // Something disappeared
  181. parseDeclare(0087); // You moved
  182. parseDeclare(0088); // Long distance attack solution
  183. parseDeclare(008D); // Chat1
  184. parseDeclare(008E); // Chat2
  185. parseDeclare(0091); // Map changing from
  186. parseDeclare(0092); // Map changing to
  187. parseDeclare(0095); // Info received
  188. parseDeclare(0097); // Private message from
  189. parseDeclare(0098); // Private message sent result
  190. parseDeclare(009A); // Chat3
  191. parseDeclare(009C); // Look at
  192. parseDeclare(009D); // Item exists
  193. parseDeclare(009E); // Item appeared
  194. parseDeclare(008A); // Attack1
  195. parseDeclare(00A0); // Item added to inventory
  196. parseDeclare(00A1); // Item disappeared
  197. parseDeclare(00A3); // Inventory(Items) received
  198. parseDeclare(00A4); // Inventory(Equips) received
  199. parseDeclare(00A8); // You used item
  200. parseDeclare(00AA); // You equip
  201. parseDeclare(00AC); // You unequip
  202. parseDeclare(00AF); // Inventory(Items) removed
  203. parseDeclare(00B0); // Status received
  204. parseDeclare(00B1); // Exp/zenny received
  205. parseDeclare(00B5); // NPC talk continue
  206. parseDeclare(00B6); // NPC talk done
  207. parseDeclare(00E5); // Deal
  208. parseDeclare(00FB); // Partner info
  209. parseDeclare(0108); // Weapon changed element
  210. parseDeclare(010C); // MVP info
  211. parseDeclare(010E); // Skill used????
  212. parseDeclare(010F); // Skills received
  213. parseDeclare(0114); // Attack2
  214. parseDeclare(01DE); // Attack2
  215. parseDeclare(0117); // Skill use on loc
  216. parseDeclare(0119); // Your status(poison etc...)
  217. parseDeclare(011A); // Skill use on someone
  218. parseDeclare(011F); // Area effect skill
  219. parseDeclare(0120); // Area effect skill disappear
  220. parseDeclare(0122); // Cart (Non-Stackable Items)
  221. parseDeclare(0123); // Cart (Stackable Items)
  222. parseDeclare(0124); // Cart add
  223. parseDeclare(0139); // Remote attack
  224. parseDeclare(013C); // Arrow equipped
  225. parseDeclare(013D); // HP/SP gained
  226. parseDeclare(013E); // Skill cast
  227. parseDeclare(0147); // 
  228. parseDeclare(016C); // Your guild name
  229. parseDeclare(0188); // Weapon changed element
  230. parseDeclare(0195); // Player name received
  231. parseDeclare(0196); // Two hands quicken
  232. parseDeclare(01A3); // Inventory
  233. parseDeclare(01B0); // Monster changed
  234. parseDeclare(01C8); // Someone use item
  235. parseDeclare(01D0); // Monk
  236. parseDeclare(019E);
  237. parseFunction2(0081, -1, 1);// (UNRESOLVED)
  238. parseFunction2(00B3, -1, 2);// Unknown
  239. int parseSendData(char *pBuffer, WORD wLen, BOOL bAi = false)
  240. {
  241. WORD wCmd = *((WORD*)pBuffer);
  242. WORD wCmdLen = *((WORD*)(pBuffer+2));
  243. BOOL bSend = true;
  244. char *pPara2;
  245. WORD wPara1, wPara2; 
  246. DWORD dwPara1, dwPara2, dwPara3; 
  247. BYTE bPara2; 
  248. CString strTemp, strOutput;
  249. if(bAi)
  250. {
  251. if(nConnState < 5 || !bAiEnabled)
  252. {
  253. return(0);
  254. }
  255. }
  256. switch(wCmd)
  257. {
  258. case 0x0067:
  259. strTemp = utlPrintHex(pBuffer, wLen);
  260. strOutput.Format("[S] 0x0067: %s", strTemp);
  261. utlLogout(strOutput, eLogCommon, bAi);
  262. break;
  263. case 0x0096: //private chat
  264. strTemp = utlPrintHex(pBuffer, wLen);
  265. strOutput.Format("[S] 私聊: %s", strTemp);
  266. utlLogout(strOutput, eLogCommon, bAi);
  267. break;
  268. case 0x007D: // Map loaded
  269. utlLogout("[S] 已载入地图", eLogCommon, bAi);
  270. // utlChangeState(-1, 5);
  271. break;
  272. case 0x0089:  // Sit/Stand/Attack
  273. dwPara1 = *((DWORD*)(pBuffer+2));
  274. bPara2 = *(pBuffer+6);
  275. switch(bPara2)
  276. {
  277. case 2:
  278. strOutput = "[S] 坐下";
  279. break;
  280. case 3:
  281. strOutput = "[S] 站立";
  282. break;
  283. default:
  284. strOutput.Format("[S] 攻击 %s (模式%d)", utlFindTarget(dwPara1), bPara2);
  285. break;
  286. }
  287. utlLogout(strOutput, eLogCommon, bAi);
  288. break;
  289. case 0x00A7: // Item use
  290. wPara1 = *((WORD*)(pBuffer+2));
  291. dwPara2 = *((DWORD*)(pBuffer+4));
  292. strOutput.Format("[S] 使用 %s", utlFindTargetInventory(wPara1));
  293. utlLogout(strOutput, eLogCommon, bAi);
  294. break;
  295. case 0x0072: // Map login
  296. strTemp = utlPrintHex(pBuffer, wLen);
  297. strOutput = "[S] 登录地图服务器: " + strTemp;
  298. utlLogout(strOutput, eLogCommon, bAi);
  299. break;
  300. case 0x0064: // Master login
  301. strTemp = utlPrintHex(pBuffer, wLen);
  302. strOutput = "[S] 登录主服务器: ";
  303. utlLogout(strOutput, eLogCommon, bAi);
  304. break;
  305. case 0x0085: // Move
  306. strOutput.Format("[S] 移动至: (%d, %d)",
  307.  utlMakeCoords((BYTE*)pBuffer+2).x,
  308.  utlMakeCoords((BYTE*)pBuffer+2).y);
  309. utlLogout(strOutput, eLogInfo, bAi);
  310. break;
  311. case 0x0113: // Skill use
  312. wPara1 = *((WORD*)(pBuffer+2));
  313. wPara2 = *((WORD*)(pBuffer+4));
  314. dwPara3 = *((DWORD*)(pBuffer+6));
  315. strOutput.Format("[S] 对 %s 使用 %d 级 %s",
  316. utlFindTarget(dwPara3),
  317. wPara1,
  318. mapSkill.FindValue(wPara2, eSkillAlias));
  319. utlLogout(strOutput, eLogCommon, bAi);
  320. break;
  321. case 0x0116: // Skill use loc
  322. strTemp = utlPrintHex(pBuffer, wLen);
  323. strOutput = "[S] 对地面使用技能: " + strTemp;
  324. utlLogout(strOutput, eLogCommon, bAi);
  325. break;
  326. case 0x007E: // Sync
  327. strTemp = utlPrintHex(pBuffer, wLen);
  328. strOutput = "[S] 与服务器同步: " + strTemp;
  329. utlLogout(strOutput, eLogInfo, bAi);
  330. break;
  331. case 0x009F: // Take
  332. dwPara1 = *((DWORD*)(pBuffer+2));
  333. strOutput.Format("[S] 捡取 %s", utlFindTargetItem(dwPara1));
  334. utlLogout(strOutput, eLogCommon, bAi);
  335. if(bAi && (!option.bAutoPickup || you.bSit))
  336. {
  337. strOutput.Format("[S] 取消捡取 %s", utlFindTargetItem(dwPara1));
  338. utlLogout(strOutput, eLogError, true);
  339. bSend = false;
  340. }
  341. break;
  342. case 0x0094: // Get info
  343. dwPara1 = *((DWORD*)(pBuffer+2));
  344. strOutput.Format("[S] 获取信息: %X", dwPara1);
  345. utlLogout(strOutput, eLogInfo, bAi);
  346. break;
  347. case 0x0112: // Add skill point
  348. wPara1 = *((WORD*)(pBuffer+2));
  349. strOutput.Format("[S] 添加技能点数: %X", wPara1);
  350. utlLogout(strOutput, eLogCommon, bAi);
  351. break;
  352. case 0x00BB: // Add status point
  353. wPara1 = *((WORD*)(pBuffer+2));
  354. strOutput.Format("[S] 添加属性点数: %X", wPara1);
  355. utlLogout(strOutput, eLogCommon, bAi);
  356. break;
  357. case 0x0118: // Attack stop
  358. strOutput.Format("[S] 停止攻击");
  359. utlLogout(strOutput, eLogCommon, bAi);
  360. break;
  361. case 0x0066: // Char login
  362. wPara1 = *(BYTE*)(pBuffer+2);
  363. if(wPara1 >=0 && wPara1 <= 2)
  364. {
  365. nCharSelected = (int)wPara1;
  366. you = youTemp[nCharSelected];
  367. strTemp = you.cName;
  368. utlReadUserProfile();
  369. bWelcomeSent = false;
  370. }
  371. strOutput.Format("[S] 选择%d号人物: %s", wPara1, strTemp);
  372. utlLogout(strOutput, eLogCommon, bAi);
  373. break;
  374. case 0x008C: // Chat
  375. strTemp = utlPrintHex(pBuffer, wLen);
  376. strOutput.Format("[S] 公聊: %s", strTemp);
  377. utlLogout(strOutput, eLogCommon, bAi);
  378. break;
  379. case 0x00DE: // Chat room change
  380. strTemp = utlPrintHex(pBuffer, wLen);
  381. strOutput.Format("[S] 聊天室名称变更: %s", strTemp);
  382. utlLogout(strOutput, eLogCommon, bAi);
  383. break;
  384. case 0x00D5: // Chat room create
  385. strTemp = utlPrintHex(pBuffer, wLen);
  386. strOutput.Format("[S] 创建聊天室: %s", strTemp);
  387. utlLogout(strOutput, eLogCommon, bAi);
  388. break;
  389. case 0x00D9: // Chat room join
  390. strTemp = utlPrintHex(pBuffer, wLen);
  391. strOutput.Format("[S] 进入聊天室: %s", strTemp);
  392. utlLogout(strOutput, eLogCommon, bAi);
  393. break;
  394. case 0x00E2: // Chat room kick
  395. strTemp = utlPrintHex(pBuffer, wLen);
  396. strOutput.Format("[S] 聊天室踢人: %s", strTemp);
  397. utlLogout(strOutput, eLogCommon, bAi);
  398. break;
  399. case 0x00E3: // Chat room leave
  400. strTemp = utlPrintHex(pBuffer, wLen);
  401. strOutput.Format("[S] 离开聊天室: %s", strTemp);
  402. utlLogout(strOutput, eLogCommon, bAi);
  403. break;
  404. case 0x00ED: // Deal cancel
  405. strTemp = utlPrintHex(pBuffer, wLen);
  406. strOutput.Format("[S] 取消交易: %s", strTemp);
  407. utlLogout(strOutput, eLogCommon, bAi);
  408. break;
  409. case 0x00E4: // Deal
  410. strTemp = utlPrintHex(pBuffer, wLen);
  411. strOutput.Format("[S] 交易物品确定: %s", strTemp);
  412. utlLogout(strOutput, eLogCommon, bAi);
  413. break;
  414. case 0x00E6: // Deal accept/cancel
  415. strTemp = utlPrintHex(pBuffer, wLen);
  416. strOutput.Format("[S] 交易接受/取消: %s", strTemp);
  417. utlLogout(strOutput, eLogCommon, bAi);
  418. break;
  419. case 0x00E8: // Deal add item
  420. strTemp = utlPrintHex(pBuffer, wLen);
  421. strOutput.Format("[S] 交易中放置物品: %s", strTemp);
  422. utlLogout(strOutput, eLogCommon, bAi);
  423. break;
  424. case 0x00EB: // Deal finalize
  425. strTemp = utlPrintHex(pBuffer, wLen);
  426. strOutput.Format("[S] 结束交易: %s", strTemp);
  427. utlLogout(strOutput, eLogCommon, bAi);
  428. break;
  429. case 0x00EF: // Deal trade
  430. strTemp = utlPrintHex(pBuffer, wLen);
  431. strOutput.Format("[S] 交易确定: %s", strTemp);
  432. utlLogout(strOutput, eLogCommon, bAi);
  433. break;
  434. case 0x00A2: // Drop
  435. strTemp = utlPrintHex(pBuffer, wLen);
  436. strOutput.Format("[S] 扔掉物品/装备: %s", strTemp);
  437. utlLogout(strOutput, eLogCommon, bAi);
  438. break;
  439. case 0x00BF: // Emotion
  440. strTemp = utlPrintHex(pBuffer, wLen);
  441. strOutput.Format("[S] 表情: %s", strTemp);
  442. utlLogout(strOutput, eLogCommon, bAi);
  443. break;
  444. case 0x00A9: // Equip
  445. strTemp = utlPrintHex(pBuffer, wLen);
  446. strOutput.Format("[S] 装备物品(装备): %s", strTemp);
  447. utlLogout(strOutput, eLogCommon, bAi);
  448. break;
  449. case 0x0065: // Game login
  450. strTemp = utlPrintHex(pBuffer, wLen);
  451. strOutput.Format("[S] 登录游戏服务器: %s", strTemp);
  452. utlLogout(strOutput, eLogCommon, bAi);
  453. break;
  454. case 0x00C5: // Get store list
  455. strTemp = utlPrintHex(pBuffer, wLen);
  456. strOutput.Format("[S] 获得商店列表: %s", strTemp);
  457. utlLogout(strOutput, eLogCommon, bAi);
  458. break;
  459. case 0x017E: // Char guild
  460. strTemp = utlPrintHex(pBuffer, wLen);
  461. strOutput.Format("[S] 会聊: %s", strTemp);
  462. utlLogout(strOutput, eLogCommon, bAi);
  463. break;
  464. case 0x0178: // Identify
  465. strTemp = utlPrintHex(pBuffer, wLen);
  466. strOutput.Format("[S] 鉴定: %s", strTemp);
  467. utlLogout(strOutput, eLogCommon, bAi);
  468. break;
  469. case 0x00CF: // Ignore
  470. strTemp = utlPrintHex(pBuffer, wLen);
  471. strOutput.Format("[S] 忽略玩家: %s", strTemp);
  472. utlLogout(strOutput, eLogCommon, bAi);
  473. break;
  474. case 0x00D0: // Ignore all
  475. strTemp = utlPrintHex(pBuffer, wLen);
  476. strOutput.Format("[S] 忽略所有玩家: %s", strTemp);
  477. utlLogout(strOutput, eLogCommon, bAi);
  478. break;
  479. case 0x00D3: // Get ignore list
  480. strTemp = utlPrintHex(pBuffer, wLen);
  481. strOutput.Format("[S] 获取忽略玩家列表: %s", strTemp);
  482. utlLogout(strOutput, eLogCommon, bAi);
  483. break;
  484. case 0x009B: // Look
  485. strOutput.Format("[S] 方向: 脸(%d) 身(%d)", *(pBuffer+2), *(pBuffer+4));
  486. utlLogout(strOutput, eLogCommon, bAi);
  487. break;
  488. case 0x011D: // Memo
  489. strTemp = utlPrintHex(pBuffer, wLen);
  490. strOutput.Format("[S] 记录传送点: %s", strTemp);
  491. utlLogout(strOutput, eLogCommon, bAi);
  492. break;
  493. case 0x0108: // Party chat
  494. strTemp = utlPrintHex(pBuffer, wLen);
  495. strOutput.Format("[S] 队聊: %s", strTemp);
  496. utlLogout(strOutput, eLogCommon, bAi);
  497. break;
  498. case 0x00FF: // Party join
  499. strTemp = utlPrintHex(pBuffer, wLen);
  500. strOutput.Format("[S] 加入队伍: %s", strTemp);
  501. utlLogout(strOutput, eLogCommon, bAi);
  502. break;
  503. case 0x00FC: // Party join request
  504. strTemp = utlPrintHex(pBuffer, wLen);
  505. strOutput.Format("[S] 聊请加入队伍: %s", strTemp);
  506. utlLogout(strOutput, eLogCommon, bAi);
  507. break;
  508. case 0x0103: // Party kick
  509. strTemp = utlPrintHex(pBuffer, wLen);
  510. strOutput.Format("[S] 队伍中踢出: %s", strTemp);
  511. utlLogout(strOutput, eLogCommon, bAi);
  512. break;
  513. case 0x0100: // Party leave
  514. strTemp = utlPrintHex(pBuffer, wLen);
  515. strOutput.Format("[S] 离开队伍: %s", strTemp);
  516. utlLogout(strOutput, eLogCommon, bAi);
  517. break;
  518. case 0x00F9: // Party organize
  519. strTemp = utlPrintHex(pBuffer, wLen);
  520. strOutput.Format("[S] 组队: %s", strTemp);
  521. utlLogout(strOutput, eLogCommon, bAi);
  522. break;
  523. case 0x0102: // Party share exp
  524. strTemp = utlPrintHex(pBuffer, wLen);
  525. strOutput.Format("[S] 组队经验分配方式: %s", strTemp);
  526. utlLogout(strOutput, eLogCommon, bAi);
  527. break;
  528. case 0x00F3: // Storage add
  529. strTemp = utlPrintHex(pBuffer, wLen);
  530. strOutput.Format("[S] 仓库中添加物品: %s", strTemp);
  531. utlLogout(strOutput, eLogCommon, bAi);
  532. break;
  533. case 0x00F7: // Storage close
  534. strTemp = utlPrintHex(pBuffer, wLen);
  535. strOutput.Format("[S] 仓库关闭: %s", strTemp);
  536. utlLogout(strOutput, eLogCommon, bAi);
  537. break;
  538. case 0x00F5: // Storage get
  539. strTemp = utlPrintHex(pBuffer, wLen);
  540. strOutput.Format("[S] 仓库中取出物品: %s", strTemp);
  541. utlLogout(strOutput, eLogCommon, bAi);
  542. break;
  543. case 0x0090: // Talk
  544. strTemp = utlPrintHex(pBuffer, wLen);
  545. strOutput.Format("[S] 与NPC对话(开始): %s", strTemp);
  546. utlLogout(strOutput, eLogCommon, bAi);
  547. break;
  548. case 0x00B9: // Talk continue
  549. strTemp = utlPrintHex(pBuffer, wLen);
  550. strOutput.Format("[S] 与NPC对话(继续): %s", strTemp);
  551. utlLogout(strOutput, eLogCommon, bAi);
  552. break;
  553. case 0x0146: // Talk cancel
  554. strTemp = utlPrintHex(pBuffer, wLen);
  555. strOutput.Format("[S] 与NPC对话(取消): %s", strTemp);
  556. utlLogout(strOutput, eLogCommon, bAi);
  557. break;
  558. case 0x00B8: // Talk response
  559. strTemp = utlPrintHex(pBuffer, wLen);
  560. strOutput.Format("[S] 与NPC对话(选择): %s", strTemp);
  561. utlLogout(strOutput, eLogCommon, bAi);
  562. break;
  563. case 0x00AB: // Unequip
  564. strTemp = utlPrintHex(pBuffer, wLen);
  565. strOutput.Format("[S] 卸下物品(装备): %s", strTemp);
  566. utlLogout(strOutput, eLogCommon, bAi);
  567. break;
  568. case 0x00C1: // Who
  569. strTemp = utlPrintHex(pBuffer, wLen);
  570. strOutput.Format("[S] 查看在线人数: %s", strTemp);
  571. utlLogout(strOutput, eLogCommon, bAi);
  572. break;
  573. case 0x00B2: // Respawn
  574. strTemp = utlPrintHex(pBuffer, wLen);
  575. strOutput.Format("[S] 回到人物选择画面: %s", strTemp);
  576. utlLogout(strOutput, eLogCommon, bAi);
  577. utlChangeState(-1, 4);
  578. you.init();
  579. utlInitMapChangeVars();
  580. bAiEnabled = false;
  581. break;
  582. case 0x018A: // Quit
  583. strTemp = utlPrintHex(pBuffer, wLen);
  584. strOutput.Format("[S] 登出游戏: %s", strTemp);
  585. utlLogout(strOutput, eLogCommon, bAi);
  586. utlChangeState(-1, 1);
  587. you.init();
  588. utlInitMapChangeVars();
  589. bAiEnabled = false;
  590. break;
  591. case 0x011B: // Teleport
  592. wPara1 = *((WORD*)(pBuffer+2));
  593. if(wPara1 == 0x001A)
  594. {
  595. pPara2 = pBuffer+4;
  596. strOutput.Format("[S] 瞬移: %s", pPara2);
  597. utlLogout(strOutput, eLogCommon, bAi);
  598. }
  599. break;
  600. case 0x0151: // unknown
  601. strTemp = utlPrintHex(pBuffer, wLen);
  602. strOutput.Format("[S] 0x0151: %s", strTemp);
  603. utlLogout(strOutput, eLogCommon, bAi);
  604. break;
  605. case 0x019F: // Capture monsters
  606. strTemp = utlPrintHex(pBuffer, wLen);
  607. strOutput.Format("[S] 0x019F: %s", strTemp);
  608. utlLogout(strOutput, eLogCommon, bAi);
  609. break;
  610. default: // Default
  611. strTemp = utlPrintHex(pBuffer, wLen);
  612. strOutput.Format("[S] 未知封包: %s", strTemp);
  613. utlLogout(strOutput, eLogError, bAi);
  614. }
  615. if(bSend)
  616. {
  617. sendToServerByInject(pBuffer, wLen);
  618. }
  619. return(wLen);
  620. }
  621. #define PARSE(code, LEN) 
  622. case 0x##code:
  623. if(LEN == 0)
  624. {
  625. if(cmdlen != 0) 
  626. nParsed = cmdlen;
  627. else
  628. nParsed = 999999;
  629. }else if(LEN == -1)
  630. {
  631. nParsed = -1;
  632. }else
  633. {
  634. nParsed = LEN;
  635. }
  636. if(nParsed != 999999 && nParsed <= wPacketLen)
  637. {
  638. strTemp.Format(_T("(%d/%d) %s"), wPacketLen, nParsed, utlPrintHex(pBuffer, nParsed));
  639. utlLogout(strTemp, eLogDebug, false);
  640. if(nParsed != -1)
  641. parse##code(pBuffer, nParsed);
  642. else
  643. parse##code(pBuffer, wPacketLen);
  644. }
  645. break;
  646. int parseRecvData(char *pBuffer, WORD wPacketLen)
  647. {
  648. static nErrorCnt = 0;
  649. WORD wCmd;
  650. WORD cmdlen = 0;
  651. CString strTemp;
  652. wCmd = *((WORD*)pBuffer);
  653. if(wPacketLen >= 4)
  654. cmdlen = *((WORD*)(pBuffer+2));
  655. // TRACE("Packlen = %d, cmdlen = %d, cmd = 0x%04Xn", wPacketLen, cmdlen, wCmd);
  656. /* if (wPacketLen >= 4 &&
  657. *((DWORD*)pBuffer) != dwAccountId &&
  658. nConnState >= 4 &&
  659. wLastCmd != wCmd &&
  660. wPacketLen >= wCmdLen)
  661. {
  662. decrypt($msg, $msg);
  663. }
  664. */
  665. int nParsed = -1;
  666. if( dwAccountId &&
  667. (*((DWORD*)pBuffer) == dwAccountId) &&
  668. (nConnState == 4 || nConnState == 2))
  669. {
  670. nParsed = 4;
  671. return(nParsed);
  672. }
  673. switch(wCmd)
  674. {
  675. PARSE(0069, 0); // Login master server completed
  676. PARSE(006A, 23); // Login master server failed
  677. PARSE(006B, -1); // Characters received
  678. PARSE(006C, -1); // Login game server failed
  679. PARSE(006E, 2); // Unknown
  680. PARSE(0071, 28); // Char ID and Map IP received
  681. PARSE(0073, 11); // Your coordinates received
  682. PARSE(0075, 11); // Unknown
  683. PARSE(0077, 4); // Unknown
  684. PARSE(0078, 54); // Something exits
  685. PARSE(0079, 53); // Something connected
  686. PARSE(007A, 4); // Unknown
  687. PARSE(007B, 60); // Something appeared/moved
  688. PARSE(007C, 41); // Something spawned
  689. PARSE(007F, 6); // Sync received
  690. PARSE(0080, 7); // Something disappeared
  691. PARSE(0081, 3); // (UNRESOLVED)
  692. PARSE(0087, 12); // You moved
  693. PARSE(0088, 10); // Long distance attack solution
  694. PARSE(0089, 2); // Unknown
  695. PARSE(008A, 29); // Attack1
  696. PARSE(008D, 0); // Chat1
  697. PARSE(008E, 0); // Chat2
  698. PARSE(008F, 4); // Unknown
  699. PARSE(0091, 22); // Map changing from
  700. PARSE(0092, 28); // Map changing to
  701. PARSE(0093, 2); // Unknown
  702. PARSE(0095, 30); // Info received
  703. PARSE(0096, 43); // Unknown
  704. PARSE(0097, 0); // Private message from
  705. PARSE(0098, 3); // Private message sent result
  706. PARSE(009A, 0); // Chat3
  707. PARSE(009C, 9); // Look at
  708. PARSE(009D, 17); // Item exists
  709. PARSE(009E, 17); // Item appeared
  710. PARSE(00A0, 23); // Item added to inventory
  711. PARSE(00A1, 6); // Item disappeared
  712. PARSE(00A3, 0); // Inventory(Items) received
  713. PARSE(00A4, 0); // Inventory(Equips) received
  714. PARSE(00A5, 0); // Storage opened(UNRESOLVED)
  715. PARSE(00A6, 0); // Storage item(UNRESOLVED)
  716. PARSE(00A8, 7); // You used item
  717. PARSE(00AA, 7); // You equip
  718. PARSE(00AC, 7); // You unequip
  719. PARSE(00AF, 6); // Inventory(Items) removed
  720. PARSE(00B0, 8); // Status received
  721. PARSE(00B1, 8); // Exp/zenny received
  722. PARSE(00B3, 3); // Unknown
  723. PARSE(00B4, 0); // NPC talk
  724. PARSE(00B5, 6); // NPC talk to continue
  725. PARSE(00B6, 6); // NPC done talking
  726. PARSE(00B7, 0); // NPC response
  727. PARSE(00BC, 6); // Add stat point
  728. PARSE(00BD, 44); // Your status(UNRESOLVED)
  729. PARSE(00BE, 5); // Points need to upgrade stats
  730. PARSE(00C0, 7); // Emotion
  731. PARSE(00C1, 4); // Unknown
  732. PARSE(00C2, 6); // Who
  733. PARSE(00C3, 8); // Unknown
  734. PARSE(00C4, 6); // NPC BUY/SELL
  735. PARSE(00C6, 0);
  736. PARSE(00C7, 0);
  737. PARSE(00CA, 3);
  738. PARSE(00CB, 3);
  739. PARSE(00D1, 4);
  740. PARSE(00D2, 4);
  741. PARSE(00D3, 2);
  742. PARSE(00D6, 3);
  743. PARSE(00D7, 0);
  744. PARSE(00D8, 6);
  745. PARSE(00DA, 3);
  746. PARSE(00DB, 0);
  747. PARSE(00DC, 28);
  748. PARSE(00DD, 29);
  749. PARSE(00DF, 0);
  750. PARSE(00E1, 30);
  751. PARSE(00E4, 34);
  752. PARSE(00E5, 26);
  753. PARSE(00E7, 3);
  754. PARSE(00E9, 19);
  755. PARSE(00EA, 5);
  756. PARSE(00EC, 3);
  757. PARSE(00EE, 2);
  758. PARSE(00F0, 3);
  759. PARSE(00F2, 6);
  760. PARSE(00F4, 21);
  761. PARSE(00F6, 8);
  762. PARSE(00F8, 2);
  763. PARSE(00FA, 3);
  764. PARSE(00FB, 0);
  765. PARSE(00FD, 27);
  766. PARSE(00FE, 30);
  767. PARSE(0100, 4);
  768. PARSE(0101, 6);
  769. PARSE(0104, 79);
  770. PARSE(0105, 31);
  771. PARSE(0106, 10);
  772. PARSE(0107, 10);
  773. PARSE(0108, 8);//new
  774. PARSE(0109, 0);
  775. PARSE(010A, 4);
  776. PARSE(010B, 6);
  777. PARSE(010C, 6);
  778. PARSE(010E, 11); // Skill used????
  779. PARSE(010F, 0); // Skills received
  780. PARSE(0110, 10);
  781. PARSE(0111, 39);
  782. PARSE(0114, 31);
  783. PARSE(0115, 16);
  784. PARSE(0117, 18);
  785. PARSE(0119, 13);
  786. PARSE(011A, 15);
  787. PARSE(011C, 4);
  788. PARSE(011E, 3);
  789. PARSE(011F, 16);
  790. PARSE(0120, 6);
  791. PARSE(0121, 14);
  792. PARSE(0122, 0);
  793. PARSE(0123, 0);
  794. PARSE(0124, 21);
  795. PARSE(0125, 8);
  796. PARSE(012C, 26);
  797. PARSE(012D, 4);
  798. PARSE(0131, 86);
  799. PARSE(0132, 6);
  800. PARSE(0133, 0);
  801. PARSE(0135, 7);
  802. PARSE(0136, 0);
  803. PARSE(0137, 6);
  804. PARSE(0139, 16);
  805. PARSE(013A, 4);
  806. PARSE(013B, 4);
  807. PARSE(013C, 4);
  808. PARSE(013D, 6);
  809. PARSE(013E, 24);
  810. PARSE(0141, 14);
  811. PARSE(0145, 19);
  812. PARSE(0147, 39);
  813. PARSE(0148, 8);
  814. PARSE(014A, 6); //new
  815. PARSE(014B, 27);
  816. PARSE(014C, 0);
  817. PARSE(014E, 6);
  818. PARSE(0150, 110);
  819. PARSE(0152, 0);
  820. PARSE(0154, 0);
  821. PARSE(0156, 0);
  822. PARSE(015A, 66);
  823. PARSE(015C, 90);
  824. PARSE(0160, 0);
  825. PARSE(0162, 0);
  826. PARSE(0163, 0);
  827. PARSE(0166, 0);
  828. PARSE(0167, 3);
  829. PARSE(0169, 3);
  830. PARSE(016A, 30);
  831. PARSE(016C, 43);
  832. PARSE(016D, 14);
  833. PARSE(016F, 182);
  834. PARSE(0171, 30);
  835. PARSE(0173, 3);
  836. PARSE(0174, 0);
  837. PARSE(0177, 0);
  838. PARSE(0179, 5);
  839. PARSE(017F, 0);
  840. PARSE(0180, 11);
  841. PARSE(0181, 3); //new
  842. PARSE(0182, 106);
  843. PARSE(0183, 15);
  844. PARSE(0187, 6);
  845. PARSE(0188, 8);
  846. PARSE(018A, 3);
  847. PARSE(018B, 4);
  848. PARSE(018C, 29);
  849. PARSE(018E, 97);
  850. PARSE(0191, 86);
  851. PARSE(0192, 24);
  852. PARSE(0193, 6);
  853. PARSE(0194, 30);
  854. PARSE(0195, 102);
  855. PARSE(0196, 9);
  856. PARSE(0199, 4);
  857. PARSE(019B, 10);
  858. PARSE(019E, 2);
  859. PARSE(01A0, 3);
  860. PARSE(01A2, 35);
  861. PARSE(01A3, 5);
  862. PARSE(01A4, 11);
  863. PARSE(01A6, 0);
  864. PARSE(01AA, 10);
  865. PARSE(01AB, 12); //new
  866. PARSE(01AC, 6);
  867. PARSE(01AD, 0);
  868. PARSE(01B0, 11);
  869. PARSE(01B1, 15); //new
  870. PARSE(01B3, 67);
  871. PARSE(01B5, 18);
  872. PARSE(01B6, 114);
  873. PARSE(01B9, 6);
  874. PARSE(01C4, 22);
  875. PARSE(01C8, 13);
  876. PARSE(01C9, 97);
  877. PARSE(01D0, 8); // Monk
  878. PARSE(01D2, 10);
  879. PARSE(01D3, 35);
  880. PARSE(01D4, 6);
  881. PARSE(01D5, 8);
  882. PARSE(01D6, 12);
  883. PARSE(01D7, 11);
  884. PARSE(01D8, 54);
  885. PARSE(01D9, 53);
  886. PARSE(01DA, 60);
  887. PARSE(01DB, 2);
  888. PARSE(01DC, 0);
  889. PARSE(01DD, 47);
  890. PARSE(01DE, 33);
  891. PARSE(01DF, 6);
  892. PARSE(01E1, 19);
  893. PARSE(01F4, 7);
  894. default:
  895. strTemp.Format("(%d/%d) 未知封包: %s", nParsed, wPacketLen, utlPrintHex(pBuffer, wPacketLen));
  896. utlLogout(strTemp, eLogError, false);
  897. break;
  898. }
  899. return(nParsed);
  900. }
  901. //-------------------------------------------------------------------------------------------------------------------------------
  902. // Login master server completed
  903. int parse0069(char *pBuffer, int nLen)
  904. {
  905. CString strOutput;
  906. int i;
  907. utlChangeState(-1, 2);
  908. dwSessionId = *(DWORD*)(pBuffer+4);
  909. dwAccountId = *(DWORD*)(pBuffer+8);
  910. BYTE nSex = *(pBuffer+46);
  911. strOutput.Format("[R] 登录主服务器成功");
  912. utlLogout(strOutput, eLogCommon, false);
  913. strOutput.Format("[R] AID: %8X, SID: %08X, 性别: %s", dwAccountId, dwSessionId, mapSex.FindValue(nSex));
  914. utlLogout(strOutput, eLogCommon, false);
  915. strOutput.Format("[R] 游戏服务器列表: ------->");
  916. utlLogout(strOutput, eLogCommon, false);
  917. for(i=47; i<nLen; i+=32)
  918. {
  919. strOutput.Format("    %s: IP: %d.%d.%d.%d, 端口: %d, 用户数: %d",
  920.  pBuffer+i+6,
  921.  *((BYTE*)(pBuffer+i)),
  922.  *((BYTE*)(pBuffer+i+1)),
  923.  *((BYTE*)(pBuffer+i+2)),
  924.  *((BYTE*)(pBuffer+i+3)),
  925.  *((WORD*)(pBuffer+i+4)),
  926.  *((DWORD*)(pBuffer+i+26)));
  927. utlLogout(strOutput, eLogCommon, false);
  928. }
  929. return(0);
  930. }
  931. //-------------------------------------------------------------------------------------------------------------------------------
  932. // Login master server failed
  933. int parse006A(char *pBuffer, int nLen)
  934. {
  935. CString strOutput;
  936. BYTE byType;
  937. byType = *(pBuffer+2);
  938. strOutput = "[R] 登录主服务器失败: ";
  939. switch(byType)
  940. {
  941. case 0:
  942. strOutput += "不存在该帐号!";
  943. break;
  944. case 1:
  945. strOutput += "密码错误!";
  946. break;
  947. case 3:
  948. strOutput += "服务器拒绝连接!";
  949. break;
  950. case 4:
  951. strOutput += "帐号已被冻结!";
  952. break;
  953. case 5:
  954. strOutput += "游戏版本不符!";
  955. break;
  956. case 6:
  957. strOutput += "暂时无法与服务器连接!";
  958. break;
  959. default:
  960. strOutput += "未知错误!";
  961. break;
  962. }
  963. utlLogout(strOutput, eLogError, false);
  964. return(0);
  965. }
  966. //-------------------------------------------------------------------------------------------------------------------------------
  967. // Characters received
  968. int parse006B(char *pBuffer, int nLen)
  969. {
  970. CString strOutput;
  971. int i;
  972. int nIdx = 0;
  973. DWORD temp;
  974. utlChangeState(-1, 3);
  975. strOutput.Format("[R] 人物列表: ------->");
  976. utlLogout(strOutput, eLogCommon, false);
  977. int nStartPos = option.bTestServer? 24 : 4;
  978. for(i=nStartPos; i<nLen; i+=106)
  979. {
  980. nIdx = *((BYTE*)(pBuffer+i+104));
  981. youTemp[nIdx].dwExp = *((DWORD*)(pBuffer+i+4));
  982. youTemp[nIdx].dwZenny = *((DWORD*)(pBuffer+i+8));
  983. youTemp[nIdx].dwJobExp = *((DWORD*)(pBuffer+i+12));
  984. youTemp[nIdx].wJobLevel = *((BYTE*)(pBuffer+i+16));
  985. youTemp[nIdx].wHp = *((WORD*)(pBuffer+i+42));
  986. youTemp[nIdx].wHpMax = *((WORD*)(pBuffer+i+44));
  987. youTemp[nIdx].wSp = *((WORD*)(pBuffer+i+46));
  988. youTemp[nIdx].wSpMax = *((WORD*)(pBuffer+i+48));
  989. temp = *((BYTE*)(pBuffer+i+52));
  990. strcpy(youTemp[nIdx].cJob, mapJob.FindValue(temp));
  991. youTemp[nIdx].wLevel = *((BYTE*)(pBuffer+i+58));
  992. strncpy(youTemp[nIdx].cName, (pBuffer+i+74), MAX_NAME_LENGTH);
  993. // youTemp[nIdx].byStr = *((BYTE*)(pBuffer+i+98));
  994. // youTemp[nIdx].byAgi = *((BYTE*)(pBuffer+i+99));
  995. // youTemp[nIdx].byVit = *((BYTE*)(pBuffer+i+100));
  996. // youTemp[nIdx].byInt = *((BYTE*)(pBuffer+i+101));
  997. // youTemp[nIdx].byDex = *((BYTE*)(pBuffer+i+102));
  998. // youTemp[nIdx].byLuk = *((BYTE*)(pBuffer+i+103));
  999. strOutput.Format("    [%d] %s: 职业: %s, 级别: %d Zenny: %d", nIdx,
  1000.  pBuffer+i+74,
  1001.  mapJob.FindValue(*((BYTE*)(pBuffer+i+52))),
  1002.  *((BYTE*)(pBuffer+i+58)),
  1003.  *((DWORD*)(pBuffer+i+8)) );
  1004. utlLogout(strOutput, eLogCommon, false);
  1005. }
  1006. ufAutoSaClassChange(0);
  1007. if(bAutoSearch)
  1008. ufAutoSearchMvp(0);
  1009. utlInitMapChangeVars();
  1010. you.init();
  1011. return(0);
  1012. }
  1013. //-------------------------------------------------------------------------------------------------------------------------------
  1014. // Login game server failed
  1015. int parse006C(char *pBuffer, int nLen)
  1016. {
  1017. CString strOutput;
  1018. utlChangeState(-1, 1);
  1019. strOutput.Format("[R] 登录游戏服务器失败: 非法人物编号!");
  1020. utlLogout(strOutput, eLogError, false);
  1021. return(0);
  1022. }
  1023. //-------------------------------------------------------------------------------------------------------------------------------
  1024. // Char ID and Map IP received
  1025. int parse0071(char *pBuffer, int nLen)
  1026. {
  1027. char cMapName[16+1];
  1028. CString strMap, strOutput;
  1029. CString strIP, strPort;
  1030. utlChangeState(-1, 4);
  1031. strOutput.Format("[R] 与地图服务器连接成功");
  1032. utlLogout(strOutput, eLogCommon, false);
  1033. strncpy(cMapName, pBuffer+6, 16);
  1034. strMap = cMapName;
  1035. strMap.TrimRight();
  1036. if(strMap.GetLength() > 4 && strMap.Right(4) == ".gat")
  1037. {
  1038. strMap = strMap.Left(strMap.GetLength()-4);
  1039. }
  1040. CString strTemp = strMap;
  1041. strTemp += ".rsw";
  1042. field.init(strMap, mapMapName.FindValue(strTemp));
  1043. strIP.Format(_T("%d.%d.%d.%d"), (BYTE)pBuffer[22], (BYTE)pBuffer[23], (BYTE)pBuffer[24], (BYTE)pBuffer[25]);
  1044. strPort.Format(_T("%d"), *(WORD*)(pBuffer+26));
  1045. strOutput.Format("[R] 地图名: %s 服务器IP: %s 端口: %s", strMap, strIP, strPort);
  1046. utlLogout(strOutput, eLogCommon, false);
  1047. return(0);
  1048. }
  1049. //-------------------------------------------------------------------------------------------------------------------------------
  1050. // Your coordinates received
  1051. int parse0073(char *pBuffer, int nLen)
  1052. {
  1053. POINT pnt;
  1054. CString strOutput;
  1055. pnt = utlMakeCoords((BYTE*)(pBuffer+6));
  1056. strOutput.Format("[R] 人物坐标: (%d, %d)", pnt.x, pnt.y);
  1057. utlLogout(strOutput, eLogCommon, false);
  1058. utlLogout("[R] 等待客户端载入地图数据......", eLogCommon, false);
  1059. utlInitMapChangeVars();
  1060. you.pntPos = pnt;
  1061. you.pntTo = pnt;
  1062. bFlyUsed = false;
  1063. dwAutoSearchTick = 0;
  1064. curFunc = NULL;
  1065. return(0);
  1066. }
  1067. //-------------------------------------------------------------------------------------------------------------------------------
  1068. // Something exits
  1069. int parse0078(char *pBuffer, int nLen)
  1070. {
  1071. DWORD dwId;
  1072. POINT pnt;
  1073. WORD wType;
  1074. BYTE bySex;
  1075. BYTE byPet;
  1076. BYTE bySitting;
  1077. WORD wFrozen;
  1078. CString strOutput, strTemp;
  1079. utlChangeState(4, 5);
  1080. dwId = *((DWORD*)(pBuffer+2));
  1081. pnt = utlMakeCoords((BYTE*)(pBuffer+46));
  1082. wType = *((WORD*)(pBuffer+14));
  1083. bySex = *(pBuffer+45);
  1084. byPet = *(pBuffer+16);
  1085. bySitting = *(pBuffer+51);
  1086. wFrozen = *((WORD*)(pBuffer+8));
  1087. int nIndex;
  1088. if(wType >= 1000)
  1089. {
  1090. if(byPet)
  1091. {
  1092. //Pet
  1093. }
  1094. else
  1095. {
  1096. // Monster
  1097. MONSTER mon;
  1098. nIndex = monsters.FindId(dwId);
  1099. if(-1 == nIndex)
  1100. {
  1101. // Appear
  1102. mon.dwId = dwId;
  1103. mon.wType = wType;
  1104. strcpy(mon.cName, mapMonster.FindValue(mon.wType, 0));
  1105. nIndex = monsters.Add(mon);
  1106. }
  1107. else
  1108. {
  1109. mon = monsters.GetAt(nIndex);
  1110. }
  1111. mon.pntPos = pnt;
  1112. mon.pntTo = pnt;
  1113. mon.wFrozen = wFrozen;
  1114. monsters.SetAt(nIndex, mon);
  1115. strOutput.Format("[R] 在 (%d, %d) 发现 %s", pnt.x, pnt.y, mon.cName);
  1116. utlLogout(strOutput, eLogInfo, false);
  1117. if(utlIsMvpMonster(mon))
  1118. {
  1119. if(mode == eModeNormal)
  1120. utlReportMonsterToParty(dwId);
  1121. utlChangeMode(eModeMvp, dwId);
  1122. }
  1123. }
  1124. }
  1125. else
  1126. {
  1127. BOOL bFound;
  1128. mapJob.FindValue(wType, -1, &bFound);
  1129. if(bFound)
  1130. {
  1131. // Player
  1132. PLAYER player;
  1133. nIndex = players.FindId(dwId);
  1134. if(-1 == nIndex)
  1135. {
  1136. player.dwAppearTime = GetTickCount();
  1137. player.dwId = dwId;
  1138. player.wType = wType;
  1139. player.bySex = bySex;
  1140. strcpy(player.cName, "Unknown");
  1141. nIndex = players.Add(player);
  1142. }
  1143. else
  1144. {
  1145. player = players.GetAt(nIndex);
  1146. }
  1147. player.pntPos = pnt;
  1148. player.pntTo = pnt;
  1149. player.bSit = (bySitting > 0);
  1150. players.SetAt(nIndex, player);
  1151. strOutput.Format("[R] 在 (%d, %d) 发现 %s", pnt.x, pnt.y, player.cName);
  1152. utlLogout(strOutput, eLogInfo, false);
  1153. utlCheckForGm(player);
  1154. }
  1155. else
  1156. {
  1157. if(45 == wType)
  1158. {
  1159. // Portal
  1160. PORTAL portal;
  1161. nIndex = portals.FindId(dwId);
  1162. if(-1 == nIndex)
  1163. {
  1164. portal.dwAppearTime = GetTickCount();
  1165. portal.dwId = dwId;
  1166. portal.wType = wType;
  1167. nIndex = portals.Add(portal);
  1168. }
  1169. else
  1170. {
  1171. portal = portals.GetAt(nIndex);
  1172. }
  1173. portal.pntPos = pnt;
  1174. portals.SetAt(nIndex, portal);
  1175. strOutput.Format("[R] 在 (%d, %d) 发现 传送点(0x%08X)", pnt.x, pnt.y, portal.dwId);
  1176. utlLogout(strOutput, eLogInfo, false);
  1177. }
  1178. else
  1179. {
  1180. strOutput.Format("[R] 在 (%d, %d) 发现 NPC(0x%08X)", pnt.x, pnt.y, dwId);
  1181. utlLogout(strOutput, eLogInfo, false);
  1182. }
  1183. }
  1184. }
  1185. return(0);
  1186. }
  1187. int parse01D8(char *pBuffer, int nLen)
  1188. {
  1189. return(parse0078(pBuffer, nLen));
  1190. }
  1191. //-------------------------------------------------------------------------------------------------------------------------------
  1192. // Something connected
  1193. int parse0079(char *pBuffer, int nLen)
  1194. {
  1195. DWORD dwId;
  1196. POINT pnt;
  1197. WORD wType;
  1198. BYTE bySex;
  1199. CString strOutput, strTemp;
  1200. utlChangeState(4, 5);
  1201. dwId = *((DWORD*)(pBuffer+2));
  1202. pnt = utlMakeCoords((BYTE*)(pBuffer+46));
  1203. wType = *((WORD*)(pBuffer+14));
  1204. bySex = *(pBuffer+45);
  1205. int nIndex;
  1206. PLAYER player;
  1207. BOOL bFound;
  1208. mapJob.FindValue(wType, -1, &bFound);
  1209. if(bFound)
  1210. {
  1211. nIndex = players.FindId(dwId);
  1212. if(-1 == nIndex)
  1213. {
  1214. player.dwAppearTime = GetTickCount();
  1215. player.dwId = dwId;
  1216. player.wType = wType;
  1217. player.bySex = bySex;
  1218. strcpy(player.cName, "Unknown");
  1219. nIndex = players.Add(player);
  1220. }
  1221. else
  1222. {
  1223. player = players.GetAt(nIndex);
  1224. }
  1225. player.pntPos = pnt;
  1226. player.pntTo = pnt;
  1227. players.SetAt(nIndex, player);
  1228. strOutput.Format("[R] 在 (%d, %d) 发现 %s 连接", pnt.x, pnt.y, utlFindTarget(dwId));
  1229. utlLogout(strOutput, eLogInfo, false);
  1230. utlCheckForGm(player);
  1231. }
  1232. else
  1233. {
  1234. // Unknown
  1235. }
  1236. return(0);
  1237. }
  1238. // Something connected
  1239. int parse01D9(char *pBuffer, int nLen)
  1240. {
  1241. return(parse0079(pBuffer, nLen));
  1242. }
  1243. //-------------------------------------------------------------------------------------------------------------------------------
  1244. // Something appeared/moved
  1245. int parse007B(char *pBuffer, int nLen)
  1246. {
  1247. DWORD dwId;
  1248. POINT pntFrom, pntTo;
  1249. WORD wType;
  1250. BYTE byPet;
  1251. BYTE bySex;
  1252. CString strOutput, strTemp;
  1253. LOG_LEVEL logLevel = eLogInfo;
  1254. utlChangeState(4, 5);
  1255. dwId = *((DWORD*)(pBuffer+2));
  1256. pntFrom = utlMakeCoords((BYTE*)(pBuffer+50));
  1257. pntTo = utlMakeCoords2((BYTE*)(pBuffer+52));
  1258. wType = *((WORD*)(pBuffer+14));
  1259. byPet = *(pBuffer+16);
  1260. bySex = *(pBuffer+49);
  1261. int nIndex;
  1262. if(wType >= 1000)
  1263. {
  1264. if(byPet)
  1265. {
  1266. ;
  1267. }
  1268. else
  1269. {
  1270. // Monster
  1271. MONSTER mon;
  1272. nIndex = monsters.FindId(dwId);
  1273. if(-1 == nIndex)
  1274. {
  1275. // Appear
  1276. mon.dwId = dwId;
  1277. mon.wType = wType;
  1278. mon.pntPos = pntFrom;
  1279. mon.pntTo = pntTo;
  1280. strcpy(mon.cName, mapMonster.FindValue(mon.wType, 0));
  1281. nIndex = monsters.Add(mon);
  1282. }
  1283. else
  1284. {
  1285. mon = monsters.GetAt(nIndex);
  1286. }
  1287. mon.pntPos = pntFrom;
  1288. mon.pntTo = pntTo;
  1289. monsters.SetAt(nIndex, mon);
  1290. strOutput.Format("[R] %s 从 (%d, %d) 移动至 (%d, %d)",
  1291. utlFindTarget(mon.dwId), pntFrom.x, pntFrom.y, pntTo.x, pntTo.y);
  1292. utlLogout(strOutput, eLogInfo, false);
  1293. if(utlIsMvpMonster(mon))
  1294. {
  1295. if(mode == eModeNormal)
  1296. utlReportMonsterToParty(dwId);
  1297. utlChangeMode(eModeMvp, dwId);
  1298. }
  1299. }
  1300. }
  1301. else
  1302. {
  1303. BOOL bFound;
  1304. mapJob.FindValue(wType, -1, &bFound);
  1305. if(bFound)
  1306. {
  1307. // player
  1308. PLAYER player;
  1309. nIndex = players.FindId(dwId);
  1310. if(-1 == nIndex)
  1311. {
  1312. // Appear
  1313. player.dwAppearTime = GetTickCount();
  1314. player.dwId = dwId;
  1315. player.wType = wType;
  1316. player.bySex = bySex;
  1317. strcpy(player.cName, "Unknown");
  1318. nIndex = players.Add(player);
  1319. }
  1320. else
  1321. {
  1322. player = players.GetAt(nIndex);
  1323. }
  1324. player.pntPos = pntFrom;
  1325. player.pntTo = pntTo;
  1326. players.SetAt(nIndex, player);
  1327. strOutput.Format("[R] %s 从 (%d, %d) 移动至 (%d, %d)", utlFindTarget(dwId), pntFrom.x, pntFrom.y, pntTo.x, pntTo.y);
  1328. utlLogout(strOutput, eLogInfo, false);
  1329. }
  1330. else
  1331. {
  1332. // Unknown
  1333. }
  1334. }
  1335. return(0);
  1336. }
  1337. int parse01DA(char *pBuffer, int nLen)
  1338. {
  1339. return(parse007B(pBuffer, nLen));
  1340. }
  1341. //-------------------------------------------------------------------------------------------------------------------------------
  1342. // Something spawned
  1343. int parse007C(char *pBuffer, int nLen)
  1344. {
  1345. DWORD dwId;
  1346. POINT pnt;
  1347. WORD wType;
  1348. BYTE bySex;
  1349. CString strOutput, strTemp;
  1350. utlChangeState(4, 5);
  1351. dwId = *((DWORD*)(pBuffer+2));
  1352. pnt = utlMakeCoords((BYTE*)(pBuffer+36));
  1353. wType = *((WORD*)(pBuffer+20));
  1354. bySex = *(pBuffer+35);
  1355. int nIndex;
  1356. if(wType >= 1000)
  1357. {
  1358. MONSTER mon;
  1359. // Monster
  1360. nIndex = monsters.FindId(dwId);
  1361. if(-1 == nIndex)
  1362. {
  1363. // Appear
  1364. mon.dwId = dwId;
  1365. mon.wType = wType;
  1366. strcpy(mon.cName, mapMonster.FindValue(mon.wType, 0));
  1367. nIndex = monsters.Add(mon);
  1368. }
  1369. else
  1370. {
  1371. mon = monsters.GetAt(nIndex);
  1372. }
  1373. mon.pntPos = pnt;
  1374. mon.pntTo = pnt;
  1375. monsters.SetAt(nIndex, mon);
  1376. strOutput.Format("[R] 发现 %s", utlFindTarget(dwId), pnt.x, pnt.y);
  1377. utlLogout(strOutput, eLogInfo, false);
  1378. if(utlIsMvpMonster(mon))
  1379. {
  1380. if(mode == eModeNormal)
  1381. utlReportMonsterToParty(dwId);
  1382. utlChangeMode(eModeMvp, dwId);
  1383. }
  1384. }
  1385. else
  1386. {
  1387. BOOL bFound;
  1388. mapJob.FindValue(wType, -1, &bFound);
  1389. if(bFound)
  1390. {
  1391. PLAYER player;
  1392. nIndex = players.FindId(dwId);
  1393. if(-1 == nIndex)
  1394. {
  1395. // Appear
  1396. player.dwAppearTime = GetTickCount();
  1397. player.dwId = dwId;
  1398. player.wType = wType;
  1399. player.bySex = bySex;
  1400. strcpy(player.cName, "Unknown");
  1401. nIndex = players.Add(player);
  1402. }
  1403. else
  1404. {
  1405. player = players.GetAt(nIndex);
  1406. }
  1407. player.pntPos = pnt;
  1408. player.pntTo = pnt;
  1409. players.SetAt(nIndex, player);
  1410. strOutput.Format("[R] 在 (%d, %d) 发现 %s", pnt.x, pnt.y, utlFindTarget(player.dwId));
  1411. utlLogout(strOutput, eLogInfo, false);
  1412. utlCheckForGm(player);
  1413. }
  1414. else
  1415. {
  1416. // Unknown
  1417. }
  1418. }
  1419. return(0);
  1420. }
  1421. //-------------------------------------------------------------------------------------------------------------------------------
  1422. // something disappeared
  1423. int parse0080(char *pBuffer, int nLen)
  1424. {
  1425. DWORD dwId;
  1426. BYTE bType;
  1427. int nIndex;
  1428. CString strOutput, strTemp;
  1429. utlChangeState(4, 5);
  1430. dwId = *((DWORD*)(pBuffer+2));
  1431. bType = *(pBuffer+6);
  1432. strOutput = "Unknown(0x0080)";
  1433. LOG_LEVEL logLevel = eLogInfo;
  1434. if(dwId == dwAccountId)
  1435. {
  1436. //you died
  1437. strOutput = "[R] 你 死亡了";
  1438. logLevel = eLogError;
  1439. sendChatParty(_T("我挂了55555555,9人哪~~~~~~"));
  1440. strTemp = _T("你已死亡,停止所有AI");
  1441. injectAdminMessage(strTemp);
  1442. you.bDied = true;
  1443. bAiEnabled = false;
  1444. }
  1445. else
  1446. {
  1447. nIndex = monsters.FindId(dwId);
  1448. if(-1 != nIndex)
  1449. {
  1450. // Monster
  1451. MONSTER mon;
  1452. mon = monsters[nIndex];
  1453. CString strTemp;
  1454. switch(bType)
  1455. {
  1456. case 0:
  1457. strOutput.Format("[R] %s 消失了", utlFindTarget(dwId));
  1458. strTemp = _T("消失了");
  1459. break;
  1460. case 1:
  1461. strOutput.Format("[R] %s 死亡了", utlFindTarget(dwId));
  1462. if(utlIsMvpMonster(mon))
  1463. {
  1464. utlShowAttackResult(nIndex);
  1465. utlSetMonsterDiedTime(mon.cName);
  1466. }
  1467. strTemp = _T("死亡了");
  1468. break;
  1469. default:
  1470. strOutput.Format("[R] %s 瞬移了", utlFindTarget(dwId));
  1471. strTemp = _T("瞬移了");
  1472. break;
  1473. }
  1474. if(utlIsMvpMonster(mon))
  1475. {
  1476. CString strMsg;
  1477. CTime time = CTime::GetCurrentTime();
  1478. strMsg.Format(_T("[%d:%d:%d] %s%s..."), time.GetHour(), time.GetMinute(), time.GetSecond(), 
  1479. monsters[nIndex].cName, strTemp);
  1480. sendChatParty(strMsg);
  1481. utlChangeMode(eModeNormal, 0);
  1482. }
  1483. monsters.RemoveAt(nIndex);
  1484. damages.RemoveDamage(dwId);
  1485. logLevel = eLogCommon;
  1486. }
  1487. else
  1488. {
  1489. nIndex = players.FindId(dwId);
  1490. if(-1 != nIndex)
  1491. {
  1492. // Player
  1493. PLAYER player;
  1494. player = players[nIndex];
  1495. switch(bType)
  1496. {
  1497. case 0:
  1498. strOutput.Format("[R] %s 消失了", utlFindTarget(dwId));
  1499. break;
  1500. case 1:
  1501. strOutput.Format("[R] %s 死亡了", utlFindTarget(dwId));
  1502. break;
  1503. case 2:
  1504. strOutput.Format("[R] %s 断线了", utlFindTarget(dwId));
  1505. break;
  1506. default:
  1507. strOutput.Format("[R] %s 瞬移了", utlFindTarget(dwId));
  1508. break;
  1509. }
  1510. if(utlCheckForGm(player))
  1511. {
  1512. utlGMDisappeared(player);
  1513. }
  1514. if(bType != 1)
  1515. {
  1516. players.RemoveAt(nIndex);
  1517. damages.RemoveDamage(dwId);
  1518. }
  1519. }
  1520. else
  1521. {
  1522. nIndex = portals.FindId(dwId);
  1523. if(-1 != nIndex)
  1524. {
  1525. // Portal
  1526. PORTAL portal;
  1527. portal = portals[nIndex];
  1528. strOutput.Format("[R] 传送点(0x%08X) 消失了", portal.dwId);
  1529. portals.RemoveAt(nIndex);
  1530. }
  1531. else
  1532. {
  1533. strOutput.Format("[R] NPC(0x%08X) 消失了", dwId);
  1534. }
  1535. }
  1536. }
  1537. }
  1538. utlLogout(strOutput, logLevel, false);
  1539. return(0);
  1540. }
  1541. //-------------------------------------------------------------------------------------------------------------------------------
  1542. // You moved
  1543. int parse0087(char *pBuffer, int nLen)
  1544. {
  1545. POINT pntFrom, pntTo;
  1546. CString strOutput;
  1547. pntFrom = utlMakeCoords((BYTE*)(pBuffer+6));
  1548. pntTo = utlMakeCoords2((BYTE*)(pBuffer+8));
  1549. you.pntPos = pntFrom;
  1550. you.pntTo = pntTo;
  1551. strOutput.Format("[R] 你 从 (%d, %d) 移动至 (%d, %d)", pntFrom.x, pntFrom.y, pntTo.x, pntTo.y);
  1552. utlLogout(strOutput, eLogInfo, false);
  1553. return(0);
  1554. }
  1555. //-------------------------------------------------------------------------------------------------------------------------------
  1556. // Long distance attack solution
  1557. int parse0088(char *pBuffer, int nLen)
  1558. {
  1559. POINT pnt;
  1560. DWORD dwId;
  1561. int nIndex;
  1562. CString strOutput = "parse0088";
  1563. dwId = *((DWORD*)(pBuffer+2));
  1564. pnt.x = *(WORD*)(pBuffer+6);
  1565. pnt.y = *(WORD*)(pBuffer+8);
  1566. if(dwId == dwAccountId)
  1567. {
  1568. strOutput.Format("[R] 你 移动至 (%d, %d) [被攻击]", pnt.x, pnt.y);
  1569. you.pntPos = pnt;
  1570. you.pntTo = pnt;
  1571. }
  1572. else
  1573. {
  1574. nIndex = players.FindId(dwId);
  1575. if(-1 != nIndex)
  1576. {
  1577. PLAYER player;
  1578. player = players[nIndex];
  1579. player.pntPos = pnt;
  1580. player.pntTo = pnt;
  1581. players.SetAt(nIndex, player);
  1582. strOutput.Format("[R] %s 移动至 (%d, %d) [被攻击]", utlFindTarget(dwId));
  1583. }
  1584. else
  1585. {
  1586. nIndex = monsters.FindId(dwId);
  1587. if(-1 != nIndex)
  1588. {
  1589. MONSTER monster;
  1590. monster = monsters[nIndex];
  1591. monster.pntPos = pnt;
  1592. monster.pntTo = pnt;
  1593. strOutput.Format("[R] %s 移动至 (%d, %d) [被攻击]", utlFindTarget(dwId));
  1594. }
  1595. }
  1596. }
  1597. utlLogout(strOutput, eLogCommon, false);
  1598. return(0);
  1599. }
  1600. //-------------------------------------------------------------------------------------------------------------------------------
  1601. // Chat1
  1602. int parse008D(char *pBuffer, int nLen)
  1603. {
  1604. DWORD dwId;
  1605. CString strOutput, strCheck;
  1606. char cChat[MAX_CHAT_MSG+1];
  1607. dwId = *((DWORD*)(pBuffer+4));
  1608. memset(cChat, 0, MAX_CHAT_MSG+1);
  1609. strncpy(cChat, pBuffer+8, (nLen-8>MAX_CHAT_MSG)?MAX_CHAT_MSG:(nLen-8));
  1610. strOutput.Format("[R] 008D(%08X): %s", dwId, cChat);
  1611. utlLogout(strOutput, eLogInfo, false);
  1612. return(0);
  1613. }
  1614. //-------------------------------------------------------------------------------------------------------------------------------
  1615. // Chat2
  1616. int parse008E(char *pBuffer, int nLen)
  1617. {
  1618. CString strOutput;
  1619. char cChat[MAX_CHAT_MSG+1];
  1620. memset(cChat, 0, MAX_CHAT_MSG+1);
  1621. strncpy(cChat, pBuffer+4, (nLen-4)>MAX_CHAT_MSG?MAX_CHAT_MSG:(nLen-4));
  1622. strOutput.Format("[R] 你 发言: %s", cChat);
  1623. utlLogout(strOutput, eLogInfo, false);
  1624. return(0);
  1625. }
  1626. //-------------------------------------------------------------------------------------------------------------------------------
  1627. // Map changing from
  1628. int parse0091(char *pBuffer, int nLen)
  1629. {
  1630. CString strMap, strOutput;
  1631. WORD x, y;
  1632. char cMapName[16+1];
  1633. utlChangeState(-1, 4);
  1634. strncpy(cMapName, pBuffer+2, 16);
  1635. strMap = cMapName;
  1636. strMap.TrimRight();
  1637. x = *((WORD*)(pBuffer+18));
  1638. y = *((WORD*)(pBuffer+20));
  1639. if(strMap.GetLength() > 4 && strMap.Right(4) == ".gat")
  1640. {
  1641. strMap = strMap.Left(strMap.GetLength()-4);
  1642. }
  1643. CString strTemp = strMap;
  1644. strTemp += ".rsw";
  1645. field.init(strMap, mapMapName.FindValue(strTemp));
  1646. strOutput.Format("[R] 准备更换地图: %s(%s)@(%d, %d)", field.m_strAlias, strMap, x, y);
  1647. utlLogout(strOutput, eLogCommon, false);
  1648. utlInitMapChangeVars();
  1649. you.pntPos.x = x;
  1650. you.pntPos.y = y;
  1651. you.pntTo.x = x;
  1652. you.pntTo.y = y;
  1653. return(0);
  1654. }
  1655. //-------------------------------------------------------------------------------------------------------------------------------
  1656. // Map changing to
  1657. int parse0092(char *pBuffer, int nLen)
  1658. {
  1659. CString strMap, strOutput;
  1660. char cMapName[16+1];
  1661. utlChangeState(-1, 4);
  1662. strncpy(cMapName, pBuffer+2, 16);
  1663. strMap = cMapName;
  1664. strMap.TrimRight();
  1665. if(strMap.GetLength() > 4 && strMap.Right(4) == ".gat")
  1666. {
  1667. strMap = strMap.Left(strMap.GetLength()-4);
  1668. }
  1669. CString strTemp = strMap;
  1670. strTemp += ".rsw";
  1671. field.init(strMap, mapMapName.FindValue(strTemp));
  1672. strOutput.Format("[R] 地图更换至: %s(%s)", field.m_strAlias, strMap);
  1673. utlLogout(strOutput, eLogCommon, false);
  1674. utlInitMapChangeVars();
  1675. return(0);
  1676. }
  1677. //-------------------------------------------------------------------------------------------------------------------------------
  1678. // Info received
  1679. int parse0095(char *pBuffer, int nLen)
  1680. {
  1681. CString strOutput;
  1682. DWORD dwId;
  1683. CString strName;
  1684. char cName[MAX_NAME_LENGTH+1];
  1685. int nIndex;
  1686. utlChangeState(4, 5);
  1687. dwId = *((DWORD*)(pBuffer+2));
  1688. memset(cName, 0, MAX_NAME_LENGTH+1);
  1689. strncpy(cName, pBuffer+6, MAX_NAME_LENGTH);
  1690. strName = cName;
  1691. strName.TrimRight();
  1692. if(dwId != dwAccountId)
  1693. {
  1694. nIndex = players.FindId(dwId);
  1695. if(-1 != nIndex)
  1696. {
  1697. strcpy(players[nIndex].cName, strName);
  1698. if(utlCheckForGmByName(players[nIndex]))
  1699. {
  1700. utlGMAppeared(players[nIndex]);
  1701. }
  1702. }
  1703. else
  1704. {
  1705. nIndex = monsters.FindId(dwId);
  1706. if(-1 != nIndex)
  1707. {
  1708. strcpy(monsters[nIndex].cName, strName);
  1709. }
  1710. }
  1711. }
  1712. strOutput.Format("[R] 收到 %08X 信息: %s", dwId, strName);
  1713. utlLogout(strOutput, eLogInfo, false);
  1714. return(0);
  1715. }
  1716. //-------------------------------------------------------------------------------------------------------------------------------
  1717. // Private message from
  1718. int parse0097(char *pBuffer, int nLen)
  1719. {
  1720. CString strOutput;
  1721. char cFrom[MAX_NAME_LENGTH+1];
  1722. char cMsg[MAX_CHAT_MSG+1];
  1723. CString strCheck;
  1724. utlChangeState(4, 5);
  1725. memset(cFrom, 0, MAX_NAME_LENGTH+1);
  1726. memset(cMsg, 0, MAX_CHAT_MSG+1);
  1727. strncpy(cFrom, pBuffer+4, MAX_NAME_LENGTH);
  1728. strncpy(cMsg, pBuffer+28, (nLen - 29)>MAX_CHAT_MSG?MAX_CHAT_MSG:(nLen - 29));
  1729. strOutput.Format("[R] %s 密 你: %s", cFrom, cMsg);
  1730. utlLogout(strOutput, eLogCommon, false);
  1731. for(int i=0; i<players.GetSize(); i++)
  1732. {
  1733. if(stricmp(players[i].cName, cFrom) == 0)
  1734. {
  1735. if(utlCheckForWanzi(players[i].cGuild))
  1736. {
  1737. sendEmotion(0);
  1738. break;
  1739. }
  1740. }
  1741. }
  1742. return(0);
  1743. }
  1744. //-------------------------------------------------------------------------------------------------------------------------------
  1745. // Private message sent result
  1746. int parse0098(char *pBuffer, int nLen)
  1747. {
  1748. CString strOutput;
  1749. BYTE byType;
  1750. byType = *(pBuffer+2);
  1751. strOutput = "[R] 密聊信息 ";
  1752. switch(byType)
  1753. {
  1754. case 0:
  1755. strOutput += "已发送";
  1756. break;
  1757. case 1:
  1758. strOutput += "无法发送: 玩家不在线!";
  1759. break;
  1760. case 2:
  1761. strOutput += "无法发送: 你已被忽略!";
  1762. break;
  1763. default:
  1764. strOutput += "无法发送: 未知错误!";
  1765. }
  1766. utlLogout(strOutput, eLogInfo, false);
  1767. return(0);
  1768. }
  1769. //-------------------------------------------------------------------------------------------------------------------------------
  1770. // Chat3
  1771. int parse009A(char *pBuffer, int nLen)
  1772. {
  1773. CString strOutput;
  1774. CString strCheck;
  1775. char cChat[MAX_CHAT_MSG+1];
  1776. memset(cChat, 0, MAX_CHAT_MSG+1);
  1777. strncpy(cChat, pBuffer+4, (nLen-4)>MAX_CHAT_MSG?MAX_CHAT_MSG:(nLen-4));
  1778. strOutput.Format("[R] GM公告: %s", cChat);
  1779. utlLogout(strOutput, eLogCommon, false);
  1780. return(0);
  1781. }
  1782. //-------------------------------------------------------------------------------------------------------------------------------
  1783. // Look at
  1784. int parse009C(char *pBuffer, int nLen)
  1785. {
  1786. CString strOutput;
  1787. DWORD dwId;
  1788. BYTE byBody, byHead;
  1789. int nIndex;
  1790. utlChangeState(4, 5);
  1791. dwId = *((DWORD*)(pBuffer+2));
  1792. byBody = *(pBuffer+8);
  1793. byHead = *(pBuffer+6);
  1794. if(dwId == dwAccountId)
  1795. {
  1796. you.byLookBody = byBody;
  1797. you.byLookHead = byHead;
  1798. strOutput.Format("[R] 你 的方向: 头:%d 身体:%d", byHead, byBody);
  1799. utlLogout(strOutput, eLogCommon, false);
  1800. }
  1801. else
  1802. {
  1803. nIndex = players.FindId(dwId);
  1804. if(-1 != nIndex)
  1805. {
  1806. players[nIndex].byLookBody = byBody;
  1807. players[nIndex].byLookHead = byHead;
  1808. strOutput.Format("[R] %s 的方向: 头:%d 身体:%d ", utlFindTarget(dwId), byHead, byBody);
  1809. utlLogout(strOutput, eLogInfo, false);
  1810. }
  1811. else
  1812. {
  1813. nIndex = monsters.FindId(dwId);
  1814. if(-1 != nIndex)
  1815. {
  1816. monsters[nIndex].byLookBody = byBody;
  1817. monsters[nIndex].byLookHead = byHead;
  1818. strOutput.Format("[R] %s 的方向: 头:%d 身体:%d", utlFindTarget(dwId), byHead, byBody);
  1819. utlLogout(strOutput, eLogInfo, false);
  1820. }
  1821. else
  1822. {
  1823. // Unknown
  1824. }
  1825. }
  1826. }
  1827. return(0);
  1828. }
  1829. //-------------------------------------------------------------------------------------------------------------------------------
  1830. // Item exists
  1831. int parse009D(char *pBuffer, int nLen)
  1832. {
  1833. DWORD dwId;
  1834. POINT pnt;
  1835. WORD wType;
  1836. WORD wAmount;
  1837. CString strOutput, strTemp;
  1838. int nIndex;
  1839. ITEM item;
  1840. LOG_LEVEL eLogLevel = eLogInfo;
  1841. utlChangeState(4, 5);
  1842. dwId = *((DWORD*)(pBuffer+2));
  1843. wType = *((WORD*)(pBuffer+6));
  1844. pnt.x = *((WORD*)(pBuffer+9));
  1845. pnt.y = *((WORD*)(pBuffer+11));
  1846. wAmount = *((WORD*)(pBuffer+13));
  1847. nIndex = items.FindId(dwId);
  1848. if(-1 == nIndex)
  1849. {
  1850. item.dwId = dwId;
  1851. item.dwAppearTime = GetTickCount();
  1852. item.wAmount = wAmount;
  1853. item.wType = wType;
  1854. item.ePriority = (ITEMPRIORITY)atoi(mapItem.FindValue(wType, eItemPriority));
  1855. nIndex = items.Add(item);
  1856. }
  1857. else
  1858. {
  1859. item = items.GetAt(nIndex);
  1860. }
  1861. item.pntPos = pnt;
  1862. items.SetAt(nIndex, item);
  1863. strOutput.Format("[R] 在 (%d,%d) 发现 %s X %d", pnt.x, pnt.y, utlFindTargetItem(dwId), wAmount);
  1864. if(item.ePriority == eIpGrab)
  1865. {
  1866. eLogLevel = eLogError;
  1867. utlLogout4(strOutput);
  1868. }
  1869. else
  1870. {
  1871. items.RemoveAt(nIndex);
  1872. }
  1873. utlLogout(strOutput, eLogLevel, false);
  1874. if(utlDistanceFrom(item.pntPos, you.pntTo) <= option.nPickupDistance && item.ePriority <= eIpPickup)
  1875. {
  1876. sendTake(item.dwId);
  1877. }
  1878. return(0);
  1879. }
  1880. //-------------------------------------------------------------------------------------------------------------------------------
  1881. // Item appeared
  1882. int parse009E(char *pBuffer, int nLen)
  1883. {
  1884. DWORD dwId;
  1885. POINT pnt;
  1886. WORD wType;
  1887. WORD wAmount;
  1888. CString strOutput, strTemp;
  1889. int nIndex;
  1890. ITEM item;
  1891. LOG_LEVEL eLogLevel = eLogInfo;
  1892. utlChangeState(4, 5);
  1893. dwId = *((DWORD*)(pBuffer+2));
  1894. wType = *((WORD*)(pBuffer+6));
  1895. pnt.x = *((WORD*)(pBuffer+9));
  1896. pnt.y = *((WORD*)(pBuffer+11));
  1897. wAmount = *((WORD*)(pBuffer+15));
  1898. nIndex = items.FindId(dwId);
  1899. if(-1 == nIndex)
  1900. {
  1901. item.dwId = dwId;
  1902. item.dwAppearTime = GetTickCount();
  1903. item.wAmount = wAmount;
  1904. item.wType = wType;
  1905. item.ePriority = (ITEMPRIORITY)atoi(mapItem.FindValue(wType, eItemPriority));
  1906. nIndex = items.Add(item);
  1907. }
  1908. else
  1909. {
  1910. item = items.GetAt(nIndex);
  1911. }
  1912. item.pntPos = pnt;
  1913. items.SetAt(nIndex, item);
  1914. strOutput.Format("[R] 在 (%d,%d) 发现 %s X %d ", pnt.x, pnt.y, utlFindTargetItem(dwId), wAmount);
  1915. if(item.ePriority <= eIpGrab)
  1916. {
  1917. eLogLevel = eLogError;
  1918. utlLogout4(strOutput);
  1919. }
  1920. else
  1921. {
  1922. items.RemoveAt(nIndex);
  1923. }
  1924. utlLogout(strOutput, eLogLevel, false);
  1925. if(utlDistanceFrom(item.pntPos, you.pntTo) <= option.nPickupDistance && item.ePriority <= eIpPickup)
  1926. {
  1927. sendTake(item.dwId);
  1928. }
  1929. return(0);
  1930. }
  1931. //-------------------------------------------------------------------------------------------------------------------------------
  1932. // Item added to inventory
  1933. int parse00A0(char *pBuffer, int nLen)
  1934. {
  1935. INVENTORY inv;
  1936. CString strTemp;
  1937. BYTE byFail;
  1938. int nIndex;
  1939. WORD wAmount;
  1940. utlChangeState(4, 5);
  1941. utlParseInventory(pBuffer+2, &inv, 0x00A0);
  1942. byFail = *(pBuffer+22);
  1943. wAmount = inv.wAmount;
  1944. switch(byFail)
  1945. {
  1946. case 0:
  1947. nIndex = inventory.FindIndex(inv.dwIndex);
  1948. if(-1 != nIndex)
  1949. {
  1950. inv.wAmount += inventory[nIndex].wAmount;
  1951. inventory.SetAt(nIndex, inv);
  1952. }
  1953. else
  1954. {
  1955. inventory.Add(inv);
  1956. }
  1957. strTemp.Format("[R] 你 取得 %s %d个", utlGetInventoryName(&inv), wAmount);
  1958. utlLogout(strTemp, eLogCommon, false);
  1959. break;
  1960. case 6:
  1961. strTemp.Format("[R] 你 无法取得 %s", utlGetInventoryName(&inv));
  1962. utlLogout(strTemp, eLogError, false);
  1963. if(-1 != items.FindId(inv.dwId))
  1964. {
  1965. // if(items[items.FindId(inv.dwId)].ePriority == eIpGrab)
  1966. items[items.FindId(inv.dwId)].nPickupFailed++;
  1967. }
  1968. break;
  1969. }
  1970. return(0);
  1971. }
  1972. //-------------------------------------------------------------------------------------------------------------------------------
  1973. // Item disappeared
  1974. int parse00A1(char *pBuffer, int nLen)
  1975. {
  1976. CString strOutput;
  1977. int nIndex;
  1978. DWORD dwId;
  1979. LOG_LEVEL eLogLevel = eLogInfo;
  1980. utlChangeState(4, 5);
  1981. dwId = *((DWORD*)(pBuffer+2));
  1982. nIndex = items.FindId(dwId);
  1983. if(-1 != nIndex)
  1984. {
  1985. strOutput.Format("[R] %s 消失了", utlFindTargetItem(dwId));
  1986. if(items[nIndex].ePriority <= eIpGather)
  1987. eLogLevel = eLogError;
  1988. utlLogout(strOutput, eLogLevel, false);
  1989. items.RemoveAt(nIndex);
  1990. }
  1991. return(0);
  1992. }
  1993. //-------------------------------------------------------------------------------------------------------------------------------
  1994. // Inventory(Items) received
  1995. int parse00A3(char *pBuffer, int nLen)
  1996. {
  1997. INVENTORY item;
  1998. int i;
  1999. CString strTemp;
  2000. int nIndex;
  2001. utlChangeState(4, 5);
  2002. utlLogout("[R] 物品列表: ------->", eLogCommon, false);
  2003. for(i=0; i<nLen-4; i+=10)
  2004. {
  2005. memset(&item, 0, sizeof(INVENTORY));
  2006. item.dwIndex = *((WORD*)(pBuffer+4+i+0));
  2007. item.dwId = *((WORD*)(pBuffer+4+i+2));
  2008. item.wType = *(pBuffer+4+i+4);
  2009. item.wAmount = *((WORD*)(pBuffer+4+i+6));
  2010. nIndex = inventory.FindId(item.dwIndex);
  2011. if(-1 != nIndex)
  2012. inventory.SetAt(nIndex, item);
  2013. else
  2014. inventory.Add(item);
  2015. strTemp.Format(_T("    [%2d] %-20s X %d"),
  2016. item.dwIndex, mapItem.FindValue(item.dwId, eItemName),
  2017. item.wAmount);
  2018. utlLogout(strTemp, eLogCommon, false);
  2019. }
  2020. return(0);
  2021. }
  2022. //-------------------------------------------------------------------------------------------------------------------------------
  2023. // Inventory(Equips) received
  2024. int parse00A4(char *pBuffer, int nLen)
  2025. {
  2026. int i;
  2027. int nIndex;
  2028. CString strTemp;
  2029. utlChangeState(4, 5);
  2030. utlLogout("[R] 装备列表: ------->", eLogCommon, false);
  2031. for(i=0; i<nLen-4; i+=20)
  2032. {
  2033. INVENTORY inv;
  2034. utlParseInventory(pBuffer+4+i, &inv, 0x00A4);
  2035. nIndex = inventory.FindIndex(inv.dwIndex);
  2036. if(-1 != nIndex)
  2037. inventory.SetAt(nIndex, inv);
  2038. else
  2039. inventory.Add(inv);
  2040. strTemp.Format(_T("    [%2d] %-20s | 鉴定: %s | 装备: %s"),
  2041. inv.dwIndex, utlGetInventoryName(&inv),
  2042. (inv.bIdentified?_T("是"):_T("否")),
  2043. (inv.wEquipped?mapEquipType.FindValue(inv.wEquipType):_T("否")));
  2044. utlLogout(strTemp, eLogCommon, false);
  2045. }
  2046. if(bAutoSearch && dwAutoSearchTick == 0)
  2047. {
  2048. dwAutoSearchTick = GetTickCount() + option.nAutoSearchDelay;
  2049. }
  2050. return(0);
  2051. }
  2052. //-------------------------------------------------------------------------------------------------------------------------------
  2053. // You used item
  2054. int parse00A8(char *pBuffer, int nLen)
  2055. {
  2056. CString strOutput;
  2057. WORD wIndex;
  2058. BYTE byAmount;
  2059. int i;
  2060. utlChangeState(4, 5);
  2061. wIndex = *((WORD*)(pBuffer+2));
  2062. byAmount = *(pBuffer+6);
  2063. i = inventory.FindIndex(wIndex);
  2064. if(i != -1)
  2065. {
  2066. inventory[i].wAmount -= byAmount;
  2067. if(inventory[i].wAmount <= 0)
  2068. inventory.RemoveAt(i);
  2069. strOutput.Format("[R] 你使用了 %s X %d", utlGetInventoryName(&inventory[i]), byAmount);
  2070. utlLogout(strOutput, eLogCommon, false);
  2071. }
  2072. return(0);
  2073. }
  2074. //-------------------------------------------------------------------------------------------------------------------------------
  2075. // Remove item
  2076. int parse01A3(char *pBuffer, int nLen)
  2077. {
  2078. CString strOutput;
  2079. // WORD wIndex;
  2080. // BYTE byAmount;
  2081. // int i;
  2082. // utlChangeState(4, 5);
  2083. strOutput.Format("[R] 01A3");
  2084. utlLogout(strOutput, eLogError, false);
  2085. /*
  2086. wIndex = *((WORD*)(pBuffer+4));
  2087. byAmount = *(pBuffer+3);
  2088. i = inventory.FindIndex(wIndex);
  2089. if(i != -1)
  2090. {
  2091. strOutput.Format("<<< You used %s X %d", 
  2092. mapItem.FindValue(inventory[i].dwId, eItemName),
  2093. byAmount);
  2094. utlLogout(strOutput, eLogError, false);
  2095. inventory[i].wAmount -= byAmount;
  2096. if(inventory[i].wAmount <= 0)
  2097. inventory.RemoveAt(i);
  2098. }
  2099. */
  2100. return(0);
  2101. }
  2102. //-------------------------------------------------------------------------------------------------------------------------------
  2103. // You equip
  2104. int parse00AA(char *pBuffer, int nLen)
  2105. {
  2106. CString strOutput;
  2107. WORD wIndex, wType;
  2108. BYTE byFailed;
  2109. int i;
  2110. utlChangeState(4, 5);
  2111. wIndex = *((WORD*)(pBuffer+2));
  2112. wType = *((WORD*)(pBuffer+4));
  2113. byFailed = *(pBuffer+6);
  2114. i = inventory.FindIndex(wIndex);
  2115. if(i != -1)
  2116. {
  2117. if(0 != byFailed)
  2118. {
  2119. inventory[i].wEquipped = wType;
  2120. strOutput.Format("[R] 你 装备了 %s", utlGetInventoryName(&inventory[i]));
  2121. utlLogout(strOutput, eLogCommon, false);
  2122. }
  2123. else
  2124. {
  2125. strOutput.Format("[R] 你无法装备 %s", utlGetInventoryName(&inventory[i]));
  2126. utlLogout(strOutput, eLogError, false);
  2127. }
  2128. }
  2129. return(0);
  2130. }
  2131. //-------------------------------------------------------------------------------------------------------------------------------
  2132. // You unequip
  2133. int parse00AC(char *pBuffer, int nLen)
  2134. {
  2135. CString strOutput;
  2136. WORD wIndex, wType;
  2137. BYTE byFailed;
  2138. int i;
  2139. utlChangeState(4, 5);
  2140. wIndex = *((WORD*)(pBuffer+2));
  2141. wType = *((WORD*)(pBuffer+4));
  2142. byFailed = *(pBuffer+6);
  2143. i = inventory.FindIndex(wIndex);
  2144. if(i != -1)
  2145. {
  2146. if(0 == byFailed)
  2147. {
  2148. strOutput.Format("[R] 你 无法卸除 %s", utlGetInventoryName(&inventory[i]));
  2149. utlLogout(strOutput, eLogError, false);
  2150. }
  2151. else
  2152. {
  2153. inventory[i].wEquipped = 0;
  2154. strOutput.Format("[R] 你卸除 %s", utlGetInventoryName(&inventory[i]));
  2155. utlLogout(strOutput, eLogCommon, false);
  2156. }
  2157. }
  2158. return(0);
  2159. }
  2160. //-------------------------------------------------------------------------------------------------------------------------------
  2161. // Inventory(Items) removed
  2162. int parse00AF(char *pBuffer, int nLen)
  2163. {
  2164. CString strOutput;
  2165. WORD wIndex, wAmount;
  2166. int i;
  2167. utlChangeState(4, 5);
  2168. wIndex = *((WORD*)(pBuffer+2));
  2169. wAmount = *((WORD*)(pBuffer+4));
  2170. i = inventory.FindIndex(wIndex);
  2171. if(i != -1)
  2172. {
  2173. strOutput.Format("[R] 移除 %s X %d", utlGetInventoryName(&inventory[i]), wAmount);
  2174. utlLogout(strOutput, eLogCommon, false);
  2175. inventory[i].wAmount -= wAmount;
  2176. if(inventory[i].wAmount <= 0)
  2177. inventory.RemoveAt(i);
  2178. }
  2179. return(0);
  2180. }
  2181. //-------------------------------------------------------------------------------------------------------------------------------
  2182. // Status received
  2183. int parse00B0(char *pBuffer, int nLen)
  2184. {
  2185. WORD wType, wVal;
  2186. wType = *((WORD*)(pBuffer+2));
  2187. wVal = *((WORD*)(pBuffer+4));
  2188. CString strType, strOutput;
  2189. // utlChangeState(4, 5);
  2190. switch(wType)
  2191. {
  2192. case 5:
  2193. strType = "HP";
  2194. you.wHp = wVal;
  2195. utlCheckForAutoHeal();
  2196. break;
  2197. case 6:
  2198. strType = "HP Max";
  2199. you.wHpMax = wVal;
  2200. break;
  2201. case 7:
  2202. strType = "SP";
  2203. you.wSp = wVal;
  2204. utlCheckForAutoHeal();
  2205. break;
  2206. case 8:
  2207. strType = "SP Max";
  2208. you.wSpMax = wVal;
  2209. break;
  2210. case 9:
  2211. strType = "Status points";
  2212. break;
  2213. case 11:
  2214. strType = "Level";
  2215. you.wLevel = wVal;
  2216. break;
  2217. case 12:
  2218. strType = "Skill points";
  2219. break;
  2220. case 24:
  2221. strType = "Weight";
  2222. you.dwWeight = wVal;
  2223. break;
  2224. case 25:
  2225. strType = "Weight Max";
  2226. you.dwWeightMax = wVal;
  2227. break;
  2228. case 41:
  2229. strType = "Attack";
  2230. break;
  2231. case 42:
  2232. strType = "Attack bonus";
  2233. break;
  2234. case 43:
  2235. strType = "Magic attack min";
  2236. break;
  2237. case 44:
  2238. strType = "Magic attack max";
  2239. break;
  2240. case 45:
  2241. strType = "Defense";
  2242. break;
  2243. case 46:
  2244. strType = "Defense bonus";
  2245. break;
  2246. case 47:
  2247. strType = "Magic defense";
  2248. break;
  2249. case 48:
  2250. strType = "Magic defense bonus";
  2251. break;
  2252. case 49:
  2253. strType = "Hit";
  2254. break;
  2255. case 50:
  2256. strType = "Flee";
  2257. break;
  2258. case 51:
  2259. strType = "Flee bonus";
  2260. break;
  2261. case 52:
  2262. strType = "Critical";
  2263. break;
  2264. case 53:
  2265. strType = "Attack speed";
  2266. break;
  2267. case 54:
  2268. strType = "Job level";
  2269. you.wJobLevel = wVal;
  2270. break;
  2271. default:
  2272. strType.Format("未知(%d)", wType);
  2273. break;
  2274. }
  2275. strOutput.Format("[R] 人物属性 %s: %d", strType, wVal);
  2276. utlLogout(strOutput, eLogInfo, false);
  2277. return(0);
  2278. }
  2279. //-------------------------------------------------------------------------------------------------------------------------------
  2280. // Exp/zenny received
  2281. int parse00B1(char *pBuffer, int nLen)
  2282. {
  2283. WORD wType;
  2284. DWORD dwVal;
  2285. wType = *((WORD*)(pBuffer+2));
  2286. dwVal = *((DWORD*)(pBuffer+4));
  2287. CString strType, strOutput;
  2288. // utlChangeState(4, 5);
  2289. switch(wType)
  2290. {
  2291. case 1:
  2292. strType = "Exp";
  2293. you.dwExp = dwVal;
  2294. break;
  2295. case 2:
  2296. strType = "ExpJob";
  2297. you.dwJobExp = dwVal;
  2298. break;
  2299. case 20:
  2300. strType = "Zenny";
  2301. you.dwZenny = dwVal;
  2302. break;
  2303. case 22:
  2304. strType = "ExpMax";
  2305. you.dwExpMax = dwVal;
  2306. break;
  2307. case 23:
  2308. strType = "ExpJobMax";
  2309. you.dwJobExpMax = dwVal;
  2310. break;
  2311. default:
  2312. strType.Format("Something(%d)", wType);
  2313. break;
  2314. }
  2315. strOutput.Format("[R] 人物信息 %s: %d", strType, dwVal);
  2316. utlLogout(strOutput, eLogInfo, false);
  2317. return(0);
  2318. }
  2319. //-------------------------------------------------------------------------------------------------------------------------------
  2320. // MVP info
  2321. int parse010C(char *pBuffer, int nLen)
  2322. {
  2323. DWORD dwId;
  2324. CString strOutput;
  2325. dwId = *((DWORD*)(pBuffer+2));
  2326. strOutput.Format(_T("%s 成为MVP啦~~~"), utlFindTarget(dwId));
  2327. utlLogout4(strOutput);
  2328. strOutput.Format(_T("[R] %s 成为MVP啦~~~"), utlFindTarget(dwId));
  2329. utlLogout(strOutput, eLogError, false);
  2330. return(0);
  2331. }
  2332. //-------------------------------------------------------------------------------------------------------------------------------
  2333. // Skill used
  2334. int parse010E(char *pBuffer, int nLen)
  2335. {
  2336. WORD wId, wLevel;
  2337. CString strOutput;
  2338. wId = *((WORD*)(pBuffer+2));
  2339. wLevel = *((WORD*)(pBuffer+4));
  2340. strOutput.Format("[R] 你 使用了 %d 级 %d", wLevel, mapSkill.FindValue(wId, eSkillAlias));
  2341. utlLogout(strOutput, eLogCommon, false);
  2342. return(0);
  2343. }
  2344. //-------------------------------------------------------------------------------------------------------------------------------
  2345. // Skills received
  2346. int parse010F(char *pBuffer, int nLen)
  2347. {
  2348. CString strOutput;
  2349. int i, j;
  2350. WORD wId, wLevel;
  2351. char cName[MAX_NAME_LENGTH+1];
  2352. SKILL skill;
  2353. CString strSkillName;
  2354. // utlChangeState(4, 5);
  2355. skills.RemoveAll();
  2356. utlLogout("[R] 技能列表: ------->", eLogCommon, false);
  2357. for(i=4; i<nLen; i+=37)
  2358. {
  2359. wId = *((WORD*)(pBuffer+i));
  2360. memset(cName, 0, MAX_NAME_LENGTH+1);
  2361. strncpy(cName, pBuffer+i+12, MAX_NAME_LENGTH);
  2362. strSkillName = cName;
  2363. wLevel = *((WORD*)(pBuffer+i+6));
  2364. memset(&skill, 0, sizeof(SKILL));
  2365. skill.dwIndex = (i-4)/37;
  2366. for(j=0; j<mapSkill.GetCount(); j++)
  2367. {
  2368. if(0 == strSkillName.CompareNoCase(mapSkill.FindValue(j, eSkillName)))
  2369. {
  2370. skill.dwId = j;
  2371. break;
  2372. }
  2373. }
  2374. if(0 == skill.dwId)
  2375. {
  2376. skill.dwId = wId;
  2377. }
  2378. skill.wLevel = wLevel;
  2379. skills.Add(skill);
  2380. strOutput.Format(_T("     [%2d] %-16s %2d级"), skill.dwIndex,
  2381. mapSkill.FindValue(skill.dwId, eSkillAlias), wLevel);
  2382. utlLogout(strOutput, eLogCommon, false);
  2383. }
  2384. return(0);
  2385. }
  2386. //-------------------------------------------------------------------------------------------------------------------------------
  2387. // Attack1
  2388. int parse008A(char *pBuffer, int nLen)
  2389. {
  2390. CString strOutput, strTemp;
  2391. DWORD dwSource, dwTarget;
  2392. WORD wStanding, wDamage;
  2393. DAMAGE damage;
  2394. LOG_LEVEL logLevel = eLogInfo;
  2395. utlChangeState(4, 5);
  2396. dwSource = *((DWORD*)(pBuffer+2));
  2397. dwTarget = *((DWORD*)(pBuffer+6));
  2398. wStanding = *((WORD*)(pBuffer+26)) - 2;
  2399. wDamage = *((WORD*)(pBuffer+22));
  2400. damage.init();
  2401. if(0 == dwTarget)
  2402. {
  2403. // Sit/stand
  2404. if(dwSource == dwAccountId)
  2405. {
  2406. you.bSit = !wStanding;
  2407. if(you.bSit)
  2408. strOutput = "[R] 你 已坐下";
  2409. else
  2410. strOutput = "[R] 你 已站立";
  2411. logLevel = eLogCommon;
  2412. }
  2413. if(-1 != players.FindId(dwSource))
  2414. {
  2415. players[players.FindId(dwSource)].bSit = !wStanding;
  2416. if(!wStanding)
  2417. strOutput.Format("[R] %s 已坐下", utlFindTarget(dwSource));
  2418. else
  2419. strOutput.Format("[R] %s 已站立", utlFindTarget(dwSource));
  2420. logLevel = eLogInfo;
  2421. }
  2422. }
  2423. else
  2424. {
  2425. if(-1 != items.FindId(dwTarget))
  2426. {
  2427. // Pick item
  2428. strOutput.Format("[R] %s 捡取了 %s", utlFindTarget(dwSource), utlFindTargetItem(dwTarget));
  2429. logLevel = eLogError;
  2430. utlLogout4(strOutput);
  2431. }
  2432. else
  2433. {
  2434. if(dwTarget == dwAccountId)
  2435. {
  2436. you.wHp -= wDamage;
  2437. you.bSit = false;
  2438. utlCheckForAutoHeal();
  2439. }
  2440. utlUpdateDamage(dwSource, dwTarget, wDamage, 0);
  2441. strOutput.Format("[R] %s 攻击 %s 伤害:%s", utlFindTarget(dwSource), utlFindTarget(dwTarget), utlCalculateHits(wDamage));
  2442. if(dwTarget == dwAccountId || dwSource == dwAccountId)
  2443. logLevel = eLogCommon;
  2444. }
  2445. }
  2446. utlLogout(strOutput, logLevel, false);
  2447. return(0);
  2448. }
  2449. //-------------------------------------------------------------------------------------------------------------------------------
  2450. // Skill cast
  2451. int parse013E(char *pBuffer, int nLen)
  2452. {
  2453. DWORD dwSource, dwTarget;
  2454. WORD x, y;
  2455. WORD wSkillId;
  2456. LOG_LEVEL logLevel = eLogInfo;
  2457. CString strOutput, strSkill;
  2458. WORD wCastTime;
  2459. utlChangeState(4, 5);
  2460. dwSource = *((DWORD*)(pBuffer+2));
  2461. dwTarget = *((DWORD*)(pBuffer+6));
  2462. x = *((WORD*)(pBuffer+10));
  2463. y = *((WORD*)(pBuffer+12));
  2464. wSkillId = *((WORD*)(pBuffer+14));
  2465. wCastTime = *((WORD*)(pBuffer+20));
  2466. BOOL bTarget = false;
  2467. strSkill =  mapSkill.FindValue(wSkillId, eSkillAlias);
  2468. for(int i=0; i<monsters.GetSize() && !bTarget; i++)
  2469. {
  2470. if((dwTarget == monsters[i].dwId) || (monsters[i].pntTo.x == x && monsters[i].pntTo.y == y) || (monsters[i].pntPos.x == x && monsters[i].pntPos.y == y))
  2471. {
  2472. monsters[i].nProtecting = wSkillId;
  2473. strOutput.Format(_T("[R] %s 开始对 %s 使用 %s 需要时间: %d ms"), utlFindTarget(dwSource), monsters[i].cName, strSkill, wCastTime);
  2474. bTarget = true;
  2475. }
  2476. }
  2477. for(i=0; i<players.GetSize() && !bTarget; i++)
  2478. {
  2479. if((dwTarget == players[i].dwId) || (players[i].pntTo.x == x && players[i].pntTo.y == y) || (players[i].pntPos.x == x && players[i].pntPos.y == y))
  2480. {
  2481. players[i].nProtecting = wSkillId;
  2482. strOutput.Format(_T("[R] %s 开始对 %s 使用 %s 需要时间: %d ms"), utlFindTarget(dwSource), players[i].cName, strSkill, wCastTime);
  2483. bTarget = true;
  2484. }
  2485. }
  2486. if(dwTarget == dwAccountId && !bTarget)
  2487. {
  2488. you.nProtecting = wSkillId;
  2489. strOutput.Format(_T("[R] %s 开始对 你 使用 %s 需要时间: %d ms"), utlFindTarget(dwSource), strSkill, wCastTime);
  2490. bTarget = true;
  2491. }
  2492. if(!bTarget)
  2493. {
  2494. strOutput.Format(_T("[R] %s 开始对 (%d,%d) 使用 %s 需要时间: %d ms"), utlFindTarget(dwSource), x, y, strSkill, wCastTime);
  2495. bTarget = true;
  2496. }
  2497. if(strSkill.CompareNoCase(_T("光之障壁")) == 0 || strSkill.CompareNoCase(_T("暗之障壁")) == 0)
  2498. utlLogout4(strOutput);
  2499. utlLogout(strOutput, eLogInfo, false);
  2500. if(dwSource == dwAccountId && bAutoSa)
  2501. {
  2502. int nIndex = utlFindSkillByAlias(_T("取消施法"));
  2503. if(nIndex != -1 && you.wSp >= 2)
  2504. {
  2505. sendUseSkill(skills[nIndex].wLevel, (unsigned short)skills[nIndex].dwId, dwAccountId);
  2506. }
  2507. }
  2508. return(0);
  2509. }
  2510. //-------------------------------------------------------------------------------------------------------------------------------
  2511. // Skill cast on loc
  2512. int parse0117(char *pBuffer, int nLen)
  2513. {
  2514. DWORD dwSource;
  2515. WORD x, y;
  2516. WORD wLevel, wSkillId;
  2517. LOG_LEVEL logLevel = eLogInfo;
  2518. CString strOutput, strSkill;
  2519. utlChangeState(4, 5);
  2520. wSkillId = *((WORD*)(pBuffer+2));
  2521. dwSource = *((DWORD*)(pBuffer+4));
  2522. wLevel = *((WORD*)(pBuffer+8));
  2523. x = *((WORD*)(pBuffer+10));
  2524. y = *((WORD*)(pBuffer+12));
  2525. BOOL bTarget = false;
  2526. strSkill =  mapSkill.FindValue(wSkillId, eSkillAlias);
  2527. for(int i=0; i<monsters.GetSize() && !bTarget; i++)
  2528. {
  2529. if((monsters[i].pntTo.x == x && monsters[i].pntTo.y == y) || (monsters[i].pntPos.x == x && monsters[i].pntPos.y == y))
  2530. {
  2531. monsters[i].nProtecting = 0;
  2532. strOutput.Format(_T("[R] %s 对 %s 使用了 %d级%s"), utlFindTarget(dwSource), monsters[i].cName, wLevel, strSkill);
  2533. bTarget = true;
  2534. }
  2535. }
  2536. for(i=0; i<players.GetSize() && !bTarget; i++)
  2537. {
  2538. if((players[i].pntTo.x == x && players[i].pntTo.y == y) || (players[i].pntPos.x == x && players[i].pntPos.y == y))
  2539. {
  2540. players[i].nProtecting = 0;
  2541. strOutput.Format(_T("[R] %s 对 %s 使用了 %d级%s"), utlFindTarget(dwSource), players[i].cName, wLevel,strSkill);
  2542. bTarget = true;
  2543. }
  2544. }
  2545. if(!bTarget)
  2546. {
  2547. strOutput.Format(_T("[R] %s 对 (%d,%d) 使用了 %d级%s"), utlFindTarget(dwSource), x, y, wLevel, strSkill );
  2548. bTarget = true;
  2549. }
  2550. if(strSkill.CompareNoCase(_T("光之障壁")) == 0 || strSkill.CompareNoCase(_T("暗之障壁")) == 0)
  2551. utlLogout4(strOutput);
  2552. utlLogout(strOutput, eLogInfo, false);
  2553. return(0);
  2554. }
  2555. //-------------------------------------------------------------------------------------------------------------------------------
  2556. // Skill cast on someone
  2557. int parse011A(char *pBuffer, int nLen)
  2558. {
  2559. DWORD dwSource, dwTarget;
  2560. WORD wAmount, wSkillId;
  2561. LOG_LEVEL logLevel = eLogInfo;
  2562. CString strOutput, strSkill;
  2563. utlChangeState(4, 5);
  2564. wSkillId = *((WORD*)(pBuffer+2));
  2565. dwSource = *((DWORD*)(pBuffer+10));
  2566. dwTarget = *((DWORD*)(pBuffer+6));
  2567. wAmount = *((WORD*)(pBuffer+4));
  2568. strSkill = mapSkill.FindValue(wSkillId, eSkillAlias);
  2569. strOutput.Format(_T("[R] %s 对 %s 使用了 %d级%s"),
  2570. utlFindTarget(dwSource), utlFindTarget(dwTarget), wAmount, strSkill);
  2571. if(strSkill == "撒水祈福" && dwTarget == dwAccountId)
  2572. {
  2573. injectAdminMessage(strOutput);
  2574. if(mode == eModeMvp && settingmvp.bAntiBless)
  2575. {
  2576. CString strWeapon;
  2577. int nIndex = -1;
  2578. int nWeaponIndex = -1;
  2579. for(int i=0; i<inventory.GetSize(); i++)
  2580. {
  2581. if(inventory[i].wEquipped)
  2582. {
  2583. strWeapon = mapEquipType.FindValue(inventory[i].wEquipType);
  2584. {
  2585. if(strWeapon.CompareNoCase(_T("双手武器")) == 0 || strWeapon.CompareNoCase(_T("单手武器")) == 0)
  2586. {
  2587. nIndex = i;
  2588. nWeaponIndex = inventory[i].dwIndex;
  2589. break;
  2590. }
  2591. }
  2592. }
  2593. }
  2594. if(nIndex != -1)
  2595. {
  2596. WORD wType = inventory[i].wEquipType;
  2597. sendUnequip(nWeaponIndex);
  2598. sendEquip(nWeaponIndex, wType);
  2599. }
  2600. }
  2601. }
  2602. if(strSkill == "复活术")
  2603. {
  2604. if(dwTarget == dwAccountId && you.bDied)
  2605. {
  2606. CString strTemp = _T("你已复活,启动所有AI");
  2607. injectAdminMessage(strTemp);
  2608. you.bDied = false;
  2609. bAiEnabled = true;
  2610. }
  2611. }
  2612. if(dwTarget == dwAccountId || dwSource == dwAccountId)
  2613. utlLogout(strOutput, eLogCommon, false);
  2614. else
  2615. utlLogout(strOutput, eLogInfo, false);
  2616. return(0);
  2617. }
  2618. //-------------------------------------------------------------------------------------------------------------------------------
  2619. // Info received
  2620. int parse0195(char *pBuffer, int nLen)
  2621. {
  2622. CString strOutput;
  2623. DWORD dwId;
  2624. CString strName;
  2625. CString strGuild;
  2626. char cName[MAX_NAME_LENGTH+1];
  2627. int nIndex;
  2628. dwId = *((DWORD*)(pBuffer+2));
  2629. memset(cName, 0, MAX_NAME_LENGTH+1);
  2630. strncpy(cName, pBuffer+6, MAX_NAME_LENGTH);
  2631. strName = cName;
  2632. strName.TrimRight();
  2633. strncpy(cName, pBuffer+54, MAX_NAME_LENGTH);
  2634. strGuild = cName;
  2635. strGuild.TrimRight();
  2636. if(dwId != dwAccountId)
  2637. {
  2638. nIndex = players.FindId(dwId);
  2639. if(-1 != nIndex)
  2640. {
  2641. strcpy(players[nIndex].cName, strName);
  2642. strcpy(players[nIndex].cGuild, strGuild);
  2643. strOutput.Format("[R] 收到 %08X 信息: %s", dwId, strName);
  2644. utlLogout(strOutput, eLogInfo, false);
  2645. if(utlCheckForGmByName(players[nIndex]))
  2646. {
  2647. utlGMAppeared(players[nIndex]);
  2648. }
  2649. if(utlCheckForWanzi(strGuild) && !utlPlayerInParty(dwId) && !utlCheckForWanzi(you.cGuild))
  2650. {
  2651. if(mode != eModeNormal)
  2652. {
  2653. utlChangeMode(eModeNormal, 0);
  2654. }
  2655. // sendEmotion(0);
  2656. // bAiEnabled = false;
  2657. // injectAdminMessage("强行关闭所有AI");
  2658. }
  2659. }
  2660. }
  2661. return(0);
  2662. }
  2663. //-------------------------------------------------------------------------------------------------------------------------------
  2664. // STATUS0196
  2665. int parse0196(char *pBuffer, int nLen)
  2666. {
  2667. CString strOutput;
  2668. DWORD dwId = *(DWORD*)(pBuffer+4);
  2669. WORD wType = *(WORD*)(pBuffer+2);
  2670. BYTE byFlag = *(pBuffer+8);
  2671. CString strTemp;
  2672. strOutput.Format(_T("[R] %s 已%s %s 状态"),
  2673. utlFindTarget(dwId),
  2674. byFlag?_T("进入"):_T("解除"),
  2675. mapSkillsst.FindValue(wType));
  2676. utlLogout(strOutput, eLogCommon, false);
  2677. // if(utlPlayerInParty(dwId))
  2678. // injectMessage(strOutput);
  2679. return(0);
  2680. }
  2681. //-------------------------------------------------------------------------------------------------------------------------------
  2682. // Attack2
  2683. int parse01DE(char *pBuffer, int nLen)
  2684. {
  2685. CString strName;
  2686. WORD wSkillId;
  2687. DWORD dwSource, dwTarget;
  2688. WORD wDamage;
  2689. WORD wLevel;
  2690. CString strOutput;
  2691. utlChangeState(4, 5);
  2692. wSkillId = *(WORD*)(pBuffer+2);
  2693. dwSource = *(DWORD*)(pBuffer+4);
  2694. dwTarget = *(DWORD*)(pBuffer+8);
  2695. wDamage = *(WORD*)(pBuffer+24);
  2696. wLevel = *(WORD*)(pBuffer+28);
  2697. if(wDamage != 35536)
  2698. {
  2699. utlUpdateDamage(dwSource, dwTarget, wDamage, wSkillId);
  2700. strOutput.Format("[R] %s 对 %s 使用了 %d 级 %s 伤害: %s",
  2701. utlFindTarget(dwSource),
  2702. utlFindTarget(dwTarget),
  2703. wLevel,
  2704. mapSkill.FindValue(wSkillId, eSkillAlias),
  2705. utlCalculateHits(wDamage));
  2706. }
  2707. else
  2708. {
  2709. strOutput.Format("[R] %s 使用了 %d 级 %s",
  2710. utlFindTarget(dwSource),
  2711. wLevel,
  2712. mapSkill.FindValue(wSkillId, eSkillAlias));
  2713. }
  2714. if(dwSource == dwAccountId || dwTarget == dwAccountId)
  2715. utlLogout(strOutput, eLogCommon, false);
  2716. else
  2717. utlLogout(strOutput, eLogInfo, false);
  2718. return(0);
  2719. }
  2720. //-------------------------------------------------------------------------------------------------------------------------------
  2721. // Attack2
  2722. int parse0114(char *pBuffer, int nLen)
  2723. {
  2724. CString strName;
  2725. WORD wSkillId;
  2726. DWORD dwSource, dwTarget;
  2727. WORD wDamage;
  2728. WORD wLevel;
  2729. CString strOutput;
  2730. utlChangeState(4, 5);
  2731. wSkillId = *(WORD*)(pBuffer+2);
  2732. dwSource = *(DWORD*)(pBuffer+4);
  2733. dwTarget = *(DWORD*)(pBuffer+8);
  2734. wDamage = *(WORD*)(pBuffer+24);
  2735. wLevel = *(WORD*)(pBuffer+28);
  2736. if(wDamage != 35536)
  2737. {
  2738. utlUpdateDamage(dwSource, dwTarget, wDamage, wSkillId);
  2739. strOutput.Format("[R] %s 对 %s 使用了 %d 级 %s 伤害: %s",
  2740. utlFindTarget(dwSource),
  2741. utlFindTarget(dwTarget),
  2742. wLevel,
  2743. mapSkill.FindValue(wSkillId-1, eSkillAlias),
  2744. utlCalculateHits(wDamage));
  2745. }
  2746. else
  2747. {
  2748. strOutput.Format("[R] %s 使用了 %d 级 %s",
  2749. utlFindTarget(dwSource),
  2750. wLevel,
  2751. mapSkill.FindValue(wSkillId-1, eSkillAlias));
  2752. }
  2753. if(dwSource == dwAccountId || dwTarget == dwAccountId)
  2754. utlLogout(strOutput, eLogCommon, false);
  2755. else
  2756. utlLogout(strOutput, eLogInfo, false);
  2757. return(0);
  2758. }
  2759. //-------------------------------------------------------------------------------------------------------------------------------
  2760. // Remote attack
  2761. int parse0139(char *pBuffer, int nLen)
  2762. {
  2763. CString strOutput;
  2764. DWORD dwId;
  2765. POINT pntFrom, pntTo;
  2766. dwId = *(DWORD*)(pBuffer+2);
  2767. pntFrom.x = *(WORD*)(pBuffer+6);
  2768. pntFrom.y = *(WORD*)(pBuffer+8);
  2769. pntTo.x = *(WORD*)(pBuffer+10);
  2770. pntTo.y = *(WORD*)(pBuffer+12);
  2771. if(-1 != monsters.FindId(dwId))
  2772. {
  2773. monsters[monsters.FindId(dwId)].pntTo = pntFrom;
  2774. }
  2775. you.pntPos = pntTo;
  2776. you.pntTo = pntTo;
  2777. strOutput.Format("[R] %s 攻击你 [远程]", utlFindTarget(dwId));
  2778. utlLogout(strOutput, eLogCommon, false);
  2779. return(0);
  2780. }
  2781. //-------------------------------------------------------------------------------------------------------------------------------
  2782. // Deal
  2783. int parse00E5(char *pBuffer, int nLen)
  2784. {
  2785. CString strOutput;
  2786. strOutput.Format("[R] 00E5");
  2787. utlLogout(strOutput, eLogError, false);
  2788. /* if(misc.bAutoDealCancel)
  2789. {
  2790. strOutput.Format("<<< Someone wants to deal with you, cancelled!");
  2791. utlLogout4(strOutput);
  2792. sendDealCancel();
  2793. }
  2794. */
  2795. return(0);
  2796. }
  2797. //-------------------------------------------------------------------------------------------------------------------------------
  2798. int parse0147(char *pBuffer, int nLen)
  2799. {
  2800. CString strOutput;
  2801. CString strClassChange = _T("变换成boss级魔物");
  2802. CString strTamingMonster = _T("认养宠物");
  2803. WORD wSkillId = *(WORD*)(pBuffer+2);
  2804. WORD wSkillLv = *(WORD*)(pBuffer+4);
  2805. strOutput.Format("[R] 准备使用 %d 级 %s", wSkillLv, mapSkill.FindValue(wSkillId, eSkillAlias));
  2806. utlLogout(strOutput, eLogError, false);
  2807. if(bAutoSa)
  2808. {
  2809. if((strClassChange.CompareNoCase(mapSkill.FindValue(wSkillId, eSkillAlias)) == 0) ||
  2810. (strTamingMonster.CompareNoCase(mapSkill.FindValue(wSkillId, eSkillAlias)) == 0))
  2811. {
  2812. sendChatParty(strOutput);
  2813. injectAdminMessage(strOutput);
  2814. ufAutoSaClassChange(0);
  2815. }
  2816. else
  2817. {
  2818. BOOL bWanzi = false;
  2819. if(!utlCheckForWanzi(you.cGuild))
  2820. {
  2821. for(int i=0; i<players.GetSize(); i++)
  2822. {
  2823. if(utlCheckForWanzi(players[i].cGuild) && !utlPlayerInParty(players[i].dwId))
  2824. {
  2825. bWanzi = true;
  2826. break;
  2827. }
  2828. }
  2829. }
  2830. if(!bWanzi)
  2831. dwAutoSaTick = GetTickCount()+200;
  2832. else
  2833. ufAutoSaClassChange(0);
  2834. }
  2835. }
  2836. return(0);
  2837. }
  2838. //-------------------------------------------------------------------------------------------------------------------------------
  2839. int parse011F(char *pBuffer, int nLen)
  2840. {
  2841. DWORD dwId, dwSourceId;
  2842. int x,y;
  2843. WORD wSkill;
  2844. SPELL spell;
  2845. CString strOutput;
  2846. dwId = *((DWORD*)(pBuffer+2));
  2847. dwSourceId = *((DWORD*)(pBuffer+6));
  2848. x = *((WORD*)(pBuffer+10));
  2849. y = *((WORD*)(pBuffer+12));
  2850. wSkill = *(pBuffer+14);
  2851. spell.dwId = dwId;
  2852. spell.dwSourceId = dwSourceId;
  2853. spell.pntPos.x = x;
  2854. spell.pntPos.y = y;
  2855. spell.wSkill = wSkill;
  2856. strOutput.Format(_T("[R] %s 在(%d, %d)施用了 %s"), utlFindTarget(dwSourceId), x, y, mapStatus011f.FindValue(wSkill));
  2857. spells.Add(spell);
  2858. if(dwSourceId == dwAccountId)
  2859. utlLogout(strOutput, eLogCommon, false);
  2860. else
  2861. utlLogout(strOutput, eLogInfo, false);
  2862. return(0);
  2863. }
  2864. //-------------------------------------------------------------------------------------------------------------------------------
  2865. int parse0120(char *pBuffer, int nLen)
  2866. {
  2867. DWORD dwId;
  2868. int i, nIndex = -1;
  2869. CString strOutput;
  2870. dwId = *((DWORD*)(pBuffer+2));
  2871. for(i=0; i<spells.GetSize(); i++)
  2872. {
  2873. if(spells[i].dwId == dwId)
  2874. {
  2875. nIndex = i;
  2876. break;
  2877. }
  2878. }
  2879. if(nIndex != -1)
  2880. {
  2881. spells.RemoveAt(nIndex);
  2882. strOutput.Format(_T("[R] 在(%d, %d)的 %s 消失了"), spells[i].pntPos.x, spells[i].pntPos.y, mapStatus011f.FindValue(spells[i].wSkill));
  2883. if(spells[i].dwSourceId == dwAccountId)
  2884. utlLogout(strOutput, eLogCommon, false);
  2885. else
  2886. utlLogout(strOutput, eLogInfo, false);
  2887. }
  2888. return(0);
  2889. }
  2890. //-------------------------------------------------------------------------------------------------------------------------------
  2891. int parse01C8(char *pBuffer, int nLen)
  2892. {
  2893. CString strOutput;
  2894. WORD wIndex;
  2895. WORD wId;
  2896. WORD wAmount;
  2897. DWORD dwSourceId;
  2898. int i;
  2899. utlChangeState(4, 5);
  2900. wIndex = *((WORD*)(pBuffer+2));
  2901. wId = *((WORD*)(pBuffer+4));
  2902. dwSourceId = *((DWORD*)(pBuffer+6));
  2903. wAmount = *((WORD*)(pBuffer+10));
  2904. if(dwSourceId == dwAccountId)
  2905. {
  2906. i = inventory.FindIndex(wIndex);
  2907. if(i != -1)
  2908. {
  2909. strOutput.Format("[R] 你 使用了 %s X %d", 
  2910. mapItem.FindValue(inventory[i].dwId, eItemName),
  2911. inventory[i].wAmount - wAmount);
  2912. utlLogout(strOutput, eLogCommon, false);
  2913. inventory[i].wAmount = wAmount;
  2914. if(inventory[i].wAmount <= 0)
  2915. inventory.RemoveAt(i);
  2916. }
  2917. }
  2918. return(0);
  2919. }
  2920. //-------------------------------------------------------------------------------------------------------------------------------
  2921. int parse0108(char *pBuffer, int nLen)
  2922. {
  2923. CString strOutput;
  2924. WORD wType, wIndex, wEnchant;
  2925. int i;
  2926. wType = *((WORD*)(pBuffer+2));
  2927. wIndex = *((WORD*)(pBuffer+4));
  2928. wEnchant = *((WORD*)(pBuffer+6));
  2929. i = inventory.FindIndex(wIndex);
  2930. if(-1 != i)
  2931. {
  2932. inventory[i].byElement = (BYTE)wEnchant;
  2933. strOutput.Format(_T("[R] 装备 %s 已经变成 %s属性(0108)"), utlGetInventoryName(&inventory[i]), mapElements.FindValue(inventory[i].byElement));
  2934. utlLogout(strOutput, eLogCommon, false);
  2935. injectMessage(strOutput);
  2936. }
  2937. return(0);
  2938. }
  2939. //-------------------------------------------------------------------------------------------------------------------------------
  2940. int parse0188(char *pBuffer, int nLen)
  2941. {
  2942. CString strOutput;
  2943. WORD wType, wIndex, wEnchant;
  2944. int i;
  2945. wType = *((WORD*)(pBuffer+2));
  2946. wIndex = *((WORD*)(pBuffer+4));
  2947. wEnchant = *((WORD*)(pBuffer+6));
  2948. i = inventory.FindIndex(wIndex);
  2949. if(-1 != i)
  2950. {
  2951. inventory[i].byRefine = (BYTE)wEnchant;
  2952. strOutput.Format(_T("[R] %s 已经精练至 +%d"), utlGetInventoryName(&inventory[i]), wEnchant);
  2953. utlLogout(strOutput, eLogCommon, false);
  2954. injectMessage(strOutput);
  2955. }
  2956. return(0);
  2957. }
  2958. //-------------------------------------------------------------------------------------------------------------------------------
  2959. int parse0119(char *pBuffer, int nLen)
  2960. {
  2961. CString strOutput, strTemp;
  2962. DWORD dwId;
  2963. WORD wStatus1, wStatus2, wStatus3;
  2964. dwId = *((DWORD*)(pBuffer+2));
  2965. wStatus1 = *((WORD*)(pBuffer+6));
  2966. wStatus2 = *((WORD*)(pBuffer+8));
  2967. wStatus3 = *((WORD*)(pBuffer+10));
  2968. if(dwId == dwAccountId)
  2969. {
  2970. you.wStatus0119_01 = wStatus1;
  2971. you.wStatus0119_02 = wStatus2;
  2972. you.wStatus0119_03 = wStatus3;
  2973. }
  2974. else
  2975. {
  2976. int nIndex = players.FindId(dwId);
  2977. if(nIndex != -1)
  2978. {
  2979. players[nIndex].wStatus0119_01 = wStatus1;
  2980. players[nIndex].wStatus0119_02 = wStatus2;
  2981. players[nIndex].wStatus0119_03 = wStatus3;
  2982. }
  2983. }
  2984. if(wStatus1 == 0 && wStatus2 == 0 && wStatus3 == 0)
  2985. {
  2986. strOutput.Format(_T("[R] %s 为正常状态"), utlFindTarget(dwId));
  2987. if(utlPlayerInParty(dwId))
  2988. {
  2989. utlLogout(strOutput, eLogCommon, false);
  2990. // injectMessage(strOutput);
  2991. }
  2992. else
  2993. {
  2994. utlLogout(strOutput, eLogInfo, false);
  2995. }
  2996. }
  2997. else
  2998. {
  2999. if(wStatus1 != 0)
  3000. {
  3001. strTemp.Format(_T("a%d"), wStatus1);
  3002. strOutput.Format(_T("[R] %s 已进入 %s"), utlFindTarget(dwId), mapStatus0119.FindValue(strTemp, -1));
  3003. if(utlPlayerInParty(dwId))
  3004. {
  3005. utlLogout(strOutput, eLogCommon, false);
  3006. // injectMessage(strOutput);
  3007. }
  3008. else
  3009. {
  3010. utlLogout(strOutput, eLogInfo, false);
  3011. }
  3012. }
  3013. if(wStatus2 != 0)
  3014. {
  3015. strTemp.Format(_T("b%d"), wStatus2);
  3016. strOutput.Format(_T("[R] %s 已进入 %s"), utlFindTarget(dwId), mapStatus0119.FindValue(strTemp, -1));
  3017. if(utlPlayerInParty(dwId))
  3018. {
  3019. utlLogout(strOutput, eLogCommon, false);
  3020. // injectMessage(strOutput);
  3021. }
  3022. else
  3023. {
  3024. utlLogout(strOutput, eLogInfo, false);
  3025. }
  3026. }
  3027. if(wStatus3 != 0)
  3028. {
  3029. strTemp.Format(_T("c%d"), wStatus3);
  3030. strOutput.Format(_T("[R] %s %s"), utlFindTarget(dwId), mapStatus0119.FindValue(strTemp, -1));
  3031. if(utlPlayerInParty(dwId))
  3032. {
  3033. utlLogout(strOutput, eLogCommon, false);
  3034. // injectMessage(strOutput);
  3035. }
  3036. else
  3037. {
  3038. utlLogout(strOutput, eLogInfo, false);
  3039. }
  3040. }
  3041. }
  3042. return(0);
  3043. }
  3044. //-------------------------------------------------------------------------------------------------------------------------------
  3045. int parse01D0(char *pBuffer, int nLen)
  3046. {
  3047. CString strOutput;
  3048. DWORD dwId;
  3049. WORD wNumber;
  3050. dwId = *((DWORD*)(pBuffer+2));
  3051. wNumber = *((WORD*)(pBuffer+6));
  3052. strOutput.Format(_T("[R] %s 拥有 %d 个气弹"), utlFindTarget(dwId), wNumber);
  3053. if(utlPlayerInParty(dwId))
  3054. {
  3055. utlLogout(strOutput, eLogCommon, false);
  3056. injectMessage(strOutput);
  3057. }
  3058. else
  3059. {
  3060. utlLogout(strOutput, eLogInfo, false);
  3061. }
  3062. return(0);
  3063. }
  3064. //-------------------------------------------------------------------------------------------------------------------------------
  3065. int parse013C(char *pBuffer, int nLen)
  3066. {
  3067. CString strOutput;
  3068. WORD wIndex;
  3069. wIndex = *((WORD*)(pBuffer+2));
  3070. int i = inventory.FindIndex(wIndex);
  3071. if(-1 != i)
  3072. {
  3073. strOutput.Format(_T("[R] 你 已装备 %s"), utlGetInventoryName(&inventory[i]));
  3074. injectMessage(strOutput);
  3075. }
  3076. return(0);
  3077. }
  3078. //-------------------------------------------------------------------------------------------------------------------------------
  3079. int parse013D(char *pBuffer, int nLen)
  3080. {
  3081. CString strOutput;
  3082. WORD wType, wAmount;
  3083. wType = *((WORD*)(pBuffer+2));
  3084. wAmount = *((WORD*)(pBuffer+4));
  3085. switch(wType)
  3086. {
  3087. case 5:
  3088. you.wHp += wAmount;
  3089. break;
  3090. case 7:
  3091. you.wSp += wAmount;
  3092. break;
  3093. }
  3094. return(0);
  3095. }
  3096. //-------------------------------------------------------------------------------------------------------------------------------
  3097. int parse00FB(char *pBuffer, int nLen)
  3098. {
  3099. BYTE byNum;
  3100. int i;
  3101. CString strOutput;
  3102. partners.RemoveAll();
  3103. strOutput.Format("[R] 队伍成员列表: ------->");
  3104. utlLogout(strOutput, eLogCommon, false);
  3105. for(i=28; i<nLen; i+=46)
  3106. {
  3107. PLAYER player;
  3108. player.dwId = *((DWORD*)(pBuffer+i));
  3109. strncpy(player.cName, pBuffer+i+4, MAX_NAME_LENGTH);
  3110. byNum = *(pBuffer+i+44);
  3111. partners.Add(player);
  3112. strOutput.Format("    %02d) %s(%08X)", byNum, player.cName, player.dwId);
  3113. utlLogout(strOutput, eLogCommon, false);
  3114. }
  3115. return(0);
  3116. }
  3117. //-------------------------------------------------------------------------------------------------------------------------------
  3118. int parse01B0(char *pBuffer, int nLen)
  3119. {
  3120. DWORD dwId;
  3121. WORD wType;
  3122. int i;
  3123. CString strOutput;
  3124. dwId = *((DWORD*)(pBuffer+2));
  3125. wType = *((WORD*)(pBuffer+7));
  3126. i = monsters.FindId(dwId);
  3127. if(-1 != i)
  3128. {
  3129. monsters[i].wType = wType;
  3130. strcpy(monsters[i].cName, mapMonster.FindValue(wType, 0));
  3131. strOutput.Format(_T("[R] 怪物 已变成 %s"), monsters[i].cName);
  3132. utlLogout(strOutput, eLogCommon, false);
  3133. injectMessage(strOutput);
  3134. if(utlIsMvpMonster(monsters[i]))
  3135. {
  3136. utlReportMonsterToParty(dwId);
  3137. }
  3138. }
  3139. return(0);
  3140. }
  3141. int parse019E(char *pBuffer, int nLen)
  3142. {
  3143. /* if(monsters.GetSize() > 0)
  3144. {
  3145. // sendUseSkill(1, 297, monsters[0].dwId);
  3146. for(int i=0; i<10; i++)
  3147. {
  3148. char buffer[6];
  3149. *(WORD*)(buffer) = 0x019F;
  3150. *(DWORD*)(buffer+2) = monsters[0].dwId;
  3151. parseSendData(buffer, 6, true);
  3152. injectAdminMessage(_T("抓宠"));
  3153. }
  3154. }
  3155. */ return(0);
  3156. }
  3157. //-------------------------------------------------------------------------------------------------------------------------------
  3158. // NPC Talk continue
  3159. int parse00B5(char *pBuffer, int nLen)
  3160. {
  3161. DWORD dwId;
  3162. CString strOutput;
  3163. dwId = *((DWORD*)(pBuffer+2));
  3164. strOutput.Format(_T("[R] NPC(0x%X) 继续对话"), dwId);
  3165. utlLogout(strOutput, eLogCommon, false);
  3166. if(option.bNpcTalkContinue)
  3167. {
  3168. Sleep(100);
  3169. sendTalkContinue(dwId);
  3170. }
  3171. return(0);
  3172. }
  3173. //-------------------------------------------------------------------------------------------------------------------------------
  3174. // NPC Talk done
  3175. int parse00B6(char *pBuffer, int nLen)
  3176. {
  3177. DWORD dwId;
  3178. CString strOutput;
  3179. dwId = *((DWORD*)(pBuffer+2));
  3180. strOutput.Format(_T("[R] NPC(0x%X) 结束对话"), dwId);
  3181. utlLogout(strOutput, eLogCommon, false);
  3182. /* if(option.bNpcTalkContinue)
  3183. {
  3184. Sleep(100);
  3185. sendTalkCancel(dwId);
  3186. }*/
  3187. return(0);
  3188. }
  3189. //-------------------------------------------------------------------------------------------------------------------------------
  3190. // Your Guild Name received
  3191. int parse016C(char *pBuffer, int nLen)
  3192. {
  3193. CString strOutput;
  3194. CString strGuild;
  3195. char cName[MAX_NAME_LENGTH+1];
  3196. memset(cName, 0, MAX_NAME_LENGTH+1);
  3197. strncpy(cName, pBuffer+19, MAX_NAME_LENGTH);
  3198. strGuild = cName;
  3199. strGuild.TrimRight();
  3200. strcpy(you.cGuild, strGuild);
  3201. strOutput.Format(_T("[R] 工会名称: %s"), strGuild);
  3202. utlLogout(strOutput, eLogCommon, false);
  3203. return(0);
  3204. }
  3205. int parse0122(char *pBuffer, int nLen)
  3206. {
  3207. INVENTORY inv;
  3208. int i;
  3209. CString strTemp;
  3210. int nIndex;
  3211. utlChangeState(4, 5);
  3212. utlLogout("[R] 手推车内装备列表: ------->", eLogCommon, false);
  3213. for(i=4; i<nLen; i+=20)
  3214. {
  3215. memset(&inv, 0, sizeof(INVENTORY));
  3216. utlParseInventory(pBuffer+i, &inv, 0x0122);
  3217. nIndex = cart.FindId(inv.dwIndex);
  3218. if(-1 != nIndex)
  3219. cart.SetAt(nIndex, inv);
  3220. else
  3221. cart.Add(inv);
  3222. strTemp.Format(_T("    [%2d] %-20s X %d"),
  3223. inv.dwIndex, mapItem.FindValue(inv.dwId, eItemName),
  3224. inv.wAmount);
  3225. utlLogout(strTemp, eLogCommon, false);
  3226. }
  3227. return(0);
  3228. }
  3229. //-------------------------------------------------------------------------------------------------------------------------------
  3230. int parse0123(char *pBuffer, int nLen)
  3231. {
  3232. INVENTORY item;
  3233. int i;
  3234. CString strTemp;
  3235. int nIndex;
  3236. utlChangeState(4, 5);
  3237. utlLogout("[R] 手推车内物品列表: ------->", eLogCommon, false);
  3238. for(i=0; i<nLen-4; i+=10)
  3239. {
  3240. memset(&item, 0, sizeof(INVENTORY));
  3241. item.dwIndex = *((WORD*)(pBuffer+4+i+0));
  3242. item.dwId = *((WORD*)(pBuffer+4+i+2));
  3243. item.wType = *(pBuffer+4+i+4);
  3244. item.wAmount = *((WORD*)(pBuffer+4+i+6));
  3245. nIndex = cart.FindId(item.dwIndex);
  3246. if(-1 != nIndex)
  3247. cart.SetAt(nIndex, item);
  3248. else
  3249. cart.Add(item);
  3250. strTemp.Format(_T("    [%2d] %-20s X %d"),
  3251. item.dwIndex, mapItem.FindValue(item.dwId, eItemName),
  3252. item.wAmount);
  3253. utlLogout(strTemp, eLogCommon, false);
  3254. }
  3255. return(0);
  3256. }
  3257. //-------------------------------------------------------------------------------------------------------------------------------
  3258. int parse0124(char *pBuffer, int nLen)
  3259. {
  3260. return(0);
  3261. }