int CShop::Buy(LPCHARACTER ch, BYTE pos)
{
if (IsLocked())
return SHOP_SUBHEADER_GC_END;
if (pos >= m_itemVector.size())
{
sys_log(0, "Shop::Buy : invalid position %d : %s", pos, ch->GetName());
return SHOP_SUBHEADER_GC_INVALID_POS;
}
sys_log(0, "Shop::Buy : name %s pos %d", ch->GetName(), pos);
GuestMapType::iterator it = m_map_guest.find(ch);
if (it == m_map_guest.end())
return SHOP_SUBHEADER_GC_END;
SHOP_ITEM& r_item = m_itemVector[pos];
if (r_item.price < 0)
{
LogManager::instance().HackLog("SHOP_BUY_GOLD_OVERFLOW", ch);
return SHOP_SUBHEADER_GC_NOT_ENOUGH_MONEY;
}
LPITEM pkSelectedItem = ITEM_MANAGER::instance().Find(r_item.itemid);
#ifdef FULL_YANG
long long dwPrice = r_item.price;
#else
DWORD dwPrice = r_item.price;
#endif
DWORD dwTax = 0;
int iVal = quest::CQuestManager::instance().GetEventFlag ("personal_shop");
if (0 < iVal)
{
if (iVal > 100)
{
iVal = 100;
}
dwTax = dwPrice * iVal / 100;
dwPrice = dwPrice - dwTax;
}
else
{
iVal = 0;
dwTax = 0;
}
if (ch->GetGold() < r_item.price)
{
sys_log(1, "Shop::Buy : Not enough money : %s has %d, price %d", ch->GetName(), ch->GetGold(), dwPrice);
return SHOP_SUBHEADER_GC_NOT_ENOUGH_MONEY;
}
LPITEM item;
if (m_pkPC)
item = r_item.pkItem;
else {
item = ITEM_MANAGER::instance().CreateItem(r_item.vnum, r_item.count);
}
if (!item)
return SHOP_SUBHEADER_GC_SOLD_OUT;
int iEmptyPos;
if (item->IsDragonSoul())
{
iEmptyPos = ch->GetEmptyDragonSoulInventory(item);
}
#ifdef ENABLE_SPLIT_INVENTORY_SYSTEM
else if (item->IsSkillBook())
{
iEmptyPos = ch->GetEmptySkillBookInventory(item->GetSize());
}
else if (item->IsUpgradeItem())
{
iEmptyPos = ch->GetEmptyUpgradeItemsInventory(item->GetSize());
}
else if (item->IsStone())
{
iEmptyPos = ch->GetEmptyStoneInventory(item->GetSize());
}
else if (item->IsBox())
{
iEmptyPos = ch->GetEmptyBoxInventory(item->GetSize());
}
else if (item->IsEfsun())
{
iEmptyPos = ch->GetEmptyEfsunInventory(item->GetSize());
}
else if (item->IsCicek())
{
iEmptyPos = ch->GetEmptyCicekInventory(item->GetSize());
}
#endif
else
{
iEmptyPos = ch->GetEmptyInventory(item->GetSize());
}
if (iEmptyPos < 0)
{
if (m_pkPC)
{
sys_log(1, "Shop::Buy at PC Shop : Inventory full : %s size %d", ch->GetName(), item->GetSize());
return SHOP_SUBHEADER_GC_INVENTORY_FULL;
}
else
{
sys_log(1, "Shop::Buy : Inventory full : %s size %d", ch->GetName(), item->GetSize());
M2_DESTROY_ITEM(item);
return SHOP_SUBHEADER_GC_INVENTORY_FULL;
}
}
#ifdef FULL_YANG_OWN
ch->ChangeGold(-dwPrice);
#else
ch->PointChange(POINT_GOLD, -dwPrice, false);
#endif
// ±?AO ˝?˝??? : ??±Y Aˇ?o
if (m_pkPC)
{
if (!m_pkPC->IsPrivShop())
m_pkPC->SyncQuickslot(QUICKSLOT_TYPE_ITEM, item->GetCell(), 255);
char buf[512];
DWORD mpid = (m_pkPC->IsPrivShop() ? m_pkPC->GetPrivShopOwner() : m_pkPC->GetPlayerID());
if (item->GetVnum() >= 80003 && item->GetVnum() <= 80007)
{
snprintf(buf, sizeof(buf), "%s FROM: %u TO: %u PRICE: %u", item->GetName(), ch->GetPlayerID(), mpid, dwPrice);
LogManager::instance().GoldBarLog(ch->GetPlayerID(), item->GetID(), SHOP_BUY, buf);
LogManager::instance().GoldBarLog(mpid, item->GetID(), SHOP_SELL, buf);
}
LPITEM pkNewItem = ITEM_MANAGER::instance().CreateItem(r_item.vnum, r_item.count);
if (pkNewItem)
{
for (int i = 0; i < ITEM_SOCKET_MAX_NUM; i++)
{
pkNewItem->SetSocket(i, item->GetSocket(i));
}
// 매직 아이템 설정
item->CopyAttributeTo(pkNewItem);
if (pkNewItem->IsDragonSoul())
pkNewItem->AddToCharacter(ch, TItemPos(DRAGON_SOUL_INVENTORY, iEmptyPos));
#ifdef ENABLE_SPLIT_INVENTORY_SYSTEM
else if (item->IsSkillBook())
item->AddToCharacter(ch, TItemPos(INVENTORY, iEmptyPos));
else if (item->IsUpgradeItem())
item->AddToCharacter(ch, TItemPos(INVENTORY, iEmptyPos));
else if (item->IsStone())
item->AddToCharacter(ch, TItemPos(INVENTORY, iEmptyPos));
else if (item->IsBox())
item->AddToCharacter(ch, TItemPos(INVENTORY, iEmptyPos));
else if (item->IsEfsun())
item->AddToCharacter(ch, TItemPos(INVENTORY, iEmptyPos));
else if (item->IsCicek())
item->AddToCharacter(ch, TItemPos(INVENTORY, iEmptyPos));
#endif
else
pkNewItem->AddToCharacter(ch, TItemPos(INVENTORY, iEmptyPos));
item->RemoveFromCharacter();
M2_DESTROY_ITEM(item);
ITEM_MANAGER::instance().FlushDelayedSave(pkNewItem);
std::string szBuy("SHOP_BUY");
std::string szSell("SHOP_SELL");
if (m_pkPC->IsPrivShop())
{
std::string temp("OFFLINE_");
szBuy = temp + szBuy;
szSell = temp + szSell;
}
#ifdef FULL_YANG
snprintf(buf, sizeof(buf), "%s %u(%s) %lld %u", pkNewItem->GetName(), mpid, m_pkPC->GetName(), dwPrice, pkNewItem->GetCount());
LogManager::instance().ItemLog(ch, pkNewItem, szBuy.c_str(), buf);
snprintf(buf, sizeof(buf), "%s %u(%s) %lld %u", pkNewItem->GetName(), ch->GetPlayerID(), ch->GetName(), dwPrice, pkNewItem->GetCount());
LogManager::instance().ItemLog(m_pkPC, pkNewItem, szSell.c_str(), buf);
#else
snprintf(buf, sizeof(buf), "%s %u(%s) %u %u", pkNewItem->GetName(), mpid, m_pkPC->GetName(), dwPrice, pkNewItem->GetCount());
LogManager::instance().ItemLog(ch, pkNewItem, szBuy.c_str(), buf);
snprintf(buf, sizeof(buf), "%s %u(%s) %u %u", pkNewItem->GetName(), ch->GetPlayerID(), ch->GetName(), dwPrice, pkNewItem->GetCount());
LogManager::instance().ItemLog(m_pkPC, pkNewItem, szSell.c_str(), buf);
#endif
r_item.pkItem = NULL;
BroadcastUpdateItem(pos);
if (m_pkPC->IsPrivShop()) {
LPCHARACTER owner = CHARACTER_MANAGER::instance().FindByPID(m_pkPC->GetPrivShopOwner());
#ifdef FULL_YANG
DBManager::instance().DirectQuery("UPDATE player_shop SET gold=gold + %lld WHERE id=%d", dwPrice, m_pkPC->GetPrivShop());
#else
DBManager::instance().DirectQuery("INSERT INTO player_gift SET \
owner_id=%d,vnum=1,count='%d',reason=\"%s\",`from`=replace(\"%s #%d\",' ','_'),status='WAIT',date_add=NOW()",
m_pkPC->GetPrivShopOwner(), dwPrice, LC_TEXT("SHOP_REASON"), m_pkPC->GetName(), m_pkPC->GetPrivShop());
#endif
DBManager::instance().DirectQuery("DELETE FROM player_shop_items WHERE shop_id=%d and id = %d", m_pkPC->GetPrivShop(), r_item.itemid);
if (owner)
{
owner->LoadPrivShops();
#ifdef FULL_YANG
if (owner->GetGiftPages() > 0)
owner->ChatPacket(CHAT_TYPE_COMMAND, "gift_info %d", owner->GetGiftPages());
#else
owner->RefreshGift();
#endif
}
}
else{
#ifdef FULL_YANG_OWN
m_pkPC->ChangeGold(dwPrice);
#else
m_pkPC->PointChange(POINT_GOLD, dwPrice, false);
#endif
if (iVal > 0)
{
m_pkPC->ChatPacket (CHAT_TYPE_INFO, LC_TEXT ("판매금액의 %d %% 가 세금으로 나가게됩니다"), iVal);
}
}
item = pkNewItem;
}
else {
return SHOP_SUBHEADER_GC_INVALID_POS;
}
}
else
{
if (item->IsDragonSoul())
item->AddToCharacter(ch, TItemPos(DRAGON_SOUL_INVENTORY, iEmptyPos));
#ifdef ENABLE_SPLIT_INVENTORY_SYSTEM
else if (item->IsSkillBook())
item->AddToCharacter(ch, TItemPos(INVENTORY, iEmptyPos));
else if (item->IsUpgradeItem())
item->AddToCharacter(ch, TItemPos(INVENTORY, iEmptyPos));
else if (item->IsStone())
item->AddToCharacter(ch, TItemPos(INVENTORY, iEmptyPos));
else if (item->IsBox())
item->AddToCharacter(ch, TItemPos(INVENTORY, iEmptyPos));
else if (item->IsEfsun())
item->AddToCharacter(ch, TItemPos(INVENTORY, iEmptyPos));
else if (item->IsCicek())
item->AddToCharacter(ch, TItemPos(INVENTORY, iEmptyPos));
#endif
else
item->AddToCharacter(ch, TItemPos(INVENTORY, iEmptyPos));
ITEM_MANAGER::instance().FlushDelayedSave(item);
LogManager::instance().ItemLog(ch, item, "BUY", item->GetName());
if (item->GetVnum() >= 80003 && item->GetVnum() <= 80007)
{
LogManager::instance().GoldBarLog(ch->GetPlayerID(), item->GetID(), PERSONAL_SHOP_BUY, "");
}
//DBManager::instance().SendMoneyLog(MONEY_LOG_SHOP, item->GetVnum(), -dwPrice);
}
if (item)
sys_log(0, "SHOP: BUY: name %s %s(x %d):%u price %u", ch->GetName(), item->GetName(), item->GetCount(), item->GetID(), dwPrice);
ch->Save();
#if defined(SHOP_AUTO_CLOSE) && defined(OFFLINE_SHOP)
if (m_pkPC && m_pkPC->IsPrivShop())
{
if (GetItemCount()<=0)
m_pkPC->DeleteMyShop();
}
#endif
return (SHOP_SUBHEADER_GC_OK);
}