stock Downloader_GetMaterialsFromMDL(const String:model[], String:files[][], maxsize, maxlen) { if(!FileExists(model)) return 0; new m_iNum = 0; new Handle:m_hFile = OpenFile(model, "rb"); FileSeek(m_hFile, 204, SEEK_SET); ReadFileCell(m_hFile, m_iNum, 4); FileSeek(m_hFile, 0, SEEK_END); decl m_cChar; decl m_iPos; do { FileSeek(m_hFile, -2, SEEK_CUR); ReadFileCell(m_hFile, m_cChar, 1); } while (m_cChar == 0); FileSeek(m_hFile, 1, SEEK_CUR); decl String:m_szPath[PLATFORM_MAX_PATH]; do { FileSeek(m_hFile, -2, SEEK_CUR); ReadFileCell(m_hFile, m_cChar, 1); } while(m_cChar != 0); m_iPos = FilePosition(m_hFile); ReadFileString(m_hFile, m_szPath, sizeof(m_szPath)); FileSeek(m_hFile, m_iPos, SEEK_SET); decl m_iRet; decl String:m_szFile[PLATFORM_MAX_PATH]; for(m_iRet=0;m_iRet 0) { m_bFound[i]=true; while(m_szLine[m_iPos] != '"' && m_szLine[m_iPos] != ' ' && m_szLine[m_iPos] != ' ') ++m_iPos; while(m_szLine[m_iPos] == ' ' || m_szLine[m_iPos] == ' ' || m_szLine[m_iPos] == '"') ++m_iPos; m_iLast = m_iPos; while(m_szLine[m_iLast] != '"' && m_szLine[m_iLast] != '\r' && m_szLine[m_iLast] != '\n' && m_szLine[m_iLast] != ' ' && m_szLine[m_iLast] != ' ' && m_szLine[m_iLast] != 0) ++m_iLast; m_szLine[m_iLast] = 0; strcopy(materials[m_iNum], maxlen, m_szLine[m_iPos]); ++m_iNum; } } } CloseHandle(m_hFile); return m_iNum; } new Handle:g_hCachedFiles = INVALID_HANDLE; new Handle:g_hCachedNums = INVALID_HANDLE; stock Downloader_AddFileToDownloadsTable(const String:filename[]) { if(!FileExists(filename)) return 0; if(g_hCachedNums == INVALID_HANDLE) { g_hCachedNums = CreateTrie(); g_hCachedFiles = CreateArray(PLATFORM_MAX_PATH); } AddFileToDownloadsTable(filename); decl m_iValue; if(GetTrieValue(g_hCachedNums, filename, m_iValue)) { new m_iStart = FindStringInArray(g_hCachedFiles, filename)+1; decl String:m_szFile[PLATFORM_MAX_PATH]; for(new i=m_iStart-m_iValue-1;i