Advertisement
Guest User

Untitled

a guest
Aug 12th, 2017
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 17.63 KB | None | 0 0
  1. #include "stdafx.h"
  2. #include "../../libgame/include/grid.h"
  3. #include "utils.h"
  4. #include "desc.h"
  5. #include "desc_client.h"
  6. #include "char.h"
  7. #include "item.h"
  8. #include "item_manager.h"
  9. #include "packet.h"
  10. #include "log.h"
  11. #include "db.h"
  12. #include "locale_service.h"
  13. #include "../../common/length.h"
  14. #include "exchange.h"
  15. #include "DragonSoul.h"
  16.  
  17. void exchange_packet(LPCHARACTER ch, BYTE sub_header, bool is_me, long long arg1, TItemPos arg2, DWORD arg3, void * pvData = NULL);
  18.  
  19. // ±łČŻ ĆĐŶ
  20. void exchange_packet(LPCHARACTER ch, BYTE sub_header, bool is_me, long long arg1, TItemPos arg2, DWORD arg3, void * pvData)
  21. {
  22. if (!ch->GetDesc())
  23. return;
  24.  
  25. struct packet_exchange pack_exchg;
  26.  
  27. pack_exchg.header = HEADER_GC_EXCHANGE;
  28. pack_exchg.sub_header = sub_header;
  29. pack_exchg.is_me = is_me;
  30. pack_exchg.arg1 = arg1;
  31. pack_exchg.arg2 = arg2;
  32. pack_exchg.arg3 = arg3;
  33.  
  34. if (sub_header == EXCHANGE_SUBHEADER_GC_ITEM_ADD && pvData)
  35. {
  36. thecore_memcpy(&pack_exchg.alSockets, ((LPITEM) pvData)->GetSockets(), sizeof(pack_exchg.alSockets));
  37. thecore_memcpy(&pack_exchg.aAttr, ((LPITEM) pvData)->GetAttributes(), sizeof(pack_exchg.aAttr));
  38. }
  39. else
  40. {
  41. memset(&pack_exchg.alSockets, 0, sizeof(pack_exchg.alSockets));
  42. memset(&pack_exchg.aAttr, 0, sizeof(pack_exchg.aAttr));
  43. }
  44.  
  45. ch->GetDesc()->Packet(&pack_exchg, sizeof(pack_exchg));
  46. }
  47.  
  48. // ±łČŻŔ» ˝ĂŔŰ
  49. bool CHARACTER::ExchangeStart(LPCHARACTER victim)
  50. {
  51. if (this == victim) // ŔÚ±â ŔڽŰú´Â ±łČŻŔ» ¸řÇŃ´Ů.
  52. return false;
  53.  
  54. if (IsObserverMode())
  55. {
  56. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("°üŔü »óĹÂżˇĽ­´Â ±łČŻŔ» ÇŇ Ľö ľř˝Ŕ´Ď´Ů."));
  57. return false;
  58. }
  59.  
  60. if (victim->IsNPC())
  61. return false;
  62.  
  63. //PREVENT_TRADE_WINDOW
  64. if ( IsOpenSafebox() || GetShopOwner() || GetMyShop() || IsCubeOpen())
  65. {
  66. ChatPacket( CHAT_TYPE_INFO, LC_TEXT("´Ů¸Ą °Ĺ·ˇĂ˘ŔĚ ż­·ÁŔÖŔ»°ćżě °Ĺ·ˇ¸¦ ÇŇĽö ľř˝Ŕ´Ď´Ů." ) );
  67. return false;
  68. }
  69.  
  70. if ( victim->IsOpenSafebox() || victim->GetShopOwner() || victim->GetMyShop() || victim->IsCubeOpen() )
  71. {
  72. ChatPacket( CHAT_TYPE_INFO, LC_TEXT("»ó´ëąćŔĚ ´Ů¸Ą °Ĺ·ˇÁßŔ̶ó °Ĺ·ˇ¸¦ ÇŇĽö ľř˝Ŕ´Ď´Ů." ) );
  73. return false;
  74. }
  75. //END_PREVENT_TRADE_WINDOW
  76. int iDist = DISTANCE_APPROX(GetX() - victim->GetX(), GetY() - victim->GetY());
  77.  
  78. // °Ĺ¸® ĂĽĹ©
  79. if (iDist >= EXCHANGE_MAX_DISTANCE)
  80. return false;
  81.  
  82. if (GetExchange())
  83. return false;
  84.  
  85. if (victim->GetExchange())
  86. {
  87. exchange_packet(this, EXCHANGE_SUBHEADER_GC_ALREADY, 0, 0, NPOS, 0);
  88. return false;
  89. }
  90.  
  91. if (victim->IsBlockMode(BLOCK_EXCHANGE))
  92. {
  93. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("»ó´ëąćŔĚ ±łČŻ °ĹşÎ »óĹÂŔÔ´Ď´Ů."));
  94. return false;
  95. }
  96.  
  97. SetExchange(M2_NEW CExchange(this));
  98. victim->SetExchange(M2_NEW CExchange(victim));
  99.  
  100. victim->GetExchange()->SetCompany(GetExchange());
  101. GetExchange()->SetCompany(victim->GetExchange());
  102.  
  103. //
  104. SetExchangeTime();
  105. victim->SetExchangeTime();
  106.  
  107. exchange_packet(victim, EXCHANGE_SUBHEADER_GC_START, 0, GetVID(), NPOS, 0);
  108. exchange_packet(this, EXCHANGE_SUBHEADER_GC_START, 0, victim->GetVID(), NPOS, 0);
  109.  
  110. return true;
  111. }
  112.  
  113. CExchange::CExchange(LPCHARACTER pOwner)
  114. {
  115. m_pCompany = NULL;
  116.  
  117. m_bAccept = false;
  118.  
  119. for (int i = 0; i < EXCHANGE_ITEM_MAX_NUM; ++i)
  120. {
  121. m_apItems[i] = NULL;
  122. m_aItemPos[i] = NPOS;
  123. m_abItemDisplayPos[i] = 0;
  124. }
  125.  
  126. m_lGold = 0;
  127.  
  128. m_pOwner = pOwner;
  129. pOwner->SetExchange(this);
  130.  
  131. m_pGrid = M2_NEW CGrid(4,6);
  132. }
  133.  
  134. CExchange::~CExchange()
  135. {
  136. M2_DELETE(m_pGrid);
  137. }
  138.  
  139. bool CExchange::AddItem(TItemPos item_pos, BYTE display_pos)
  140. {
  141. assert(m_pOwner != NULL && GetCompany());
  142.  
  143. if (!item_pos.IsValidItemPosition())
  144. return false;
  145.  
  146. // Ŕĺşń´Â ±łČŻÇŇ Ľö ľřŔ˝
  147. if (item_pos.IsEquipPosition())
  148. return false;
  149.  
  150. LPITEM item;
  151.  
  152. if (!(item = m_pOwner->GetItem(item_pos)))
  153. return false;
  154.  
  155. if (IS_SET(item->GetAntiFlag(), ITEM_ANTIFLAG_GIVE))
  156. {
  157. m_pOwner->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ľĆŔĚĹŰŔ» °Çł×ÁŮ Ľö ľř˝Ŕ´Ď´Ů."));
  158. return false;
  159. }
  160.  
  161. if (true == item->isLocked())
  162. {
  163. return false;
  164. }
  165.  
  166. // ŔĚąĚ ±łČŻĂ˘żˇ Ăß°ˇµČ ľĆŔĚĹŰŔΰˇ?
  167. if (item->IsExchanging())
  168. {
  169. sys_log(0, "EXCHANGE under exchanging");
  170. return false;
  171. }
  172.  
  173. if (!m_pGrid->IsEmpty(display_pos, 1, item->GetSize()))
  174. {
  175. sys_log(0, "EXCHANGE not empty item_pos %d %d %d", display_pos, 1, item->GetSize());
  176. return false;
  177. }
  178.  
  179. Accept(false);
  180. GetCompany()->Accept(false);
  181.  
  182. for (int i = 0; i < EXCHANGE_ITEM_MAX_NUM; ++i)
  183. {
  184. if (m_apItems[i])
  185. continue;
  186.  
  187. m_apItems[i] = item;
  188. m_aItemPos[i] = item_pos;
  189. m_abItemDisplayPos[i] = display_pos;
  190. m_pGrid->Put(display_pos, 1, item->GetSize());
  191.  
  192. item->SetExchanging(true);
  193.  
  194. exchange_packet(m_pOwner,
  195. EXCHANGE_SUBHEADER_GC_ITEM_ADD,
  196. true,
  197. item->GetVnum(),
  198. TItemPos(RESERVED_WINDOW, display_pos),
  199. item->GetCount(),
  200. item);
  201.  
  202. exchange_packet(GetCompany()->GetOwner(),
  203. EXCHANGE_SUBHEADER_GC_ITEM_ADD,
  204. false,
  205. item->GetVnum(),
  206. TItemPos(RESERVED_WINDOW, display_pos),
  207. item->GetCount(),
  208. item);
  209.  
  210. sys_log(0, "EXCHANGE AddItem success %s pos(%d, %d) %d", item->GetName(), item_pos.window_type, item_pos.cell, display_pos);
  211.  
  212. return true;
  213. }
  214.  
  215. // Ăß°ˇÇŇ °ř°ŁŔĚ ľřŔ˝
  216. return false;
  217. }
  218.  
  219. bool CExchange::RemoveItem(BYTE pos)
  220. {
  221. if (pos >= EXCHANGE_ITEM_MAX_NUM)
  222. return false;
  223.  
  224. if (!m_apItems[pos])
  225. return false;
  226.  
  227. TItemPos PosOfInventory = m_aItemPos[pos];
  228. m_apItems[pos]->SetExchanging(false);
  229.  
  230. m_pGrid->Get(m_abItemDisplayPos[pos], 1, m_apItems[pos]->GetSize());
  231.  
  232. exchange_packet(GetOwner(), EXCHANGE_SUBHEADER_GC_ITEM_DEL, true, pos, NPOS, 0);
  233. exchange_packet(GetCompany()->GetOwner(), EXCHANGE_SUBHEADER_GC_ITEM_DEL, false, pos, PosOfInventory, 0);
  234.  
  235. Accept(false);
  236. GetCompany()->Accept(false);
  237.  
  238. m_apItems[pos] = NULL;
  239. m_aItemPos[pos] = NPOS;
  240. m_abItemDisplayPos[pos] = 0;
  241. return true;
  242. }
  243.  
  244. bool CExchange::AddGold(long long gold)
  245. {
  246. if (gold <= 0)
  247. return false;
  248.  
  249. if (GetOwner()->GetGold() < gold)
  250. {
  251. // °ˇÁö°í ŔÖ´Â µ·ŔĚ şÎÁ·.
  252. exchange_packet(GetOwner(), EXCHANGE_SUBHEADER_GC_LESS_GOLD, 0, 0, NPOS, 0);
  253. return false;
  254. }
  255.  
  256. if ( LC_IsCanada() == true || LC_IsEurope() == true )
  257. {
  258. if ( m_lGold > 0 )
  259. {
  260. return false;
  261. }
  262. }
  263.  
  264. Accept(false);
  265. GetCompany()->Accept(false);
  266.  
  267. m_lGold = gold;
  268.  
  269. exchange_packet(GetOwner(), EXCHANGE_SUBHEADER_GC_GOLD_ADD, true, m_lGold, NPOS, 0);
  270. exchange_packet(GetCompany()->GetOwner(), EXCHANGE_SUBHEADER_GC_GOLD_ADD, false, m_lGold, NPOS, 0);
  271. return true;
  272. }
  273.  
  274. // µ·ŔĚ ĂćşĐČ÷ ŔÖ´ÂÁö, ±łČŻÇĎ·Á´Â ľĆŔĚĹŰŔĚ ˝ÇÁ¦·Î ŔÖ´ÂÁö Č®ŔÎ ÇŃ´Ů.
  275. bool CExchange::Check(int * piItemCount)
  276. {
  277. if (GetOwner()->GetGold() < m_lGold)
  278. return false;
  279.  
  280. int item_count = 0;
  281.  
  282. for (int i = 0; i < EXCHANGE_ITEM_MAX_NUM; ++i)
  283. {
  284. if (!m_apItems[i])
  285. continue;
  286.  
  287. if (!m_aItemPos[i].IsValidItemPosition())
  288. return false;
  289.  
  290. if (m_apItems[i] != GetOwner()->GetItem(m_aItemPos[i]))
  291. return false;
  292.  
  293. ++item_count;
  294. }
  295.  
  296. *piItemCount = item_count;
  297. return true;
  298. }
  299.  
  300. bool CExchange::CheckSpace()
  301. {
  302. static CGrid s_grid1(5, INVENTORY_MAX_NUM / 5 / 5); // inven page 1
  303. static CGrid s_grid2(5, INVENTORY_MAX_NUM / 5 / 5); // inven page 2
  304. static CGrid s_grid3(5, INVENTORY_MAX_NUM / 5 / 5); // inven page 3
  305. static CGrid s_grid4(5, INVENTORY_MAX_NUM / 5 / 5); // inven page 4
  306. static CGrid s_grid5(5, INVENTORY_MAX_NUM / 5 / 5); // inven page 5
  307.  
  308. s_grid1.Clear();
  309. s_grid2.Clear();
  310. s_grid3.Clear();
  311. s_grid4.Clear();
  312. s_grid5.Clear();
  313.  
  314. LPCHARACTER victim = GetCompany()->GetOwner();
  315. LPITEM item;
  316.  
  317. int i;
  318. const int PageSlotCount = INVENTORY_MAX_NUM / 5;
  319.  
  320. for (i = 0; i < INVENTORY_MAX_NUM; ++i)
  321. {
  322. if (!(item = victim->GetInventoryItem(i)))
  323. continue;
  324.  
  325. BYTE itemSize = item->GetSize();
  326.  
  327. if (i < PageSlotCount)
  328. s_grid1.Put(i, 1, itemSize);
  329. else if (i < PageSlotCount * 2)
  330. s_grid2.Put(i - PageSlotCount, 1, itemSize);
  331. else if (i < PageSlotCount * 3)
  332. s_grid3.Put(i - PageSlotCount * 2, 1, itemSize);
  333. else if (i < PageSlotCount * 4)
  334. s_grid4.Put(i - PageSlotCount * 3, 1, itemSize);
  335. else if (i < PageSlotCount * 5)
  336. s_grid5.Put(i - PageSlotCount * 4, 1, itemSize);
  337. }
  338.  
  339. static std::vector <WORD> s_vDSGrid(DRAGON_SOUL_INVENTORY_MAX_NUM);
  340.  
  341. bool bDSInitialized = false;
  342.  
  343. for (i = 0; i < EXCHANGE_ITEM_MAX_NUM; ++i)
  344. {
  345. if (!(item = m_apItems))
  346. continue;
  347.  
  348. BYTE itemSize = item->GetSize();
  349.  
  350. if (item->IsDragonSoul())
  351. {
  352. if (!victim->DragonSoul_IsQualified())
  353. {
  354. return false;
  355. }
  356.  
  357. if (!bDSInitialized)
  358. {
  359. bDSInitialized = true;
  360. victim->CopyDragonSoulItemGrid(s_vDSGrid);
  361. }
  362.  
  363. bool bExistEmptySpace = false;
  364. WORD wBasePos = DSManager::instance().GetBasePosition(item);
  365. if (wBasePos >= DRAGON_SOUL_INVENTORY_MAX_NUM)
  366. return false;
  367.  
  368. for (int i = 0; i < DRAGON_SOUL_BOX_SIZE; i++)
  369. {
  370. WORD wPos = wBasePos + i;
  371. if (0 == s_vDSGrid[wBasePos])
  372. {
  373. bool bEmpty = true;
  374. for (int j = 1; j < item->GetSize(); j++)
  375. {
  376. if (s_vDSGrid[wPos + j * DRAGON_SOUL_BOX_COLUMN_NUM])
  377. {
  378. bEmpty = false;
  379. break;
  380. }
  381. }
  382. if (bEmpty)
  383. {
  384. for (int j = 0; j < item->GetSize(); j++)
  385. {
  386. s_vDSGrid[wPos + j * DRAGON_SOUL_BOX_COLUMN_NUM] = wPos + 1;
  387. }
  388. bExistEmptySpace = true;
  389. break;
  390. }
  391. }
  392. if (bExistEmptySpace)
  393. break;
  394. }
  395. if (!bExistEmptySpace)
  396. return false;
  397. }
  398. else
  399. {
  400. int iPos = s_grid1.FindBlank(1, itemSize);
  401. if (iPos >= 0)
  402. {
  403. s_grid1.Put(iPos, 1, itemSize);
  404. continue;
  405. }
  406.  
  407. iPos = s_grid2.FindBlank(1, itemSize);
  408. if (iPos >= 0)
  409. {
  410. s_grid2.Put(iPos, 1, itemSize);
  411. continue;
  412. }
  413.  
  414. iPos = s_grid3.FindBlank(1, itemSize);
  415. if (iPos >= 0)
  416. {
  417. s_grid3.Put(iPos, 1, itemSize);
  418. continue;
  419. }
  420.  
  421. iPos = s_grid4.FindBlank(1, itemSize);
  422. if (iPos >= 0)
  423. {
  424. s_grid4.Put(iPos, 1, itemSize);
  425. continue;
  426. }
  427.  
  428. iPos = s_grid5.FindBlank(1, itemSize);
  429. if (iPos >= 0)
  430. {
  431. s_grid5.Put(iPos, 1, itemSize);
  432. continue;
  433. }
  434.  
  435. return false;
  436. }
  437. }
  438.  
  439. return true;
  440. }
  441.  
  442. // ±łČŻ łˇ (ľĆŔĚĹŰ°ú µ· µîŔ» ˝ÇÁ¦·Î żĹ±ä´Ů)
  443. bool CExchange::Done()
  444. {
  445. int empty_pos, i;
  446. LPITEM item;
  447.  
  448. LPCHARACTER victim = GetCompany()->GetOwner();
  449.  
  450. for (i = 0; i < EXCHANGE_ITEM_MAX_NUM; ++i)
  451. {
  452. if (!(item = m_apItems[i]))
  453. continue;
  454.  
  455. if (item->IsDragonSoul())
  456. empty_pos = victim->GetEmptyDragonSoulInventory(item);
  457. else
  458. empty_pos = victim->GetEmptyInventory(item->GetSize());
  459.  
  460. if (empty_pos < 0)
  461. {
  462. sys_err("Exchange::Done : Cannot find blank position in inventory %s <-> %s item %s",
  463. m_pOwner->GetName(), victim->GetName(), item->GetName());
  464. continue;
  465. }
  466.  
  467. assert(empty_pos >= 0);
  468.  
  469. if (item->GetVnum() == 90008 || item->GetVnum() == 90009) // VCARD
  470. {
  471. VCardUse(m_pOwner, victim, item);
  472. continue;
  473. }
  474.  
  475. m_pOwner->SyncQuickslot(QUICKSLOT_TYPE_ITEM, item->GetCell(), 1000);
  476.  
  477. item->RemoveFromCharacter();
  478. if (item->IsDragonSoul())
  479. item->AddToCharacter(victim, TItemPos(DRAGON_SOUL_INVENTORY, empty_pos));
  480. else
  481. item->AddToCharacter(victim, TItemPos(INVENTORY, empty_pos));
  482. ITEM_MANAGER::instance().FlushDelayedSave(item);
  483.  
  484. item->SetExchanging(false);
  485. {
  486. char exchange_buf[51];
  487.  
  488. snprintf(exchange_buf, sizeof(exchange_buf), "%s %u %u", item->GetName(), GetOwner()->GetPlayerID(), item->GetCount());
  489. LogManager::instance().ItemLog(victim, item, "EXCHANGE_TAKE", exchange_buf);
  490.  
  491. snprintf(exchange_buf, sizeof(exchange_buf), "%s %u %u", item->GetName(), victim->GetPlayerID(), item->GetCount());
  492. LogManager::instance().ItemLog(GetOwner(), item, "EXCHANGE_GIVE", exchange_buf);
  493.  
  494. if (item->GetVnum() >= 80003 && item->GetVnum() <= 80007)
  495. {
  496. LogManager::instance().GoldBarLog(victim->GetPlayerID(), item->GetID(), EXCHANGE_TAKE, "");
  497. LogManager::instance().GoldBarLog(GetOwner()->GetPlayerID(), item->GetID(), EXCHANGE_GIVE, "");
  498. }
  499. }
  500.  
  501. m_apItems[i] = NULL;
  502. }
  503.  
  504. if (m_lGold)
  505. {
  506. GetOwner()->PointChange(POINT_GOLD, -m_lGold, true);
  507. victim->PointChange(POINT_GOLD, m_lGold, true);
  508.  
  509. if (m_lGold > 1000)
  510. {
  511. char exchange_buf[51];
  512. snprintf(exchange_buf, sizeof(exchange_buf), "%u %s", GetOwner()->GetPlayerID(), GetOwner()->GetName());
  513. LogManager::instance().CharLog(victim, m_lGold, "EXCHANGE_GOLD_TAKE", exchange_buf);
  514.  
  515. snprintf(exchange_buf, sizeof(exchange_buf), "%u %s", victim->GetPlayerID(), victim->GetName());
  516. LogManager::instance().CharLog(GetOwner(), m_lGold, "EXCHANGE_GOLD_GIVE", exchange_buf);
  517. }
  518. }
  519.  
  520. m_pGrid->Clear();
  521. return true;
  522. }
  523.  
  524. // ±łČŻŔ» µżŔÇ
  525. bool CExchange::Accept(bool bAccept)
  526. {
  527. if (m_bAccept == bAccept)
  528. return true;
  529.  
  530. m_bAccept = bAccept;
  531.  
  532. // µŃ ´Ů µżŔÇ ÇßŔ¸ąÇ·Î ±łČŻ Ľş¸ł
  533. if (m_bAccept && GetCompany()->m_bAccept)
  534. {
  535. int iItemCount;
  536.  
  537. LPCHARACTER victim = GetCompany()->GetOwner();
  538.  
  539. //PREVENT_PORTAL_AFTER_EXCHANGE
  540. GetOwner()->SetExchangeTime();
  541. victim->SetExchangeTime();
  542. //END_PREVENT_PORTAL_AFTER_EXCHANGE
  543.  
  544. // exchange_check żˇĽ­´Â ±łČŻÇŇ ľĆŔĚĹ۵éŔĚ Á¦ŔÚ¸®żˇ ŔÖłŞ Č®ŔÎÇĎ°í,
  545. // ż¤Ĺ©µµ ĂćşĐČ÷ ŔÖłŞ Č®ŔÎÇŃ´Ů, µÎąř° ŔÎŔÚ·Î ±łČŻÇŇ ľĆŔĚĹŰ °łĽö
  546. // ¸¦ ¸®ĹĎÇŃ´Ů.
  547. if (!Check(&iItemCount))
  548. {
  549. GetOwner()->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("µ·ŔĚ şÎÁ·ÇĎ°ĹłŞ ľĆŔĚĹŰŔĚ Á¦ŔÚ¸®żˇ ľř˝Ŕ´Ď´Ů."));
  550. victim->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("»ó´ëąćŔÇ µ·ŔĚ şÎÁ·ÇĎ°ĹłŞ ľĆŔĚĹŰŔĚ Á¦ŔÚ¸®żˇ ľř˝Ŕ´Ď´Ů."));
  551. goto EXCHANGE_END;
  552. }
  553.  
  554. // ¸®ĹĎ ąŢŔş ľĆŔĚĹŰ °łĽö·Î »ó´ëąćŔÇ ĽŇÁöÇ°żˇ ł˛Ŕş ŔÚ¸®°ˇ ŔÖłŞ Č®ŔÎÇŃ´Ů.
  555. if (!CheckSpace())
  556. {
  557. GetOwner()->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("»ó´ëąćŔÇ ĽŇÁöÇ°żˇ şó °ř°ŁŔĚ ľř˝Ŕ´Ď´Ů."));
  558. victim->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ĽŇÁöÇ°żˇ şó °ř°ŁŔĚ ľř˝Ŕ´Ď´Ů."));
  559. goto EXCHANGE_END;
  560. }
  561.  
  562. // »ó´ëąćµµ ¸¶Âů°ˇÁö·Î..
  563. if (!GetCompany()->Check(&iItemCount))
  564. {
  565. victim->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("µ·ŔĚ şÎÁ·ÇĎ°ĹłŞ ľĆŔĚĹŰŔĚ Á¦ŔÚ¸®żˇ ľř˝Ŕ´Ď´Ů."));
  566. GetOwner()->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("»ó´ëąćŔÇ µ·ŔĚ şÎÁ·ÇĎ°ĹłŞ ľĆŔĚĹŰŔĚ Á¦ŔÚ¸®żˇ ľř˝Ŕ´Ď´Ů."));
  567. goto EXCHANGE_END;
  568. }
  569.  
  570. if (!GetCompany()->CheckSpace())
  571. {
  572. victim->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("»ó´ëąćŔÇ ĽŇÁöÇ°żˇ şó °ř°ŁŔĚ ľř˝Ŕ´Ď´Ů."));
  573. GetOwner()->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ĽŇÁöÇ°żˇ şó °ř°ŁŔĚ ľř˝Ŕ´Ď´Ů."));
  574. goto EXCHANGE_END;
  575. }
  576.  
  577. if (db_clientdesc->GetSocket() == INVALID_SOCKET)
  578. {
  579. sys_err("Cannot use exchange feature while DB cache connection is dead.");
  580. victim->ChatPacket(CHAT_TYPE_INFO, "Unknown error");
  581. GetOwner()->ChatPacket(CHAT_TYPE_INFO, "Unknown error");
  582. goto EXCHANGE_END;
  583. }
  584.  
  585. if (Done())
  586. {
  587. if (m_lGold) // µ·ŔĚ ŔÖŔ» ‹š¸¸ ŔúŔĺ
  588. GetOwner()->Save();
  589.  
  590. if (GetCompany()->Done())
  591. {
  592. if (GetCompany()->m_lGold) // µ·ŔĚ ŔÖŔ» ¶§¸¸ ŔúŔĺ
  593. victim->Save();
  594.  
  595. // INTERNATIONAL_VERSION
  596. GetOwner()->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%s ´Ô°úŔÇ ±łČŻŔĚ Ľş»ç µÇľú˝Ŕ´Ď´Ů."), victim->GetName());
  597. victim->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%s ´Ô°úŔÇ ±łČŻŔĚ Ľş»ç µÇľú˝Ŕ´Ď´Ů."), GetOwner()->GetName());
  598. // END_OF_INTERNATIONAL_VERSION
  599. }
  600. }
  601.  
  602. EXCHANGE_END:
  603. Cancel();
  604. return false;
  605. }
  606. else
  607. {
  608. // ľĆ´Ď¸é acceptżˇ ´ëÇŃ ĆĐŶŔ» ş¸ł»ŔÚ.
  609. exchange_packet(GetOwner(), EXCHANGE_SUBHEADER_GC_ACCEPT, true, m_bAccept, NPOS, 0);
  610. exchange_packet(GetCompany()->GetOwner(), EXCHANGE_SUBHEADER_GC_ACCEPT, false, m_bAccept, NPOS, 0);
  611. return true;
  612. }
  613. }
  614.  
  615. // ±łČŻ ĂëĽŇ
  616. void CExchange::Cancel()
  617. {
  618. exchange_packet(GetOwner(), EXCHANGE_SUBHEADER_GC_END, 0, 0, NPOS, 0);
  619. GetOwner()->SetExchange(NULL);
  620.  
  621. for (int i = 0; i < EXCHANGE_ITEM_MAX_NUM; ++i)
  622. {
  623. if (m_apItems[i])
  624. m_apItems[i]->SetExchanging(false);
  625. }
  626.  
  627. if (GetCompany())
  628. {
  629. GetCompany()->SetCompany(NULL);
  630. GetCompany()->Cancel();
  631. }
  632.  
  633. M2_DELETE(this);
  634. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement