Jump to content

help with Shop Search Sistem...


Recommended Posts

If I put an object for example at 100k, I look for it, I offer to buy it but I don't accept and then I change the price of the object to 5kk and I agree to buy it, he will buy it at the price of 5kk.

I want to do something but I don't know, a kind of price check to not buy if is not same price...

I use Mali's Official Private Shop Search

Video and code down:

void CShopManager::ShopSearchProcess(LPCHARACTER ch, const TPacketCGPrivateShopSearch* p)
{
	if (ch == NULL || ch->GetDesc() == NULL || p == NULL)
		return;

	if (ch->GetExchange() || ch->GetMyShop() || ch->GetShopOwner() || ch->IsOpenSafebox() || ch->IsCubeOpen())
	{
		ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("[LC]31"));
		return;
	}

	TEMP_BUFFER buf;

	for (std::map<DWORD, CShop*>::const_iterator it = m_map_pkShopByPC.begin(); it != m_map_pkShopByPC.end(); ++it)
	{
		CShop* tShopTable = it->second;
		if (tShopTable == NULL || tShopTable->LockStatus())
			continue;

		LPCHARACTER GetOwner = tShopTable->GetShopOwner();
		if (GetOwner == NULL || ch == GetOwner)
			continue;

		const std::vector<CShop::SHOP_ITEM>& vItemVec = tShopTable->GetItemVector();
		for (std::vector<CShop::SHOP_ITEM>::const_iterator ShopIter = vItemVec.begin(); ShopIter != vItemVec.end(); ++ShopIter)
		{
			LPITEM item = ShopIter->pkItem;
			if (item == NULL)
				continue;

			/*First n character equals(case insensitive)*/
			if (strncasecmp(item->GetName(), p->szItemName, strlen(p->szItemName)))
				continue;

			if ((p->iMinRefine <= item->GetRefineLevel() && p->iMaxRefine >= item->GetRefineLevel()) == false)
				continue;

			if ((p->iMinLevel <= item->GetLevelLimit() && p->iMaxLevel >= item->GetLevelLimit()) == false)
				continue;

			if ((p->iMinGold <= ShopIter->price && p->iMaxGold >= ShopIter->price) == false)
				continue;

			if (p->bMaskType != ITEM_NONE && p->bMaskType != item->GetType()) // ITEM_NONE: All Categories
				continue;

			if (p->iMaskSub != -1 && p->iMaskSub != item->GetSubType()) // -1: No SubType Check
				continue;

			switch (p->bJob)
			{
			case JOB_WARRIOR:
				if (item->GetAntiFlag() & ITEM_ANTIFLAG_WARRIOR)
					continue;
				break;

			case JOB_ASSASSIN:
				if (item->GetAntiFlag() & ITEM_ANTIFLAG_ASSASSIN)
					continue;
				break;

			case JOB_SHAMAN:
				if (item->GetAntiFlag() & ITEM_ANTIFLAG_SHAMAN)
					continue;
				break;

			case JOB_SURA:
				if (item->GetAntiFlag() & ITEM_ANTIFLAG_SURA)
					continue;
				break;

			}

			TPacketGCPrivateShopSearchItem pack2;
			pack2.item.vnum = ShopIter->vnum;
			pack2.item.price = ShopIter->price;
			pack2.item.count = ShopIter->count;

			pack2.item.display_pos = static_cast<BYTE>(std::distance(vItemVec.begin(), ShopIter));

            if (item->GetOwner())
                pack2.dwShopPID = item->GetOwner()->GetVID();
            else
                pack2.dwShopPID = 0;

			std::memcpy(&pack2.szSellerName, GetOwner->GetName(), sizeof(pack2.szSellerName));
			std::memcpy(&pack2.item.alSockets, item->GetSockets(), sizeof(pack2.item.alSockets));
			std::memcpy(&pack2.item.aAttr, item->GetAttributes(), sizeof(pack2.item.aAttr));

			buf.write(&pack2, sizeof(pack2));
		}
	}

	if (buf.size() <= 0)
		return;

	TPacketGCPrivateShopSearch pack;
	pack.header = HEADER_GC_PRIVATE_SHOP_SEARCH;
	pack.size = static_cast<WORD>(sizeof(pack) + buf.size());
	ch->GetDesc()->BufferedPacket(&pack, sizeof(pack));
	ch->GetDesc()->Packet(buf.read_peek(), buf.size());
}

