1. char.h
  2. bool SellItem(TItemPos Cell, BYTE bCount=0);
  3. char_item.cpp
  4. bool CHARACTER::SellItem(TItemPos Cell, BYTE bCount)
  5. {
  6. LPITEM item = NULL;
  7. if (!CanHandleItem())
  8. {
  9. if (NULL != DragonSoul_RefineWindow_GetOpener())
  10. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("강화창을 연 상태에서는 아이템을 옮길 수 없습니다."));
  11. return false;
  12. }
  13. if (IsDead())
  14. return false;
  15. if (!IsValidItemPosition(Cell) || !(item = GetItem(Cell)))
  16. return false;
  17. if (item->IsExchanging())
  18. return false;
  19. if (true == item->isLocked())
  20. return false;
  21. #ifdef WJ_SOULBINDING_SYSTEM
  22. if (item->IsBind() || item->IsUntilBind())
  23. {
  24. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("BIND_ITEM_NOT_SELL"));
  25. return false;
  26. }
  27. #endif
  28. if (IS_SET(item->GetAntiFlag(), ITEM_ANTIFLAG_SELL))
  29. {
  30. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("THIS_ITEM_NOT_SELL"));
  31. return false;
  32. }
  33. if (quest::CQuestManager::instance().GetPCForce(GetPlayerID())->IsRunning() == true)
  34. return false;
  35. if (item->GetCount() <= 0)
  36. return false;
  37. #ifdef WJ_GROWTH_PET_SYSTEM
  38. if (item->GetVnum() == 55701 || item->GetVnum() == 55702 || item->GetVnum() == 55703 || item->GetVnum() == 55704)
  39. if (GetNewPetSystem()->IsActivePet())
  40. return false;
  41. #endif
  42. DWORD dwPrice;
  43. if (bCount == 0 || bCount > item->GetCount())
  44. bCount = item->GetCount();
  45. dwPrice = item->GetShopBuyPrice();
  46. if (IS_SET(item->GetFlag(), ITEM_FLAG_COUNT_PER_1GOLD))
  47. {
  48. if (dwPrice == 0)
  49. dwPrice = bCount;
  50. else
  51. dwPrice = bCount / dwPrice;
  52. }
  53. else
  54. dwPrice *= bCount;
  55. const int64_t nTotalMoney = static_cast<int64_t>(GetGold()) + static_cast<int64_t>(dwPrice);
  56. if (GOLD_MAX <= nTotalMoney)
  57. {
  58. sys_err("[OVERFLOW_GOLD] id %u name %s gold %u", GetPlayerID(), GetName(), GetGold());
  59. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("20억냥이 초과하여 물품을 팔수 없습니다."));
  60. return false;
  61. }
  62. sys_log(0, "SHOP: SELL: %s item name: %s(x%d):%u price: %u", GetName(), item->GetName(), bCount, item->GetID(), dwPrice);
  63. DBManager::instance().SendMoneyLog(MONEY_LOG_SHOP, item->GetVnum(), dwPrice);
  64. item->SetCount(item->GetCount() - bCount);
  65. PointChange(POINT_GOLD, dwPrice, false);
  66. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ITEM_SELL_SUCCES"), item->GetName());
  67. return true;
  68. }