Advertisement
Guest User

Untitled

a guest
Oct 25th, 2014
153
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 16.14 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, DWORD arg1, TItemPos arg2, DWORD arg3, void * pvData = NULL);
  18.  
  19. // ±³È¯ ÆÐŶ
  20. void exchange_packet(LPCHARACTER ch, BYTE sub_header, bool is_me, DWORD 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,3);
  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 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 / 2); // inven page 1
  303. static CGrid s_grid2(5, INVENTORY_MAX_NUM/5 / 2); // inven page 2
  304.  
  305. s_grid1.Clear();
  306. s_grid2.Clear();
  307.  
  308. LPCHARACTER victim = GetCompany()->GetOwner();
  309. LPITEM item;
  310.  
  311. int i;
  312.  
  313. for (i = 0; i < INVENTORY_MAX_NUM / 2; ++i)
  314. {
  315. if (!(item = victim->GetInventoryItem(i)))
  316. continue;
  317.  
  318. s_grid1.Put(i, 1, item->GetSize());
  319. }
  320. for (i = INVENTORY_MAX_NUM / 2; i < INVENTORY_MAX_NUM; ++i)
  321. {
  322. if (!(item = victim->GetInventoryItem(i)))
  323. continue;
  324.  
  325. s_grid2.Put(i - INVENTORY_MAX_NUM / 2, 1, item->GetSize());
  326. }
  327.  
  328. // ¾Æ... ¹º°¡ °³º´½Å °°Áö¸¸... ¿ëÈ¥¼® Àκ¥À» ³ë¸Ö Àκ¥ º¸°í µû¶ó ¸¸µç ³» À߸øÀÌ´Ù ¤Ð¤Ð
  329. static std::vector <WORD> s_vDSGrid(DRAGON_SOUL_INVENTORY_MAX_NUM);
  330.  
  331. // ÀÏ´Ü ¿ëÈ¥¼®À» ±³È¯ÇÏÁö ¾ÊÀ» °¡´É¼ºÀÌ Å©¹Ç·Î, ¿ëÈ¥¼® Àκ¥ º¹»ç´Â ¿ëÈ¥¼®ÀÌ ÀÖÀ» ¶§ Çϵµ·Ï ÇÑ´Ù.
  332. bool bDSInitialized = false;
  333.  
  334. for (i = 0; i < EXCHANGE_ITEM_MAX_NUM; ++i)
  335. {
  336. if (!(item = m_apItems[i]))
  337. continue;
  338.  
  339. if (item->IsDragonSoul())
  340. {
  341. if (!victim->DragonSoul_IsQualified())
  342. {
  343. return false;
  344. }
  345.  
  346. if (!bDSInitialized)
  347. {
  348. bDSInitialized = true;
  349. victim->CopyDragonSoulItemGrid(s_vDSGrid);
  350. }
  351.  
  352. bool bExistEmptySpace = false;
  353. WORD wBasePos = DSManager::instance().GetBasePosition(item);
  354. if (wBasePos >= DRAGON_SOUL_INVENTORY_MAX_NUM)
  355. return false;
  356.  
  357. for (int i = 0; i < DRAGON_SOUL_BOX_SIZE; i++)
  358. {
  359. WORD wPos = wBasePos + i;
  360. if (0 == s_vDSGrid[wBasePos])
  361. {
  362. bool bEmpty = true;
  363. for (int j = 1; j < item->GetSize(); j++)
  364. {
  365. if (s_vDSGrid[wPos + j * DRAGON_SOUL_BOX_COLUMN_NUM])
  366. {
  367. bEmpty = false;
  368. break;
  369. }
  370. }
  371. if (bEmpty)
  372. {
  373. for (int j = 0; j < item->GetSize(); j++)
  374. {
  375. s_vDSGrid[wPos + j * DRAGON_SOUL_BOX_COLUMN_NUM] = wPos + 1;
  376. }
  377. bExistEmptySpace = true;
  378. break;
  379. }
  380. }
  381. if (bExistEmptySpace)
  382. break;
  383. }
  384. if (!bExistEmptySpace)
  385. return false;
  386. }
  387. else
  388. {
  389. int iPos = s_grid1.FindBlank(1, item->GetSize());
  390.  
  391. if (iPos >= 0)
  392. {
  393. s_grid1.Put(iPos, 1, item->GetSize());
  394. }
  395. else
  396. {
  397. iPos = s_grid2.FindBlank(1, item->GetSize());
  398.  
  399. if (iPos >= 0)
  400. {
  401. s_grid2.Put(iPos, 1, item->GetSize());
  402. }
  403. else
  404. {
  405. return false;
  406. }
  407. }
  408. }
  409. }
  410.  
  411. return true;
  412. }
  413.  
  414. // ±³È¯ ³¡ (¾ÆÀÌÅÛ°ú µ· µîÀ» ½ÇÁ¦·Î ¿Å±ä´Ù)
  415. bool CExchange::Done()
  416. {
  417. int empty_pos, i;
  418. LPITEM item;
  419.  
  420. LPCHARACTER victim = GetCompany()->GetOwner();
  421.  
  422. for (i = 0; i < EXCHANGE_ITEM_MAX_NUM; ++i)
  423. {
  424. if (!(item = m_apItems[i]))
  425. continue;
  426.  
  427. if (item->IsDragonSoul())
  428. empty_pos = victim->GetEmptyDragonSoulInventory(item);
  429. else
  430. empty_pos = victim->GetEmptyInventory(item->GetSize());
  431.  
  432. if (empty_pos < 0)
  433. {
  434. sys_err("Exchange::Done : Cannot find blank position in inventory %s <-> %s item %s",
  435. m_pOwner->GetName(), victim->GetName(), item->GetName());
  436. continue;
  437. }
  438.  
  439. assert(empty_pos >= 0);
  440.  
  441. if (item->GetVnum() == 90008 || item->GetVnum() == 90009) // VCARD
  442. {
  443. VCardUse(m_pOwner, victim, item);
  444. continue;
  445. }
  446.  
  447. m_pOwner->SyncQuickslot(QUICKSLOT_TYPE_ITEM, item->GetCell(), 255);
  448.  
  449. item->RemoveFromCharacter();
  450. if (item->IsDragonSoul())
  451. item->AddToCharacter(victim, TItemPos(DRAGON_SOUL_INVENTORY, empty_pos));
  452. else
  453. item->AddToCharacter(victim, TItemPos(INVENTORY, empty_pos));
  454. ITEM_MANAGER::instance().FlushDelayedSave(item);
  455.  
  456. item->SetExchanging(false);
  457. {
  458. char exchange_buf[51];
  459.  
  460. snprintf(exchange_buf, sizeof(exchange_buf), "%s %u %u", item->GetName(), GetOwner()->GetPlayerID(), item->GetCount());
  461. LogManager::instance().ItemLog(victim, item, "EXCHANGE_TAKE", exchange_buf);
  462.  
  463. snprintf(exchange_buf, sizeof(exchange_buf), "%s %u %u", item->GetName(), victim->GetPlayerID(), item->GetCount());
  464. LogManager::instance().ItemLog(GetOwner(), item, "EXCHANGE_GIVE", exchange_buf);
  465.  
  466. if (item->GetVnum() >= 80003 && item->GetVnum() <= 80007)
  467. {
  468. LogManager::instance().GoldBarLog(victim->GetPlayerID(), item->GetID(), EXCHANGE_TAKE, "");
  469. LogManager::instance().GoldBarLog(GetOwner()->GetPlayerID(), item->GetID(), EXCHANGE_GIVE, "");
  470. m_pOwner->CreateFly(FLY_SP_MEDIUM, victim);//ExchangeEffect by andrea49611
  471. for (int i = 0; i < 3; i++){
  472. m_pOwner->CreateFly(FLY_SP_SMALL, victim);
  473. }
  474. }
  475.  
  476. m_apItems[i] = NULL;
  477. }
  478.  
  479. if (m_lGold)
  480. {
  481. GetOwner()->PointChange(POINT_GOLD, -m_lGold, true);
  482. victim->PointChange(POINT_GOLD, m_lGold, true);
  483.  
  484. if (m_lGold > 1000)
  485. {
  486. char exchange_buf[51];
  487. snprintf(exchange_buf, sizeof(exchange_buf), "%u %s", GetOwner()->GetPlayerID(), GetOwner()->GetName());
  488. LogManager::instance().CharLog(victim, m_lGold, "EXCHANGE_GOLD_TAKE", exchange_buf);
  489.  
  490. snprintf(exchange_buf, sizeof(exchange_buf), "%u %s", victim->GetPlayerID(), victim->GetName());
  491. LogManager::instance().CharLog(GetOwner(), m_lGold, "EXCHANGE_GOLD_GIVE", exchange_buf);
  492. }
  493. }
  494.  
  495. m_pGrid->Clear();
  496. return true;
  497. }
  498.  
  499. // ±³È¯À» µ¿ÀÇ
  500. bool CExchange::Accept(bool bAccept)
  501. {
  502. if (m_bAccept == bAccept)
  503. return true;
  504.  
  505. m_bAccept = bAccept;
  506.  
  507. // µÑ ´Ù µ¿ÀÇ ÇßÀ¸¹Ç·Î ±³È¯ ¼º¸³
  508. if (m_bAccept && GetCompany()->m_bAccept)
  509. {
  510. int iItemCount;
  511.  
  512. LPCHARACTER victim = GetCompany()->GetOwner();
  513.  
  514. //PREVENT_PORTAL_AFTER_EXCHANGE
  515. GetOwner()->SetExchangeTime();
  516. victim->SetExchangeTime();
  517. //END_PREVENT_PORTAL_AFTER_EXCHANGE
  518.  
  519. // exchange_check ¿¡¼­´Â ±³È¯ÇÒ ¾ÆÀÌÅÛµéÀÌ Á¦ÀÚ¸®¿¡ ÀÖ³ª È®ÀÎÇÏ°í,
  520. // ¿¤Å©µµ ÃæºÐÈ÷ ÀÖ³ª È®ÀÎÇÑ´Ù, µÎ¹ø° ÀÎÀÚ·Î ±³È¯ÇÒ ¾ÆÀÌÅÛ °³¼ö
  521. // ¸¦ ¸®ÅÏÇÑ´Ù.
  522. if (!Check(&iItemCount))
  523. {
  524. GetOwner()->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("µ·ÀÌ ºÎÁ·Çϰųª ¾ÆÀÌÅÛÀÌ Á¦ÀÚ¸®¿¡ ¾ø½À´Ï´Ù."));
  525. victim->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("»ó´ë¹æÀÇ µ·ÀÌ ºÎÁ·Çϰųª ¾ÆÀÌÅÛÀÌ Á¦ÀÚ¸®¿¡ ¾ø½À´Ï´Ù."));
  526. goto EXCHANGE_END;
  527. }
  528.  
  529. // ¸®ÅÏ ¹ÞÀº ¾ÆÀÌÅÛ °³¼ö·Î »ó´ë¹æÀÇ ¼ÒÁöÇ°¿¡ ³²Àº ÀÚ¸®°¡ ÀÖ³ª È®ÀÎÇÑ´Ù.
  530. if (!CheckSpace())
  531. {
  532. GetOwner()->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("»ó´ë¹æÀÇ ¼ÒÁöÇ°¿¡ ºó °ø°£ÀÌ ¾ø½À´Ï´Ù."));
  533. victim->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¼ÒÁöÇ°¿¡ ºó °ø°£ÀÌ ¾ø½À´Ï´Ù."));
  534. goto EXCHANGE_END;
  535. }
  536.  
  537. // »ó´ë¹æµµ ¸¶Âù°¡Áö·Î..
  538. if (!GetCompany()->Check(&iItemCount))
  539. {
  540. victim->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("µ·ÀÌ ºÎÁ·Çϰųª ¾ÆÀÌÅÛÀÌ Á¦ÀÚ¸®¿¡ ¾ø½À´Ï´Ù."));
  541. GetOwner()->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("»ó´ë¹æÀÇ µ·ÀÌ ºÎÁ·Çϰųª ¾ÆÀÌÅÛÀÌ Á¦ÀÚ¸®¿¡ ¾ø½À´Ï´Ù."));
  542. goto EXCHANGE_END;
  543. }
  544.  
  545. if (!GetCompany()->CheckSpace())
  546. {
  547. victim->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("»ó´ë¹æÀÇ ¼ÒÁöÇ°¿¡ ºó °ø°£ÀÌ ¾ø½À´Ï´Ù."));
  548. GetOwner()->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¼ÒÁöÇ°¿¡ ºó °ø°£ÀÌ ¾ø½À´Ï´Ù."));
  549. goto EXCHANGE_END;
  550. }
  551.  
  552. if (db_clientdesc->GetSocket() == INVALID_SOCKET)
  553. {
  554. sys_err("Cannot use exchange feature while DB cache connection is dead.");
  555. victim->ChatPacket(CHAT_TYPE_INFO, "Unknown error");
  556. GetOwner()->ChatPacket(CHAT_TYPE_INFO, "Unknown error");
  557. goto EXCHANGE_END;
  558. }
  559.  
  560. if (Done())
  561. {
  562. if (m_lGold) // µ·ÀÌ ÀÖÀ» ‹š¸¸ ÀúÀå
  563. GetOwner()->Save();
  564.  
  565. if (GetCompany()->Done())
  566. {
  567. if (GetCompany()->m_lGold) // µ·ÀÌ ÀÖÀ» ¶§¸¸ ÀúÀå
  568. victim->Save();
  569.  
  570. // INTERNATIONAL_VERSION
  571. GetOwner()->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%s ´Ô°úÀÇ ±³È¯ÀÌ ¼º»ç µÇ¾ú½À´Ï´Ù."), victim->GetName());
  572. victim->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%s ´Ô°úÀÇ ±³È¯ÀÌ ¼º»ç µÇ¾ú½À´Ï´Ù."), GetOwner()->GetName());
  573. // END_OF_INTERNATIONAL_VERSION
  574. }
  575. }
  576.  
  577. EXCHANGE_END:
  578. Cancel();
  579. return false;
  580. }
  581. else
  582. {
  583. // ¾Æ´Ï¸é accept¿¡ ´ëÇÑ ÆÐŶÀ» º¸³»ÀÚ.
  584. exchange_packet(GetOwner(), EXCHANGE_SUBHEADER_GC_ACCEPT, true, m_bAccept, NPOS, 0);
  585. exchange_packet(GetCompany()->GetOwner(), EXCHANGE_SUBHEADER_GC_ACCEPT, false, m_bAccept, NPOS, 0);
  586. return true;
  587. }
  588. }
  589.  
  590. // ±³È¯ Ãë¼Ò
  591. void CExchange::Cancel()
  592. {
  593. exchange_packet(GetOwner(), EXCHANGE_SUBHEADER_GC_END, 0, 0, NPOS, 0);
  594. GetOwner()->SetExchange(NULL);
  595.  
  596. for (int i = 0; i < EXCHANGE_ITEM_MAX_NUM; ++i)
  597. {
  598. if (m_apItems[i])
  599. m_apItems[i]->SetExchanging(false);
  600. }
  601.  
  602. if (GetCompany())
  603. {
  604. GetCompany()->SetCompany(NULL);
  605. GetCompany()->Cancel();
  606. }
  607.  
  608. M2_DELETE(this);
  609. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement