bool CChar::NPC_Vendor_Restock(bool bForce, bool bFillStock) { ADDTOCALLSTACK("CChar::NPC_Vendor_Restock"); // Restock this NPC char. // Then Set the next restock time for this . if ( m_pNPC == NULL ) return false; // Make sure that we're a vendor and not a pet if ( IsStatFlag(STATF_Pet) || !NPC_IsVendor() ) return false; bool bRestockNow = true; if ( !bForce && m_pNPC->m_timeRestock.IsTimeValid() ) { // Restock occurs every 10 minutes of inactivity (unless // region tag specifies different time) CRegionWorld *region = GetRegion(); int64 restockIn = 10 * 60 * TICK_PER_SEC; if( region != NULL ) { CVarDefCont *vardef = region->m_TagDefs.GetKey("RestockVendors"); if( vardef != NULL ) restockIn = vardef->GetValNum(); if ( region->m_TagDefs.GetKey("NoRestock") != NULL ) bRestockNow = false; } if ( m_TagDefs.GetKey("NoRestock") != NULL ) bRestockNow = false; if (bRestockNow) bRestockNow = ( CServerTime::GetCurrentTime().GetTimeDiff(m_pNPC->m_timeRestock) > restockIn ); } // At restock the containers are actually emptied if ( bRestockNow ) { m_pNPC->m_timeRestock.Init(); for ( size_t i = 0; i < CountOf(sm_VendorLayers); ++i ) { CItemContainer *pCont = GetBank(sm_VendorLayers[i]); if ( !pCont ) return false; pCont->Empty(); } } if ( bFillStock ) { // An invalid restock time means that the containers are // waiting to be filled if ( !m_pNPC->m_timeRestock.IsTimeValid() ) { if ( IsTrigUsed(TRIGGER_NPCRESTOCK) ) { CCharBase *pCharDef = Char_GetDef(); ReadScriptTrig(pCharDef, CTRIG_NPCRestock, true); } // we need restock vendor money as well GetBank()->Restock(); } // remember that the stock was filled (or considered up-to-date) m_pNPC->m_timeRestock.SetCurrentTime(); } return true; }