Advertisement
DJR

exchange.cpp

DJR
Sep 23rd, 2014
388
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 15.43 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.             }
  471.         }
  472.  
  473.         m_apItems[i] = NULL;
  474.     }
  475.  
  476.     if (m_lGold)
  477.     {
  478.         GetOwner()->PointChange(POINT_GOLD, -m_lGold, true);
  479.         victim->PointChange(POINT_GOLD, m_lGold, true);
  480.  
  481.         if (m_lGold > 1000)
  482.         {
  483.             char exchange_buf[51];
  484.             snprintf(exchange_buf, sizeof(exchange_buf), "%u %s", GetOwner()->GetPlayerID(), GetOwner()->GetName());
  485.             LogManager::instance().CharLog(victim, m_lGold, "EXCHANGE_GOLD_TAKE", exchange_buf);
  486.  
  487.             snprintf(exchange_buf, sizeof(exchange_buf), "%u %s", victim->GetPlayerID(), victim->GetName());
  488.             LogManager::instance().CharLog(GetOwner(), m_lGold, "EXCHANGE_GOLD_GIVE", exchange_buf);
  489.         }
  490.     }
  491.  
  492.     m_pGrid->Clear();
  493.     return true;
  494. }
  495.  
  496. // 교환을 동의
  497. bool CExchange::Accept(bool bAccept)
  498. {
  499.     if (m_bAccept == bAccept)
  500.         return true;
  501.  
  502.     m_bAccept = bAccept;
  503.  
  504.     // 둘 다 동의 했으므로 교환 성립
  505.     if (m_bAccept && GetCompany()->m_bAccept)
  506.     {
  507.         int iItemCount;
  508.  
  509.         LPCHARACTER victim = GetCompany()->GetOwner();
  510.  
  511.         //PREVENT_PORTAL_AFTER_EXCHANGE
  512.         GetOwner()->SetExchangeTime();
  513.         victim->SetExchangeTime();     
  514.         //END_PREVENT_PORTAL_AFTER_EXCHANGE
  515.  
  516.         // exchange_check 에서는 교환할 아이템들이 제자리에 있나 확인하고,
  517.         // 엘크도 충분히 있나 확인한다, 두번째 인자로 교환할 아이템 개수
  518.         // 를 리턴한다.
  519.         if (!Check(&iItemCount))
  520.         {
  521.             GetOwner()->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("돈이 부족하거나 아이템이 제자리에 없습니다."));
  522.             victim->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("상대방의 돈이 부족하거나 아이템이 제자리에 없습니다."));
  523.             goto EXCHANGE_END;
  524.         }
  525.  
  526.         // 리턴 받은 아이템 개수로 상대방의 소지품에 남은 자리가 있나 확인한다.
  527.         if (!CheckSpace())
  528.         {
  529.             GetOwner()->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("상대방의 소지품에 빈 공간이 없습니다."));
  530.             victim->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("소지품에 빈 공간이 없습니다."));
  531.             goto EXCHANGE_END;
  532.         }
  533.  
  534.         // 상대방도 마찬가지로..
  535.         if (!GetCompany()->Check(&iItemCount))
  536.         {
  537.             victim->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("돈이 부족하거나 아이템이 제자리에 없습니다."));
  538.             GetOwner()->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("상대방의 돈이 부족하거나 아이템이 제자리에 없습니다."));
  539.             goto EXCHANGE_END;
  540.         }
  541.  
  542.         if (!GetCompany()->CheckSpace())
  543.         {
  544.             victim->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("상대방의 소지품에 빈 공간이 없습니다."));
  545.             GetOwner()->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("소지품에 빈 공간이 없습니다."));
  546.             goto EXCHANGE_END;
  547.         }
  548.  
  549.         if (db_clientdesc->GetSocket() == INVALID_SOCKET)
  550.         {
  551.             sys_err("Cannot use exchange feature while DB cache connection is dead.");
  552.             victim->ChatPacket(CHAT_TYPE_INFO, "Unknown error");
  553.             GetOwner()->ChatPacket(CHAT_TYPE_INFO, "Unknown error");
  554.             goto EXCHANGE_END;
  555.         }
  556.  
  557.         if (Done())
  558.         {
  559.             if (m_lGold) // 돈이 있을 ‹š만 저장
  560.                 GetOwner()->Save();
  561.  
  562.             if (GetCompany()->Done())
  563.             {
  564.                 if (GetCompany()->m_lGold) // 돈이 있을 때만 저장
  565.                     victim->Save();
  566.  
  567.                 // INTERNATIONAL_VERSION
  568.                 GetOwner()->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%s 님과의 교환이 성사 되었습니다."), victim->GetName());
  569.                 victim->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%s 님과의 교환이 성사 되었습니다."), GetOwner()->GetName());
  570.                 // END_OF_INTERNATIONAL_VERSION
  571.             }
  572.         }
  573.  
  574. EXCHANGE_END:
  575.         Cancel();
  576.         return false;
  577.     }
  578.     else
  579.     {
  580.         // 아니면 accept에 대한 패킷을 보내자.
  581.         exchange_packet(GetOwner(), EXCHANGE_SUBHEADER_GC_ACCEPT, true, m_bAccept, NPOS, 0);
  582.         exchange_packet(GetCompany()->GetOwner(), EXCHANGE_SUBHEADER_GC_ACCEPT, false, m_bAccept, NPOS, 0);
  583.         return true;
  584.     }
  585. }
  586.  
  587. // 교환 취소
  588. void CExchange::Cancel()
  589. {
  590.     exchange_packet(GetOwner(), EXCHANGE_SUBHEADER_GC_END, 0, 0, NPOS, 0);
  591.     GetOwner()->SetExchange(NULL);
  592.  
  593.     for (int i = 0; i < EXCHANGE_ITEM_MAX_NUM; ++i)
  594.     {
  595.         if (m_apItems[i])
  596.             m_apItems[i]->SetExchanging(false);
  597.     }
  598.  
  599.     if (GetCompany())
  600.     {
  601.         GetCompany()->SetCompany(NULL);
  602.         GetCompany()->Cancel();
  603.     }
  604.  
  605.     M2_DELETE(this);
  606. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement