Advertisement
Guest User

Untitled

a guest
Aug 8th, 2017
147
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 17.52 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. #ifdef __NEW_EXCHANGE_WINDOW__
  132. m_pGrid = M2_NEW CGrid(6, 4);
  133. #else
  134. m_pGrid = M2_NEW CGrid(4, 3);
  135. #endif
  136. }
  137.  
  138. CExchange::~CExchange()
  139. {
  140. M2_DELETE(m_pGrid);
  141. }
  142.  
  143. bool CExchange::AddItem(TItemPos item_pos, BYTE display_pos)
  144. {
  145. assert(m_pOwner != NULL && GetCompany());
  146.  
  147. if (!item_pos.IsValidItemPosition())
  148. return false;
  149.  
  150. // Àåºñ´Â ±³È¯ÇÒ ¼ö ¾øÀ½
  151. if (item_pos.IsEquipPosition())
  152. return false;
  153.  
  154. LPITEM item;
  155.  
  156. if (!(item = m_pOwner->GetItem(item_pos)))
  157. return false;
  158.  
  159. if (IS_SET(item->GetAntiFlag(), ITEM_ANTIFLAG_GIVE))
  160. {
  161. m_pOwner->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¾ÆÀÌÅÛÀ» °Ç³×ÁÙ ¼ö ¾ø½À´Ï´Ù."));
  162. return false;
  163. }
  164.  
  165. if (true == item->isLocked())
  166. {
  167. return false;
  168. }
  169.  
  170. // ÀÌ¹Ì ±³È¯Ã¢¿¡ Ãß°¡µÈ ¾ÆÀÌÅÛÀΰ¡?
  171. if (item->IsExchanging())
  172. {
  173. sys_log(0, "EXCHANGE under exchanging");
  174. return false;
  175. }
  176.  
  177. if (!m_pGrid->IsEmpty(display_pos, 1, item->GetSize()))
  178. {
  179. sys_log(0, "EXCHANGE not empty item_pos %d %d %d", display_pos, 1, item->GetSize());
  180. return false;
  181. }
  182.  
  183. Accept(false);
  184. GetCompany()->Accept(false);
  185.  
  186. for (int i = 0; i < EXCHANGE_ITEM_MAX_NUM; ++i)
  187. {
  188. if (m_apItems[i])
  189. continue;
  190.  
  191. m_apItems[i] = item;
  192. m_aItemPos[i] = item_pos;
  193. m_abItemDisplayPos[i] = display_pos;
  194. m_pGrid->Put(display_pos, 1, item->GetSize());
  195.  
  196. item->SetExchanging(true);
  197.  
  198. exchange_packet(m_pOwner,
  199. EXCHANGE_SUBHEADER_GC_ITEM_ADD,
  200. true,
  201. item->GetVnum(),
  202. TItemPos(RESERVED_WINDOW, display_pos),
  203. item->GetCount(),
  204. item);
  205.  
  206. exchange_packet(GetCompany()->GetOwner(),
  207. EXCHANGE_SUBHEADER_GC_ITEM_ADD,
  208. false,
  209. item->GetVnum(),
  210. TItemPos(RESERVED_WINDOW, display_pos),
  211. item->GetCount(),
  212. item);
  213.  
  214. sys_log(0, "EXCHANGE AddItem success %s pos(%d, %d) %d", item->GetName(), item_pos.window_type, item_pos.cell, display_pos);
  215.  
  216. return true;
  217. }
  218.  
  219. // Ãß°¡ÇÒ °ø°£ÀÌ ¾øÀ½
  220. return false;
  221. }
  222.  
  223. bool CExchange::RemoveItem(BYTE pos)
  224. {
  225. if (pos >= EXCHANGE_ITEM_MAX_NUM)
  226. return false;
  227.  
  228. if (!m_apItems[pos])
  229. return false;
  230.  
  231. TItemPos PosOfInventory = m_aItemPos[pos];
  232. m_apItems[pos]->SetExchanging(false);
  233.  
  234. m_pGrid->Get(m_abItemDisplayPos[pos], 1, m_apItems[pos]->GetSize());
  235.  
  236. exchange_packet(GetOwner(), EXCHANGE_SUBHEADER_GC_ITEM_DEL, true, pos, NPOS, 0);
  237. exchange_packet(GetCompany()->GetOwner(), EXCHANGE_SUBHEADER_GC_ITEM_DEL, false, pos, PosOfInventory, 0);
  238.  
  239. Accept(false);
  240. GetCompany()->Accept(false);
  241.  
  242. m_apItems[pos] = NULL;
  243. m_aItemPos[pos] = NPOS;
  244. m_abItemDisplayPos[pos] = 0;
  245. return true;
  246. }
  247.  
  248. bool CExchange::AddGold(long long gold)
  249. {
  250. if (gold <= 0)
  251. return false;
  252.  
  253. if (GetOwner()->GetGold() < gold)
  254. {
  255. // °¡Áö°í ÀÖ´Â µ·ÀÌ ºÎÁ·.
  256. exchange_packet(GetOwner(), EXCHANGE_SUBHEADER_GC_LESS_GOLD, 0, 0, NPOS, 0);
  257. return false;
  258. }
  259.  
  260. if ( LC_IsCanada() == true || LC_IsEurope() == true )
  261. {
  262. if ( m_lGold > 0 )
  263. {
  264. return false;
  265. }
  266. }
  267.  
  268. Accept(false);
  269. GetCompany()->Accept(false);
  270.  
  271. m_lGold = gold;
  272.  
  273. exchange_packet(GetOwner(), EXCHANGE_SUBHEADER_GC_GOLD_ADD, true, m_lGold, NPOS, 0);
  274. exchange_packet(GetCompany()->GetOwner(), EXCHANGE_SUBHEADER_GC_GOLD_ADD, false, m_lGold, NPOS, 0);
  275. return true;
  276. }
  277.  
  278. // µ·ÀÌ ÃæºÐÈ÷ ÀÖ´ÂÁö, ±³È¯ÇÏ·Á´Â ¾ÆÀÌÅÛÀÌ ½ÇÁ¦·Î ÀÖ´ÂÁö È®ÀÎ ÇÑ´Ù.
  279. bool CExchange::Check(int * piItemCount)
  280. {
  281. if (GetOwner()->GetGold() < m_lGold)
  282. return false;
  283.  
  284. int item_count = 0;
  285.  
  286. for (int i = 0; i < EXCHANGE_ITEM_MAX_NUM; ++i)
  287. {
  288. if (!m_apItems[i])
  289. continue;
  290.  
  291. if (!m_aItemPos[i].IsValidItemPosition())
  292. return false;
  293.  
  294. if (m_apItems[i] != GetOwner()->GetItem(m_aItemPos[i]))
  295. return false;
  296.  
  297. ++item_count;
  298. }
  299.  
  300. *piItemCount = item_count;
  301. return true;
  302. }
  303.  
  304. bool CExchange::CheckSpace()
  305. {
  306. static CGrid s_grid1(5, INVENTORY_MAX_NUM/5 / 5); // inven page 1
  307. static CGrid s_grid2(5, INVENTORY_MAX_NUM/5 / 5); // inven page 2
  308. static CGrid s_grid3(5, INVENTORY_MAX_NUM/5 / 5); // inven page 3
  309. static CGrid s_grid4(5, INVENTORY_MAX_NUM/5 / 5); // inven page 4
  310. static CGrid s_grid5(5, INVENTORY_MAX_NUM/5 / 5); // inven page 5
  311.  
  312. s_grid1.Clear();
  313. s_grid2.Clear();
  314. s_grid3.Clear();
  315. s_grid4.Clear();
  316. s_grid5.Clear();
  317.  
  318. LPCHARACTER victim = GetCompany()->GetOwner();
  319. LPITEM item;
  320.  
  321. int i;
  322.  
  323. for (i = 0; i < INVENTORY_MAX_NUM / 4; ++i)
  324. {
  325. if (!(item = victim->GetInventoryItem(i)))
  326. continue;
  327.  
  328. s_grid1.Put(i, 1, item->GetSize());
  329. }
  330. for (i = INVENTORY_MAX_NUM / 4; i < (INVENTORY_MAX_NUM / 4) * 2; ++i)
  331. {
  332. if (!(item = victim->GetInventoryItem(i)))
  333. continue;
  334.  
  335. s_grid2.Put(i - INVENTORY_MAX_NUM / 4, 1, item->GetSize());
  336. }
  337. for (i = (INVENTORY_MAX_NUM / 4) * 2; i < (INVENTORY_MAX_NUM / 4) * 3; ++i)
  338. {
  339. if (!(item = victim->GetInventoryItem(i)))
  340. continue;
  341.  
  342. s_grid3.Put(i - (INVENTORY_MAX_NUM / 4) * 2, 1, item->GetSize());
  343. }
  344. for (i = (INVENTORY_MAX_NUM / 4) * 3; i < (INVENTORY_MAX_NUM / 4) * 4; ++i)
  345. {
  346. if (!(item = victim->GetInventoryItem(i)))
  347. continue;
  348.  
  349. s_grid4.Put(i -(INVENTORY_MAX_NUM / 4) * 3, 1, item->GetSize());
  350. }
  351. for (i = (INVENTORY_MAX_NUM / 5) * 4; i < (INVENTORY_MAX_NUM / 5) * 5; ++i)
  352. {
  353. if (!(item = victim->GetInventoryItem(i)))
  354. continue;
  355.  
  356. s_grid5.Put(i - (INVENTORY_MAX_NUM / 5) * 4, 1, item->GetSize());
  357. }
  358.  
  359. // ¾Æ... ¹º°¡ °³º´½Å °°Áö¸¸... ¿ëÈ¥¼® Àκ¥À» ³ë¸Ö Àκ¥ º¸°í µû¶ó ¸¸µç ³» À߸øÀÌ´Ù ¤Ð¤Ð
  360. static std::vector <WORD> s_vDSGrid(DRAGON_SOUL_INVENTORY_MAX_NUM);
  361.  
  362. // ÀÏ´Ü ¿ëÈ¥¼®À» ±³È¯ÇÏÁö ¾ÊÀ» °¡´É¼ºÀÌ Å©¹Ç·Î, ¿ëÈ¥¼® Àκ¥ º¹»ç´Â ¿ëÈ¥¼®ÀÌ ÀÖÀ» ¶§ Çϵµ·Ï ÇÑ´Ù.
  363. bool bDSInitialized = false;
  364.  
  365. for (i = 0; i < EXCHANGE_ITEM_MAX_NUM; ++i)
  366. {
  367. if (!(item = m_apItems[i]))
  368. continue;
  369.  
  370. if (item->IsDragonSoul())
  371. {
  372. if (!victim->DragonSoul_IsQualified())
  373. {
  374. return false;
  375. }
  376.  
  377. if (!bDSInitialized)
  378. {
  379. bDSInitialized = true;
  380. victim->CopyDragonSoulItemGrid(s_vDSGrid);
  381. }
  382.  
  383. bool bExistEmptySpace = false;
  384. WORD wBasePos = DSManager::instance().GetBasePosition(item);
  385. if (wBasePos >= DRAGON_SOUL_INVENTORY_MAX_NUM)
  386. return false;
  387.  
  388. for (int i = 0; i < DRAGON_SOUL_BOX_SIZE; i++)
  389. {
  390. WORD wPos = wBasePos + i;
  391. if (0 == s_vDSGrid[wBasePos])
  392. {
  393. bool bEmpty = true;
  394. for (int j = 1; j < item->GetSize(); j++)
  395. {
  396. if (s_vDSGrid[wPos + j * DRAGON_SOUL_BOX_COLUMN_NUM])
  397. {
  398. bEmpty = false;
  399. break;
  400. }
  401. }
  402. if (bEmpty)
  403. {
  404. for (int j = 0; j < item->GetSize(); j++)
  405. {
  406. s_vDSGrid[wPos + j * DRAGON_SOUL_BOX_COLUMN_NUM] = wPos + 1;
  407. }
  408. bExistEmptySpace = true;
  409. break;
  410. }
  411. }
  412. if (bExistEmptySpace)
  413. break;
  414. }
  415. if (!bExistEmptySpace)
  416. return false;
  417. }
  418. else
  419. {
  420. int iPos = s_grid1.FindBlank(1, item->GetSize());
  421.  
  422. if (iPos >= 0)
  423. {
  424. s_grid1.Put(iPos, 1, item->GetSize());
  425. }
  426. else
  427. {
  428. iPos = s_grid2.FindBlank(1, item->GetSize());
  429.  
  430. if (iPos >= 0)
  431. {
  432. s_grid2.Put(iPos, 1, item->GetSize());
  433. }
  434. else
  435. {
  436. iPos = s_grid3.FindBlank(1, item->GetSize());
  437.  
  438. if (iPos >= 0)
  439. {
  440. s_grid3.Put(iPos, 1, item->GetSize());
  441. }
  442. else
  443. {
  444. iPos = s_grid4.FindBlank(1, item->GetSize());
  445.  
  446. if (iPos >= 0)
  447. {
  448. s_grid4.Put(iPos, 1, item->GetSize());
  449. }
  450. else
  451. {
  452. return false;
  453. }
  454. }
  455. }
  456. }
  457. }
  458. }
  459. return true;
  460. }
  461.  
  462. // ±³È¯ ³¡ (¾ÆÀÌÅÛ°ú µ· µîÀ» ½ÇÁ¦·Î ¿Å±ä´Ù)
  463. bool CExchange::Done()
  464. {
  465. int empty_pos, i;
  466. LPITEM item;
  467.  
  468. LPCHARACTER victim = GetCompany()->GetOwner();
  469. //GetOwner()->CreateFly(6,victim);
  470.  
  471. for (i = 0; i < EXCHANGE_ITEM_MAX_NUM; ++i)
  472. {
  473. if (!(item = m_apItems[i]))
  474. continue;
  475.  
  476. if (item->IsDragonSoul())
  477. empty_pos = victim->GetEmptyDragonSoulInventory(item);
  478. else
  479. empty_pos = victim->GetEmptyInventory(item->GetSize());
  480.  
  481. if (empty_pos < 0)
  482. {
  483. sys_err("Exchange::Done : Cannot find blank position in inventory %s <-> %s item %s",
  484. m_pOwner->GetName(), victim->GetName(), item->GetName());
  485. continue;
  486. }
  487.  
  488. assert(empty_pos >= 0);
  489.  
  490. if (item->GetVnum() == 90008 || item->GetVnum() == 90009) // VCARD
  491. {
  492. VCardUse(m_pOwner, victim, item);
  493. continue;
  494. }
  495.  
  496. m_pOwner->SyncQuickslot(QUICKSLOT_TYPE_ITEM, item->GetCell(), 255);
  497.  
  498. item->RemoveFromCharacter();
  499. if (item->IsDragonSoul())
  500. item->AddToCharacter(victim, TItemPos(DRAGON_SOUL_INVENTORY, empty_pos));
  501. else
  502. item->AddToCharacter(victim, TItemPos(INVENTORY, empty_pos));
  503. ITEM_MANAGER::instance().FlushDelayedSave(item);
  504.  
  505. //GetOwner()->CreateFly(5,victim);
  506. item->SetExchanging(false);
  507. {
  508. char exchange_buf[51];
  509.  
  510. snprintf(exchange_buf, sizeof(exchange_buf), "%s %u %u", item->GetName(), GetOwner()->GetPlayerID(), item->GetCount());
  511. LogManager::instance().ItemLog(victim, item, "EXCHANGE_TAKE", exchange_buf);
  512.  
  513. snprintf(exchange_buf, sizeof(exchange_buf), "%s %u %u", item->GetName(), victim->GetPlayerID(), item->GetCount());
  514. LogManager::instance().ItemLog(GetOwner(), item, "EXCHANGE_GIVE", exchange_buf);
  515.  
  516. if (item->GetVnum() >= 80003 && item->GetVnum() <= 80007)
  517. {
  518. LogManager::instance().GoldBarLog(victim->GetPlayerID(), item->GetID(), EXCHANGE_TAKE, "");
  519. LogManager::instance().GoldBarLog(GetOwner()->GetPlayerID(), item->GetID(), EXCHANGE_GIVE, "");
  520. }
  521. }
  522.  
  523. m_apItems[i] = NULL;
  524. }
  525.  
  526. if (m_lGold)
  527. {
  528. for (int i = 1; i < m_lGold+1; i=i+500000)
  529. //GetOwner()->CreateFly(4,victim); // 1 Fly pro 500k . dh max 20 auf einmal (TradeLimit: 10kkk
  530. GetOwner()->PointChange(POINT_GOLD, -m_lGold, true);
  531. victim->PointChange(POINT_GOLD, m_lGold, true);
  532.  
  533. if (m_lGold > 1000)
  534. {
  535. char exchange_buf[51];
  536. snprintf(exchange_buf, sizeof(exchange_buf), "%u %s", GetOwner()->GetPlayerID(), GetOwner()->GetName());
  537. LogManager::instance().CharLog(victim, m_lGold, "EXCHANGE_GOLD_TAKE", exchange_buf);
  538.  
  539. snprintf(exchange_buf, sizeof(exchange_buf), "%u %s", victim->GetPlayerID(), victim->GetName());
  540. LogManager::instance().CharLog(GetOwner(), m_lGold, "EXCHANGE_GOLD_GIVE", exchange_buf);
  541. }
  542. }
  543.  
  544. m_pGrid->Clear();
  545. return true;
  546. }
  547.  
  548. // ±³È¯À» µ¿ÀÇ
  549. bool CExchange::Accept(bool bAccept)
  550. {
  551. if (m_bAccept == bAccept)
  552. return true;
  553.  
  554. m_bAccept = bAccept;
  555.  
  556. // µÑ ´Ù µ¿ÀÇ ÇßÀ¸¹Ç·Î ±³È¯ ¼º¸³
  557. if (m_bAccept && GetCompany()->m_bAccept)
  558. {
  559. int iItemCount;
  560.  
  561. LPCHARACTER victim = GetCompany()->GetOwner();
  562.  
  563. //PREVENT_PORTAL_AFTER_EXCHANGE
  564. GetOwner()->SetExchangeTime();
  565. victim->SetExchangeTime();
  566. //END_PREVENT_PORTAL_AFTER_EXCHANGE
  567.  
  568. // exchange_check ¿¡¼­´Â ±³È¯ÇÒ ¾ÆÀÌÅÛµéÀÌ Á¦ÀÚ¸®¿¡ ÀÖ³ª È®ÀÎÇÏ°í,
  569. // ¿¤Å©µµ ÃæºÐÈ÷ ÀÖ³ª È®ÀÎÇÑ´Ù, µÎ¹ø° ÀÎÀÚ·Î ±³È¯ÇÒ ¾ÆÀÌÅÛ °³¼ö
  570. // ¸¦ ¸®ÅÏÇÑ´Ù.
  571. if (!Check(&iItemCount))
  572. {
  573. GetOwner()->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("µ·ÀÌ ºÎÁ·Çϰųª ¾ÆÀÌÅÛÀÌ Á¦ÀÚ¸®¿¡ ¾ø½À´Ï´Ù."));
  574. victim->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("»ó´ë¹æÀÇ µ·ÀÌ ºÎÁ·Çϰųª ¾ÆÀÌÅÛÀÌ Á¦ÀÚ¸®¿¡ ¾ø½À´Ï´Ù."));
  575. goto EXCHANGE_END;
  576. }
  577.  
  578. // ¸®ÅÏ ¹ÞÀº ¾ÆÀÌÅÛ °³¼ö·Î »ó´ë¹æÀÇ ¼ÒÁöÇ°¿¡ ³²Àº ÀÚ¸®°¡ ÀÖ³ª È®ÀÎÇÑ´Ù.
  579. if (!CheckSpace())
  580. {
  581. GetOwner()->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("»ó´ë¹æÀÇ ¼ÒÁöÇ°¿¡ ºó °ø°£ÀÌ ¾ø½À´Ï´Ù."));
  582. victim->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¼ÒÁöÇ°¿¡ ºó °ø°£ÀÌ ¾ø½À´Ï´Ù."));
  583. goto EXCHANGE_END;
  584. }
  585.  
  586. // »ó´ë¹æµµ ¸¶Âù°¡Áö·Î..
  587. if (!GetCompany()->Check(&iItemCount))
  588. {
  589. victim->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("µ·ÀÌ ºÎÁ·Çϰųª ¾ÆÀÌÅÛÀÌ Á¦ÀÚ¸®¿¡ ¾ø½À´Ï´Ù."));
  590. GetOwner()->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("»ó´ë¹æÀÇ µ·ÀÌ ºÎÁ·Çϰųª ¾ÆÀÌÅÛÀÌ Á¦ÀÚ¸®¿¡ ¾ø½À´Ï´Ù."));
  591. goto EXCHANGE_END;
  592. }
  593.  
  594. if (!GetCompany()->CheckSpace())
  595. {
  596. victim->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("»ó´ë¹æÀÇ ¼ÒÁöÇ°¿¡ ºó °ø°£ÀÌ ¾ø½À´Ï´Ù."));
  597. GetOwner()->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¼ÒÁöÇ°¿¡ ºó °ø°£ÀÌ ¾ø½À´Ï´Ù."));
  598. goto EXCHANGE_END;
  599. }
  600.  
  601. if (db_clientdesc->GetSocket() == INVALID_SOCKET)
  602. {
  603. sys_err("Cannot use exchange feature while DB cache connection is dead.");
  604. victim->ChatPacket(CHAT_TYPE_INFO, "Unknown error");
  605. GetOwner()->ChatPacket(CHAT_TYPE_INFO, "Unknown error");
  606. goto EXCHANGE_END;
  607. }
  608.  
  609. if (Done())
  610. {
  611. if (m_lGold) // µ·ÀÌ ÀÖÀ» ‹š¸¸ ÀúÀå
  612. GetOwner()->Save();
  613.  
  614. if (GetCompany()->Done())
  615. {
  616. if (GetCompany()->m_lGold) // µ·ÀÌ ÀÖÀ» ¶§¸¸ ÀúÀå
  617. victim->Save();
  618.  
  619. // INTERNATIONAL_VERSION
  620. GetOwner()->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%s ´Ô°úÀÇ ±³È¯ÀÌ ¼º»ç µÇ¾ú½À´Ï´Ù."), victim->GetName());
  621. victim->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%s ´Ô°úÀÇ ±³È¯ÀÌ ¼º»ç µÇ¾ú½À´Ï´Ù."), GetOwner()->GetName());
  622. // END_OF_INTERNATIONAL_VERSION
  623. }
  624. }
  625.  
  626. EXCHANGE_END:
  627. Cancel();
  628. return false;
  629. }
  630. else
  631. {
  632. // ¾Æ´Ï¸é accept¿¡ ´ëÇÑ ÆÐŶÀ» º¸³»ÀÚ.
  633. exchange_packet(GetOwner(), EXCHANGE_SUBHEADER_GC_ACCEPT, true, m_bAccept, NPOS, 0);
  634. exchange_packet(GetCompany()->GetOwner(), EXCHANGE_SUBHEADER_GC_ACCEPT, false, m_bAccept, NPOS, 0);
  635. return true;
  636. }
  637. }
  638.  
  639. // ±³È¯ Ãë¼Ò
  640. void CExchange::Cancel()
  641. {
  642. exchange_packet(GetOwner(), EXCHANGE_SUBHEADER_GC_END, 0, 0, NPOS, 0);
  643. GetOwner()->SetExchange(NULL);
  644.  
  645. for (int i = 0; i < EXCHANGE_ITEM_MAX_NUM; ++i)
  646. {
  647. if (m_apItems[i])
  648. m_apItems[i]->SetExchanging(false);
  649. }
  650.  
  651. if (GetCompany())
  652. {
  653. GetCompany()->SetCompany(NULL);
  654. GetCompany()->Cancel();
  655. }
  656.  
  657. M2_DELETE(this);
  658. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement