1. #include "StdAfx.h"
  2. #include "PythonNetworkStream.h"
  3. #include "Packet.h"
  4. #include "PythonGuild.h"
  5. #include "PythonCharacterManager.h"
  6. #include "PythonPlayer.h"
  7. #include "PythonBackground.h"
  8. #include "PythonMiniMap.h"
  9. #include "PythonTextTail.h"
  10. #include "PythonItem.h"
  11. #include "PythonChat.h"
  12. #include "PythonShop.h"
  13. #include "PythonExchange.h"
  14. #include "PythonQuest.h"
  15. #include "PythonEventManager.h"
  16. #include "PythonMessenger.h"
  17. #include "PythonApplication.h"
  18. #include "../EterPack/EterPackManager.h"
  19. #include "../gamelib/ItemManager.h"
  20. #include "AbstractApplication.h"
  21. #include "AbstractCharacterManager.h"
  22. #include "InstanceBase.h"
  23. #include "ProcessCRC.h"
  24. BOOL gs_bEmpireLanuageEnable = TRUE;
  25. void CPythonNetworkStream::__RefreshAlignmentWindow()
  26. {
  27. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "RefreshAlignment", Py_BuildValue("()"));
  28. }
  29. void CPythonNetworkStream::__RefreshTargetBoardByVID(DWORD dwVID)
  30. {
  31. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "RefreshTargetBoardByVID", Py_BuildValue("(i)", dwVID));
  32. }
  33. void CPythonNetworkStream::__RefreshTargetBoardByName(const char * c_szName)
  34. {
  35. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "RefreshTargetBoardByName", Py_BuildValue("(s)", c_szName));
  36. }
  37. void CPythonNetworkStream::__RefreshTargetBoard()
  38. {
  39. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "RefreshTargetBoard", Py_BuildValue("()"));
  40. }
  41. void CPythonNetworkStream::__RefreshGuildWindowGradePage()
  42. {
  43. m_isRefreshGuildWndGradePage=true;
  44. }
  45. void CPythonNetworkStream::__RefreshGuildWindowSkillPage()
  46. {
  47. m_isRefreshGuildWndSkillPage=true;
  48. }
  49. void CPythonNetworkStream::__RefreshGuildWindowMemberPageGradeComboBox()
  50. {
  51. m_isRefreshGuildWndMemberPageGradeComboBox=true;
  52. }
  53. void CPythonNetworkStream::__RefreshGuildWindowMemberPage()
  54. {
  55. m_isRefreshGuildWndMemberPage=true;
  56. }
  57. void CPythonNetworkStream::__RefreshGuildWindowBoardPage()
  58. {
  59. m_isRefreshGuildWndBoardPage=true;
  60. }
  61. void CPythonNetworkStream::__RefreshGuildWindowInfoPage()
  62. {
  63. m_isRefreshGuildWndInfoPage=true;
  64. }
  65. void CPythonNetworkStream::__RefreshMessengerWindow()
  66. {
  67. m_isRefreshMessengerWnd=true;
  68. }
  69. void CPythonNetworkStream::__RefreshSafeboxWindow()
  70. {
  71. m_isRefreshSafeboxWnd=true;
  72. }
  73. void CPythonNetworkStream::__RefreshMallWindow()
  74. {
  75. m_isRefreshMallWnd=true;
  76. }
  77. void CPythonNetworkStream::__RefreshSkillWindow()
  78. {
  79. m_isRefreshSkillWnd=true;
  80. }
  81. void CPythonNetworkStream::__RefreshExchangeWindow()
  82. {
  83. m_isRefreshExchangeWnd=true;
  84. }
  85. void CPythonNetworkStream::__RefreshStatus()
  86. {
  87. m_isRefreshStatus=true;
  88. }
  89. void CPythonNetworkStream::__RefreshCharacterWindow()
  90. {
  91. m_isRefreshCharacterWnd=true;
  92. }
  93. void CPythonNetworkStream::__RefreshInventoryWindow()
  94. {
  95. m_isRefreshInventoryWnd=true;
  96. }
  97. void CPythonNetworkStream::__RefreshEquipmentWindow()
  98. {
  99. m_isRefreshEquipmentWnd=true;
  100. }
  101. void CPythonNetworkStream::__SetGuildID(DWORD id)
  102. {
  103. if (m_dwGuildID != id)
  104. {
  105. m_dwGuildID = id;
  106. IAbstractPlayer& rkPlayer = IAbstractPlayer::GetSingleton();
  107. for (int i = 0; i < PLAYER_PER_ACCOUNT4; ++i)
  108. if (!strncmp(m_akSimplePlayerInfo[i].szName, rkPlayer.GetName(), CHARACTER_NAME_MAX_LEN))
  109. {
  110. m_adwGuildID[i] = id;
  111. std::string guildName;
  112. if (CPythonGuild::Instance().GetGuildName(id, &guildName))
  113. {
  114. m_astrGuildName[i] = guildName;
  115. }
  116. else
  117. {
  118. m_astrGuildName[i] = "";
  119. }
  120. }
  121. }
  122. }
  123. struct PERF_PacketInfo
  124. {
  125. DWORD dwCount;
  126. DWORD dwTime;
  127. PERF_PacketInfo()
  128. {
  129. dwCount=0;
  130. dwTime=0;
  131. }
  132. };
  133. #ifdef __PERFORMANCE_CHECK__
  134. class PERF_PacketTimeAnalyzer
  135. {
  136. public:
  137. ~PERF_PacketTimeAnalyzer()
  138. {
  139. FILE* fp=fopen("perf_dispatch_packet_result.txt", "w");
  140. for (std::map<DWORD, PERF_PacketInfo>::iterator i=m_kMap_kPacketInfo.begin(); i!=m_kMap_kPacketInfo.end(); ++i)
  141. {
  142. if (i->second.dwTime>0)
  143. fprintf(fp, "header %d: count %d, time %d, tpc %d\n", i->first, i->second.dwCount, i->second.dwTime, i->second.dwTime/i->second.dwCount);
  144. }
  145. fclose(fp);
  146. }
  147. public:
  148. std::map<DWORD, PERF_PacketInfo> m_kMap_kPacketInfo;
  149. };
  150. PERF_PacketTimeAnalyzer gs_kPacketTimeAnalyzer;
  151. #endif
  152. // Game Phase ---------------------------------------------------------------------------
  153. void CPythonNetworkStream::GamePhase()
  154. {
  155. if (!m_kQue_stHack.empty())
  156. {
  157. __SendHack(m_kQue_stHack.front().c_str());
  158. m_kQue_stHack.pop_front();
  159. }
  160. TPacketHeader header = 0;
  161. bool ret = true;
  162. #ifdef __PERFORMANCE_CHECK__
  163. DWORD timeBeginDispatch=timeGetTime();
  164. static std::map<DWORD, PERF_PacketInfo> kMap_kPacketInfo;
  165. kMap_kPacketInfo.clear();
  166. #endif
  167. const DWORD MAX_RECV_COUNT = 4;
  168. const DWORD SAFE_RECV_BUFSIZE = 8192;
  169. DWORD dwRecvCount = 0;
  170. while (ret)
  171. {
  172. if(dwRecvCount++ >= MAX_RECV_COUNT-1 && GetRecvBufferSize() < SAFE_RECV_BUFSIZE
  173. && m_strPhase == "Game") //phase_game ÀÌ ¾Æ´Ï¾îµµ ¿©±â·Î µé¾î¿À´Â °æ¿ì°¡ ÀÖ´Ù.
  174. break;
  175. if (!CheckPacket(&header))
  176. break;
  177. #ifdef __PERFORMANCE_CHECK__
  178. DWORD timeBeginPacket=timeGetTime();
  179. #endif
  180. switch (header)
  181. {
  182. case HEADER_GC_OBSERVER_ADD:
  183. ret = RecvObserverAddPacket();
  184. break;
  185. case HEADER_GC_OBSERVER_REMOVE:
  186. ret = RecvObserverRemovePacket();
  187. break;
  188. case HEADER_GC_OBSERVER_MOVE:
  189. ret = RecvObserverMovePacket();
  190. break;
  191. case HEADER_GC_WARP:
  192. ret = RecvWarpPacket();
  193. break;
  194. case HEADER_GC_PHASE:
  195. ret = RecvPhasePacket();
  196. return; // µµÁß¿¡ Phase °¡ ¹Ù²î¸é ÀÏ´Ü ¹«Á¶°Ç GamePhase Å»Ãâ - [levites]
  197. break;
  198. case HEADER_GC_PVP:
  199. ret = RecvPVPPacket();
  200. break;
  201. case HEADER_GC_DUEL_START:
  202. ret = RecvDuelStartPacket();
  203. break;
  204. case HEADER_GC_CHARACTER_ADD:
  205. ret = RecvCharacterAppendPacket();
  206. break;
  207. case HEADER_GC_CHAR_ADDITIONAL_INFO:
  208. ret = RecvCharacterAdditionalInfo();
  209. break;
  210. case HEADER_GC_CHARACTER_ADD2:
  211. ret = RecvCharacterAppendPacketNew();
  212. break;
  213. case HEADER_GC_CHARACTER_UPDATE:
  214. ret = RecvCharacterUpdatePacket();
  215. break;
  216. case HEADER_GC_CHARACTER_UPDATE2:
  217. ret = RecvCharacterUpdatePacketNew();
  218. break;
  219. case HEADER_GC_CHARACTER_DEL:
  220. ret = RecvCharacterDeletePacket();
  221. break;
  222. case HEADER_GC_CHAT:
  223. ret = RecvChatPacket();
  224. break;
  225. case HEADER_GC_SYNC_POSITION:
  226. ret = RecvSyncPositionPacket();
  227. break;
  228. case HEADER_GC_OWNERSHIP:
  229. ret = RecvOwnerShipPacket();
  230. break;
  231. case HEADER_GC_WHISPER:
  232. ret = RecvWhisperPacket();
  233. break;
  234. case HEADER_GC_CHARACTER_MOVE:
  235. ret = RecvCharacterMovePacket();
  236. break;
  237. // Position
  238. case HEADER_GC_CHARACTER_POSITION:
  239. ret = RecvCharacterPositionPacket();
  240. break;
  241. // Battle Packet
  242. case HEADER_GC_STUN:
  243. ret = RecvStunPacket();
  244. break;
  245. case HEADER_GC_DEAD:
  246. ret = RecvDeadPacket();
  247. break;
  248. case HEADER_GC_PLAYER_POINT_CHANGE:
  249. ret = RecvPointChange();
  250. break;
  251. // item packet.
  252. case HEADER_GC_ITEM_SET:
  253. ret = RecvItemSetPacket();
  254. break;
  255. case HEADER_GC_ITEM_SET2:
  256. ret = RecvItemSetPacket2();
  257. break;
  258. case HEADER_GC_ITEM_USE:
  259. ret = RecvItemUsePacket();
  260. break;
  261. case HEADER_GC_ITEM_UPDATE:
  262. ret = RecvItemUpdatePacket();
  263. break;
  264. case HEADER_GC_ITEM_GROUND_ADD:
  265. ret = RecvItemGroundAddPacket();
  266. break;
  267. case HEADER_GC_ITEM_GROUND_DEL:
  268. ret = RecvItemGroundDelPacket();
  269. break;
  270. case HEADER_GC_ITEM_OWNERSHIP:
  271. ret = RecvItemOwnership();
  272. break;
  273. case HEADER_GC_QUICKSLOT_ADD:
  274. ret = RecvQuickSlotAddPacket();
  275. break;
  276. case HEADER_GC_QUICKSLOT_DEL:
  277. ret = RecvQuickSlotDelPacket();
  278. break;
  279. case HEADER_GC_QUICKSLOT_SWAP:
  280. ret = RecvQuickSlotMovePacket();
  281. break;
  282. case HEADER_GC_MOTION:
  283. ret = RecvMotionPacket();
  284. break;
  285. case HEADER_GC_SHOP:
  286. ret = RecvShopPacket();
  287. break;
  288. case HEADER_GC_SHOP_SIGN:
  289. ret = RecvShopSignPacket();
  290. break;
  291. case HEADER_GC_OFFLINE_SHOP:
  292. ret = RecvOfflineShopPacket();
  293. break;
  294. case HEADER_GC_OFFLINE_SHOP_SIGN:
  295. ret = RecvOfflineShopSignPacket();
  296. break;
  297. case HEADER_GC_EXCHANGE:
  298. ret = RecvExchangePacket();
  299. break;
  300. case HEADER_GC_QUEST_INFO:
  301. ret = RecvQuestInfoPacket();
  302. break;
  303. case HEADER_GC_REQUEST_MAKE_GUILD:
  304. ret = RecvRequestMakeGuild();
  305. break;
  306. case HEADER_GC_PING:
  307. ret = RecvPingPacket();
  308. break;
  309. case HEADER_GC_SCRIPT:
  310. ret = RecvScriptPacket();
  311. break;
  312. case HEADER_GC_QUEST_CONFIRM:
  313. ret = RecvQuestConfirmPacket();
  314. break;
  315. case HEADER_GC_TARGET:
  316. ret = RecvTargetPacket();
  317. break;
  318. case HEADER_GC_DAMAGE_INFO:
  319. ret = RecvDamageInfoPacket();
  320. break;
  321. case HEADER_GC_MOUNT:
  322. ret = RecvMountPacket();
  323. break;
  324. case HEADER_GC_CHANGE_SPEED:
  325. ret = RecvChangeSpeedPacket();
  326. break;
  327. case HEADER_GC_PLAYER_POINTS:
  328. ret = __RecvPlayerPoints();
  329. break;
  330. case HEADER_GC_CREATE_FLY:
  331. ret = RecvCreateFlyPacket();
  332. break;
  333. case HEADER_GC_FLY_TARGETING:
  334. ret = RecvFlyTargetingPacket();
  335. break;
  336. case HEADER_GC_ADD_FLY_TARGETING:
  337. ret = RecvAddFlyTargetingPacket();
  338. break;
  339. case HEADER_GC_SKILL_LEVEL:
  340. ret = RecvSkillLevel();
  341. break;
  342. case HEADER_GC_SKILL_LEVEL_NEW:
  343. ret = RecvSkillLevelNew();
  344. break;
  345. case HEADER_GC_MESSENGER:
  346. ret = RecvMessenger();
  347. break;
  348. case HEADER_GC_GUILD:
  349. ret = RecvGuild();
  350. break;
  351. case HEADER_GC_PARTY_INVITE:
  352. ret = RecvPartyInvite();
  353. break;
  354. case HEADER_GC_PARTY_ADD:
  355. ret = RecvPartyAdd();
  356. break;
  357. case HEADER_GC_PARTY_UPDATE:
  358. ret = RecvPartyUpdate();
  359. break;
  360. case HEADER_GC_PARTY_REMOVE:
  361. ret = RecvPartyRemove();
  362. break;
  363. case HEADER_GC_PARTY_LINK:
  364. ret = RecvPartyLink();
  365. break;
  366. case HEADER_GC_PARTY_UNLINK:
  367. ret = RecvPartyUnlink();
  368. break;
  369. case HEADER_GC_PARTY_PARAMETER:
  370. ret = RecvPartyParameter();
  371. break;
  372. case HEADER_GC_SAFEBOX_SET:
  373. ret = RecvSafeBoxSetPacket();
  374. break;
  375. case HEADER_GC_SAFEBOX_DEL:
  376. ret = RecvSafeBoxDelPacket();
  377. break;
  378. case HEADER_GC_SAFEBOX_WRONG_PASSWORD:
  379. ret = RecvSafeBoxWrongPasswordPacket();
  380. break;
  381. case HEADER_GC_SAFEBOX_SIZE:
  382. ret = RecvSafeBoxSizePacket();
  383. break;
  384. case HEADER_GC_SAFEBOX_MONEY_CHANGE:
  385. ret = RecvSafeBoxMoneyChangePacket();
  386. break;
  387. case HEADER_GC_FISHING:
  388. ret = RecvFishing();
  389. break;
  390. case HEADER_GC_DUNGEON:
  391. ret = RecvDungeon();
  392. break;
  393. case HEADER_GC_TIME:
  394. ret = RecvTimePacket();
  395. break;
  396. case HEADER_GC_WALK_MODE:
  397. ret = RecvWalkModePacket();
  398. break;
  399. case HEADER_GC_CHANGE_SKILL_GROUP:
  400. ret = RecvChangeSkillGroupPacket();
  401. break;
  402. case HEADER_GC_REFINE_INFORMATION:
  403. ret = RecvRefineInformationPacket();
  404. break;
  405. case HEADER_GC_REFINE_INFORMATION_NEW:
  406. ret = RecvRefineInformationPacketNew();
  407. break;
  408. case HEADER_GC_SEPCIAL_EFFECT:
  409. ret = RecvSpecialEffect();
  410. break;
  411. case HEADER_GC_NPC_POSITION:
  412. ret = RecvNPCList();
  413. break;
  414. case HEADER_GC_CHANNEL:
  415. ret = RecvChannelPacket();
  416. break;
  417. case HEADER_GC_VIEW_EQUIP:
  418. ret = RecvViewEquipPacket();
  419. break;
  420. case HEADER_GC_LAND_LIST:
  421. ret = RecvLandPacket();
  422. break;
  423. //case HEADER_GC_TARGET_CREATE:
  424. // ret = RecvTargetCreatePacket();
  425. // break;
  426. case HEADER_GC_TARGET_CREATE_NEW:
  427. ret = RecvTargetCreatePacketNew();
  428. break;
  429. case HEADER_GC_TARGET_UPDATE:
  430. ret = RecvTargetUpdatePacket();
  431. break;
  432. case HEADER_GC_TARGET_DELETE:
  433. ret = RecvTargetDeletePacket();
  434. break;
  435. case HEADER_GC_AFFECT_ADD:
  436. ret = RecvAffectAddPacket();
  437. break;
  438. case HEADER_GC_AFFECT_REMOVE:
  439. ret = RecvAffectRemovePacket();
  440. break;
  441. case HEADER_GC_MALL_OPEN:
  442. ret = RecvMallOpenPacket();
  443. break;
  444. case HEADER_GC_MALL_SET:
  445. ret = RecvMallItemSetPacket();
  446. break;
  447. case HEADER_GC_MALL_DEL:
  448. ret = RecvMallItemDelPacket();
  449. break;
  450. case HEADER_GC_LOVER_INFO:
  451. ret = RecvLoverInfoPacket();
  452. break;
  453. case HEADER_GC_LOVE_POINT_UPDATE:
  454. ret = RecvLovePointUpdatePacket();
  455. break;
  456. case HEADER_GC_DIG_MOTION:
  457. ret = RecvDigMotionPacket();
  458. break;
  459. case HEADER_GC_HANDSHAKE:
  460. RecvHandshakePacket();
  461. return;
  462. break;
  463. case HEADER_GC_HANDSHAKE_OK:
  464. RecvHandshakeOKPacket();
  465. return;
  466. break;
  467. case HEADER_GC_HYBRIDCRYPT_KEYS:
  468. RecvHybridCryptKeyPacket();
  469. return;
  470. break;
  471. case HEADER_GC_HYBRIDCRYPT_SDB:
  472. RecvHybridCryptSDBPacket();
  473. return;
  474. break;
  475. #ifdef _IMPROVED_PACKET_ENCRYPTION_
  476. case HEADER_GC_KEY_AGREEMENT:
  477. RecvKeyAgreementPacket();
  478. return;
  479. break;
  480. case HEADER_GC_KEY_AGREEMENT_COMPLETED:
  481. RecvKeyAgreementCompletedPacket();
  482. return;
  483. break;
  484. #endif
  485. case HEADER_GC_HS_REQUEST:
  486. ret = RecvHSCheckRequest();
  487. break;
  488. case HEADER_GC_XTRAP_CS1_REQUEST:
  489. ret = RecvXTrapVerifyRequest();
  490. break;
  491. case HEADER_GC_SPECIFIC_EFFECT:
  492. ret = RecvSpecificEffect();
  493. break;
  494. case HEADER_GC_DRAGON_SOUL_REFINE:
  495. #ifdef ENABLE_SUPPORT_SHAMAN_SYSTEM
  496. case HEADER_GC_SUPPORT_SHAMAN_SKILL:
  497. ret = RecvSupportShamanUseSkill();
  498. break;
  499. #endif
  500. ret = RecvDragonSoulRefine();
  501. break;
  502. default:
  503. ret = RecvDefaultPacket(header);
  504. break;
  505. }
  506. #ifdef __PERFORMANCE_CHECK__
  507. DWORD timeEndPacket=timeGetTime();
  508. {
  509. PERF_PacketInfo& rkPacketInfo=kMap_kPacketInfo[header];
  510. rkPacketInfo.dwCount++;
  511. rkPacketInfo.dwTime+=timeEndPacket-timeBeginPacket;
  512. }
  513. {
  514. PERF_PacketInfo& rkPacketInfo=gs_kPacketTimeAnalyzer.m_kMap_kPacketInfo[header];
  515. rkPacketInfo.dwCount++;
  516. rkPacketInfo.dwTime+=timeEndPacket-timeBeginPacket;
  517. }
  518. #endif
  519. }
  520. #ifdef __PERFORMANCE_CHECK__
  521. DWORD timeEndDispatch=timeGetTime();
  522. if (timeEndDispatch-timeBeginDispatch>2)
  523. {
  524. static FILE* fp=fopen("perf_dispatch_packet.txt", "w");
  525. fprintf(fp, "delay %d\n", timeEndDispatch-timeBeginDispatch);
  526. for (std::map<DWORD, PERF_PacketInfo>::iterator i=kMap_kPacketInfo.begin(); i!=kMap_kPacketInfo.end(); ++i)
  527. {
  528. if (i->second.dwTime>0)
  529. fprintf(fp, "header %d: count %d, time %d\n", i->first, i->second.dwCount, i->second.dwTime);
  530. }
  531. fputs("=====================================================\n", fp);
  532. fflush(fp);
  533. }
  534. #endif
  535. if (!ret)
  536. RecvErrorPacket(header);
  537. static DWORD s_nextRefreshTime = ELTimer_GetMSec();
  538. DWORD curTime = ELTimer_GetMSec();
  539. if (s_nextRefreshTime > curTime)
  540. return;
  541. if (m_isRefreshCharacterWnd)
  542. {
  543. m_isRefreshCharacterWnd=false;
  544. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "RefreshCharacter", Py_BuildValue("()"));
  545. s_nextRefreshTime = curTime + 300;
  546. }
  547. if (m_isRefreshEquipmentWnd)
  548. {
  549. m_isRefreshEquipmentWnd=false;
  550. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "RefreshEquipment", Py_BuildValue("()"));
  551. s_nextRefreshTime = curTime + 300;
  552. }
  553. if (m_isRefreshInventoryWnd)
  554. {
  555. m_isRefreshInventoryWnd=false;
  556. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "RefreshInventory", Py_BuildValue("()"));
  557. s_nextRefreshTime = curTime + 300;
  558. }
  559. if (m_isRefreshExchangeWnd)
  560. {
  561. m_isRefreshExchangeWnd=false;
  562. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "RefreshExchange", Py_BuildValue("()"));
  563. s_nextRefreshTime = curTime + 300;
  564. }
  565. if (m_isRefreshSkillWnd)
  566. {
  567. m_isRefreshSkillWnd=false;
  568. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "RefreshSkill", Py_BuildValue("()"));
  569. s_nextRefreshTime = curTime + 300;
  570. }
  571. if (m_isRefreshSafeboxWnd)
  572. {
  573. m_isRefreshSafeboxWnd=false;
  574. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "RefreshSafebox", Py_BuildValue("()"));
  575. s_nextRefreshTime = curTime + 300;
  576. }
  577. if (m_isRefreshMallWnd)
  578. {
  579. m_isRefreshMallWnd=false;
  580. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "RefreshMall", Py_BuildValue("()"));
  581. s_nextRefreshTime = curTime + 300;
  582. }
  583. if (m_isRefreshStatus)
  584. {
  585. m_isRefreshStatus=false;
  586. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "RefreshStatus", Py_BuildValue("()"));
  587. s_nextRefreshTime = curTime + 300;
  588. }
  589. if (m_isRefreshMessengerWnd)
  590. {
  591. m_isRefreshMessengerWnd=false;
  592. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "RefreshMessenger", Py_BuildValue("()"));
  593. s_nextRefreshTime = curTime + 300;
  594. }
  595. if (m_isRefreshGuildWndInfoPage)
  596. {
  597. m_isRefreshGuildWndInfoPage=false;
  598. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "RefreshGuildInfoPage", Py_BuildValue("()"));
  599. s_nextRefreshTime = curTime + 300;
  600. }
  601. if (m_isRefreshGuildWndBoardPage)
  602. {
  603. m_isRefreshGuildWndBoardPage=false;
  604. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "RefreshGuildBoardPage", Py_BuildValue("()"));
  605. s_nextRefreshTime = curTime + 300;
  606. }
  607. if (m_isRefreshGuildWndMemberPage)
  608. {
  609. m_isRefreshGuildWndMemberPage=false;
  610. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "RefreshGuildMemberPage", Py_BuildValue("()"));
  611. s_nextRefreshTime = curTime + 300;
  612. }
  613. if (m_isRefreshGuildWndMemberPageGradeComboBox)
  614. {
  615. m_isRefreshGuildWndMemberPageGradeComboBox=false;
  616. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "RefreshGuildMemberPageGradeComboBox", Py_BuildValue("()"));
  617. s_nextRefreshTime = curTime + 300;
  618. }
  619. if (m_isRefreshGuildWndSkillPage)
  620. {
  621. m_isRefreshGuildWndSkillPage=false;
  622. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "RefreshGuildSkillPage", Py_BuildValue("()"));
  623. s_nextRefreshTime = curTime + 300;
  624. }
  625. if (m_isRefreshGuildWndGradePage)
  626. {
  627. m_isRefreshGuildWndGradePage=false;
  628. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "RefreshGuildGradePage", Py_BuildValue("()"));
  629. s_nextRefreshTime = curTime + 300;
  630. }
  631. }
  632. void CPythonNetworkStream::__InitializeGamePhase()
  633. {
  634. __ServerTimeSync_Initialize();
  635. m_isRefreshStatus=false;
  636. m_isRefreshCharacterWnd=false;
  637. m_isRefreshEquipmentWnd=false;
  638. m_isRefreshInventoryWnd=false;
  639. m_isRefreshExchangeWnd=false;
  640. m_isRefreshSkillWnd=false;
  641. m_isRefreshSafeboxWnd=false;
  642. m_isRefreshMallWnd=false;
  643. m_isRefreshMessengerWnd=false;
  644. m_isRefreshGuildWndInfoPage=false;
  645. m_isRefreshGuildWndBoardPage=false;
  646. m_isRefreshGuildWndMemberPage=false;
  647. m_isRefreshGuildWndMemberPageGradeComboBox=false;
  648. m_isRefreshGuildWndSkillPage=false;
  649. m_isRefreshGuildWndGradePage=false;
  650. m_EmoticonStringVector.clear();
  651. m_pInstTarget = NULL;
  652. }
  653. void CPythonNetworkStream::Warp(LONG lGlobalX, LONG lGlobalY)
  654. {
  655. CPythonBackground& rkBgMgr=CPythonBackground::Instance();
  656. rkBgMgr.Destroy();
  657. rkBgMgr.Create();
  658. rkBgMgr.Warp(lGlobalX, lGlobalY);
  659. //rkBgMgr.SetShadowLevel(CPythonBackground::SHADOW_ALL);
  660. rkBgMgr.RefreshShadowLevel();
  661. // NOTE : Warp ÇßÀ»¶§ CenterPositionÀÇ Height°¡ 0À̱⠶§¹®¿¡ Ä«¸Ş¶ó°¡ ¶¥¹Ù´Ú¿¡ ¹ÚÇôÀÖ°Ô µÊ
  662. // ¿òÁ÷À϶§¸¶´Ù Height°¡ °»½Å µÇ±â ¶§¹®À̹ǷΠ¸ÊÀ» À̵¿Çϸé PositionÀ» °­Á¦·Î Çѹø
  663. // ¼ÂÆÃÇØÁØ´Ù - [levites]
  664. LONG lLocalX = lGlobalX;
  665. LONG lLocalY = lGlobalY;
  666. __GlobalPositionToLocalPosition(lLocalX, lLocalY);
  667. float fHeight = CPythonBackground::Instance().GetHeight(float(lLocalX), float(lLocalY));
  668. IAbstractApplication& rkApp=IAbstractApplication::GetSingleton();
  669. rkApp.SetCenterPosition(float(lLocalX), float(lLocalY), fHeight);
  670. __ShowMapName(lLocalX, lLocalY);
  671. }
  672. void CPythonNetworkStream::__ShowMapName(LONG lLocalX, LONG lLocalY)
  673. {
  674. const std::string & c_rstrMapFileName = CPythonBackground::Instance().GetWarpMapName();
  675. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "ShowMapName", Py_BuildValue("(sii)", c_rstrMapFileName.c_str(), lLocalX, lLocalY));
  676. }
  677. void CPythonNetworkStream::__LeaveGamePhase()
  678. {
  679. CInstanceBase::ClearPVPKeySystem();
  680. __ClearNetworkActorManager();
  681. m_bComboSkillFlag = FALSE;
  682. IAbstractCharacterManager& rkChrMgr=IAbstractCharacterManager::GetSingleton();
  683. rkChrMgr.Destroy();
  684. CPythonItem& rkItemMgr=CPythonItem::Instance();
  685. rkItemMgr.Destroy();
  686. }
  687. void CPythonNetworkStream::SetGamePhase()
  688. {
  689. if ("Game"!=m_strPhase)
  690. m_phaseLeaveFunc.Run();
  691. Tracen("");
  692. Tracen("## Network - Game Phase ##");
  693. Tracen("");
  694. m_strPhase = "Game";
  695. m_dwChangingPhaseTime = ELTimer_GetMSec();
  696. m_phaseProcessFunc.Set(this, &CPythonNetworkStream::GamePhase);
  697. m_phaseLeaveFunc.Set(this, &CPythonNetworkStream::__LeaveGamePhase);
  698. // Main Character µî·ÏO
  699. IAbstractPlayer & rkPlayer = IAbstractPlayer::GetSingleton();
  700. rkPlayer.SetMainCharacterIndex(GetMainActorVID());
  701. __RefreshStatus();
  702. }
  703. bool CPythonNetworkStream::RecvObserverAddPacket()
  704. {
  705. TPacketGCObserverAdd kObserverAddPacket;
  706. if (!Recv(sizeof(kObserverAddPacket), &kObserverAddPacket))
  707. return false;
  708. CPythonMiniMap::Instance().AddObserver(
  709. kObserverAddPacket.vid,
  710. kObserverAddPacket.x*100.0f,
  711. kObserverAddPacket.y*100.0f);
  712. return true;
  713. }
  714. bool CPythonNetworkStream::RecvObserverRemovePacket()
  715. {
  716. TPacketGCObserverAdd kObserverRemovePacket;
  717. if (!Recv(sizeof(kObserverRemovePacket), &kObserverRemovePacket))
  718. return false;
  719. CPythonMiniMap::Instance().RemoveObserver(
  720. kObserverRemovePacket.vid
  721. );
  722. return true;
  723. }
  724. bool CPythonNetworkStream::RecvObserverMovePacket()
  725. {
  726. TPacketGCObserverMove kObserverMovePacket;
  727. if (!Recv(sizeof(kObserverMovePacket), &kObserverMovePacket))
  728. return false;
  729. CPythonMiniMap::Instance().MoveObserver(
  730. kObserverMovePacket.vid,
  731. kObserverMovePacket.x*100.0f,
  732. kObserverMovePacket.y*100.0f);
  733. return true;
  734. }
  735. bool CPythonNetworkStream::RecvWarpPacket()
  736. {
  737. TPacketGCWarp kWarpPacket;
  738. if (!Recv(sizeof(kWarpPacket), &kWarpPacket))
  739. return false;
  740. __DirectEnterMode_Set(m_dwSelectedCharacterIndex);
  741. CNetworkStream::Connect((DWORD)kWarpPacket.lAddr, kWarpPacket.wPort);
  742. return true;
  743. }
  744. bool CPythonNetworkStream::RecvDuelStartPacket()
  745. {
  746. TPacketGCDuelStart kDuelStartPacket;
  747. if (!Recv(sizeof(kDuelStartPacket), &kDuelStartPacket))
  748. return false;
  749. DWORD count = (kDuelStartPacket.wSize - sizeof(kDuelStartPacket))/sizeof(DWORD);
  750. CPythonCharacterManager & rkChrMgr = CPythonCharacterManager::Instance();
  751. CInstanceBase* pkInstMain=rkChrMgr.GetMainInstancePtr();
  752. if (!pkInstMain)
  753. {
  754. TraceError("CPythonNetworkStream::RecvDuelStartPacket - MainCharacter is NULL");
  755. return false;
  756. }
  757. DWORD dwVIDSrc = pkInstMain->GetVirtualID();
  758. DWORD dwVIDDest;
  759. for ( DWORD i = 0; i < count; i++)
  760. {
  761. Recv(sizeof(dwVIDDest),&dwVIDDest);
  762. CInstanceBase::InsertDUELKey(dwVIDSrc,dwVIDDest);
  763. }
  764. if(count == 0)
  765. pkInstMain->SetDuelMode(CInstanceBase::DUEL_CANNOTATTACK);
  766. else
  767. pkInstMain->SetDuelMode(CInstanceBase::DUEL_START);
  768. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "CloseTargetBoard", Py_BuildValue("()"));
  769. rkChrMgr.RefreshAllPCTextTail();
  770. return true;
  771. }
  772. bool CPythonNetworkStream::RecvPVPPacket()
  773. {
  774. TPacketGCPVP kPVPPacket;
  775. if (!Recv(sizeof(kPVPPacket), &kPVPPacket))
  776. return false;
  777. CPythonCharacterManager & rkChrMgr = CPythonCharacterManager::Instance();
  778. CPythonPlayer & rkPlayer = CPythonPlayer::Instance();
  779. switch (kPVPPacket.bMode)
  780. {
  781. case PVP_MODE_AGREE:
  782. rkChrMgr.RemovePVPKey(kPVPPacket.dwVIDSrc, kPVPPacket.dwVIDDst);
  783. // »ó´ë°¡ ³ª(Dst)¿¡°Ô µ¿ÀǸ¦ ±¸ÇßÀ»¶§
  784. if (rkPlayer.IsMainCharacterIndex(kPVPPacket.dwVIDDst))
  785. rkPlayer.RememberChallengeInstance(kPVPPacket.dwVIDSrc);
  786. // »ó´ë¿¡°Ô µ¿ÀǸ¦ ±¸ÇÑ µ¿¾È¿¡´Â ´ë°á ºÒ´É
  787. if (rkPlayer.IsMainCharacterIndex(kPVPPacket.dwVIDSrc))
  788. rkPlayer.RememberCantFightInstance(kPVPPacket.dwVIDDst);
  789. break;
  790. case PVP_MODE_REVENGE:
  791. {
  792. rkChrMgr.RemovePVPKey(kPVPPacket.dwVIDSrc, kPVPPacket.dwVIDDst);
  793. DWORD dwKiller = kPVPPacket.dwVIDSrc;
  794. DWORD dwVictim = kPVPPacket.dwVIDDst;
  795. // ³»(victim)°¡ »ó´ë¿¡°Ô º¹¼öÇÒ ¼ö ÀÖÀ»¶§
  796. if (rkPlayer.IsMainCharacterIndex(dwVictim))
  797. rkPlayer.RememberRevengeInstance(dwKiller);
  798. // »ó´ë(victim)°¡ ³ª¿¡°Ô º¹¼öÇÏ´Â µ¿¾È¿¡´Â ´ë°á ºÒ´É
  799. if (rkPlayer.IsMainCharacterIndex(dwKiller))
  800. rkPlayer.RememberCantFightInstance(dwVictim);
  801. break;
  802. }
  803. case PVP_MODE_FIGHT:
  804. rkChrMgr.InsertPVPKey(kPVPPacket.dwVIDSrc, kPVPPacket.dwVIDDst);
  805. rkPlayer.ForgetInstance(kPVPPacket.dwVIDSrc);
  806. rkPlayer.ForgetInstance(kPVPPacket.dwVIDDst);
  807. break;
  808. case PVP_MODE_NONE:
  809. rkChrMgr.RemovePVPKey(kPVPPacket.dwVIDSrc, kPVPPacket.dwVIDDst);
  810. rkPlayer.ForgetInstance(kPVPPacket.dwVIDSrc);
  811. rkPlayer.ForgetInstance(kPVPPacket.dwVIDDst);
  812. break;
  813. }
  814. // NOTE : PVP Åä±Û½Ã TargetBoard ¸¦ ¾÷µ¥ÀÌÆ® ÇÕ´Ï´Ù.
  815. __RefreshTargetBoardByVID(kPVPPacket.dwVIDSrc);
  816. __RefreshTargetBoardByVID(kPVPPacket.dwVIDDst);
  817. return true;
  818. }
  819. // DELETEME
  820. /*
  821. void CPythonNetworkStream::__SendWarpPacket()
  822. {
  823. TPacketCGWarp kWarpPacket;
  824. kWarpPacket.bHeader=HEADER_GC_WARP;
  825. if (!Send(sizeof(kWarpPacket), &kWarpPacket))
  826. {
  827. return;
  828. }
  829. }
  830. */
  831. void CPythonNetworkStream::NotifyHack(const char* c_szMsg)
  832. {
  833. if (!m_kQue_stHack.empty())
  834. if (c_szMsg==m_kQue_stHack.back())
  835. return;
  836. m_kQue_stHack.push_back(c_szMsg);
  837. }
  838. bool CPythonNetworkStream::__SendHack(const char* c_szMsg)
  839. {
  840. Tracen(c_szMsg);
  841. TPacketCGHack kPacketHack;
  842. kPacketHack.bHeader=HEADER_CG_HACK;
  843. strncpy(kPacketHack.szBuf, c_szMsg, sizeof(kPacketHack.szBuf)-1);
  844. if (!Send(sizeof(kPacketHack), &kPacketHack))
  845. return false;
  846. return SendSequence();
  847. }
  848. bool CPythonNetworkStream::SendMessengerAddByVIDPacket(DWORD vid)
  849. {
  850. TPacketCGMessenger packet;
  851. packet.header = HEADER_CG_MESSENGER;
  852. packet.subheader = MESSENGER_SUBHEADER_CG_ADD_BY_VID;
  853. if (!Send(sizeof(packet), &packet))
  854. return false;
  855. if (!Send(sizeof(vid), &vid))
  856. return false;
  857. return SendSequence();
  858. }
  859. bool CPythonNetworkStream::SendMessengerAddByNamePacket(const char * c_szName)
  860. {
  861. TPacketCGMessenger packet;
  862. packet.header = HEADER_CG_MESSENGER;
  863. packet.subheader = MESSENGER_SUBHEADER_CG_ADD_BY_NAME;
  864. if (!Send(sizeof(packet), &packet))
  865. return false;
  866. char szName[CHARACTER_NAME_MAX_LEN];
  867. strncpy(szName, c_szName, CHARACTER_NAME_MAX_LEN-1);
  868. szName[CHARACTER_NAME_MAX_LEN-1] = '\0'; // #720: ¸Ş½ÅÀú À̸§ °ü·Ã ¹öÆÛ ¿À¹öÇÃ·Î¿ì ¹ö±× ¼öÁ¤
  869. if (!Send(sizeof(szName), &szName))
  870. return false;
  871. Tracef(" SendMessengerAddByNamePacket : %s\n", c_szName);
  872. return SendSequence();
  873. }
  874. bool CPythonNetworkStream::SendMessengerRemovePacket(const char * c_szKey, const char * c_szName)
  875. {
  876. TPacketCGMessenger packet;
  877. packet.header = HEADER_CG_MESSENGER;
  878. packet.subheader = MESSENGER_SUBHEADER_CG_REMOVE;
  879. if (!Send(sizeof(packet), &packet))
  880. return false;
  881. char szKey[CHARACTER_NAME_MAX_LEN];
  882. strncpy(szKey, c_szKey, CHARACTER_NAME_MAX_LEN-1);
  883. if (!Send(sizeof(szKey), &szKey))
  884. return false;
  885. __RefreshTargetBoardByName(c_szName);
  886. return SendSequence();
  887. }
  888. bool CPythonNetworkStream::SendCharacterStatePacket(const TPixelPosition& c_rkPPosDst, float fDstRot, UINT eFunc, UINT uArg)
  889. {
  890. NANOBEGIN
  891. if (!__CanActMainInstance())
  892. return true;
  893. if (fDstRot < 0.0f)
  894. fDstRot = 360 + fDstRot;
  895. else if (fDstRot > 360.0f)
  896. fDstRot = fmodf(fDstRot, 360.0f);
  897. // TODO: ³ªÁß¿¡ ÆĞŶÀ̸§À» ¹Ù²ÙÀÚ
  898. TPacketCGMove kStatePacket;
  899. kStatePacket.bHeader = HEADER_CG_CHARACTER_MOVE;
  900. kStatePacket.bFunc = eFunc;
  901. kStatePacket.bArg = uArg;
  902. kStatePacket.bRot = fDstRot/5.0f;
  903. kStatePacket.lX = long(c_rkPPosDst.x);
  904. kStatePacket.lY = long(c_rkPPosDst.y);
  905. kStatePacket.dwTime = ELTimer_GetServerMSec();
  906. assert(kStatePacket.lX >= 0 && kStatePacket.lX < 204800);
  907. __LocalPositionToGlobalPosition(kStatePacket.lX, kStatePacket.lY);
  908. if (!Send(sizeof(kStatePacket), &kStatePacket))
  909. {
  910. Tracenf("CPythonNetworkStream::SendCharacterStatePacket(dwCmdTime=%u, fDstPos=(%f, %f), fDstRot=%f, eFunc=%d uArg=%d) - PACKET SEND ERROR",
  911. kStatePacket.dwTime,
  912. float(kStatePacket.lX),
  913. float(kStatePacket.lY),
  914. fDstRot,
  915. kStatePacket.bFunc,
  916. kStatePacket.bArg);
  917. return false;
  918. }
  919. NANOEND
  920. return SendSequence();
  921. }
  922. // NOTE : SlotIndex´Â ÀÓ½Ã
  923. bool CPythonNetworkStream::SendUseSkillPacket(DWORD dwSkillIndex, DWORD dwTargetVID)
  924. {
  925. TPacketCGUseSkill UseSkillPacket;
  926. UseSkillPacket.bHeader = HEADER_CG_USE_SKILL;
  927. UseSkillPacket.dwVnum = dwSkillIndex;
  928. UseSkillPacket.dwTargetVID = dwTargetVID;
  929. if (!Send(sizeof(TPacketCGUseSkill), &UseSkillPacket))
  930. {
  931. Tracen("CPythonNetworkStream::SendUseSkillPacket - SEND PACKET ERROR");
  932. return false;
  933. }
  934. return SendSequence();
  935. }
  936. bool CPythonNetworkStream::SendChatPacket(const char * c_szChat, BYTE byType)
  937. {
  938. if (strlen(c_szChat) == 0)
  939. return true;
  940. if (strlen(c_szChat) >= 512)
  941. return true;
  942. if (c_szChat[0] == '/')
  943. {
  944. if (1 == strlen(c_szChat))
  945. {
  946. if (!m_strLastCommand.empty())
  947. c_szChat = m_strLastCommand.c_str();
  948. }
  949. else
  950. {
  951. m_strLastCommand = c_szChat;
  952. }
  953. }
  954. if (ClientCommand(c_szChat))
  955. return true;
  956. int iTextLen = strlen(c_szChat) + 1;
  957. TPacketCGChat ChatPacket;
  958. ChatPacket.header = HEADER_CG_CHAT;
  959. ChatPacket.length = sizeof(ChatPacket) + iTextLen;
  960. ChatPacket.type = byType;
  961. if (!Send(sizeof(ChatPacket), &ChatPacket))
  962. return false;
  963. if (!Send(iTextLen, c_szChat))
  964. return false;
  965. return SendSequence();
  966. }
  967. //////////////////////////////////////////////////////////////////////////
  968. // Emoticon
  969. void CPythonNetworkStream::RegisterEmoticonString(const char * pcEmoticonString)
  970. {
  971. if (m_EmoticonStringVector.size() >= CInstanceBase::EMOTICON_NUM)
  972. {
  973. TraceError("Can't register emoticon string... vector is full (size:%d)", m_EmoticonStringVector.size() );
  974. return;
  975. }
  976. m_EmoticonStringVector.push_back(pcEmoticonString);
  977. }
  978. bool CPythonNetworkStream::ParseEmoticon(const char * pChatMsg, DWORD * pdwEmoticon)
  979. {
  980. for (DWORD dwEmoticonIndex = 0; dwEmoticonIndex < m_EmoticonStringVector.size() ; ++dwEmoticonIndex)
  981. {
  982. if (strlen(pChatMsg) > m_EmoticonStringVector[dwEmoticonIndex].size())
  983. continue;
  984. const char * pcFind = strstr(pChatMsg, m_EmoticonStringVector[dwEmoticonIndex].c_str());
  985. if (pcFind != pChatMsg)
  986. continue;
  987. *pdwEmoticon = dwEmoticonIndex;
  988. return true;
  989. }
  990. return false;
  991. }
  992. // Emoticon
  993. //////////////////////////////////////////////////////////////////////////
  994. void CPythonNetworkStream::__ConvertEmpireText(DWORD dwEmpireID, char* szText)
  995. {
  996. if (dwEmpireID<1 || dwEmpireID>3)
  997. return;
  998. UINT uHanPos;
  999. STextConvertTable& rkTextConvTable=m_aTextConvTable[dwEmpireID-1];
  1000. BYTE* pbText=(BYTE*)szText;
  1001. while (*pbText)
  1002. {
  1003. if (*pbText & 0x80)
  1004. {
  1005. if (pbText[0]>=0xb0 && pbText[0]<=0xc8 && pbText[1]>=0xa1 && pbText[1]<=0xfe)
  1006. {
  1007. uHanPos=(pbText[0]-0xb0)*(0xfe-0xa1+1)+(pbText[1]-0xa1);
  1008. pbText[0]=rkTextConvTable.aacHan[uHanPos][0];
  1009. pbText[1]=rkTextConvTable.aacHan[uHanPos][1];
  1010. }
  1011. pbText+=2;
  1012. }
  1013. else
  1014. {
  1015. if (*pbText>='a' && *pbText<='z')
  1016. {
  1017. *pbText=rkTextConvTable.acLower[*pbText-'a'];
  1018. }
  1019. else if (*pbText>='A' && *pbText<='Z')
  1020. {
  1021. *pbText=rkTextConvTable.acUpper[*pbText-'A'];
  1022. }
  1023. pbText++;
  1024. }
  1025. }
  1026. }
  1027. bool CPythonNetworkStream::RecvChatPacket()
  1028. {
  1029. TPacketGCChat kChat;
  1030. char buf[1024 + 1];
  1031. char line[1024 + 1];
  1032. if (!Recv(sizeof(kChat), &kChat))
  1033. return false;
  1034. UINT uChatSize=kChat.size - sizeof(kChat);
  1035. if (!Recv(uChatSize, buf))
  1036. return false;
  1037. buf[uChatSize]='\0';
  1038. // À¯·´ ¾Æ¶ø ¹öÀü ó¸®
  1039. // "À̸§: ³»¿ë" ÀÔ·ÂÀ» "³»¿ë: À̸§" ¼ø¼­·Î Ãâ·ÂÇϱâ À§ÇØ ÅÇ(0x08)À» ³ÖÀ½
  1040. // ÅÇÀ» ¾Æ¶ø¾î ±âÈ£·Î ó¸®ÇØ (¿µ¾î1) : (¿µ¾î2) ·Î ÀԷµǾ (¿µ¾î2) : (¿µ¾î1) ·Î Ãâ·ÂÇÏ°Ô ¸¸µç´Ù
  1041. if (LocaleService_IsEUROPE() && GetDefaultCodePage() == 1256)
  1042. {
  1043. char * p = strchr(buf, ':');
  1044. if (p && p[1] == ' ')
  1045. p[1] = 0x08;
  1046. }
  1047. if (kChat.type >= CHAT_TYPE_MAX_NUM)
  1048. return true;
  1049. if (CHAT_TYPE_COMMAND == kChat.type)
  1050. {
  1051. ServerCommand(buf);
  1052. return true;
  1053. }
  1054. if (kChat.dwVID != 0)
  1055. {
  1056. CPythonCharacterManager& rkChrMgr=CPythonCharacterManager::Instance();
  1057. CInstanceBase * pkInstChatter = rkChrMgr.GetInstancePtr(kChat.dwVID);
  1058. if (NULL == pkInstChatter)
  1059. return true;
  1060. switch (kChat.type)
  1061. {
  1062. case CHAT_TYPE_TALKING: /* ±×³É äÆÃ */
  1063. case CHAT_TYPE_PARTY: /* ÆÄƼ¸» */
  1064. case CHAT_TYPE_GUILD: /* ±æµå¸» */
  1065. case CHAT_TYPE_SHOUT: /* ¿ÜÄ¡±â */
  1066. case CHAT_TYPE_WHISPER: // ¼­¹ö¿Í´Â ¿¬µ¿µÇÁö ¾Ê´Â Only Client Enum
  1067. {
  1068. char * p = strchr(buf, ':');
  1069. if (p)
  1070. p += 2;
  1071. else
  1072. p = buf;
  1073. DWORD dwEmoticon;
  1074. if (ParseEmoticon(p, &dwEmoticon))
  1075. {
  1076. pkInstChatter->SetEmoticon(dwEmoticon);
  1077. return true;
  1078. }
  1079. else
  1080. {
  1081. if (gs_bEmpireLanuageEnable)
  1082. {
  1083. CInstanceBase* pkInstMain=rkChrMgr.GetMainInstancePtr();
  1084. if (pkInstMain)
  1085. if (!pkInstMain->IsSameEmpire(*pkInstChatter))
  1086. __ConvertEmpireText(pkInstChatter->GetEmpireID(), p);
  1087. }
  1088. if (m_isEnableChatInsultFilter)
  1089. {
  1090. if (false == pkInstChatter->IsNPC() && false == pkInstChatter->IsEnemy())
  1091. {
  1092. __FilterInsult(p, strlen(p));
  1093. }
  1094. }
  1095. _snprintf(line, sizeof(line), "%s", p);
  1096. }
  1097. }
  1098. break;
  1099. case CHAT_TYPE_COMMAND: /* ¸í·É */
  1100. case CHAT_TYPE_INFO: /* Á¤º¸ (¾ÆÀÌÅÛÀ» Áı¾ú´Ù, °æÇèÄ¡¸¦ ¾ò¾ú´Ù. µî) */
  1101. case CHAT_TYPE_NOTICE: /* °øÁö»çÇ× */
  1102. case CHAT_TYPE_BIG_NOTICE:
  1103. case CHAT_TYPE_MAX_NUM:
  1104. default:
  1105. _snprintf(line, sizeof(line), "%s", buf);
  1106. break;
  1107. }
  1108. if (CHAT_TYPE_SHOUT != kChat.type)
  1109. {
  1110. CPythonTextTail::Instance().RegisterChatTail(kChat.dwVID, line);
  1111. }
  1112. if (pkInstChatter->IsPC())
  1113. CPythonChat::Instance().AppendChat(kChat.type, buf);
  1114. }
  1115. else
  1116. {
  1117. if (CHAT_TYPE_NOTICE == kChat.type)
  1118. {
  1119. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "BINARY_SetTipMessage", Py_BuildValue("(s)", buf));
  1120. }
  1121. else if (CHAT_TYPE_BIG_NOTICE == kChat.type)
  1122. {
  1123. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "BINARY_SetBigMessage", Py_BuildValue("(s)", buf));
  1124. }
  1125. else if (CHAT_TYPE_SHOUT == kChat.type)
  1126. {
  1127. char * p = strchr(buf, ':');
  1128. if (p)
  1129. {
  1130. if (m_isEnableChatInsultFilter)
  1131. __FilterInsult(p, strlen(p));
  1132. }
  1133. }
  1134. CPythonChat::Instance().AppendChat(kChat.type, buf);
  1135. }
  1136. return true;
  1137. }
  1138. bool CPythonNetworkStream::RecvWhisperPacket()
  1139. {
  1140. TPacketGCWhisper whisperPacket;
  1141. char buf[512 + 1];
  1142. if (!Recv(sizeof(whisperPacket), &whisperPacket))
  1143. return false;
  1144. assert(whisperPacket.wSize - sizeof(whisperPacket) < 512);
  1145. if (!Recv(whisperPacket.wSize - sizeof(whisperPacket), &buf))
  1146. return false;
  1147. buf[whisperPacket.wSize - sizeof(whisperPacket)] = '\0';
  1148. static char line[256];
  1149. if (CPythonChat::WHISPER_TYPE_CHAT == whisperPacket.bType || CPythonChat::WHISPER_TYPE_GM == whisperPacket.bType)
  1150. {
  1151. _snprintf(line, sizeof(line), "%s : %s", whisperPacket.szNameFrom, buf);
  1152. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "OnRecvWhisper", Py_BuildValue("(iss)", (int) whisperPacket.bType, whisperPacket.szNameFrom, line));
  1153. }
  1154. else if (CPythonChat::WHISPER_TYPE_SYSTEM == whisperPacket.bType || CPythonChat::WHISPER_TYPE_ERROR == whisperPacket.bType)
  1155. {
  1156. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "OnRecvWhisperSystemMessage", Py_BuildValue("(iss)", (int) whisperPacket.bType, whisperPacket.szNameFrom, buf));
  1157. }
  1158. else
  1159. {
  1160. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "OnRecvWhisperError", Py_BuildValue("(iss)", (int) whisperPacket.bType, whisperPacket.szNameFrom, buf));
  1161. }
  1162. return true;
  1163. }
  1164. bool CPythonNetworkStream::SendWhisperPacket(const char * name, const char * c_szChat)
  1165. {
  1166. if (strlen(c_szChat) >= 255)
  1167. return true;
  1168. int iTextLen = strlen(c_szChat) + 1;
  1169. TPacketCGWhisper WhisperPacket;
  1170. WhisperPacket.bHeader = HEADER_CG_WHISPER;
  1171. WhisperPacket.wSize = sizeof(WhisperPacket) + iTextLen;
  1172. strncpy(WhisperPacket.szNameTo, name, sizeof(WhisperPacket.szNameTo) - 1);
  1173. if (!Send(sizeof(WhisperPacket), &WhisperPacket))
  1174. return false;
  1175. if (!Send(iTextLen, c_szChat))
  1176. return false;
  1177. return SendSequence();
  1178. }
  1179. bool CPythonNetworkStream::SendMobileMessagePacket(const char * name, const char * c_szChat)
  1180. {
  1181. int iTextLen = strlen(c_szChat) + 1;
  1182. TPacketCGSMS SMSPacket;
  1183. SMSPacket.bHeader = HEADER_CG_SMS;
  1184. SMSPacket.wSize = sizeof(SMSPacket) + iTextLen;
  1185. strncpy(SMSPacket.szNameTo, name, sizeof(SMSPacket.szNameTo) - 1);
  1186. if (!Send(sizeof(SMSPacket), &SMSPacket))
  1187. return false;
  1188. if (!Send(iTextLen, c_szChat))
  1189. return false;
  1190. return SendSequence();
  1191. }
  1192. bool CPythonNetworkStream::RecvPointChange()
  1193. {
  1194. TPacketGCPointChange PointChange;
  1195. if (!Recv(sizeof(TPacketGCPointChange), &PointChange))
  1196. {
  1197. Tracen("Recv Point Change Packet Error");
  1198. return false;
  1199. }
  1200. CPythonCharacterManager& rkChrMgr = CPythonCharacterManager::Instance();
  1201. rkChrMgr.ShowPointEffect(PointChange.Type, PointChange.dwVID);
  1202. CInstanceBase * pInstance = CPythonCharacterManager::Instance().GetMainInstancePtr();
  1203. // ÀÚ½ÅÀÇ Point°¡ º¯°æµÇ¾úÀ» °æ¿ì..
  1204. if (pInstance)
  1205. if (PointChange.dwVID == pInstance->GetVirtualID())
  1206. {
  1207. CPythonPlayer & rkPlayer = CPythonPlayer::Instance();
  1208. rkPlayer.SetStatus(PointChange.Type, PointChange.value);
  1209. switch (PointChange.Type)
  1210. {
  1211. case POINT_STAT_RESET_COUNT:
  1212. __RefreshStatus();
  1213. break;
  1214. case POINT_LEVEL:
  1215. case POINT_ST:
  1216. case POINT_DX:
  1217. case POINT_HT:
  1218. case POINT_IQ:
  1219. __RefreshStatus();
  1220. __RefreshSkillWindow();
  1221. break;
  1222. case POINT_SKILL:
  1223. case POINT_SUB_SKILL:
  1224. case POINT_HORSE_SKILL:
  1225. __RefreshSkillWindow();
  1226. break;
  1227. case POINT_ENERGY:
  1228. if (PointChange.value == 0)
  1229. {
  1230. rkPlayer.SetStatus(POINT_ENERGY_END_TIME, 0);
  1231. }
  1232. __RefreshStatus();
  1233. break;
  1234. default:
  1235. __RefreshStatus();
  1236. break;
  1237. }
  1238. if (POINT_GOLD == PointChange.Type)
  1239. {
  1240. if (PointChange.amount > 0)
  1241. {
  1242. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "OnPickMoney", Py_BuildValue("(i)", PointChange.amount));
  1243. }
  1244. }
  1245. }
  1246. return true;
  1247. }
  1248. bool CPythonNetworkStream::RecvStunPacket()
  1249. {
  1250. TPacketGCStun StunPacket;
  1251. if (!Recv(sizeof(StunPacket), &StunPacket))
  1252. {
  1253. Tracen("CPythonNetworkStream::RecvStunPacket Error");
  1254. return false;
  1255. }
  1256. //Tracef("RecvStunPacket %d\n", StunPacket.vid);
  1257. CPythonCharacterManager& rkChrMgr=CPythonCharacterManager::Instance();
  1258. CInstanceBase * pkInstSel = rkChrMgr.GetInstancePtr(StunPacket.vid);
  1259. if (pkInstSel)
  1260. {
  1261. if (CPythonCharacterManager::Instance().GetMainInstancePtr()==pkInstSel)
  1262. pkInstSel->Die();
  1263. else
  1264. pkInstSel->Stun();
  1265. }
  1266. return true;
  1267. }
  1268. bool CPythonNetworkStream::RecvDeadPacket()
  1269. {
  1270. TPacketGCDead DeadPacket;
  1271. if (!Recv(sizeof(DeadPacket), &DeadPacket))
  1272. {
  1273. Tracen("CPythonNetworkStream::RecvDeadPacket Error");
  1274. return false;
  1275. }
  1276. CPythonCharacterManager& rkChrMgr=CPythonCharacterManager::Instance();
  1277. CInstanceBase * pkChrInstSel = rkChrMgr.GetInstancePtr(DeadPacket.vid);
  1278. if (pkChrInstSel)
  1279. {
  1280. CInstanceBase* pkInstMain=rkChrMgr.GetMainInstancePtr();
  1281. if (pkInstMain==pkChrInstSel)
  1282. {
  1283. Tracenf("ÁÖÀΰø »ç¸Á");
  1284. if (false == pkInstMain->GetDuelMode())
  1285. {
  1286. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "OnGameOver", Py_BuildValue("()"));
  1287. }
  1288. CPythonPlayer::Instance().NotifyDeadMainCharacter();
  1289. }
  1290. pkChrInstSel->Die();
  1291. }
  1292. return true;
  1293. }
  1294. bool CPythonNetworkStream::SendCharacterPositionPacket(BYTE iPosition)
  1295. {
  1296. TPacketCGPosition PositionPacket;
  1297. PositionPacket.header = HEADER_CG_CHARACTER_POSITION;
  1298. PositionPacket.position = iPosition;
  1299. if (!Send(sizeof(TPacketCGPosition), &PositionPacket))
  1300. {
  1301. Tracen("Send Character Position Packet Error");
  1302. return false;
  1303. }
  1304. return SendSequence();
  1305. }
  1306. bool CPythonNetworkStream::SendOnClickPacket(DWORD vid)
  1307. {
  1308. TPacketCGOnClick OnClickPacket;
  1309. OnClickPacket.header = HEADER_CG_ON_CLICK;
  1310. OnClickPacket.vid = vid;
  1311. if (!Send(sizeof(OnClickPacket), &OnClickPacket))
  1312. {
  1313. Tracen("Send On_Click Packet Error");
  1314. return false;
  1315. }
  1316. Tracef("SendOnClickPacket\n");
  1317. return SendSequence();
  1318. }
  1319. bool CPythonNetworkStream::RecvCharacterPositionPacket()
  1320. {
  1321. TPacketGCPosition PositionPacket;
  1322. if (!Recv(sizeof(TPacketGCPosition), &PositionPacket))
  1323. return false;
  1324. CInstanceBase * pChrInstance = CPythonCharacterManager::Instance().GetInstancePtr(PositionPacket.vid);
  1325. if (!pChrInstance)
  1326. return true;
  1327. //pChrInstance->UpdatePosition(PositionPacket.position);
  1328. return true;
  1329. }
  1330. bool CPythonNetworkStream::RecvMotionPacket()
  1331. {
  1332. TPacketGCMotion MotionPacket;
  1333. if (!Recv(sizeof(TPacketGCMotion), &MotionPacket))
  1334. return false;
  1335. CInstanceBase * pMainInstance = CPythonCharacterManager::Instance().GetInstancePtr(MotionPacket.vid);
  1336. CInstanceBase * pVictimInstance = NULL;
  1337. if (0 != MotionPacket.victim_vid)
  1338. pVictimInstance = CPythonCharacterManager::Instance().GetInstancePtr(MotionPacket.victim_vid);
  1339. if (!pMainInstance)
  1340. return false;
  1341. return true;
  1342. }
  1343. bool CPythonNetworkStream::RecvShopPacket()
  1344. {
  1345. std::vector<char> vecBuffer;
  1346. vecBuffer.clear();
  1347. TPacketGCShop packet_shop;
  1348. if (!Recv(sizeof(packet_shop), &packet_shop))
  1349. return false;
  1350. int iSize = packet_shop.size - sizeof(packet_shop);
  1351. if (iSize > 0)
  1352. {
  1353. vecBuffer.resize(iSize);
  1354. if (!Recv(iSize, &vecBuffer[0]))
  1355. return false;
  1356. }
  1357. switch (packet_shop.subheader)
  1358. {
  1359. case SHOP_SUBHEADER_GC_START:
  1360. {
  1361. CPythonShop::Instance().Clear();
  1362. DWORD dwVID = *(DWORD *)&vecBuffer[0];
  1363. TPacketGCShopStart * pShopStartPacket = (TPacketGCShopStart *)&vecBuffer[4];
  1364. for (BYTE iItemIndex = 0; iItemIndex < SHOP_HOST_ITEM_MAX_NUM; ++iItemIndex)
  1365. {
  1366. CPythonShop::Instance().SetItemData(iItemIndex, pShopStartPacket->items[iItemIndex]);
  1367. }
  1368. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "StartShop", Py_BuildValue("(i)", dwVID));
  1369. }
  1370. break;
  1371. case SHOP_SUBHEADER_GC_START_EX:
  1372. {
  1373. CPythonShop::Instance().Clear();
  1374. TPacketGCShopStartEx * pShopStartPacket = (TPacketGCShopStartEx *)&vecBuffer[0];
  1375. size_t read_point = sizeof(TPacketGCShopStartEx);
  1376. DWORD dwVID = pShopStartPacket->owner_vid;
  1377. BYTE shop_tab_count = pShopStartPacket->shop_tab_count;
  1378. CPythonShop::instance().SetTabCount(shop_tab_count);
  1379. for (size_t i = 0; i < shop_tab_count; i++)
  1380. {
  1381. TPacketGCShopStartEx::TSubPacketShopTab* pPackTab = (TPacketGCShopStartEx::TSubPacketShopTab*)&vecBuffer[read_point];
  1382. read_point += sizeof(TPacketGCShopStartEx::TSubPacketShopTab);
  1383. CPythonShop::instance().SetTabCoinType(i, pPackTab->coin_type);
  1384. CPythonShop::instance().SetTabName(i, pPackTab->name);
  1385. struct packet_shop_item* item = &pPackTab->items[0];
  1386. for (BYTE j = 0; j < SHOP_HOST_ITEM_MAX_NUM; j++)
  1387. {
  1388. TShopItemData* itemData = (item + j);
  1389. CPythonShop::Instance().SetItemData(i, j, *itemData);
  1390. }
  1391. }
  1392. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "StartShop", Py_BuildValue("(i)", dwVID));
  1393. }
  1394. break;
  1395. case SHOP_SUBHEADER_GC_END:
  1396. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "EndShop", Py_BuildValue("()"));
  1397. break;
  1398. case SHOP_SUBHEADER_GC_UPDATE_ITEM:
  1399. {
  1400. TPacketGCShopUpdateItem * pShopUpdateItemPacket = (TPacketGCShopUpdateItem *)&vecBuffer[0];
  1401. CPythonShop::Instance().SetItemData(pShopUpdateItemPacket->pos, pShopUpdateItemPacket->item);
  1402. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "RefreshShop", Py_BuildValue("()"));
  1403. }
  1404. break;
  1405. case SHOP_SUBHEADER_GC_UPDATE_PRICE:
  1406. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "SetShopSellingPrice", Py_BuildValue("(i)", *(int *)&vecBuffer[0]));
  1407. break;
  1408. case SHOP_SUBHEADER_GC_NOT_ENOUGH_MONEY:
  1409. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "OnShopError", Py_BuildValue("(s)", "NOT_ENOUGH_MONEY"));
  1410. break;
  1411. case SHOP_SUBHEADER_GC_NOT_ENOUGH_MONEY_EX:
  1412. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "OnShopError", Py_BuildValue("(s)", "NOT_ENOUGH_MONEY_EX"));
  1413. break;
  1414. case SHOP_SUBHEADER_GC_SOLDOUT:
  1415. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "OnShopError", Py_BuildValue("(s)", "SOLDOUT"));
  1416. break;
  1417. case SHOP_SUBHEADER_GC_INVENTORY_FULL:
  1418. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "OnShopError", Py_BuildValue("(s)", "INVENTORY_FULL"));
  1419. break;
  1420. case SHOP_SUBHEADER_GC_INVALID_POS:
  1421. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "OnShopError", Py_BuildValue("(s)", "INVALID_POS"));
  1422. break;
  1423. default:
  1424. TraceError("CPythonNetworkStream::RecvShopPacket: Unknown subheader\n");
  1425. break;
  1426. }
  1427. return true;
  1428. }
  1429. bool CPythonNetworkStream::RecvExchangePacket()
  1430. {
  1431. TPacketGCExchange exchange_packet;
  1432. if (!Recv(sizeof(exchange_packet), &exchange_packet))
  1433. return false;
  1434. switch (exchange_packet.subheader)
  1435. {
  1436. case EXCHANGE_SUBHEADER_GC_START:
  1437. CPythonExchange::Instance().Clear();
  1438. CPythonExchange::Instance().Start();
  1439. CPythonExchange::Instance().SetSelfName(CPythonPlayer::Instance().GetName());
  1440. {
  1441. CInstanceBase * pCharacterInstance = CPythonCharacterManager::Instance().GetInstancePtr(exchange_packet.arg1);
  1442. if (pCharacterInstance)
  1443. {
  1444. CPythonExchange::Instance().SetTargetName(pCharacterInstance->GetNameString());
  1445. }
  1446. }
  1447. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "StartExchange", Py_BuildValue("()"));
  1448. break;
  1449. case EXCHANGE_SUBHEADER_GC_ITEM_ADD:
  1450. if (exchange_packet.is_me)
  1451. {
  1452. int iSlotIndex = exchange_packet.arg2.cell;
  1453. CPythonExchange::Instance().SetItemToSelf(iSlotIndex, exchange_packet.arg1, (BYTE) exchange_packet.arg3);
  1454. for (int i = 0; i < ITEM_SOCKET_SLOT_MAX_NUM; ++i)
  1455. CPythonExchange::Instance().SetItemMetinSocketToSelf(iSlotIndex, i, exchange_packet.alValues[i]);
  1456. for (int j = 0; j < ITEM_ATTRIBUTE_SLOT_MAX_NUM; ++j)
  1457. CPythonExchange::Instance().SetItemAttributeToSelf(iSlotIndex, j, exchange_packet.aAttr[j].bType, exchange_packet.aAttr[j].sValue);
  1458. }
  1459. else
  1460. {
  1461. int iSlotIndex = exchange_packet.arg2.cell;
  1462. CPythonExchange::Instance().SetItemToTarget(iSlotIndex, exchange_packet.arg1, (BYTE) exchange_packet.arg3);
  1463. for (int i = 0; i < ITEM_SOCKET_SLOT_MAX_NUM; ++i)
  1464. CPythonExchange::Instance().SetItemMetinSocketToTarget(iSlotIndex, i, exchange_packet.alValues[i]);
  1465. for (int j = 0; j < ITEM_ATTRIBUTE_SLOT_MAX_NUM; ++j)
  1466. CPythonExchange::Instance().SetItemAttributeToTarget(iSlotIndex, j, exchange_packet.aAttr[j].bType, exchange_packet.aAttr[j].sValue);
  1467. }
  1468. __RefreshExchangeWindow();
  1469. __RefreshInventoryWindow();
  1470. break;
  1471. case EXCHANGE_SUBHEADER_GC_ITEM_DEL:
  1472. if (exchange_packet.is_me)
  1473. {
  1474. CPythonExchange::Instance().DelItemOfSelf((BYTE) exchange_packet.arg1);
  1475. }
  1476. else
  1477. {
  1478. CPythonExchange::Instance().DelItemOfTarget((BYTE) exchange_packet.arg1);
  1479. }
  1480. __RefreshExchangeWindow();
  1481. __RefreshInventoryWindow();
  1482. break;
  1483. case EXCHANGE_SUBHEADER_GC_ELK_ADD:
  1484. if (exchange_packet.is_me)
  1485. CPythonExchange::Instance().SetElkToSelf(exchange_packet.arg1);
  1486. else
  1487. CPythonExchange::Instance().SetElkToTarget(exchange_packet.arg1);
  1488. __RefreshExchangeWindow();
  1489. break;
  1490. case EXCHANGE_SUBHEADER_GC_ACCEPT:
  1491. if (exchange_packet.is_me)
  1492. {
  1493. CPythonExchange::Instance().SetAcceptToSelf((BYTE) exchange_packet.arg1);
  1494. }
  1495. else
  1496. {
  1497. CPythonExchange::Instance().SetAcceptToTarget((BYTE) exchange_packet.arg1);
  1498. }
  1499. __RefreshExchangeWindow();
  1500. break;
  1501. case EXCHANGE_SUBHEADER_GC_END:
  1502. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "EndExchange", Py_BuildValue("()"));
  1503. __RefreshInventoryWindow();
  1504. CPythonExchange::Instance().End();
  1505. break;
  1506. case EXCHANGE_SUBHEADER_GC_ALREADY:
  1507. Tracef("trade_already");
  1508. break;
  1509. case EXCHANGE_SUBHEADER_GC_LESS_ELK:
  1510. Tracef("trade_less_elk");
  1511. break;
  1512. };
  1513. return true;
  1514. }
  1515. bool CPythonNetworkStream::RecvQuestInfoPacket()
  1516. {
  1517. TPacketGCQuestInfo QuestInfo;
  1518. if (!Peek(sizeof(TPacketGCQuestInfo), &QuestInfo))
  1519. {
  1520. Tracen("Recv Quest Info Packet Error #1");
  1521. TraceError("Recv Quest Info Packet Error #1");
  1522. return false;
  1523. }
  1524. if (!Peek(QuestInfo.size))
  1525. {
  1526. Tracen("Recv Quest Info Packet Error #2");
  1527. TraceError("Recv Quest Info Packet Error #2");
  1528. return false;
  1529. }
  1530. Recv(sizeof(TPacketGCQuestInfo));
  1531. const BYTE & c_rFlag = QuestInfo.flag;
  1532. enum
  1533. {
  1534. QUEST_PACKET_TYPE_NONE,
  1535. QUEST_PACKET_TYPE_BEGIN,
  1536. QUEST_PACKET_TYPE_UPDATE,
  1537. QUEST_PACKET_TYPE_END,
  1538. };
  1539. BYTE byQuestPacketType = QUEST_PACKET_TYPE_NONE;
  1540. if (0 != (c_rFlag & QUEST_SEND_IS_BEGIN))
  1541. {
  1542. BYTE isBegin = QuestInfo.isBegin;
  1543. if (isBegin)
  1544. byQuestPacketType = QUEST_PACKET_TYPE_BEGIN;
  1545. else
  1546. byQuestPacketType = QUEST_PACKET_TYPE_END;
  1547. }
  1548. else
  1549. {
  1550. byQuestPacketType = QUEST_PACKET_TYPE_UPDATE;
  1551. }
  1552. // Recv Data Start
  1553. char szTitle[30 + 1] = "";
  1554. char szClockName[16 + 1] = "";
  1555. int iClockValue = 0;
  1556. char szCounterName[16 + 1] = "";
  1557. int iCounterValue = 0;
  1558. char szIconFileName[24 + 1] = "";
  1559. if (0 != (c_rFlag & QUEST_SEND_TITLE))
  1560. {
  1561. strncpy(szTitle, QuestInfo.szTitle, sizeof(szTitle));
  1562. szTitle[30]='\0';
  1563. }
  1564. if (0 != (c_rFlag & QUEST_SEND_CLOCK_NAME))
  1565. {
  1566. strncpy(szClockName, QuestInfo.szClockName, sizeof(szClockName));
  1567. szClockName[16]='\0';
  1568. }
  1569. if (0 != (c_rFlag & QUEST_SEND_CLOCK_VALUE))
  1570. {
  1571. iClockValue = QuestInfo.iClockValue;
  1572. }
  1573. if (0 != (c_rFlag & QUEST_SEND_COUNTER_NAME))
  1574. {
  1575. strncpy(szCounterName, QuestInfo.szCounterName, sizeof(szCounterName));
  1576. szCounterName[16]='\0';
  1577. }
  1578. if (0 != (c_rFlag & QUEST_SEND_COUNTER_VALUE))
  1579. {
  1580. iCounterValue = QuestInfo.iCounterValue;
  1581. }
  1582. if (0 != (c_rFlag & QUEST_SEND_ICON_FILE))
  1583. {
  1584. strncpy(szIconFileName, QuestInfo.szIconFileName, sizeof(szIconFileName));
  1585. szIconFileName[24]='\0';
  1586. }
  1587. // Recv Data End
  1588. CPythonQuest& rkQuest=CPythonQuest::Instance();
  1589. // Process Start
  1590. if (QUEST_PACKET_TYPE_END == byQuestPacketType)
  1591. {
  1592. rkQuest.DeleteQuestInstance(QuestInfo.index);
  1593. }
  1594. else if (QUEST_PACKET_TYPE_UPDATE == byQuestPacketType)
  1595. {
  1596. if (!rkQuest.IsQuest(QuestInfo.index))
  1597. {
  1598. rkQuest.MakeQuest(QuestInfo.index);
  1599. }
  1600. if (strlen(szTitle) > 0)
  1601. rkQuest.SetQuestTitle(QuestInfo.index, szTitle);
  1602. if (strlen(szClockName) > 0)
  1603. rkQuest.SetQuestClockName(QuestInfo.index, szClockName);
  1604. if (strlen(szCounterName) > 0)
  1605. rkQuest.SetQuestCounterName(QuestInfo.index, szCounterName);
  1606. if (strlen(szIconFileName) > 0)
  1607. rkQuest.SetQuestIconFileName(QuestInfo.index, szIconFileName);
  1608. if (c_rFlag & QUEST_SEND_CLOCK_VALUE)
  1609. rkQuest.SetQuestClockValue(QuestInfo.index, iClockValue);
  1610. if (c_rFlag & QUEST_SEND_COUNTER_VALUE)
  1611. rkQuest.SetQuestCounterValue(QuestInfo.index, iCounterValue);
  1612. }
  1613. else if (QUEST_PACKET_TYPE_BEGIN == byQuestPacketType)
  1614. {
  1615. CPythonQuest::SQuestInstance QuestInstance;
  1616. QuestInstance.dwIndex = QuestInfo.index;
  1617. QuestInstance.strTitle = szTitle;
  1618. QuestInstance.strClockName = szClockName;
  1619. QuestInstance.iClockValue = iClockValue;
  1620. QuestInstance.strCounterName = szCounterName;
  1621. QuestInstance.iCounterValue = iCounterValue;
  1622. QuestInstance.strIconFileName = szIconFileName;
  1623. CPythonQuest::Instance().RegisterQuestInstance(QuestInstance);
  1624. }
  1625. // Process Start End
  1626. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "RefreshQuest", Py_BuildValue("()"));
  1627. return true;
  1628. }
  1629. bool CPythonNetworkStream::RecvQuestConfirmPacket()
  1630. {
  1631. TPacketGCQuestConfirm kQuestConfirmPacket;
  1632. if (!Recv(sizeof(kQuestConfirmPacket), &kQuestConfirmPacket))
  1633. {
  1634. Tracen("RecvQuestConfirmPacket Error");
  1635. return false;
  1636. }
  1637. PyObject * poArg = Py_BuildValue("(sii)", kQuestConfirmPacket.msg, kQuestConfirmPacket.timeout, kQuestConfirmPacket.requestPID);
  1638. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "BINARY_OnQuestConfirm", poArg);
  1639. return true;
  1640. }
  1641. bool CPythonNetworkStream::RecvRequestMakeGuild()
  1642. {
  1643. TPacketGCBlank blank;
  1644. if (!Recv(sizeof(blank), &blank))
  1645. {
  1646. Tracen("RecvRequestMakeGuild Packet Error");
  1647. return false;
  1648. }
  1649. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "AskGuildName", Py_BuildValue("()"));
  1650. return true;
  1651. }
  1652. void CPythonNetworkStream::ToggleGameDebugInfo()
  1653. {
  1654. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "ToggleDebugInfo", Py_BuildValue("()"));
  1655. }
  1656. bool CPythonNetworkStream::SendExchangeStartPacket(DWORD vid)
  1657. {
  1658. if (!__CanActMainInstance())
  1659. return true;
  1660. TPacketCGExchange packet;
  1661. packet.header = HEADER_CG_EXCHANGE;
  1662. packet.subheader = EXCHANGE_SUBHEADER_CG_START;
  1663. packet.arg1 = vid;
  1664. if (!Send(sizeof(packet), &packet))
  1665. {
  1666. Tracef("send_trade_start_packet Error\n");
  1667. return false;
  1668. }
  1669. Tracef("send_trade_start_packet vid %d \n", vid);
  1670. return SendSequence();
  1671. }
  1672. bool CPythonNetworkStream::SendExchangeElkAddPacket(DWORD elk)
  1673. {
  1674. if (!__CanActMainInstance())
  1675. return true;
  1676. TPacketCGExchange packet;
  1677. packet.header = HEADER_CG_EXCHANGE;
  1678. packet.subheader = EXCHANGE_SUBHEADER_CG_ELK_ADD;
  1679. packet.arg1 = elk;
  1680. if (!Send(sizeof(packet), &packet))
  1681. {
  1682. Tracef("send_trade_elk_add_packet Error\n");
  1683. return false;
  1684. }
  1685. return SendSequence();
  1686. }
  1687. bool CPythonNetworkStream::SendExchangeItemAddPacket(TItemPos ItemPos, BYTE byDisplayPos)
  1688. {
  1689. if (!__CanActMainInstance())
  1690. return true;
  1691. TPacketCGExchange packet;
  1692. packet.header = HEADER_CG_EXCHANGE;
  1693. packet.subheader = EXCHANGE_SUBHEADER_CG_ITEM_ADD;
  1694. packet.Pos = ItemPos;
  1695. packet.arg2 = byDisplayPos;
  1696. if (!Send(sizeof(packet), &packet))
  1697. {
  1698. Tracef("send_trade_item_add_packet Error\n");
  1699. return false;
  1700. }
  1701. return SendSequence();
  1702. }
  1703. bool CPythonNetworkStream::SendExchangeItemDelPacket(BYTE pos)
  1704. {
  1705. assert(!"Can't be called function - CPythonNetworkStream::SendExchangeItemDelPacket");
  1706. return true;
  1707. if (!__CanActMainInstance())
  1708. return true;
  1709. TPacketCGExchange packet;
  1710. packet.header = HEADER_CG_EXCHANGE;
  1711. packet.subheader = EXCHANGE_SUBHEADER_CG_ITEM_DEL;
  1712. packet.arg1 = pos;
  1713. if (!Send(sizeof(packet), &packet))
  1714. {
  1715. Tracef("send_trade_item_del_packet Error\n");
  1716. return false;
  1717. }
  1718. return SendSequence();
  1719. }
  1720. bool CPythonNetworkStream::SendExchangeAcceptPacket()
  1721. {
  1722. if (!__CanActMainInstance())
  1723. return true;
  1724. TPacketCGExchange packet;
  1725. packet.header = HEADER_CG_EXCHANGE;
  1726. packet.subheader = EXCHANGE_SUBHEADER_CG_ACCEPT;
  1727. if (!Send(sizeof(packet), &packet))
  1728. {
  1729. Tracef("send_trade_accept_packet Error\n");
  1730. return false;
  1731. }
  1732. return SendSequence();
  1733. }
  1734. bool CPythonNetworkStream::SendExchangeExitPacket()
  1735. {
  1736. if (!__CanActMainInstance())
  1737. return true;
  1738. TPacketCGExchange packet;
  1739. packet.header = HEADER_CG_EXCHANGE;
  1740. packet.subheader = EXCHANGE_SUBHEADER_CG_CANCEL;
  1741. if (!Send(sizeof(packet), &packet))
  1742. {
  1743. Tracef("send_trade_exit_packet Error\n");
  1744. return false;
  1745. }
  1746. return SendSequence();
  1747. }
  1748. // PointReset °³ÀÓ½Ã
  1749. bool CPythonNetworkStream::SendPointResetPacket()
  1750. {
  1751. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "StartPointReset", Py_BuildValue("()"));
  1752. return true;
  1753. }
  1754. bool CPythonNetworkStream::__IsPlayerAttacking()
  1755. {
  1756. CPythonCharacterManager& rkChrMgr=CPythonCharacterManager::Instance();
  1757. CInstanceBase* pkInstMain=rkChrMgr.GetMainInstancePtr();
  1758. if (!pkInstMain)
  1759. return false;
  1760. if (!pkInstMain->IsAttacking())
  1761. return false;
  1762. return true;
  1763. }
  1764. bool CPythonNetworkStream::RecvScriptPacket()
  1765. {
  1766. TPacketGCScript ScriptPacket;
  1767. if (!Recv(sizeof(TPacketGCScript), &ScriptPacket))
  1768. {
  1769. TraceError("RecvScriptPacket_RecvError");
  1770. return false;
  1771. }
  1772. if (ScriptPacket.size < sizeof(TPacketGCScript))
  1773. {
  1774. TraceError("RecvScriptPacket_SizeError");
  1775. return false;
  1776. }
  1777. ScriptPacket.size -= sizeof(TPacketGCScript);
  1778. static string str;
  1779. str = "";
  1780. str.resize(ScriptPacket.size+1);
  1781. if (!Recv(ScriptPacket.size, &str[0]))
  1782. return false;
  1783. str[str.size()-1] = '\0';
  1784. int iIndex = CPythonEventManager::Instance().RegisterEventSetFromString(str);
  1785. if (-1 != iIndex)
  1786. {
  1787. CPythonEventManager::Instance().SetVisibleLineCount(iIndex, 30);
  1788. CPythonNetworkStream::Instance().OnScriptEventStart(ScriptPacket.skin,iIndex);
  1789. }
  1790. return true;
  1791. }
  1792. bool CPythonNetworkStream::SendScriptAnswerPacket(int iAnswer)
  1793. {
  1794. TPacketCGScriptAnswer ScriptAnswer;
  1795. ScriptAnswer.header = HEADER_CG_SCRIPT_ANSWER;
  1796. ScriptAnswer.answer = (BYTE) iAnswer;
  1797. if (!Send(sizeof(TPacketCGScriptAnswer), &ScriptAnswer))
  1798. {
  1799. Tracen("Send Script Answer Packet Error");
  1800. return false;
  1801. }
  1802. return SendSequence();
  1803. }
  1804. bool CPythonNetworkStream::SendScriptButtonPacket(unsigned int iIndex)
  1805. {
  1806. TPacketCGScriptButton ScriptButton;
  1807. ScriptButton.header = HEADER_CG_SCRIPT_BUTTON;
  1808. ScriptButton.idx = iIndex;
  1809. if (!Send(sizeof(TPacketCGScriptButton), &ScriptButton))
  1810. {
  1811. Tracen("Send Script Button Packet Error");
  1812. return false;
  1813. }
  1814. return SendSequence();
  1815. }
  1816. bool CPythonNetworkStream::SendAnswerMakeGuildPacket(const char * c_szName)
  1817. {
  1818. TPacketCGAnswerMakeGuild Packet;
  1819. Packet.header = HEADER_CG_ANSWER_MAKE_GUILD;
  1820. strncpy(Packet.guild_name, c_szName, GUILD_NAME_MAX_LEN);
  1821. Packet.guild_name[GUILD_NAME_MAX_LEN] = '\0';
  1822. if (!Send(sizeof(Packet), &Packet))
  1823. {
  1824. Tracen("SendAnswerMakeGuild Packet Error");
  1825. return false;
  1826. }
  1827. // Tracef(" SendAnswerMakeGuildPacket : %s", c_szName);
  1828. return SendSequence();
  1829. }
  1830. bool CPythonNetworkStream::SendQuestInputStringPacket(const char * c_szString)
  1831. {
  1832. TPacketCGQuestInputString Packet;
  1833. Packet.bHeader = HEADER_CG_QUEST_INPUT_STRING;
  1834. strncpy(Packet.szString, c_szString, QUEST_INPUT_STRING_MAX_NUM);
  1835. if (!Send(sizeof(Packet), &Packet))
  1836. {
  1837. Tracen("SendQuestInputStringPacket Error");
  1838. return false;
  1839. }
  1840. return SendSequence();
  1841. }
  1842. bool CPythonNetworkStream::SendQuestConfirmPacket(BYTE byAnswer, DWORD dwPID)
  1843. {
  1844. TPacketCGQuestConfirm kPacket;
  1845. kPacket.header = HEADER_CG_QUEST_CONFIRM;
  1846. kPacket.answer = byAnswer;
  1847. kPacket.requestPID = dwPID;
  1848. if (!Send(sizeof(kPacket), &kPacket))
  1849. {
  1850. Tracen("SendQuestConfirmPacket Error");
  1851. return false;
  1852. }
  1853. Tracenf(" SendQuestConfirmPacket : %d, %d", byAnswer, dwPID);
  1854. return SendSequence();
  1855. }
  1856. bool CPythonNetworkStream::RecvSkillCoolTimeEnd()
  1857. {
  1858. TPacketGCSkillCoolTimeEnd kPacketSkillCoolTimeEnd;
  1859. if (!Recv(sizeof(kPacketSkillCoolTimeEnd), &kPacketSkillCoolTimeEnd))
  1860. {
  1861. Tracen("CPythonNetworkStream::RecvSkillCoolTimeEnd - RecvError");
  1862. return false;
  1863. }
  1864. CPythonPlayer::Instance().EndSkillCoolTime(kPacketSkillCoolTimeEnd.bSkill);
  1865. return true;
  1866. }
  1867. bool CPythonNetworkStream::RecvSkillLevel()
  1868. {
  1869. assert(!"CPythonNetworkStream::RecvSkillLevel - »ç¿ëÇÏÁö ¾Ê´Â ÇÔ¼ö");
  1870. TPacketGCSkillLevel packet;
  1871. if (!Recv(sizeof(TPacketGCSkillLevel), &packet))
  1872. {
  1873. Tracen("CPythonNetworkStream::RecvSkillLevel - RecvError");
  1874. return false;
  1875. }
  1876. DWORD dwSlotIndex;
  1877. CPythonPlayer& rkPlayer=CPythonPlayer::Instance();
  1878. for (int i = 0; i < SKILL_MAX_NUM; ++i)
  1879. {
  1880. if (rkPlayer.GetSkillSlotIndex(i, &dwSlotIndex))
  1881. rkPlayer.SetSkillLevel(dwSlotIndex, packet.abSkillLevels[i]);
  1882. }
  1883. __RefreshSkillWindow();
  1884. __RefreshStatus();
  1885. Tracef(" >> RecvSkillLevel\n");
  1886. return true;
  1887. }
  1888. bool CPythonNetworkStream::RecvSkillLevelNew()
  1889. {
  1890. TPacketGCSkillLevelNew packet;
  1891. if (!Recv(sizeof(TPacketGCSkillLevelNew), &packet))
  1892. {
  1893. Tracen("CPythonNetworkStream::RecvSkillLevelNew - RecvError");
  1894. return false;
  1895. }
  1896. CPythonPlayer& rkPlayer=CPythonPlayer::Instance();
  1897. rkPlayer.SetSkill(7, 0);
  1898. rkPlayer.SetSkill(8, 0);
  1899. for (int i = 0; i < SKILL_MAX_NUM; ++i)
  1900. {
  1901. TPlayerSkill & rPlayerSkill = packet.skills[i];
  1902. if (i >= 112 && i <= 115 && rPlayerSkill.bLevel)
  1903. rkPlayer.SetSkill(7, i);
  1904. if (i >= 116 && i <= 119 && rPlayerSkill.bLevel)
  1905. rkPlayer.SetSkill(8, i);
  1906. rkPlayer.SetSkillLevel_(i, rPlayerSkill.bMasterType, rPlayerSkill.bLevel);
  1907. }
  1908. __RefreshSkillWindow();
  1909. __RefreshStatus();
  1910. //Tracef(" >> RecvSkillLevelNew\n");
  1911. return true;
  1912. }
  1913. bool CPythonNetworkStream::RecvDamageInfoPacket()
  1914. {
  1915. TPacketGCDamageInfo DamageInfoPacket;
  1916. if (!Recv(sizeof(TPacketGCDamageInfo), &DamageInfoPacket))
  1917. {
  1918. Tracen("Recv Target Packet Error");
  1919. return false;
  1920. }
  1921. CInstanceBase * pInstTarget = CPythonCharacterManager::Instance().GetInstancePtr(DamageInfoPacket.dwVID);
  1922. bool bSelf = (pInstTarget == CPythonCharacterManager::Instance().GetMainInstancePtr());
  1923. bool bTarget = (pInstTarget==m_pInstTarget);
  1924. if (pInstTarget)
  1925. {
  1926. if(DamageInfoPacket.damage >= 0)
  1927. pInstTarget->AddDamageEffect(DamageInfoPacket.damage,DamageInfoPacket.flag,bSelf,bTarget);
  1928. else
  1929. TraceError("Damage is equal or below 0.");
  1930. }
  1931. return true;
  1932. }
  1933. bool CPythonNetworkStream::RecvTargetPacket()
  1934. {
  1935. TPacketGCTarget TargetPacket;
  1936. if (!Recv(sizeof(TPacketGCTarget), &TargetPacket))
  1937. {
  1938. Tracen("Recv Target Packet Error");
  1939. return false;
  1940. }
  1941. CInstanceBase * pInstPlayer = CPythonCharacterManager::Instance().GetMainInstancePtr();
  1942. CInstanceBase * pInstTarget = CPythonCharacterManager::Instance().GetInstancePtr(TargetPacket.dwVID);
  1943. if (pInstPlayer && pInstTarget)
  1944. {
  1945. if (!pInstTarget->IsDead())
  1946. {
  1947. if (pInstTarget->IsPC() || pInstTarget->IsBuilding())
  1948. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "CloseTargetBoardIfDifferent", Py_BuildValue("(i)", TargetPacket.dwVID));
  1949. else if (pInstPlayer->CanViewTargetHP(*pInstTarget))
  1950. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "SetHPTargetBoard", Py_BuildValue("(ii)", TargetPacket.dwVID, TargetPacket.bHPPercent));
  1951. else
  1952. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "CloseTargetBoard", Py_BuildValue("()"));
  1953. m_pInstTarget = pInstTarget;
  1954. }
  1955. }
  1956. else
  1957. {
  1958. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "CloseTargetBoard", Py_BuildValue("()"));
  1959. }
  1960. return true;
  1961. }
  1962. bool CPythonNetworkStream::RecvMountPacket()
  1963. {
  1964. TPacketGCMount MountPacket;
  1965. if (!Recv(sizeof(TPacketGCMount), &MountPacket))
  1966. {
  1967. Tracen("Recv Mount Packet Error");
  1968. return false;
  1969. }
  1970. CInstanceBase * pInstance = CPythonCharacterManager::Instance().GetInstancePtr(MountPacket.vid);
  1971. if (pInstance)
  1972. {
  1973. // Mount
  1974. if (0 != MountPacket.mount_vid)
  1975. {
  1976. // pInstance->Ride(MountPacket.pos, MountPacket.mount_vid);
  1977. }
  1978. // Unmount
  1979. else
  1980. {
  1981. // pInstance->Unride(MountPacket.pos, MountPacket.x, MountPacket.y);
  1982. }
  1983. }
  1984. if (CPythonPlayer::Instance().IsMainCharacterIndex(MountPacket.vid))
  1985. {
  1986. // CPythonPlayer::Instance().SetRidingVehicleIndex(MountPacket.mount_vid);
  1987. }
  1988. return true;
  1989. }
  1990. bool CPythonNetworkStream::RecvChangeSpeedPacket()
  1991. {
  1992. TPacketGCChangeSpeed SpeedPacket;
  1993. if (!Recv(sizeof(TPacketGCChangeSpeed), &SpeedPacket))
  1994. {
  1995. Tracen("Recv Speed Packet Error");
  1996. return false;
  1997. }
  1998. CInstanceBase * pInstance = CPythonCharacterManager::Instance().GetInstancePtr(SpeedPacket.vid);
  1999. if (!pInstance)
  2000. return true;
  2001. // pInstance->SetWalkSpeed(SpeedPacket.walking_speed);
  2002. // pInstance->SetRunSpeed(SpeedPacket.running_speed);
  2003. return true;
  2004. }
  2005. ///////////////////////////////////////////////////////////////////////////////////////////////////
  2006. // Recv
  2007. bool CPythonNetworkStream::SendAttackPacket(UINT uMotAttack, DWORD dwVIDVictim)
  2008. {
  2009. if (!__CanActMainInstance())
  2010. return true;
  2011. #ifdef ATTACK_TIME_LOG
  2012. static DWORD prevTime = timeGetTime();
  2013. DWORD curTime = timeGetTime();
  2014. TraceError("TIME: %.4f(%.4f) ATTACK_PACKET: %d TARGET: %d", curTime/1000.0f, (curTime-prevTime)/1000.0f, uMotAttack, dwVIDVictim);
  2015. prevTime = curTime;
  2016. #endif
  2017. TPacketCGAttack kPacketAtk;
  2018. kPacketAtk.header = HEADER_CG_ATTACK;
  2019. kPacketAtk.bType = uMotAttack;
  2020. kPacketAtk.dwVictimVID = dwVIDVictim;
  2021. if (!SendSpecial(sizeof(kPacketAtk), &kPacketAtk))
  2022. {
  2023. Tracen("Send Battle Attack Packet Error");
  2024. return false;
  2025. }
  2026. return SendSequence();
  2027. }
  2028. bool CPythonNetworkStream::SendSpecial(int nLen, void * pvBuf)
  2029. {
  2030. BYTE bHeader = *(BYTE *) pvBuf;
  2031. switch (bHeader)
  2032. {
  2033. case HEADER_CG_ATTACK:
  2034. {
  2035. TPacketCGAttack * pkPacketAtk = (TPacketCGAttack *) pvBuf;
  2036. pkPacketAtk->bCRCMagicCubeProcPiece = GetProcessCRCMagicCubePiece();
  2037. pkPacketAtk->bCRCMagicCubeFilePiece = GetProcessCRCMagicCubePiece();
  2038. return Send(nLen, pvBuf);
  2039. }
  2040. break;
  2041. }
  2042. return Send(nLen, pvBuf);
  2043. }
  2044. bool CPythonNetworkStream::RecvAddFlyTargetingPacket()
  2045. {
  2046. TPacketGCFlyTargeting kPacket;
  2047. if (!Recv(sizeof(kPacket), &kPacket))
  2048. return false;
  2049. __GlobalPositionToLocalPosition(kPacket.lX, kPacket.lY);
  2050. Tracef("VID [%d]°¡ Ÿ°ÙÀ» Ãß°¡ ¼³Á¤\n",kPacket.dwShooterVID);
  2051. CPythonCharacterManager & rpcm = CPythonCharacterManager::Instance();
  2052. CInstanceBase * pShooter = rpcm.GetInstancePtr(kPacket.dwShooterVID);
  2053. if (!pShooter)
  2054. {
  2055. #ifndef _DEBUG
  2056. TraceError("CPythonNetworkStream::RecvFlyTargetingPacket() - dwShooterVID[%d] NOT EXIST", kPacket.dwShooterVID);
  2057. #endif
  2058. return true;
  2059. }
  2060. CInstanceBase * pTarget = rpcm.GetInstancePtr(kPacket.dwTargetVID);
  2061. if (kPacket.dwTargetVID && pTarget)
  2062. {
  2063. pShooter->GetGraphicThingInstancePtr()->AddFlyTarget(pTarget->GetGraphicThingInstancePtr());
  2064. }
  2065. else
  2066. {
  2067. float h = CPythonBackground::Instance().GetHeight(kPacket.lX,kPacket.lY) + 60.0f; // TEMPORARY HEIGHT
  2068. pShooter->GetGraphicThingInstancePtr()->AddFlyTarget(D3DXVECTOR3(kPacket.lX,kPacket.lY,h));
  2069. //pShooter->GetGraphicThingInstancePtr()->SetFlyTarget(kPacket.kPPosTarget.x,kPacket.kPPosTarget.y,);
  2070. }
  2071. return true;
  2072. }
  2073. bool CPythonNetworkStream::RecvFlyTargetingPacket()
  2074. {
  2075. TPacketGCFlyTargeting kPacket;
  2076. if (!Recv(sizeof(kPacket), &kPacket))
  2077. return false;
  2078. __GlobalPositionToLocalPosition(kPacket.lX, kPacket.lY);
  2079. //Tracef("CPythonNetworkStream::RecvFlyTargetingPacket - VID [%d]\n",kPacket.dwShooterVID);
  2080. CPythonCharacterManager & rpcm = CPythonCharacterManager::Instance();
  2081. CInstanceBase * pShooter = rpcm.GetInstancePtr(kPacket.dwShooterVID);
  2082. if (!pShooter)
  2083. {
  2084. #ifdef _DEBUG
  2085. TraceError("CPythonNetworkStream::RecvFlyTargetingPacket() - dwShooterVID[%d] NOT EXIST", kPacket.dwShooterVID);
  2086. #endif
  2087. return true;
  2088. }
  2089. CInstanceBase * pTarget = rpcm.GetInstancePtr(kPacket.dwTargetVID);
  2090. if (kPacket.dwTargetVID && pTarget)
  2091. {
  2092. pShooter->GetGraphicThingInstancePtr()->SetFlyTarget(pTarget->GetGraphicThingInstancePtr());
  2093. }
  2094. else
  2095. {
  2096. float h = CPythonBackground::Instance().GetHeight(kPacket.lX, kPacket.lY) + 60.0f; // TEMPORARY HEIGHT
  2097. pShooter->GetGraphicThingInstancePtr()->SetFlyTarget(D3DXVECTOR3(kPacket.lX,kPacket.lY,h));
  2098. //pShooter->GetGraphicThingInstancePtr()->SetFlyTarget(kPacket.kPPosTarget.x,kPacket.kPPosTarget.y,);
  2099. }
  2100. return true;
  2101. }
  2102. bool CPythonNetworkStream::SendShootPacket(UINT uSkill)
  2103. {
  2104. TPacketCGShoot kPacketShoot;
  2105. kPacketShoot.bHeader=HEADER_CG_SHOOT;
  2106. kPacketShoot.bType=uSkill;
  2107. if (!Send(sizeof(kPacketShoot), &kPacketShoot))
  2108. {
  2109. Tracen("SendShootPacket Error");
  2110. return false;
  2111. }
  2112. return SendSequence();
  2113. }
  2114. bool CPythonNetworkStream::SendAddFlyTargetingPacket(DWORD dwTargetVID, const TPixelPosition & kPPosTarget)
  2115. {
  2116. TPacketCGFlyTargeting packet;
  2117. //CPythonCharacterManager & rpcm = CPythonCharacterManager::Instance();
  2118. packet.bHeader = HEADER_CG_ADD_FLY_TARGETING;
  2119. packet.dwTargetVID = dwTargetVID;
  2120. packet.lX = kPPosTarget.x;
  2121. packet.lY = kPPosTarget.y;
  2122. __LocalPositionToGlobalPosition(packet.lX, packet.lY);
  2123. if (!Send(sizeof(packet), &packet))
  2124. {
  2125. Tracen("Send FlyTargeting Packet Error");
  2126. return false;
  2127. }
  2128. return SendSequence();
  2129. }
  2130. bool CPythonNetworkStream::SendFlyTargetingPacket(DWORD dwTargetVID, const TPixelPosition & kPPosTarget)
  2131. {
  2132. TPacketCGFlyTargeting packet;
  2133. //CPythonCharacterManager & rpcm = CPythonCharacterManager::Instance();
  2134. packet.bHeader = HEADER_CG_FLY_TARGETING;
  2135. packet.dwTargetVID = dwTargetVID;
  2136. packet.lX = kPPosTarget.x;
  2137. packet.lY = kPPosTarget.y;
  2138. __LocalPositionToGlobalPosition(packet.lX, packet.lY);
  2139. if (!Send(sizeof(packet), &packet))
  2140. {
  2141. Tracen("Send FlyTargeting Packet Error");
  2142. return false;
  2143. }
  2144. return SendSequence();
  2145. }
  2146. bool CPythonNetworkStream::RecvCreateFlyPacket()
  2147. {
  2148. TPacketGCCreateFly kPacket;
  2149. if (!Recv(sizeof(TPacketGCCreateFly), &kPacket))
  2150. return false;
  2151. CFlyingManager& rkFlyMgr = CFlyingManager::Instance();
  2152. CPythonCharacterManager & rkChrMgr = CPythonCharacterManager::Instance();
  2153. CInstanceBase * pkStartInst = rkChrMgr.GetInstancePtr(kPacket.dwStartVID);
  2154. CInstanceBase * pkEndInst = rkChrMgr.GetInstancePtr(kPacket.dwEndVID);
  2155. if (!pkStartInst || !pkEndInst)
  2156. return true;
  2157. rkFlyMgr.CreateIndexedFly(kPacket.bType, pkStartInst->GetGraphicThingInstancePtr(), pkEndInst->GetGraphicThingInstancePtr());
  2158. return true;
  2159. }
  2160. bool CPythonNetworkStream::SendTargetPacket(DWORD dwVID)
  2161. {
  2162. TPacketCGTarget packet;
  2163. packet.header = HEADER_CG_TARGET;
  2164. packet.dwVID = dwVID;
  2165. if (!Send(sizeof(packet), &packet))
  2166. {
  2167. Tracen("Send Target Packet Error");
  2168. return false;
  2169. }
  2170. return SendSequence();
  2171. }
  2172. bool CPythonNetworkStream::SendSyncPositionElementPacket(DWORD dwVictimVID, DWORD dwVictimX, DWORD dwVictimY)
  2173. {
  2174. TPacketCGSyncPositionElement kSyncPos;
  2175. kSyncPos.dwVID=dwVictimVID;
  2176. kSyncPos.lX=dwVictimX;
  2177. kSyncPos.lY=dwVictimY;
  2178. __LocalPositionToGlobalPosition(kSyncPos.lX, kSyncPos.lY);
  2179. if (!Send(sizeof(kSyncPos), &kSyncPos))
  2180. {
  2181. Tracen("CPythonNetworkStream::SendSyncPositionElementPacket - ERROR");
  2182. return false;
  2183. }
  2184. return true;
  2185. }
  2186. bool CPythonNetworkStream::RecvMessenger()
  2187. {
  2188. TPacketGCMessenger p;
  2189. if (!Recv(sizeof(p), &p))
  2190. return false;
  2191. int iSize = p.size - sizeof(p);
  2192. char char_name[24+1];
  2193. switch (p.subheader)
  2194. {
  2195. case MESSENGER_SUBHEADER_GC_LIST:
  2196. {
  2197. TPacketGCMessengerListOnline on;
  2198. while(iSize)
  2199. {
  2200. if (!Recv(sizeof(TPacketGCMessengerListOffline),&on))
  2201. return false;
  2202. if (!Recv(on.length, char_name))
  2203. return false;
  2204. char_name[on.length] = 0;
  2205. if (on.connected & MESSENGER_CONNECTED_STATE_ONLINE)
  2206. CPythonMessenger::Instance().OnFriendLogin(char_name);
  2207. else
  2208. CPythonMessenger::Instance().OnFriendLogout(char_name);
  2209. if (on.connected & MESSENGER_CONNECTED_STATE_MOBILE)
  2210. CPythonMessenger::Instance().SetMobile(char_name, TRUE);
  2211. iSize -= sizeof(TPacketGCMessengerListOffline);
  2212. iSize -= on.length;
  2213. }
  2214. break;
  2215. }
  2216. case MESSENGER_SUBHEADER_GC_LOGIN:
  2217. {
  2218. TPacketGCMessengerLogin p;
  2219. if (!Recv(sizeof(p),&p))
  2220. return false;
  2221. if (!Recv(p.length, char_name))
  2222. return false;
  2223. char_name[p.length] = 0;
  2224. CPythonMessenger::Instance().OnFriendLogin(char_name);
  2225. __RefreshTargetBoardByName(char_name);
  2226. break;
  2227. }
  2228. case MESSENGER_SUBHEADER_GC_LOGOUT:
  2229. {
  2230. TPacketGCMessengerLogout logout;
  2231. if (!Recv(sizeof(logout),&logout))
  2232. return false;
  2233. if (!Recv(logout.length, char_name))
  2234. return false;
  2235. char_name[logout.length] = 0;
  2236. CPythonMessenger::Instance().OnFriendLogout(char_name);
  2237. break;
  2238. }
  2239. case MESSENGER_SUBHEADER_GC_MOBILE:
  2240. {
  2241. BYTE byState; // ¸ğ¹ÙÀÏ ¹øÈ£°¡ ¾ø¾îÁ³´ÂÁö Ç÷¡±×
  2242. BYTE byLength;
  2243. if (!Recv(sizeof(byState), &byState))
  2244. return false;
  2245. if (!Recv(sizeof(byLength), &byLength))
  2246. return false;
  2247. if (!Recv(byLength, char_name))
  2248. return false;
  2249. char_name[byLength] = 0;
  2250. CPythonMessenger::Instance().SetMobile(char_name, byState);
  2251. break;
  2252. }
  2253. }
  2254. return true;
  2255. }
  2256. //////////////////////////////////////////////////////////////////////////
  2257. // Party
  2258. bool CPythonNetworkStream::SendPartyInvitePacket(DWORD dwVID)
  2259. {
  2260. TPacketCGPartyInvite kPartyInvitePacket;
  2261. kPartyInvitePacket.header = HEADER_CG_PARTY_INVITE;
  2262. kPartyInvitePacket.vid = dwVID;
  2263. if (!Send(sizeof(kPartyInvitePacket), &kPartyInvitePacket))
  2264. {
  2265. Tracenf("CPythonNetworkStream::SendPartyInvitePacket [%ud] - PACKET SEND ERROR", dwVID);
  2266. return false;
  2267. }
  2268. Tracef(" << SendPartyInvitePacket : %d\n", dwVID);
  2269. return SendSequence();
  2270. }
  2271. bool CPythonNetworkStream::SendPartyInviteAnswerPacket(DWORD dwLeaderVID, BYTE byAnswer)
  2272. {
  2273. TPacketCGPartyInviteAnswer kPartyInviteAnswerPacket;
  2274. kPartyInviteAnswerPacket.header = HEADER_CG_PARTY_INVITE_ANSWER;
  2275. kPartyInviteAnswerPacket.leader_pid = dwLeaderVID;
  2276. kPartyInviteAnswerPacket.accept = byAnswer;
  2277. if (!Send(sizeof(kPartyInviteAnswerPacket), &kPartyInviteAnswerPacket))
  2278. {
  2279. Tracenf("CPythonNetworkStream::SendPartyInviteAnswerPacket [%ud %ud] - PACKET SEND ERROR", dwLeaderVID, byAnswer);
  2280. return false;
  2281. }
  2282. Tracef(" << SendPartyInviteAnswerPacket : %d, %d\n", dwLeaderVID, byAnswer);
  2283. return SendSequence();
  2284. }
  2285. bool CPythonNetworkStream::SendPartyRemovePacket(DWORD dwPID)
  2286. {
  2287. TPacketCGPartyRemove kPartyInviteRemove;
  2288. kPartyInviteRemove.header = HEADER_CG_PARTY_REMOVE;
  2289. kPartyInviteRemove.pid = dwPID;
  2290. if (!Send(sizeof(kPartyInviteRemove), &kPartyInviteRemove))
  2291. {
  2292. Tracenf("CPythonNetworkStream::SendPartyRemovePacket [%ud] - PACKET SEND ERROR", dwPID);
  2293. return false;
  2294. }
  2295. Tracef(" << SendPartyRemovePacket : %d\n", dwPID);
  2296. return SendSequence();
  2297. }
  2298. bool CPythonNetworkStream::SendPartySetStatePacket(DWORD dwVID, BYTE byState, BYTE byFlag)
  2299. {
  2300. TPacketCGPartySetState kPartySetState;
  2301. kPartySetState.byHeader = HEADER_CG_PARTY_SET_STATE;
  2302. kPartySetState.dwVID = dwVID;
  2303. kPartySetState.byState = byState;
  2304. kPartySetState.byFlag = byFlag;
  2305. if (!Send(sizeof(kPartySetState), &kPartySetState))
  2306. {
  2307. Tracenf("CPythonNetworkStream::SendPartySetStatePacket(%ud, %ud) - PACKET SEND ERROR", dwVID, byState);
  2308. return false;
  2309. }
  2310. Tracef(" << SendPartySetStatePacket : %d, %d, %d\n", dwVID, byState, byFlag);
  2311. return SendSequence();
  2312. }
  2313. bool CPythonNetworkStream::SendPartyUseSkillPacket(BYTE bySkillIndex, DWORD dwVID)
  2314. {
  2315. TPacketCGPartyUseSkill kPartyUseSkill;
  2316. kPartyUseSkill.byHeader = HEADER_CG_PARTY_USE_SKILL;
  2317. kPartyUseSkill.bySkillIndex = bySkillIndex;
  2318. kPartyUseSkill.dwTargetVID = dwVID;
  2319. if (!Send(sizeof(kPartyUseSkill), &kPartyUseSkill))
  2320. {
  2321. Tracenf("CPythonNetworkStream::SendPartyUseSkillPacket(%ud, %ud) - PACKET SEND ERROR", bySkillIndex, dwVID);
  2322. return false;
  2323. }
  2324. Tracef(" << SendPartyUseSkillPacket : %d, %d\n", bySkillIndex, dwVID);
  2325. return SendSequence();
  2326. }
  2327. bool CPythonNetworkStream::SendPartyParameterPacket(BYTE byDistributeMode)
  2328. {
  2329. TPacketCGPartyParameter kPartyParameter;
  2330. kPartyParameter.bHeader = HEADER_CG_PARTY_PARAMETER;
  2331. kPartyParameter.bDistributeMode = byDistributeMode;
  2332. if (!Send(sizeof(kPartyParameter), &kPartyParameter))
  2333. {
  2334. Tracenf("CPythonNetworkStream::SendPartyParameterPacket(%d) - PACKET SEND ERROR", byDistributeMode);
  2335. return false;
  2336. }
  2337. Tracef(" << SendPartyParameterPacket : %d\n", byDistributeMode);
  2338. return SendSequence();
  2339. }
  2340. bool CPythonNetworkStream::RecvPartyInvite()
  2341. {
  2342. TPacketGCPartyInvite kPartyInvitePacket;
  2343. if (!Recv(sizeof(kPartyInvitePacket), &kPartyInvitePacket))
  2344. return false;
  2345. CInstanceBase * pInstance = CPythonCharacterManager::Instance().GetInstancePtr(kPartyInvitePacket.leader_pid);
  2346. if (!pInstance)
  2347. {
  2348. TraceError(" CPythonNetworkStream::RecvPartyInvite - Failed to find leader instance [%d]\n", kPartyInvitePacket.leader_pid);
  2349. return true;
  2350. }
  2351. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "RecvPartyInviteQuestion", Py_BuildValue("(is)", kPartyInvitePacket.leader_pid, pInstance->GetNameString()));
  2352. Tracef(" >> RecvPartyInvite : %d, %s\n", kPartyInvitePacket.leader_pid, pInstance->GetNameString());
  2353. return true;
  2354. }
  2355. bool CPythonNetworkStream::RecvPartyAdd()
  2356. {
  2357. TPacketGCPartyAdd kPartyAddPacket;
  2358. if (!Recv(sizeof(kPartyAddPacket), &kPartyAddPacket))
  2359. return false;
  2360. CPythonPlayer::Instance().AppendPartyMember(kPartyAddPacket.pid, kPartyAddPacket.name);
  2361. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "AddPartyMember", Py_BuildValue("(is)", kPartyAddPacket.pid, kPartyAddPacket.name));
  2362. Tracef(" >> RecvPartyAdd : %d, %s\n", kPartyAddPacket.pid, kPartyAddPacket.name);
  2363. return true;
  2364. }
  2365. bool CPythonNetworkStream::RecvPartyUpdate()
  2366. {
  2367. TPacketGCPartyUpdate kPartyUpdatePacket;
  2368. if (!Recv(sizeof(kPartyUpdatePacket), &kPartyUpdatePacket))
  2369. return false;
  2370. CPythonPlayer::TPartyMemberInfo * pPartyMemberInfo;
  2371. if (!CPythonPlayer::Instance().GetPartyMemberPtr(kPartyUpdatePacket.pid, &pPartyMemberInfo))
  2372. return true;
  2373. BYTE byOldState = pPartyMemberInfo->byState;
  2374. CPythonPlayer::Instance().UpdatePartyMemberInfo(kPartyUpdatePacket.pid, kPartyUpdatePacket.state, kPartyUpdatePacket.percent_hp);
  2375. for (int i = 0; i < PARTY_AFFECT_SLOT_MAX_NUM; ++i)
  2376. {
  2377. CPythonPlayer::Instance().UpdatePartyMemberAffect(kPartyUpdatePacket.pid, i, kPartyUpdatePacket.affects[i]);
  2378. }
  2379. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "UpdatePartyMemberInfo", Py_BuildValue("(i)", kPartyUpdatePacket.pid));
  2380. // ¸¸¾à ¸®´õ°¡ ¹Ù²î¾ú´Ù¸é, TargetBoard ÀÇ ¹öưÀ» ¾÷µ¥ÀÌÆ® ÇÑ´Ù.
  2381. DWORD dwVID;
  2382. if (CPythonPlayer::Instance().PartyMemberPIDToVID(kPartyUpdatePacket.pid, &dwVID))
  2383. if (byOldState != kPartyUpdatePacket.state)
  2384. {
  2385. __RefreshTargetBoardByVID(dwVID);
  2386. }
  2387. // Tracef(" >> RecvPartyUpdate : %d, %d, %d\n", kPartyUpdatePacket.pid, kPartyUpdatePacket.state, kPartyUpdatePacket.percent_hp);
  2388. return true;
  2389. }
  2390. bool CPythonNetworkStream::RecvPartyRemove()
  2391. {
  2392. TPacketGCPartyRemove kPartyRemovePacket;
  2393. if (!Recv(sizeof(kPartyRemovePacket), &kPartyRemovePacket))
  2394. return false;
  2395. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "RemovePartyMember", Py_BuildValue("(i)", kPartyRemovePacket.pid));
  2396. Tracef(" >> RecvPartyRemove : %d\n", kPartyRemovePacket.pid);
  2397. return true;
  2398. }
  2399. bool CPythonNetworkStream::RecvPartyLink()
  2400. {
  2401. TPacketGCPartyLink kPartyLinkPacket;
  2402. if (!Recv(sizeof(kPartyLinkPacket), &kPartyLinkPacket))
  2403. return false;
  2404. CPythonPlayer::Instance().LinkPartyMember(kPartyLinkPacket.pid, kPartyLinkPacket.vid);
  2405. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "LinkPartyMember", Py_BuildValue("(ii)", kPartyLinkPacket.pid, kPartyLinkPacket.vid));
  2406. Tracef(" >> RecvPartyLink : %d, %d\n", kPartyLinkPacket.pid, kPartyLinkPacket.vid);
  2407. return true;
  2408. }
  2409. bool CPythonNetworkStream::RecvPartyUnlink()
  2410. {
  2411. TPacketGCPartyUnlink kPartyUnlinkPacket;
  2412. if (!Recv(sizeof(kPartyUnlinkPacket), &kPartyUnlinkPacket))
  2413. return false;
  2414. CPythonPlayer::Instance().UnlinkPartyMember(kPartyUnlinkPacket.pid);
  2415. if (CPythonPlayer::Instance().IsMainCharacterIndex(kPartyUnlinkPacket.vid))
  2416. {
  2417. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "UnlinkAllPartyMember", Py_BuildValue("()"));
  2418. }
  2419. else
  2420. {
  2421. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "UnlinkPartyMember", Py_BuildValue("(i)", kPartyUnlinkPacket.pid));
  2422. }
  2423. Tracef(" >> RecvPartyUnlink : %d, %d\n", kPartyUnlinkPacket.pid, kPartyUnlinkPacket.vid);
  2424. return true;
  2425. }
  2426. bool CPythonNetworkStream::RecvPartyParameter()
  2427. {
  2428. TPacketGCPartyParameter kPartyParameterPacket;
  2429. if (!Recv(sizeof(kPartyParameterPacket), &kPartyParameterPacket))
  2430. return false;
  2431. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "ChangePartyParameter", Py_BuildValue("(i)", kPartyParameterPacket.bDistributeMode));
  2432. Tracef(" >> RecvPartyParameter : %d\n", kPartyParameterPacket.bDistributeMode);
  2433. return true;
  2434. }
  2435. // Party
  2436. //////////////////////////////////////////////////////////////////////////
  2437. //////////////////////////////////////////////////////////////////////////
  2438. // Guild
  2439. bool CPythonNetworkStream::SendGuildAddMemberPacket(DWORD dwVID)
  2440. {
  2441. TPacketCGGuild GuildPacket;
  2442. GuildPacket.byHeader = HEADER_CG_GUILD;
  2443. GuildPacket.bySubHeader = GUILD_SUBHEADER_CG_ADD_MEMBER;
  2444. if (!Send(sizeof(GuildPacket), &GuildPacket))
  2445. return false;
  2446. if (!Send(sizeof(dwVID), &dwVID))
  2447. return false;
  2448. Tracef(" SendGuildAddMemberPacket\n", dwVID);
  2449. return SendSequence();
  2450. }
  2451. bool CPythonNetworkStream::SendGuildRemoveMemberPacket(DWORD dwPID)
  2452. {
  2453. TPacketCGGuild GuildPacket;
  2454. GuildPacket.byHeader = HEADER_CG_GUILD;
  2455. GuildPacket.bySubHeader = GUILD_SUBHEADER_CG_REMOVE_MEMBER;
  2456. if (!Send(sizeof(GuildPacket), &GuildPacket))
  2457. return false;
  2458. if (!Send(sizeof(dwPID), &dwPID))
  2459. return false;
  2460. Tracef(" SendGuildRemoveMemberPacket %d\n", dwPID);
  2461. return SendSequence();
  2462. }
  2463. bool CPythonNetworkStream::SendGuildChangeGradeNamePacket(BYTE byGradeNumber, const char * c_szName)
  2464. {
  2465. TPacketCGGuild GuildPacket;
  2466. GuildPacket.byHeader = HEADER_CG_GUILD;
  2467. GuildPacket.bySubHeader = GUILD_SUBHEADER_CG_CHANGE_GRADE_NAME;
  2468. if (!Send(sizeof(GuildPacket), &GuildPacket))
  2469. return false;
  2470. if (!Send(sizeof(byGradeNumber), &byGradeNumber))
  2471. return false;
  2472. char szName[GUILD_GRADE_NAME_MAX_LEN+1];
  2473. strncpy(szName, c_szName, GUILD_GRADE_NAME_MAX_LEN);
  2474. szName[GUILD_GRADE_NAME_MAX_LEN] = '\0';
  2475. if (!Send(sizeof(szName), &szName))
  2476. return false;
  2477. Tracef(" SendGuildChangeGradeNamePacket %d, %s\n", byGradeNumber, c_szName);
  2478. return SendSequence();
  2479. }
  2480. bool CPythonNetworkStream::SendGuildChangeGradeAuthorityPacket(BYTE byGradeNumber, BYTE byAuthority)
  2481. {
  2482. TPacketCGGuild GuildPacket;
  2483. GuildPacket.byHeader = HEADER_CG_GUILD;
  2484. GuildPacket.bySubHeader = GUILD_SUBHEADER_CG_CHANGE_GRADE_AUTHORITY;
  2485. if (!Send(sizeof(GuildPacket), &GuildPacket))
  2486. return false;
  2487. if (!Send(sizeof(byGradeNumber), &byGradeNumber))
  2488. return false;
  2489. if (!Send(sizeof(byAuthority), &byAuthority))
  2490. return false;
  2491. Tracef(" SendGuildChangeGradeAuthorityPacket %d, %d\n", byGradeNumber, byAuthority);
  2492. return SendSequence();
  2493. }
  2494. bool CPythonNetworkStream::SendGuildOfferPacket(DWORD dwExperience)
  2495. {
  2496. TPacketCGGuild GuildPacket;
  2497. GuildPacket.byHeader = HEADER_CG_GUILD;
  2498. GuildPacket.bySubHeader = GUILD_SUBHEADER_CG_OFFER;
  2499. if (!Send(sizeof(GuildPacket), &GuildPacket))
  2500. return false;
  2501. if (!Send(sizeof(dwExperience), &dwExperience))
  2502. return false;
  2503. Tracef(" SendGuildOfferPacket %d\n", dwExperience);
  2504. return SendSequence();
  2505. }
  2506. bool CPythonNetworkStream::SendGuildPostCommentPacket(const char * c_szMessage)
  2507. {
  2508. TPacketCGGuild GuildPacket;
  2509. GuildPacket.byHeader = HEADER_CG_GUILD;
  2510. GuildPacket.bySubHeader = GUILD_SUBHEADER_CG_POST_COMMENT;
  2511. if (!Send(sizeof(GuildPacket), &GuildPacket))
  2512. return false;
  2513. BYTE bySize = BYTE(strlen(c_szMessage)) + 1;
  2514. if (!Send(sizeof(bySize), &bySize))
  2515. return false;
  2516. if (!Send(bySize, c_szMessage))
  2517. return false;
  2518. Tracef(" SendGuildPostCommentPacket %d, %s\n", bySize, c_szMessage);
  2519. return SendSequence();
  2520. }
  2521. bool CPythonNetworkStream::SendGuildDeleteCommentPacket(DWORD dwIndex)
  2522. {
  2523. TPacketCGGuild GuildPacket;
  2524. GuildPacket.byHeader = HEADER_CG_GUILD;
  2525. GuildPacket.bySubHeader = GUILD_SUBHEADER_CG_DELETE_COMMENT;
  2526. if (!Send(sizeof(GuildPacket), &GuildPacket))
  2527. return false;
  2528. if (!Send(sizeof(dwIndex), &dwIndex))
  2529. return false;
  2530. Tracef(" SendGuildDeleteCommentPacket %d\n", dwIndex);
  2531. return SendSequence();
  2532. }
  2533. bool CPythonNetworkStream::SendGuildRefreshCommentsPacket(DWORD dwHighestIndex)
  2534. {
  2535. static DWORD s_LastTime = timeGetTime() - 1001;
  2536. if (timeGetTime() - s_LastTime < 1000)
  2537. return true;
  2538. s_LastTime = timeGetTime();
  2539. TPacketCGGuild GuildPacket;
  2540. GuildPacket.byHeader = HEADER_CG_GUILD;
  2541. GuildPacket.bySubHeader = GUILD_SUBHEADER_CG_REFRESH_COMMENT;
  2542. if (!Send(sizeof(GuildPacket), &GuildPacket))
  2543. return false;
  2544. Tracef(" SendGuildRefreshCommentPacket %d\n", dwHighestIndex);
  2545. return SendSequence();
  2546. }
  2547. bool CPythonNetworkStream::SendGuildChangeMemberGradePacket(DWORD dwPID, BYTE byGrade)
  2548. {
  2549. TPacketCGGuild GuildPacket;
  2550. GuildPacket.byHeader = HEADER_CG_GUILD;
  2551. GuildPacket.bySubHeader = GUILD_SUBHEADER_CG_CHANGE_MEMBER_GRADE;
  2552. if (!Send(sizeof(GuildPacket), &GuildPacket))
  2553. return false;
  2554. if (!Send(sizeof(dwPID), &dwPID))
  2555. return false;
  2556. if (!Send(sizeof(byGrade), &byGrade))
  2557. return false;
  2558. Tracef(" SendGuildChangeMemberGradePacket %d, %d\n", dwPID, byGrade);
  2559. return SendSequence();
  2560. }
  2561. bool CPythonNetworkStream::SendGuildUseSkillPacket(DWORD dwSkillID, DWORD dwTargetVID)
  2562. {
  2563. TPacketCGGuild GuildPacket;
  2564. GuildPacket.byHeader = HEADER_CG_GUILD;
  2565. GuildPacket.bySubHeader = GUILD_SUBHEADER_CG_USE_SKILL;
  2566. if (!Send(sizeof(GuildPacket), &GuildPacket))
  2567. return false;
  2568. if (!Send(sizeof(dwSkillID), &dwSkillID))
  2569. return false;
  2570. if (!Send(sizeof(dwTargetVID), &dwTargetVID))
  2571. return false;
  2572. Tracef(" SendGuildUseSkillPacket %d, %d\n", dwSkillID, dwTargetVID);
  2573. return SendSequence();
  2574. }
  2575. bool CPythonNetworkStream::SendGuildChangeMemberGeneralPacket(DWORD dwPID, BYTE byFlag)
  2576. {
  2577. TPacketCGGuild GuildPacket;
  2578. GuildPacket.byHeader = HEADER_CG_GUILD;
  2579. GuildPacket.bySubHeader = GUILD_SUBHEADER_CG_CHANGE_MEMBER_GENERAL;
  2580. if (!Send(sizeof(GuildPacket), &GuildPacket))
  2581. return false;
  2582. if (!Send(sizeof(dwPID), &dwPID))
  2583. return false;
  2584. if (!Send(sizeof(byFlag), &byFlag))
  2585. return false;
  2586. Tracef(" SendGuildChangeMemberGeneralFlagPacket %d, %d\n", dwPID, byFlag);
  2587. return SendSequence();
  2588. }
  2589. bool CPythonNetworkStream::SendGuildInviteAnswerPacket(DWORD dwGuildID, BYTE byAnswer)
  2590. {
  2591. TPacketCGGuild GuildPacket;
  2592. GuildPacket.byHeader = HEADER_CG_GUILD;
  2593. GuildPacket.bySubHeader = GUILD_SUBHEADER_CG_GUILD_INVITE_ANSWER;
  2594. if (!Send(sizeof(GuildPacket), &GuildPacket))
  2595. return false;
  2596. if (!Send(sizeof(dwGuildID), &dwGuildID))
  2597. return false;
  2598. if (!Send(sizeof(byAnswer), &byAnswer))
  2599. return false;
  2600. Tracef(" SendGuildInviteAnswerPacket %d, %d\n", dwGuildID, byAnswer);
  2601. return SendSequence();
  2602. }
  2603. bool CPythonNetworkStream::SendGuildChargeGSPPacket(DWORD dwMoney)
  2604. {
  2605. TPacketCGGuild GuildPacket;
  2606. GuildPacket.byHeader = HEADER_CG_GUILD;
  2607. GuildPacket.bySubHeader = GUILD_SUBHEADER_CG_CHARGE_GSP;
  2608. if (!Send(sizeof(GuildPacket), &GuildPacket))
  2609. return false;
  2610. if (!Send(sizeof(dwMoney), &dwMoney))
  2611. return false;
  2612. Tracef(" SendGuildChargeGSPPacket %d\n", dwMoney);
  2613. return SendSequence();
  2614. }
  2615. bool CPythonNetworkStream::SendGuildDepositMoneyPacket(DWORD dwMoney)
  2616. {
  2617. TPacketCGGuild GuildPacket;
  2618. GuildPacket.byHeader = HEADER_CG_GUILD;
  2619. GuildPacket.bySubHeader = GUILD_SUBHEADER_CG_DEPOSIT_MONEY;
  2620. if (!Send(sizeof(GuildPacket), &GuildPacket))
  2621. return false;
  2622. if (!Send(sizeof(dwMoney), &dwMoney))
  2623. return false;
  2624. Tracef(" SendGuildDepositMoneyPacket %d\n", dwMoney);
  2625. return SendSequence();
  2626. }
  2627. bool CPythonNetworkStream::SendGuildWithdrawMoneyPacket(DWORD dwMoney)
  2628. {
  2629. TPacketCGGuild GuildPacket;
  2630. GuildPacket.byHeader = HEADER_CG_GUILD;
  2631. GuildPacket.bySubHeader = GUILD_SUBHEADER_CG_WITHDRAW_MONEY;
  2632. if (!Send(sizeof(GuildPacket), &GuildPacket))
  2633. return false;
  2634. if (!Send(sizeof(dwMoney), &dwMoney))
  2635. return false;
  2636. Tracef(" SendGuildWithdrawMoneyPacket %d\n", dwMoney);
  2637. return SendSequence();
  2638. }
  2639. bool CPythonNetworkStream::RecvGuild()
  2640. {
  2641. TPacketGCGuild GuildPacket;
  2642. if (!Recv(sizeof(GuildPacket), &GuildPacket))
  2643. return false;
  2644. switch(GuildPacket.subheader)
  2645. {
  2646. case GUILD_SUBHEADER_GC_LOGIN:
  2647. {
  2648. DWORD dwPID;
  2649. if (!Recv(sizeof(DWORD), &dwPID))
  2650. return false;
  2651. // Messenger
  2652. CPythonGuild::TGuildMemberData * pGuildMemberData;
  2653. if (CPythonGuild::Instance().GetMemberDataPtrByPID(dwPID, &pGuildMemberData))
  2654. if (0 != pGuildMemberData->strName.compare(CPythonPlayer::Instance().GetName()))
  2655. CPythonMessenger::Instance().LoginGuildMember(pGuildMemberData->strName.c_str());
  2656. //Tracef(" <Login> %d\n", dwPID);
  2657. break;
  2658. }
  2659. case GUILD_SUBHEADER_GC_LOGOUT:
  2660. {
  2661. DWORD dwPID;
  2662. if (!Recv(sizeof(DWORD), &dwPID))
  2663. return false;
  2664. // Messenger
  2665. CPythonGuild::TGuildMemberData * pGuildMemberData;
  2666. if (CPythonGuild::Instance().GetMemberDataPtrByPID(dwPID, &pGuildMemberData))
  2667. if (0 != pGuildMemberData->strName.compare(CPythonPlayer::Instance().GetName()))
  2668. CPythonMessenger::Instance().LogoutGuildMember(pGuildMemberData->strName.c_str());
  2669. //Tracef(" <Logout> %d\n", dwPID);
  2670. break;
  2671. }
  2672. case GUILD_SUBHEADER_GC_REMOVE:
  2673. {
  2674. DWORD dwPID;
  2675. if (!Recv(sizeof(dwPID), &dwPID))
  2676. return false;
  2677. // Main Player ÀÏ °æ¿ì DeleteGuild
  2678. if (CPythonGuild::Instance().IsMainPlayer(dwPID))
  2679. {
  2680. CPythonGuild::Instance().Destroy();
  2681. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "DeleteGuild", Py_BuildValue("()"));
  2682. CPythonMessenger::Instance().RemoveAllGuildMember();
  2683. __SetGuildID(0);
  2684. __RefreshMessengerWindow();
  2685. __RefreshTargetBoard();
  2686. __RefreshCharacterWindow();
  2687. }
  2688. else
  2689. {
  2690. // Get Member Name
  2691. std::string strMemberName = "";
  2692. CPythonGuild::TGuildMemberData * pData;
  2693. if (CPythonGuild::Instance().GetMemberDataPtrByPID(dwPID, &pData))
  2694. {
  2695. strMemberName = pData->strName;
  2696. CPythonMessenger::Instance().RemoveGuildMember(pData->strName.c_str());
  2697. }
  2698. CPythonGuild::Instance().RemoveMember(dwPID);
  2699. // Refresh
  2700. __RefreshTargetBoardByName(strMemberName.c_str());
  2701. __RefreshGuildWindowMemberPage();
  2702. }
  2703. Tracef(" <Remove> %d\n", dwPID);
  2704. break;
  2705. }
  2706. case GUILD_SUBHEADER_GC_LIST:
  2707. {
  2708. int iPacketSize = int(GuildPacket.size) - sizeof(GuildPacket);
  2709. for (; iPacketSize > 0;)
  2710. {
  2711. TPacketGCGuildSubMember memberPacket;
  2712. if (!Recv(sizeof(memberPacket), &memberPacket))
  2713. return false;
  2714. char szName[CHARACTER_NAME_MAX_LEN+1] = "";
  2715. if (memberPacket.byNameFlag)
  2716. {
  2717. if (!Recv(sizeof(szName), &szName))
  2718. return false;
  2719. iPacketSize -= CHARACTER_NAME_MAX_LEN+1;
  2720. }
  2721. else
  2722. {
  2723. CPythonGuild::TGuildMemberData * pMemberData;
  2724. if (CPythonGuild::Instance().GetMemberDataPtrByPID(memberPacket.pid, &pMemberData))
  2725. {
  2726. strncpy(szName, pMemberData->strName.c_str(), CHARACTER_NAME_MAX_LEN);
  2727. }
  2728. }
  2729. //Tracef(" <List> %d : %s, %d (%d, %d, %d)\n", memberPacket.pid, szName, memberPacket.byGrade, memberPacket.byJob, memberPacket.byLevel, memberPacket.dwOffer);
  2730. CPythonGuild::SGuildMemberData GuildMemberData;
  2731. GuildMemberData.dwPID = memberPacket.pid;
  2732. GuildMemberData.byGrade = memberPacket.byGrade;
  2733. GuildMemberData.strName = szName;
  2734. GuildMemberData.byJob = memberPacket.byJob;
  2735. GuildMemberData.byLevel = memberPacket.byLevel;
  2736. GuildMemberData.dwOffer = memberPacket.dwOffer;
  2737. GuildMemberData.byGeneralFlag = memberPacket.byIsGeneral;
  2738. CPythonGuild::Instance().RegisterMember(GuildMemberData);
  2739. // Messenger
  2740. if (strcmp(szName, CPythonPlayer::Instance().GetName()))
  2741. CPythonMessenger::Instance().AppendGuildMember(szName);
  2742. __RefreshTargetBoardByName(szName);
  2743. iPacketSize -= sizeof(memberPacket);
  2744. }
  2745. __RefreshGuildWindowInfoPage();
  2746. __RefreshGuildWindowMemberPage();
  2747. __RefreshMessengerWindow();
  2748. __RefreshCharacterWindow();
  2749. break;
  2750. }
  2751. case GUILD_SUBHEADER_GC_GRADE:
  2752. {
  2753. BYTE byCount;
  2754. if (!Recv(sizeof(byCount), &byCount))
  2755. return false;
  2756. for (BYTE i = 0; i < byCount; ++ i)
  2757. {
  2758. BYTE byIndex;
  2759. if (!Recv(sizeof(byCount), &byIndex))
  2760. return false;
  2761. TPacketGCGuildSubGrade GradePacket;
  2762. if (!Recv(sizeof(GradePacket), &GradePacket))
  2763. return false;
  2764. CPythonGuild::Instance().SetGradeData(byIndex, CPythonGuild::SGuildGradeData(GradePacket.auth_flag, GradePacket.grade_name));
  2765. //Tracef(" <Grade> [%d/%d] : %s, %d\n", byIndex, byCount, GradePacket.grade_name, GradePacket.auth_flag);
  2766. }
  2767. __RefreshGuildWindowGradePage();
  2768. __RefreshGuildWindowMemberPageGradeComboBox();
  2769. break;
  2770. }
  2771. case GUILD_SUBHEADER_GC_GRADE_NAME:
  2772. {
  2773. BYTE byGradeNumber;
  2774. if (!Recv(sizeof(byGradeNumber), &byGradeNumber))
  2775. return false;
  2776. char szGradeName[GUILD_GRADE_NAME_MAX_LEN+1] = "";
  2777. if (!Recv(sizeof(szGradeName), &szGradeName))
  2778. return false;
  2779. CPythonGuild::Instance().SetGradeName(byGradeNumber, szGradeName);
  2780. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "RefreshGuildGrade", Py_BuildValue("()"));
  2781. Tracef(" <Change Grade Name> %d, %s\n", byGradeNumber, szGradeName);
  2782. __RefreshGuildWindowGradePage();
  2783. __RefreshGuildWindowMemberPageGradeComboBox();
  2784. break;
  2785. }
  2786. case GUILD_SUBHEADER_GC_GRADE_AUTH:
  2787. {
  2788. BYTE byGradeNumber;
  2789. if (!Recv(sizeof(byGradeNumber), &byGradeNumber))
  2790. return false;
  2791. BYTE byAuthorityFlag;
  2792. if (!Recv(sizeof(byAuthorityFlag), &byAuthorityFlag))
  2793. return false;
  2794. CPythonGuild::Instance().SetGradeAuthority(byGradeNumber, byAuthorityFlag);
  2795. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "RefreshGuildGrade", Py_BuildValue("()"));
  2796. Tracef(" <Change Grade Authority> %d, %d\n", byGradeNumber, byAuthorityFlag);
  2797. __RefreshGuildWindowGradePage();
  2798. break;
  2799. }
  2800. case GUILD_SUBHEADER_GC_INFO:
  2801. {
  2802. TPacketGCGuildInfo GuildInfo;
  2803. if (!Recv(sizeof(GuildInfo), &GuildInfo))
  2804. return false;
  2805. CPythonGuild::Instance().EnableGuild();
  2806. CPythonGuild::TGuildInfo & rGuildInfo = CPythonGuild::Instance().GetGuildInfoRef();
  2807. strncpy(rGuildInfo.szGuildName, GuildInfo.name, GUILD_NAME_MAX_LEN);
  2808. rGuildInfo.szGuildName[GUILD_NAME_MAX_LEN] = '\0';
  2809. rGuildInfo.dwGuildID = GuildInfo.guild_id;
  2810. rGuildInfo.dwMasterPID = GuildInfo.master_pid;
  2811. rGuildInfo.dwGuildLevel = GuildInfo.level;
  2812. rGuildInfo.dwCurrentExperience = GuildInfo.exp;
  2813. rGuildInfo.dwCurrentMemberCount = GuildInfo.member_count;
  2814. rGuildInfo.dwMaxMemberCount = GuildInfo.max_member_count;
  2815. rGuildInfo.dwGuildMoney = GuildInfo.gold;
  2816. rGuildInfo.bHasLand = GuildInfo.hasLand;
  2817. //Tracef(" <Info> %s, %d, %d : %d\n", GuildInfo.name, GuildInfo.master_pid, GuildInfo.level, rGuildInfo.bHasLand);
  2818. __RefreshGuildWindowInfoPage();
  2819. break;
  2820. }
  2821. case GUILD_SUBHEADER_GC_COMMENTS:
  2822. {
  2823. BYTE byCount;
  2824. if (!Recv(sizeof(byCount), &byCount))
  2825. return false;
  2826. CPythonGuild::Instance().ClearComment();
  2827. //Tracef(" >>> Comments Count : %d\n", byCount);
  2828. for (BYTE i = 0; i < byCount; ++i)
  2829. {
  2830. DWORD dwCommentID;
  2831. if (!Recv(sizeof(dwCommentID), &dwCommentID))
  2832. return false;
  2833. char szName[CHARACTER_NAME_MAX_LEN+1] = "";
  2834. if (!Recv(sizeof(szName), &szName))
  2835. return false;
  2836. char szComment[GULID_COMMENT_MAX_LEN+1] = "";
  2837. if (!Recv(sizeof(szComment), &szComment))
  2838. return false;
  2839. //Tracef(" [Comment-%d] : %s, %s\n", dwCommentID, szName, szComment);
  2840. CPythonGuild::Instance().RegisterComment(dwCommentID, szName, szComment);
  2841. }
  2842. __RefreshGuildWindowBoardPage();
  2843. break;
  2844. }
  2845. case GUILD_SUBHEADER_GC_CHANGE_EXP:
  2846. {
  2847. BYTE byLevel;
  2848. if (!Recv(sizeof(byLevel), &byLevel))
  2849. return false;
  2850. DWORD dwEXP;
  2851. if (!Recv(sizeof(dwEXP), &dwEXP))
  2852. return false;
  2853. CPythonGuild::Instance().SetGuildEXP(byLevel, dwEXP);
  2854. Tracef(" <ChangeEXP> %d, %d\n", byLevel, dwEXP);
  2855. __RefreshGuildWindowInfoPage();
  2856. break;
  2857. }
  2858. case GUILD_SUBHEADER_GC_CHANGE_MEMBER_GRADE:
  2859. {
  2860. DWORD dwPID;
  2861. if (!Recv(sizeof(dwPID), &dwPID))
  2862. return false;
  2863. BYTE byGrade;
  2864. if (!Recv(sizeof(byGrade), &byGrade))
  2865. return false;
  2866. CPythonGuild::Instance().ChangeGuildMemberGrade(dwPID, byGrade);
  2867. Tracef(" <ChangeMemberGrade> %d, %d\n", dwPID, byGrade);
  2868. __RefreshGuildWindowMemberPage();
  2869. break;
  2870. }
  2871. case GUILD_SUBHEADER_GC_SKILL_INFO:
  2872. {
  2873. CPythonGuild::TGuildSkillData & rSkillData = CPythonGuild::Instance().GetGuildSkillDataRef();
  2874. if (!Recv(sizeof(rSkillData.bySkillPoint), &rSkillData.bySkillPoint))
  2875. return false;
  2876. if (!Recv(sizeof(rSkillData.bySkillLevel), rSkillData.bySkillLevel))
  2877. return false;
  2878. if (!Recv(sizeof(rSkillData.wGuildPoint), &rSkillData.wGuildPoint))
  2879. return false;
  2880. if (!Recv(sizeof(rSkillData.wMaxGuildPoint), &rSkillData.wMaxGuildPoint))
  2881. return false;
  2882. Tracef(" <SkillInfo> %d / %d, %d\n", rSkillData.bySkillPoint, rSkillData.wGuildPoint, rSkillData.wMaxGuildPoint);
  2883. __RefreshGuildWindowSkillPage();
  2884. break;
  2885. }
  2886. case GUILD_SUBHEADER_GC_CHANGE_MEMBER_GENERAL:
  2887. {
  2888. DWORD dwPID;
  2889. if (!Recv(sizeof(dwPID), &dwPID))
  2890. return false;
  2891. BYTE byFlag;
  2892. if (!Recv(sizeof(byFlag), &byFlag))
  2893. return false;
  2894. CPythonGuild::Instance().ChangeGuildMemberGeneralFlag(dwPID, byFlag);
  2895. Tracef(" <ChangeMemberGeneralFlag> %d, %d\n", dwPID, byFlag);
  2896. __RefreshGuildWindowMemberPage();
  2897. break;
  2898. }
  2899. case GUILD_SUBHEADER_GC_GUILD_INVITE:
  2900. {
  2901. DWORD dwGuildID;
  2902. if (!Recv(sizeof(dwGuildID), &dwGuildID))
  2903. return false;
  2904. char szGuildName[GUILD_NAME_MAX_LEN+1];
  2905. if (!Recv(GUILD_NAME_MAX_LEN, &szGuildName))
  2906. return false;
  2907. szGuildName[GUILD_NAME_MAX_LEN] = 0;
  2908. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "RecvGuildInviteQuestion", Py_BuildValue("(is)", dwGuildID, szGuildName));
  2909. Tracef(" <Guild Invite> %d, %s\n", dwGuildID, szGuildName);
  2910. break;
  2911. }
  2912. case GUILD_SUBHEADER_GC_WAR:
  2913. {
  2914. TPacketGCGuildWar kGuildWar;
  2915. if (!Recv(sizeof(kGuildWar), &kGuildWar))
  2916. return false;
  2917. switch (kGuildWar.bWarState)
  2918. {
  2919. case GUILD_WAR_SEND_DECLARE:
  2920. Tracef(" >> GUILD_SUBHEADER_GC_WAR : GUILD_WAR_SEND_DECLARE\n");
  2921. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME],
  2922. "BINARY_GuildWar_OnSendDeclare",
  2923. Py_BuildValue("(i)", kGuildWar.dwGuildOpp)
  2924. );
  2925. break;
  2926. case GUILD_WAR_RECV_DECLARE:
  2927. Tracef(" >> GUILD_SUBHEADER_GC_WAR : GUILD_WAR_RECV_DECLARE\n");
  2928. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME],
  2929. "BINARY_GuildWar_OnRecvDeclare",
  2930. Py_BuildValue("(ii)", kGuildWar.dwGuildOpp, kGuildWar.bType)
  2931. );
  2932. break;
  2933. case GUILD_WAR_ON_WAR:
  2934. Tracef(" >> GUILD_SUBHEADER_GC_WAR : GUILD_WAR_ON_WAR : %d, %d\n", kGuildWar.dwGuildSelf, kGuildWar.dwGuildOpp);
  2935. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME],
  2936. "BINARY_GuildWar_OnStart",
  2937. Py_BuildValue("(ii)", kGuildWar.dwGuildSelf, kGuildWar.dwGuildOpp)
  2938. );
  2939. CPythonGuild::Instance().StartGuildWar(kGuildWar.dwGuildOpp);
  2940. break;
  2941. case GUILD_WAR_END:
  2942. Tracef(" >> GUILD_SUBHEADER_GC_WAR : GUILD_WAR_END\n");
  2943. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME],
  2944. "BINARY_GuildWar_OnEnd",
  2945. Py_BuildValue("(ii)", kGuildWar.dwGuildSelf, kGuildWar.dwGuildOpp)
  2946. );
  2947. CPythonGuild::Instance().EndGuildWar(kGuildWar.dwGuildOpp);
  2948. break;
  2949. }
  2950. break;
  2951. }
  2952. case GUILD_SUBHEADER_GC_GUILD_NAME:
  2953. {
  2954. DWORD dwID;
  2955. char szGuildName[GUILD_NAME_MAX_LEN+1];
  2956. int iPacketSize = int(GuildPacket.size) - sizeof(GuildPacket);
  2957. int nItemSize = sizeof(dwID) + GUILD_NAME_MAX_LEN;
  2958. assert(iPacketSize%nItemSize==0 && "GUILD_SUBHEADER_GC_GUILD_NAME");
  2959. for (; iPacketSize > 0;)
  2960. {
  2961. if (!Recv(sizeof(dwID), &dwID))
  2962. return false;
  2963. if (!Recv(GUILD_NAME_MAX_LEN, &szGuildName))
  2964. return false;
  2965. szGuildName[GUILD_NAME_MAX_LEN] = 0;
  2966. //Tracef(" >> GulidName [%d : %s]\n", dwID, szGuildName);
  2967. CPythonGuild::Instance().RegisterGuildName(dwID, szGuildName);
  2968. iPacketSize -= nItemSize;
  2969. }
  2970. break;
  2971. }
  2972. case GUILD_SUBHEADER_GC_GUILD_WAR_LIST:
  2973. {
  2974. DWORD dwSrcGuildID;
  2975. DWORD dwDstGuildID;
  2976. int iPacketSize = int(GuildPacket.size) - sizeof(GuildPacket);
  2977. int nItemSize = sizeof(dwSrcGuildID) + sizeof(dwDstGuildID);
  2978. assert(iPacketSize%nItemSize==0 && "GUILD_SUBHEADER_GC_GUILD_WAR_LIST");
  2979. for (; iPacketSize > 0;)
  2980. {
  2981. if (!Recv(sizeof(dwSrcGuildID), &dwSrcGuildID))
  2982. return false;
  2983. if (!Recv(sizeof(dwDstGuildID), &dwDstGuildID))
  2984. return false;
  2985. Tracef(" >> GulidWarList [%d vs %d]\n", dwSrcGuildID, dwDstGuildID);
  2986. CInstanceBase::InsertGVGKey(dwSrcGuildID, dwDstGuildID);
  2987. CPythonCharacterManager::Instance().ChangeGVG(dwSrcGuildID, dwDstGuildID);
  2988. iPacketSize -= nItemSize;
  2989. }
  2990. break;
  2991. }
  2992. case GUILD_SUBHEADER_GC_GUILD_WAR_END_LIST:
  2993. {
  2994. DWORD dwSrcGuildID;
  2995. DWORD dwDstGuildID;
  2996. int iPacketSize = int(GuildPacket.size) - sizeof(GuildPacket);
  2997. int nItemSize = sizeof(dwSrcGuildID) + sizeof(dwDstGuildID);
  2998. assert(iPacketSize%nItemSize==0 && "GUILD_SUBHEADER_GC_GUILD_WAR_END_LIST");
  2999. for (; iPacketSize > 0;)
  3000. {
  3001. if (!Recv(sizeof(dwSrcGuildID), &dwSrcGuildID))
  3002. return false;
  3003. if (!Recv(sizeof(dwDstGuildID), &dwDstGuildID))
  3004. return false;
  3005. Tracef(" >> GulidWarEndList [%d vs %d]\n", dwSrcGuildID, dwDstGuildID);
  3006. CInstanceBase::RemoveGVGKey(dwSrcGuildID, dwDstGuildID);
  3007. CPythonCharacterManager::Instance().ChangeGVG(dwSrcGuildID, dwDstGuildID);
  3008. iPacketSize -= nItemSize;
  3009. }
  3010. break;
  3011. }
  3012. case GUILD_SUBHEADER_GC_WAR_POINT:
  3013. {
  3014. TPacketGuildWarPoint GuildWarPoint;
  3015. if (!Recv(sizeof(GuildWarPoint), &GuildWarPoint))
  3016. return false;
  3017. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME],
  3018. "BINARY_GuildWar_OnRecvPoint",
  3019. Py_BuildValue("(iii)", GuildWarPoint.dwGainGuildID, GuildWarPoint.dwOpponentGuildID, GuildWarPoint.lPoint)
  3020. );
  3021. break;
  3022. }
  3023. case GUILD_SUBHEADER_GC_MONEY_CHANGE:
  3024. {
  3025. DWORD dwMoney;
  3026. if (!Recv(sizeof(dwMoney), &dwMoney))
  3027. return false;
  3028. CPythonGuild::Instance().SetGuildMoney(dwMoney);
  3029. __RefreshGuildWindowInfoPage();
  3030. Tracef(" >> Guild Money Change : %d\n", dwMoney);
  3031. break;
  3032. }
  3033. }
  3034. return true;
  3035. }
  3036. // Guild
  3037. //////////////////////////////////////////////////////////////////////////
  3038. /////////////////////////////////////////////////////////////////////////
  3039. // Fishing
  3040. bool CPythonNetworkStream::SendFishingPacket(int iRotation)
  3041. {
  3042. BYTE byHeader = HEADER_CG_FISHING;
  3043. if (!Send(sizeof(byHeader), &byHeader))
  3044. return false;
  3045. BYTE byPacketRotation = iRotation / 5;
  3046. if (!Send(sizeof(BYTE), &byPacketRotation))
  3047. return false;
  3048. return SendSequence();
  3049. }
  3050. bool CPythonNetworkStream::SendGiveItemPacket(DWORD dwTargetVID, TItemPos ItemPos, int iItemCount)
  3051. {
  3052. TPacketCGGiveItem GiveItemPacket;
  3053. GiveItemPacket.byHeader = HEADER_CG_GIVE_ITEM;
  3054. GiveItemPacket.dwTargetVID = dwTargetVID;
  3055. GiveItemPacket.ItemPos = ItemPos;
  3056. GiveItemPacket.byItemCount = iItemCount;
  3057. if (!Send(sizeof(GiveItemPacket), &GiveItemPacket))
  3058. return false;
  3059. return SendSequence();
  3060. }
  3061. bool CPythonNetworkStream::RecvFishing()
  3062. {
  3063. TPacketGCFishing FishingPacket;
  3064. if (!Recv(sizeof(FishingPacket), &FishingPacket))
  3065. return false;
  3066. CInstanceBase * pFishingInstance = NULL;
  3067. if (FISHING_SUBHEADER_GC_FISH != FishingPacket.subheader)
  3068. {
  3069. pFishingInstance = CPythonCharacterManager::Instance().GetInstancePtr(FishingPacket.info);
  3070. if (!pFishingInstance)
  3071. return true;
  3072. }
  3073. switch (FishingPacket.subheader)
  3074. {
  3075. case FISHING_SUBHEADER_GC_START:
  3076. pFishingInstance->StartFishing(float(FishingPacket.dir) * 5.0f);
  3077. break;
  3078. case FISHING_SUBHEADER_GC_STOP:
  3079. if (pFishingInstance->IsFishing())
  3080. pFishingInstance->StopFishing();
  3081. break;
  3082. case FISHING_SUBHEADER_GC_REACT:
  3083. if (pFishingInstance->IsFishing())
  3084. {
  3085. pFishingInstance->SetFishEmoticon(); // Fish Emoticon
  3086. pFishingInstance->ReactFishing();
  3087. }
  3088. break;
  3089. case FISHING_SUBHEADER_GC_SUCCESS:
  3090. pFishingInstance->CatchSuccess();
  3091. break;
  3092. case FISHING_SUBHEADER_GC_FAIL:
  3093. pFishingInstance->CatchFail();
  3094. if (pFishingInstance == CPythonCharacterManager::Instance().GetMainInstancePtr())
  3095. {
  3096. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "OnFishingFailure", Py_BuildValue("()"));
  3097. }
  3098. break;
  3099. case FISHING_SUBHEADER_GC_FISH:
  3100. {
  3101. DWORD dwFishID = FishingPacket.info;
  3102. if (0 == FishingPacket.info)
  3103. {
  3104. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "OnFishingNotifyUnknown", Py_BuildValue("()"));
  3105. return true;
  3106. }
  3107. CItemData * pItemData;
  3108. if (!CItemManager::Instance().GetItemDataPointer(dwFishID, &pItemData))
  3109. return true;
  3110. CInstanceBase * pMainInstance = CPythonCharacterManager::Instance().GetMainInstancePtr();
  3111. if (!pMainInstance)
  3112. return true;
  3113. if (pMainInstance->IsFishing())
  3114. {
  3115. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "OnFishingNotify", Py_BuildValue("(is)", CItemData::ITEM_TYPE_FISH == pItemData->GetType(), pItemData->GetName()));
  3116. }
  3117. else
  3118. {
  3119. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "OnFishingSuccess", Py_BuildValue("(is)", CItemData::ITEM_TYPE_FISH == pItemData->GetType(), pItemData->GetName()));
  3120. }
  3121. break;
  3122. }
  3123. }
  3124. return true;
  3125. }
  3126. // Fishing
  3127. /////////////////////////////////////////////////////////////////////////
  3128. /////////////////////////////////////////////////////////////////////////
  3129. // Dungeon
  3130. bool CPythonNetworkStream::RecvDungeon()
  3131. {
  3132. TPacketGCDungeon DungeonPacket;
  3133. if (!Recv(sizeof(DungeonPacket), &DungeonPacket))
  3134. return false;
  3135. switch (DungeonPacket.subheader)
  3136. {
  3137. case DUNGEON_SUBHEADER_GC_TIME_ATTACK_START:
  3138. {
  3139. break;
  3140. }
  3141. case DUNGEON_SUBHEADER_GC_DESTINATION_POSITION:
  3142. {
  3143. unsigned long ulx, uly;
  3144. if (!Recv(sizeof(ulx), &ulx))
  3145. return false;
  3146. if (!Recv(sizeof(uly), &uly))
  3147. return false;
  3148. CPythonPlayer::Instance().SetDungeonDestinationPosition(ulx, uly);
  3149. break;
  3150. }
  3151. }
  3152. return true;
  3153. }
  3154. // Dungeon
  3155. /////////////////////////////////////////////////////////////////////////
  3156. /////////////////////////////////////////////////////////////////////////
  3157. // MyShop
  3158. bool CPythonNetworkStream::SendBuildPrivateShopPacket(const char * c_szName, const std::vector<TShopItemTable> & c_rSellingItemStock)
  3159. {
  3160. TPacketCGMyShop packet;
  3161. packet.bHeader = HEADER_CG_MYSHOP;
  3162. strncpy(packet.szSign, c_szName, SHOP_SIGN_MAX_LEN);
  3163. packet.bCount = c_rSellingItemStock.size();
  3164. if (!Send(sizeof(packet), &packet))
  3165. return false;
  3166. for (std::vector<TShopItemTable>::const_iterator itor = c_rSellingItemStock.begin(); itor < c_rSellingItemStock.end(); ++itor)
  3167. {
  3168. const TShopItemTable & c_rItem = *itor;
  3169. if (!Send(sizeof(c_rItem), &c_rItem))
  3170. return false;
  3171. }
  3172. return SendSequence();
  3173. }
  3174. bool CPythonNetworkStream::RecvShopSignPacket()
  3175. {
  3176. TPacketGCShopSign p;
  3177. if (!Recv(sizeof(TPacketGCShopSign), &p))
  3178. return false;
  3179. CPythonPlayer& rkPlayer=CPythonPlayer::Instance();
  3180. if (0 == strlen(p.szSign))
  3181. {
  3182. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME],
  3183. "BINARY_PrivateShop_Disappear",
  3184. Py_BuildValue("(i)", p.dwVID)
  3185. );
  3186. if (rkPlayer.IsMainCharacterIndex(p.dwVID))
  3187. rkPlayer.ClosePrivateShop();
  3188. }
  3189. else
  3190. {
  3191. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME],
  3192. "BINARY_PrivateShop_Appear",
  3193. Py_BuildValue("(is)", p.dwVID, p.szSign)
  3194. );
  3195. if (rkPlayer.IsMainCharacterIndex(p.dwVID))
  3196. rkPlayer.OpenPrivateShop();
  3197. }
  3198. return true;
  3199. }
  3200. /////////////////////////////////////////////////////////////////////////
  3201. bool CPythonNetworkStream::SendBuildOfflineShopPacket(const char * c_szName, const std::vector<TShopItemTable> & c_rSellingItemStock, BYTE bTime)
  3202. {
  3203. TPacketCGMyOfflineShop packet;
  3204. packet.bHeader = HEADER_CG_MY_OFFLINE_SHOP;
  3205. strncpy(packet.szSign, c_szName, SHOP_SIGN_MAX_LEN);
  3206. packet.bCount = c_rSellingItemStock.size();
  3207. packet.bTime = bTime;
  3208. if (!Send(sizeof(packet), &packet))
  3209. return false;
  3210. for (std::vector<TShopItemTable>::const_iterator itor = c_rSellingItemStock.begin(); itor < c_rSellingItemStock.end(); ++itor)
  3211. {
  3212. const TShopItemTable & c_rItem = *itor;
  3213. if (!Send(sizeof(c_rItem), &c_rItem))
  3214. return false;
  3215. }
  3216. return SendSequence();
  3217. }
  3218. bool CPythonNetworkStream::RecvOfflineShopSignPacket()
  3219. {
  3220. TPacketGCShopSign p;
  3221. if (!Recv(sizeof(TPacketGCShopSign), &p))
  3222. return false;
  3223. if (0 == strlen(p.szSign))
  3224. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "BINARY_OfflineShop_Disappear", Py_BuildValue("(i)", p.dwVID));
  3225. else
  3226. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "BINARY_OfflineShop_Appear", Py_BuildValue("(is)", p.dwVID, p.szSign));
  3227. return true;
  3228. }
  3229. bool CPythonNetworkStream::RecvOfflineShopPacket()
  3230. {
  3231. std::vector<char> vecBuffer;
  3232. vecBuffer.clear();
  3233. TPacketGCShop packet_shop;
  3234. if (!Recv(sizeof(packet_shop), &packet_shop))
  3235. return false;
  3236. int iSize = packet_shop.size - sizeof(packet_shop);
  3237. if (iSize > 0)
  3238. {
  3239. vecBuffer.resize(iSize);
  3240. if (!Recv(iSize, &vecBuffer[0]))
  3241. return false;
  3242. }
  3243. switch (packet_shop.subheader)
  3244. {
  3245. case SHOP_SUBHEADER_GC_START:
  3246. {
  3247. CPythonShop::Instance().Clear();
  3248. DWORD dwVID = *(DWORD *)&vecBuffer[0];
  3249. TPacketGCOfflineShopStart * pShopStartPacket = (TPacketGCOfflineShopStart *)&vecBuffer[4];
  3250. for (BYTE iItemIndex = 0; iItemIndex < OFFLINE_SHOP_HOST_ITEM_MAX_NUM; ++iItemIndex)
  3251. {
  3252. CPythonShop::Instance().SetOfflineShopItemData(iItemIndex, pShopStartPacket->items[iItemIndex]);
  3253. }
  3254. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "StartOfflineShop", Py_BuildValue("(i)", dwVID));
  3255. }
  3256. break;
  3257. case SHOP_SUBHEADER_GC_END:
  3258. CPythonShop::instance().Clear();
  3259. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "EndOfflineShop", Py_BuildValue("()"));
  3260. break;
  3261. case SHOP_SUBHEADER_GC_UPDATE_ITEM:
  3262. {
  3263. TPacketGCShopUpdateOfflineShopItem * pShopUpdateItemPacket = (TPacketGCShopUpdateOfflineShopItem *)&vecBuffer[0];
  3264. CPythonShop::Instance().SetOfflineShopItemData(pShopUpdateItemPacket->pos, pShopUpdateItemPacket->item);
  3265. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "RefreshOfflineShop", Py_BuildValue("()"));
  3266. }
  3267. break;
  3268. case SHOP_SUBHEADER_GC_NOT_ENOUGH_MONEY:
  3269. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "OnShopError", Py_BuildValue("(s)", "NOT_ENOUGH_MONEY"));
  3270. break;
  3271. case SHOP_SUBHEADER_GC_NOT_ENOUGH_MONEY_EX:
  3272. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "OnShopError", Py_BuildValue("(s)", "NOT_ENOUGH_MONEY_EX"));
  3273. break;
  3274. case SHOP_SUBHEADER_GC_SOLD_OUT:
  3275. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "OnShopError", Py_BuildValue("(s)", "SOLDOUT"));
  3276. break;
  3277. case SHOP_SUBHEADER_GC_INVENTORY_FULL:
  3278. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "OnShopError", Py_BuildValue("(s)", "INVENTORY_FULL"));
  3279. break;
  3280. case SHOP_SUBHEADER_GC_INVALID_POS:
  3281. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "OnShopError", Py_BuildValue("(s)", "INVALID_POS"));
  3282. break;
  3283. default:
  3284. TraceError("CPythonNetworkStream::RecvOfflineShopPacket: Unknown subheader %d\n", packet_shop.subheader);
  3285. break;
  3286. }
  3287. return true;
  3288. }
  3289. bool CPythonNetworkStream::RecvTimePacket()
  3290. {
  3291. TPacketGCTime TimePacket;
  3292. if (!Recv(sizeof(TimePacket), &TimePacket))
  3293. return false;
  3294. IAbstractApplication& rkApp=IAbstractApplication::GetSingleton();
  3295. rkApp.SetServerTime(TimePacket.time);
  3296. return true;
  3297. }
  3298. bool CPythonNetworkStream::RecvWalkModePacket()
  3299. {
  3300. TPacketGCWalkMode WalkModePacket;
  3301. if (!Recv(sizeof(WalkModePacket), &WalkModePacket))
  3302. return false;
  3303. CInstanceBase * pInstance = CPythonCharacterManager::Instance().GetInstancePtr(WalkModePacket.vid);
  3304. if (pInstance)
  3305. {
  3306. if (WALKMODE_RUN == WalkModePacket.mode)
  3307. {
  3308. pInstance->SetRunMode();
  3309. }
  3310. else
  3311. {
  3312. pInstance->SetWalkMode();
  3313. }
  3314. }
  3315. return true;
  3316. }
  3317. bool CPythonNetworkStream::RecvChangeSkillGroupPacket()
  3318. {
  3319. TPacketGCChangeSkillGroup ChangeSkillGroup;
  3320. if (!Recv(sizeof(ChangeSkillGroup), &ChangeSkillGroup))
  3321. return false;
  3322. m_dwMainActorSkillGroup = ChangeSkillGroup.skill_group;
  3323. CPythonPlayer::Instance().NEW_ClearSkillData();
  3324. __RefreshCharacterWindow();
  3325. return true;
  3326. }
  3327. void CPythonNetworkStream::__TEST_SetSkillGroupFake(int iIndex)
  3328. {
  3329. m_dwMainActorSkillGroup = DWORD(iIndex);
  3330. CPythonPlayer::Instance().NEW_ClearSkillData();
  3331. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "RefreshCharacter", Py_BuildValue("()"));
  3332. }
  3333. bool CPythonNetworkStream::SendRefinePacket(BYTE byPos, BYTE byType)
  3334. {
  3335. TPacketCGRefine kRefinePacket;
  3336. kRefinePacket.header = HEADER_CG_REFINE;
  3337. kRefinePacket.pos = byPos;
  3338. kRefinePacket.type = byType;
  3339. if (!Send(sizeof(kRefinePacket), &kRefinePacket))
  3340. return false;
  3341. return SendSequence();
  3342. }
  3343. bool CPythonNetworkStream::SendSelectItemPacket(DWORD dwItemPos)
  3344. {
  3345. TPacketCGScriptSelectItem kScriptSelectItem;
  3346. kScriptSelectItem.header = HEADER_CG_SCRIPT_SELECT_ITEM;
  3347. kScriptSelectItem.selection = dwItemPos;
  3348. if (!Send(sizeof(kScriptSelectItem), &kScriptSelectItem))
  3349. return false;
  3350. return SendSequence();
  3351. }
  3352. bool CPythonNetworkStream::RecvRefineInformationPacket()
  3353. {
  3354. TPacketGCRefineInformation kRefineInfoPacket;
  3355. if (!Recv(sizeof(kRefineInfoPacket), &kRefineInfoPacket))
  3356. return false;
  3357. TRefineTable & rkRefineTable = kRefineInfoPacket.refine_table;
  3358. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME],
  3359. "OpenRefineDialog",
  3360. Py_BuildValue("(iiii)",
  3361. kRefineInfoPacket.pos,
  3362. kRefineInfoPacket.refine_table.result_vnum,
  3363. rkRefineTable.cost,
  3364. rkRefineTable.prob));
  3365. for (int i = 0; i < rkRefineTable.material_count; ++i)
  3366. {
  3367. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "AppendMaterialToRefineDialog", Py_BuildValue("(ii)", rkRefineTable.materials[i].vnum, rkRefineTable.materials[i].count));
  3368. }
  3369. #ifdef _DEBUG
  3370. Tracef(" >> RecvRefineInformationPacket(pos=%d, result_vnum=%d, cost=%d, prob=%d)\n",
  3371. kRefineInfoPacket.pos,
  3372. kRefineInfoPacket.refine_table.result_vnum,
  3373. rkRefineTable.cost,
  3374. rkRefineTable.prob);
  3375. #endif
  3376. return true;
  3377. }
  3378. bool CPythonNetworkStream::RecvRefineInformationPacketNew()
  3379. {
  3380. TPacketGCRefineInformationNew kRefineInfoPacket;
  3381. if (!Recv(sizeof(kRefineInfoPacket), &kRefineInfoPacket))
  3382. return false;
  3383. TRefineTable & rkRefineTable = kRefineInfoPacket.refine_table;
  3384. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME],
  3385. "OpenRefineDialog",
  3386. Py_BuildValue("(iiiii)",
  3387. kRefineInfoPacket.pos,
  3388. kRefineInfoPacket.refine_table.result_vnum,
  3389. rkRefineTable.cost,
  3390. rkRefineTable.prob,
  3391. kRefineInfoPacket.type)
  3392. );
  3393. for (int i = 0; i < rkRefineTable.material_count; ++i)
  3394. {
  3395. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "AppendMaterialToRefineDialog", Py_BuildValue("(ii)", rkRefineTable.materials[i].vnum, rkRefineTable.materials[i].count));
  3396. }
  3397. #ifdef _DEBUG
  3398. Tracef(" >> RecvRefineInformationPacketNew(pos=%d, result_vnum=%d, cost=%d, prob=%d, type=%d)\n",
  3399. kRefineInfoPacket.pos,
  3400. kRefineInfoPacket.refine_table.result_vnum,
  3401. rkRefineTable.cost,
  3402. rkRefineTable.prob,
  3403. kRefineInfoPacket.type);
  3404. #endif
  3405. return true;
  3406. }
  3407. bool CPythonNetworkStream::RecvNPCList()
  3408. {
  3409. TPacketGCNPCPosition kNPCPosition;
  3410. if (!Recv(sizeof(kNPCPosition), &kNPCPosition))
  3411. return false;
  3412. assert(int(kNPCPosition.size)-sizeof(kNPCPosition) == kNPCPosition.count*sizeof(TNPCPosition) && "HEADER_GC_NPC_POSITION");
  3413. CPythonMiniMap::Instance().ClearAtlasMarkInfo();
  3414. for (int i = 0; i < kNPCPosition.count; ++i)
  3415. {
  3416. TNPCPosition NPCPosition;
  3417. if (!Recv(sizeof(TNPCPosition), &NPCPosition))
  3418. return false;
  3419. CPythonMiniMap::Instance().RegisterAtlasMark(NPCPosition.bType, NPCPosition.name, NPCPosition.x, NPCPosition.y);
  3420. }
  3421. return true;
  3422. }
  3423. bool CPythonNetworkStream::__SendCRCReportPacket()
  3424. {
  3425. /*
  3426. DWORD dwProcessCRC = 0;
  3427. DWORD dwFileCRC = 0;
  3428. CFilename exeFileName;
  3429. //LPCVOID c_pvBaseAddress = NULL;
  3430. GetExeCRC(dwProcessCRC, dwFileCRC);
  3431. CFilename strRootPackFileName = CEterPackManager::Instance().GetRootPacketFileName();
  3432. strRootPackFileName.ChangeDosPath();
  3433. TPacketCGCRCReport kReportPacket;
  3434. kReportPacket.header = HEADER_CG_CRC_REPORT;
  3435. kReportPacket.byPackMode = CEterPackManager::Instance().GetSearchMode();
  3436. kReportPacket.dwBinaryCRC32 = dwFileCRC;
  3437. kReportPacket.dwProcessCRC32 = dwProcessCRC;
  3438. kReportPacket.dwRootPackCRC32 = GetFileCRC32(strRootPackFileName.c_str());
  3439. if (!Send(sizeof(kReportPacket), &kReportPacket))
  3440. Tracef("SendClientReportPacket Error");
  3441. return SendSequence();
  3442. */
  3443. return true;
  3444. }
  3445. bool CPythonNetworkStream::SendClientVersionPacket()
  3446. {
  3447. std::string filename;
  3448. GetExcutedFileName(filename);
  3449. filename = CFileNameHelper::NoPath(filename);
  3450. CFileNameHelper::ChangeDosPath(filename);
  3451. if (LocaleService_IsEUROPE() && false == LocaleService_IsYMIR())
  3452. {
  3453. TPacketCGClientVersion2 kVersionPacket;
  3454. kVersionPacket.header = HEADER_CG_CLIENT_VERSION2;
  3455. strncpy(kVersionPacket.filename, filename.c_str(), sizeof(kVersionPacket.filename)-1);
  3456. strncpy(kVersionPacket.timestamp, "1215955205", sizeof(kVersionPacket.timestamp)-1); // # python time.time ¾ÕÀÚ¸®
  3457. //strncpy(kVersionPacket.timestamp, __TIMESTAMP__, sizeof(kVersionPacket.timestamp)-1); // old_string_ver
  3458. //strncpy(kVersionPacket.timestamp, "1218055205", sizeof(kVersionPacket.timestamp)-1); // new_future
  3459. //strncpy(kVersionPacket.timestamp, "1214055205", sizeof(kVersionPacket.timestamp)-1); // old_past
  3460. if (!Send(sizeof(kVersionPacket), &kVersionPacket))
  3461. Tracef("SendClientReportPacket Error");
  3462. }
  3463. else
  3464. {
  3465. TPacketCGClientVersion kVersionPacket;
  3466. kVersionPacket.header = HEADER_CG_CLIENT_VERSION;
  3467. strncpy(kVersionPacket.filename, filename.c_str(), sizeof(kVersionPacket.filename)-1);
  3468. strncpy(kVersionPacket.timestamp, __TIMESTAMP__, sizeof(kVersionPacket.timestamp)-1);
  3469. if (!Send(sizeof(kVersionPacket), &kVersionPacket))
  3470. Tracef("SendClientReportPacket Error");
  3471. }
  3472. return SendSequence();
  3473. }
  3474. bool CPythonNetworkStream::RecvAffectAddPacket()
  3475. {
  3476. TPacketGCAffectAdd kAffectAdd;
  3477. if (!Recv(sizeof(kAffectAdd), &kAffectAdd))
  3478. return false;
  3479. TPacketAffectElement & rkElement = kAffectAdd.elem;
  3480. if (rkElement.bPointIdxApplyOn == POINT_ENERGY)
  3481. {
  3482. CPythonPlayer::instance().SetStatus (POINT_ENERGY_END_TIME, CPythonApplication::Instance().GetServerTimeStamp() + rkElement.lDuration);
  3483. __RefreshStatus();
  3484. }
  3485. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "BINARY_NEW_AddAffect", Py_BuildValue("(iiii)", rkElement.dwType, rkElement.bPointIdxApplyOn, rkElement.lApplyValue, rkElement.lDuration));
  3486. return true;
  3487. }
  3488. bool CPythonNetworkStream::RecvAffectRemovePacket()
  3489. {
  3490. TPacketGCAffectRemove kAffectRemove;
  3491. if (!Recv(sizeof(kAffectRemove), &kAffectRemove))
  3492. return false;
  3493. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "BINARY_NEW_RemoveAffect", Py_BuildValue("(ii)", kAffectRemove.dwType, kAffectRemove.bApplyOn));
  3494. return true;
  3495. }
  3496. bool CPythonNetworkStream::RecvChannelPacket()
  3497. {
  3498. TPacketGCChannel kChannelPacket;
  3499. if (!Recv(sizeof(kChannelPacket), &kChannelPacket))
  3500. return false;
  3501. //Tracef(" >> CPythonNetworkStream::RecvChannelPacket(channel=%d)\n", kChannelPacket.channel);
  3502. #ifdef ENABLE_MOVE_CHANNEL
  3503. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "RefreshChannel", Py_BuildValue("(i)", kChannelPacket.channel));
  3504. #endif
  3505. return true;
  3506. }
  3507. bool CPythonNetworkStream::RecvViewEquipPacket()
  3508. {
  3509. TPacketGCViewEquip kViewEquipPacket;
  3510. if (!Recv(sizeof(kViewEquipPacket), &kViewEquipPacket))
  3511. return false;
  3512. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "OpenEquipmentDialog", Py_BuildValue("(i)", kViewEquipPacket.dwVID));
  3513. for (int i = 0; i < WEAR_MAX_NUM; ++i)
  3514. {
  3515. TEquipmentItemSet & rItemSet = kViewEquipPacket.equips[i];
  3516. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "SetEquipmentDialogItem", Py_BuildValue("(iiii)", kViewEquipPacket.dwVID, i, rItemSet.vnum, rItemSet.count));
  3517. for (int j = 0; j < ITEM_SOCKET_SLOT_MAX_NUM; ++j)
  3518. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "SetEquipmentDialogSocket", Py_BuildValue("(iiii)", kViewEquipPacket.dwVID, i, j, rItemSet.alSockets[j]));
  3519. for (int k = 0; k < ITEM_ATTRIBUTE_SLOT_MAX_NUM; ++k)
  3520. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "SetEquipmentDialogAttr", Py_BuildValue("(iiiii)", kViewEquipPacket.dwVID, i, k, rItemSet.aAttr[k].bType, rItemSet.aAttr[k].sValue));
  3521. }
  3522. return true;
  3523. }
  3524. bool CPythonNetworkStream::RecvLandPacket()
  3525. {
  3526. TPacketGCLandList kLandList;
  3527. if (!Recv(sizeof(kLandList), &kLandList))
  3528. return false;
  3529. std::vector<DWORD> kVec_dwGuildID;
  3530. CPythonMiniMap & rkMiniMap = CPythonMiniMap::Instance();
  3531. CPythonBackground & rkBG = CPythonBackground::Instance();
  3532. CInstanceBase * pMainInstance = CPythonPlayer::Instance().NEW_GetMainActorPtr();
  3533. rkMiniMap.ClearGuildArea();
  3534. rkBG.ClearGuildArea();
  3535. int iPacketSize = (kLandList.size - sizeof(TPacketGCLandList));
  3536. for (; iPacketSize > 0; iPacketSize-=sizeof(TLandPacketElement))
  3537. {
  3538. TLandPacketElement kElement;
  3539. if (!Recv(sizeof(TLandPacketElement), &kElement))
  3540. return false;
  3541. rkMiniMap.RegisterGuildArea(kElement.dwID,
  3542. kElement.dwGuildID,
  3543. kElement.x,
  3544. kElement.y,
  3545. kElement.width,
  3546. kElement.height);
  3547. if (pMainInstance)
  3548. if (kElement.dwGuildID == pMainInstance->GetGuildID())
  3549. {
  3550. rkBG.RegisterGuildArea(kElement.x,
  3551. kElement.y,
  3552. kElement.x+kElement.width,
  3553. kElement.y+kElement.height);
  3554. }
  3555. if (0 != kElement.dwGuildID)
  3556. kVec_dwGuildID.push_back(kElement.dwGuildID);
  3557. }
  3558. #ifdef fix_header254
  3559. if (kVec_dwGuildID.size()>0)
  3560. __DownloadSymbol(kVec_dwGuildID);
  3561. #endif
  3562. return true;
  3563. }
  3564. bool CPythonNetworkStream::RecvTargetCreatePacket()
  3565. {
  3566. TPacketGCTargetCreate kTargetCreate;
  3567. if (!Recv(sizeof(kTargetCreate), &kTargetCreate))
  3568. return false;
  3569. CPythonMiniMap & rkpyMiniMap = CPythonMiniMap::Instance();
  3570. rkpyMiniMap.CreateTarget(kTargetCreate.lID, kTargetCreate.szTargetName);
  3571. //#ifdef _DEBUG
  3572. // char szBuf[256+1];
  3573. // _snprintf(szBuf, sizeof(szBuf), "Ÿ°ÙÀÌ »ı¼º µÇ¾ú½À´Ï´Ù [%d:%s]", kTargetCreate.lID, kTargetCreate.szTargetName);
  3574. // CPythonChat::Instance().AppendChat(CHAT_TYPE_NOTICE, szBuf);
  3575. // Tracef(" >> RecvTargetCreatePacket %d : %s\n", kTargetCreate.lID, kTargetCreate.szTargetName);
  3576. //#endif
  3577. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "BINARY_OpenAtlasWindow", Py_BuildValue("()"));
  3578. return true;
  3579. }
  3580. bool CPythonNetworkStream::RecvTargetCreatePacketNew()
  3581. {
  3582. TPacketGCTargetCreateNew kTargetCreate;
  3583. if (!Recv(sizeof(kTargetCreate), &kTargetCreate))
  3584. return false;
  3585. CPythonMiniMap & rkpyMiniMap = CPythonMiniMap::Instance();
  3586. CPythonBackground & rkpyBG = CPythonBackground::Instance();
  3587. if (CREATE_TARGET_TYPE_LOCATION == kTargetCreate.byType)
  3588. {
  3589. rkpyMiniMap.CreateTarget(kTargetCreate.lID, kTargetCreate.szTargetName);
  3590. }
  3591. else
  3592. {
  3593. rkpyMiniMap.CreateTarget(kTargetCreate.lID, kTargetCreate.szTargetName, kTargetCreate.dwVID);
  3594. rkpyBG.CreateTargetEffect(kTargetCreate.lID, kTargetCreate.dwVID);
  3595. }
  3596. //#ifdef _DEBUG
  3597. // char szBuf[256+1];
  3598. // _snprintf(szBuf, sizeof(szBuf), "ij¸¯ÅÍ Å¸°ÙÀÌ »ı¼º µÇ¾ú½À´Ï´Ù [%d:%s:%d]", kTargetCreate.lID, kTargetCreate.szTargetName, kTargetCreate.dwVID);
  3599. // CPythonChat::Instance().AppendChat(CHAT_TYPE_NOTICE, szBuf);
  3600. // Tracef(" >> RecvTargetCreatePacketNew %d : %d/%d\n", kTargetCreate.lID, kTargetCreate.byType, kTargetCreate.dwVID);
  3601. //#endif
  3602. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "BINARY_OpenAtlasWindow", Py_BuildValue("()"));
  3603. return true;
  3604. }
  3605. bool CPythonNetworkStream::RecvTargetUpdatePacket()
  3606. {
  3607. TPacketGCTargetUpdate kTargetUpdate;
  3608. if (!Recv(sizeof(kTargetUpdate), &kTargetUpdate))
  3609. return false;
  3610. CPythonMiniMap & rkpyMiniMap = CPythonMiniMap::Instance();
  3611. rkpyMiniMap.UpdateTarget(kTargetUpdate.lID, kTargetUpdate.lX, kTargetUpdate.lY);
  3612. CPythonBackground & rkpyBG = CPythonBackground::Instance();
  3613. rkpyBG.CreateTargetEffect(kTargetUpdate.lID, kTargetUpdate.lX, kTargetUpdate.lY);
  3614. //#ifdef _DEBUG
  3615. // char szBuf[256+1];
  3616. // _snprintf(szBuf, sizeof(szBuf), "Ÿ°ÙÀÇ À§Ä¡°¡ °»½Å µÇ¾ú½À´Ï´Ù [%d:%d/%d]", kTargetUpdate.lID, kTargetUpdate.lX, kTargetUpdate.lY);
  3617. // CPythonChat::Instance().AppendChat(CHAT_TYPE_NOTICE, szBuf);
  3618. // Tracef(" >> RecvTargetUpdatePacket %d : %d, %d\n", kTargetUpdate.lID, kTargetUpdate.lX, kTargetUpdate.lY);
  3619. //#endif
  3620. return true;
  3621. }
  3622. bool CPythonNetworkStream::RecvTargetDeletePacket()
  3623. {
  3624. TPacketGCTargetDelete kTargetDelete;
  3625. if (!Recv(sizeof(kTargetDelete), &kTargetDelete))
  3626. return false;
  3627. CPythonMiniMap & rkpyMiniMap = CPythonMiniMap::Instance();
  3628. rkpyMiniMap.DeleteTarget(kTargetDelete.lID);
  3629. CPythonBackground & rkpyBG = CPythonBackground::Instance();
  3630. rkpyBG.DeleteTargetEffect(kTargetDelete.lID);
  3631. //#ifdef _DEBUG
  3632. // Tracef(" >> RecvTargetDeletePacket %d\n", kTargetDelete.lID);
  3633. //#endif
  3634. return true;
  3635. }
  3636. bool CPythonNetworkStream::RecvLoverInfoPacket()
  3637. {
  3638. TPacketGCLoverInfo kLoverInfo;
  3639. if (!Recv(sizeof(kLoverInfo), &kLoverInfo))
  3640. return false;
  3641. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "BINARY_LoverInfo", Py_BuildValue("(si)", kLoverInfo.szName, kLoverInfo.byLovePoint));
  3642. #ifdef _DEBUG
  3643. Tracef("RECV LOVER INFO : %s, %d\n", kLoverInfo.szName, kLoverInfo.byLovePoint);
  3644. #endif
  3645. return true;
  3646. }
  3647. bool CPythonNetworkStream::RecvLovePointUpdatePacket()
  3648. {
  3649. TPacketGCLovePointUpdate kLovePointUpdate;
  3650. if (!Recv(sizeof(kLovePointUpdate), &kLovePointUpdate))
  3651. return false;
  3652. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "BINARY_UpdateLovePoint", Py_BuildValue("(i)", kLovePointUpdate.byLovePoint));
  3653. #ifdef _DEBUG
  3654. Tracef("RECV LOVE POINT UPDATE : %d\n", kLovePointUpdate.byLovePoint);
  3655. #endif
  3656. return true;
  3657. }
  3658. bool CPythonNetworkStream::RecvDigMotionPacket()
  3659. {
  3660. TPacketGCDigMotion kDigMotion;
  3661. if (!Recv(sizeof(kDigMotion), &kDigMotion))
  3662. return false;
  3663. #ifdef _DEBUG
  3664. Tracef(" Dig Motion [%d/%d]\n", kDigMotion.vid, kDigMotion.count);
  3665. #endif
  3666. IAbstractCharacterManager& rkChrMgr=IAbstractCharacterManager::GetSingleton();
  3667. CInstanceBase * pkInstMain = rkChrMgr.GetInstancePtr(kDigMotion.vid);
  3668. CInstanceBase * pkInstTarget = rkChrMgr.GetInstancePtr(kDigMotion.target_vid);
  3669. if (NULL == pkInstMain)
  3670. return true;
  3671. if (pkInstTarget)
  3672. pkInstMain->NEW_LookAtDestInstance(*pkInstTarget);
  3673. for (int i = 0; i < kDigMotion.count; ++i)
  3674. pkInstMain->PushOnceMotion(CRaceMotionData::NAME_DIG);
  3675. return true;
  3676. }
  3677. // ¿ëÈ¥¼® °­È­
  3678. bool CPythonNetworkStream::SendDragonSoulRefinePacket(BYTE bRefineType, TItemPos* pos)
  3679. {
  3680. TPacketCGDragonSoulRefine pk;
  3681. pk.header = HEADER_CG_DRAGON_SOUL_REFINE;
  3682. pk.bSubType = bRefineType;
  3683. memcpy (pk.ItemGrid, pos, sizeof (TItemPos) * DS_REFINE_WINDOW_MAX_NUM);
  3684. if (!Send(sizeof (pk), &pk))
  3685. {
  3686. return false;
  3687. }
  3688. return true;
  3689. }