#include "unique_item.h"
#include "target.h"
void CShopManager::ShopSearchBuy(LPCHARACTER ch, const TPacketCGPrivateShopSearchBuyItem* p)
{
    if (ch == NULL || ch->GetDesc() == NULL || p == NULL)
        return;

    int32_t shopVid = p->dwShopPID;

    if (ch->GetExchange() || ch->GetMyShop() || ch->GetShopOwner() || ch->IsOpenSafebox() || ch->IsCubeOpen())
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("[LC]31"));
        return;
    }

    LPCHARACTER ShopCH = CHARACTER_MANAGER::instance().Find(shopVid);

    if (ShopCH == NULL)
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("[LC]753"));
        return;
    }

    if (ch == ShopCH) // what?
        return;

    CShop* pkShop = ShopCH->GetMyShop();

    if (pkShop == NULL || pkShop->IsPCShop() == false)
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("[LC]753"));
        return;
    }

    const BYTE bState = ch->GetPrivateShopSearchState();
    switch (bState)
    {
    case SHOP_SEARCH_LOOKING:
    {
        if (ch->CountSpecifyItem(PRIVATE_SHOP_SEARCH_LOOKING_GLASS) == 0)
        {
            const TItemTable* GlassTable = ITEM_MANAGER::instance().GetTable(PRIVATE_SHOP_SEARCH_LOOKING_GLASS);
            if (GlassTable)
                ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("[LC]754"), GlassTable->szLocaleName);
            return;
        }

        if (ch->GetMapIndex() != ShopCH->GetMapIndex())
        {
            ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("[LC]755"));
            return;
        }

		if (pkShop->LockStatus())
		{
			ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("[LC]948"));
			return;
		}

        const DWORD dwSellerVID(ShopCH->GetVID());
        if (CTargetManager::instance().GetTargetInfo(ch->GetPlayerID(), TARGET_TYPE_VID_SHOP_SEARCH, dwSellerVID))
            CTargetManager::instance().DeleteTarget(ch->GetPlayerID(), SHOP_SEARCH_INDEX, "__SHOPSEARCH_TARGET__");

        CTargetManager::Instance().CreateTarget(ch->GetPlayerID(), SHOP_SEARCH_INDEX, "__SHOPSEARCH_TARGET__", TARGET_TYPE_VID_SHOP_SEARCH, dwSellerVID, 0, ch->GetMapIndex(), LC_TEXT("[LC]949"), 1);

        if (CTargetManager::instance().GetTargetInfo(ch->GetPlayerID(), TARGET_TYPE_VID_SHOP_SEARCH, dwSellerVID))
            ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("[LC]756"));
        break;
    }

    case SHOP_SEARCH_TRADING:
    {
        if (ch->CountSpecifyItem(PRIVATE_SHOP_SEARCH_TRADING_GLASS) == 0)
        {
            const TItemTable* GlassTable = ITEM_MANAGER::instance().GetTable(PRIVATE_SHOP_SEARCH_TRADING_GLASS);
            if (GlassTable)
                ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("[LC]754"), GlassTable->szLocaleName);
            return;
        }

		if (pkShop->LockStatus())
		{
			ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("[LC]948"));
			return;
		}

        ch->SetMyShopTime();
		
		
		
		
		const std::vector<CShop::SHOP_ITEM>& vItemVec = pkShop->GetItemVector();
		const CShop::SHOP_ITEM& item = vItemVec[p->bPos];
		
		ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Pret magazin: %u"), item.price);
// Here need something like 
      // if (item.price != shop_search_view_price_but_i_dont_know)
      /////
	
		
		
		
        int ret = pkShop->Buy(ch, p->bPos, true);

        if (SHOP_SUBHEADER_GC_OK != ret)
        {
            TPacketGCShop pack;
            pack.header = HEADER_GC_SHOP;
            pack.subheader = static_cast<BYTE>(ret);
            pack.size = sizeof(TPacketGCShop);
            ch->GetDesc()->Packet(&pack, sizeof(pack));
        }
        else
            ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("[LC]757"));

        break;
    }
    default:
        sys_err("ShopSearchBuy ch(%s) wrong state(%d)", ch->GetName(), bState);
        break;
    }
}

 

Link to comment
Share on other sites

  • Replies 0
  • Created
  • Last Reply

Top Posters In This Topic

Popular Days

Top Posters In This Topic

Popular Days

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now

Announcements



×
×
  • Create New...

Important Information

Terms of Use / Privacy Policy / Guidelines / We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.