rawn3cr0 1 Posted May 9, 2023 Share Posted May 9, 2023 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 More sharing options...
Recommended Posts
Please sign in to comment
You will be able to leave a comment after signing in
Sign In Now