Cod:
//FILE : new_offlineshop_manager.cpp
//SEARCH FOR
bool CShopManager::RecvShopCreateOfferClientPacket(LPCHARACTER ch, TOfferInfo& offer)
{
if(!ch)
return false;
//offlineshop-updated 03/08/19
if(ch->GetPlayerID() == offer.dwOwnerID)
return false;
//ADD UNDER
// fix flooding offers
if (!CheckOfferCooldown(ch->GetPlayerID()))
return false;
//SEARCH FOR:
void CShopManager::ClearSearchTimeMap()
{
m_searchTimeMap.clear();
//ADD UNDER
// fix flooding offers
m_offerCooldownMap.clear();
//SEARCH FOR
void CShopManager::ClearSearchTimeMap()
{
m_searchTimeMap.clear();
}
//ADD UNDER
// fix flooding offers
bool CShopManager::CheckOfferCooldown(DWORD dwPID) {
DWORD now = get_dword_time();
const DWORD cooldown_seconds = 15;
itertype(m_offerCooldownMap) it = m_offerCooldownMap.find(dwPID);
if (it == m_offerCooldownMap.end()) {
m_offerCooldownMap[dwPID] = now + cooldown_seconds *1000;
return true;
}
if (it->second > now)
return false;
it->second = now + cooldown_seconds * 1000;
return true;
}
//FILE : new_offlineshop_manager.h
//SEARCH FOR:
//search time map (checking to avoid search abouse)
void ClearSearchTimeMap();
bool CheckSearchTime(DWORD dwPID);
//ADD UNDER:
// fix flooding offers
bool CheckOfferCooldown(DWORD dwPID);
//SEARCH FOR:
AUCTIONMAP m_mapAuctions;
//ADD UNDER:
// fix flooding offers
SEARCHTIMEMAP m_offerCooldownMap;
//FILE : ClientManagerOfflineshop.cpp
//SEARCH FOR:
bool CClientManager::RecvOfflineShopOfferAccepted(const char* data)
{
offlineshop::TSubPacketGDOfferAccept* subpack;
data = Decode(subpack, data);
offlineshop::COfferCache::TOfferCacheInfo* pOffer=nullptr;
m_offlineshopOfferCache.Get(subpack->dwOfferID,&pOffer);
//ADD UNDER:
if(!pOffer)
return true;