#ifdef OFFLINE_SHOP
#if defined(BL_PRIVATESHOP_SEARCH_SYSTEM)
int CShop::Buy(LPCHARACTER ch, BYTE pos, bool bIsShopSearch)
#else
int CShop::Buy(LPCHARACTER ch, BYTE pos)
#endif
{
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 defined(BL_PRIVATESHOP_SEARCH_SYSTEM)
if (bIsShopSearch == false && it == m_map_guest.end())
return SHOP_SUBHEADER_GC_END;
#else
if (it == m_map_guest.end())
return SHOP_SUBHEADER_GC_END;
#endif
SHOP_ITEM& r_item = m_itemVector[pos];
if (r_item.price < 0)//@turkmmo58
{
LogManager::instance().HackLog("SHOP_BUY_GOLD_OVERFLOW", ch);
return SHOP_SUBHEADER_GC_NOT_ENOUGH_MONEY;
}
LPITEM pkSelectedItem = ITEM_MANAGER::instance().Find(r_item.itemid);
if (IsPCShop())
{
if (!pkSelectedItem)
{
#if defined(BL_PRIVATESHOP_SEARCH_SYSTEM)
if (bIsShopSearch == true)
return SHOP_SUBHEADER_GC_SOLD_OUT;
#endif
sys_log(0, "Shop::Buy : Critical: This user seems to be a hacker : invalid pcshop item : BuyerPID:%d SellerPID:%d",
ch->GetPlayerID(),
m_pkPC->GetPlayerID());
return false;
}
if ((pkSelectedItem->GetOwner() != m_pkPC))
{
#if defined(BL_PRIVATESHOP_SEARCH_SYSTEM)
if (bIsShopSearch == true)
return SHOP_SUBHEADER_GC_SOLD_OUT;
#endif
sys_log(0, "Shop::Buy : Critical: This user seems to be a hacker : invalid pcshop item : BuyerPID:%d SellerPID:%d",
ch->GetPlayerID(),
m_pkPC->GetPlayerID());
return false;
}
}
DWORD dwPrice = r_item.price;
#if defined(BL_PRIVATESHOP_SEARCH_SYSTEM)
if (bIsShopSearch == false && it->second) // if other empire, price is triple
dwPrice *= 3;
#else
if (it->second) // if other empire, price is triple
dwPrice *= 3;
#endif
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;
#ifdef ENABLE_SHOP_BLACKLIST
if (!m_pkPC)
{
if (quest::CQuestManager::instance().GetEventFlag("hivalue_item_sell") == 0)
{
if (item->GetVnum() == 70024 || item->GetVnum() == 70035)
{
return SHOP_SUBHEADER_GC_END;
}
}
}
#endif
int iEmptyPos;
if (item->IsDragonSoul())
iEmptyPos = ch->GetEmptyDragonSoulInventory(item);
#ifdef ENABLE_SPECIAL_STORAGE
else if (item->IsUpgradeItem())
iEmptyPos = ch->GetEmptyUpgradeInventory(item);
else if (item->IsBook())
iEmptyPos = ch->GetEmptyBookInventory(item);
else if (item->IsStone())
iEmptyPos = ch->GetEmptyStoneInventory(item);
#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;
}
}
ch->PointChange(POINT_GOLD, -dwPrice, false);
DWORD dwTax = 0;
int iVal = 0;
{
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 (!m_pkPC)
{
CMonarch::instance().SendtoDBAddMoney(dwTax, ch->GetEmpire(), ch);
}
if (m_pkPC)
{
if (!m_pkPC->IsPrivShop())
m_pkPC->SyncQuickslot(QUICKSLOT_TYPE_ITEM, item->GetCell(), 255);
DWORD mpid = (m_pkPC->IsPrivShop() ? m_pkPC->GetPrivShopOwner() : m_pkPC->GetPlayerID());
char buf[512];
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_SPECIAL_STORAGE
else if (pkNewItem->IsUpgradeItem())
pkNewItem->AddToCharacter(ch, TItemPos(UPGRADE_INVENTORY, iEmptyPos));
else if (pkNewItem->IsBook())
pkNewItem->AddToCharacter(ch, TItemPos(BOOK_INVENTORY, iEmptyPos));
else if (pkNewItem->IsStone())
pkNewItem->AddToCharacter(ch, TItemPos(STONE_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;
}
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);
r_item.pkItem = NULL;
BroadcastUpdateItem(pos);
if (m_pkPC->IsPrivShop()) {
LPCHARACTER owner = CHARACTER_MANAGER::instance().FindByPID(m_pkPC->GetPrivShopOwner());
std::unique_ptr<SQLMsg> pMsg(DBManager::instance().DirectQuery("UPDATE player.player_shop SET gold=gold + '%u' WHERE id='%d';", dwPrice, m_pkPC->GetPrivShop()));
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();
if (owner->GetGiftPages() > 0)
owner->ChatPacket(CHAT_TYPE_COMMAND, "gift_info %d", owner->GetGiftPages());
}
}
else
{
m_pkPC->PointChange(POINT_GOLD, dwPrice, false);
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_SPECIAL_STORAGE
else if (item->IsUpgradeItem())
item->AddToCharacter(ch, TItemPos(UPGRADE_INVENTORY, iEmptyPos));
else if (item->IsBook())
item->AddToCharacter(ch, TItemPos(BOOK_INVENTORY, iEmptyPos));
else if (item->IsStone())
item->AddToCharacter(ch, TItemPos(STONE_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);
}