Advertisement
Guest User

Untitled

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