char *COM_FindFile(const char *Filename, int* FileLength) { if (!Filename) return NULL; searchpath_t *Jogger; for (Jogger = COM_Searchpaths; Jogger != NULL; Jogger = Jogger->Next) { pack_t *CurrentPak = Jogger->Pack; for (int i = 0; i < CurrentPak->NumberOfFiles; i++) { if (!strcmp(Filename, CurrentPak->PakFiles[i].FileName)) { Sys_FileSeek(CurrentPak->PackHandle, CurrentPak->PakFiles[i].FilePosition); char *FileData = (char *)malloc(CurrentPak->PakFiles[i].FileLength); Sys_FileRead(CurrentPak->PackHandle, FileData, CurrentPak->PakFiles[i].FileLength); if (FileLength) *FileLength = CurrentPak->PakFiles[i].FileLength; return (char*)FileData; } } } return NULL; }
pack_t *COM_LoadPackFile(char *PakFile) { int PakSize; int PakHandle = Sys_FileOpenRead(PakFile, &PakSize); if (PakHandle == -1) { return NULL; } dpackheader_t PakHeader; Sys_FileRead(PakHandle, &PakHeader, sizeof(PakHeader)); if (PakHeader.Magic[0] != 'P' || PakHeader.Magic[1] != 'A' || PakHeader.Magic[2] != 'C' || PakHeader.Magic[3] != 'K') { return NULL; } int NumPackFiles = PakHeader.DirectoryLength / sizeof(dpackfile_t); packfile_t* FilesInMemory = malloc(NumPackFiles * sizeof(packfile_t)); Sys_FileSeek(PakHandle, PakHeader.DirectoryOffset); dpackfile_t TempPackFile[MAX_FILES_IN_PACK]; Sys_FileRead(PakHandle, (void *)TempPackFile, PakHeader.DirectoryLength); for (int i = 0; i < NumPackFiles; i++) { strcpy_s(FilesInMemory[i].FileName, 56, TempPackFile[i].FileName); FilesInMemory[i].FileLength = TempPackFile[i].FileLength; FilesInMemory[i].FilePosition = TempPackFile[i].FilePosition; } pack_t *Pak0 = (void*)malloc(sizeof(pack_t)); strcpy_s(Pak0->PackName, 64, PakFile); Pak0->PackHandle = PakHandle; Pak0->NumberOfFiles = NumPackFiles; Pak0->PakFiles = FilesInMemory; return Pak0; }
int Mod_FindExternalVIS (loadedfile_t *brush_fileinfo) { char visfilename[1024]; int fhandle; int len, i, pos; searchpath_t *s_vis; vispatch_t header; char mapname[VISPATCH_MAPNAME_LENGTH+5]; // + ".vis" + EoS fhandle = -1; if (external_vis->value) { // check for a .VIS file strcpy(visfilename, loadmodel->name); COM_StripExtension(visfilename, visfilename); strcat(visfilename, ".vis"); len = COM_OpenFile (visfilename, &fhandle, &s_vis); if (fhandle == -1) // check for a .VIS file with map's directory name (e.g. ID1.VIS) { strcpy(visfilename, "maps/"); strcat(visfilename, COM_SkipPath(brush_fileinfo->path->filename)); strcat(visfilename, ".vis"); len = COM_OpenFile (visfilename, &fhandle, &s_vis); } if (fhandle >= 0) { // check file for size if (len <= 0) { COM_CloseFile(fhandle); fhandle = -1; } } if (fhandle >= 0) { // search map in visfile strncpy(mapname, loadname, VISPATCH_MAPNAME_LENGTH); mapname[VISPATCH_MAPNAME_LENGTH] = 0; strcat(mapname, ".bsp"); pos = 0; while ((i = Sys_FileRead (fhandle, &header, sizeof(struct vispatch_s))) == sizeof(struct vispatch_s)) { header.filelen = LittleLong(header.filelen); pos += i; if (!Q_strncasecmp (header.mapname, mapname, VISPATCH_MAPNAME_LENGTH)) // found { break; } pos += header.filelen; Sys_FileSeek(fhandle, pos); } if (i != sizeof(struct vispatch_s)) { COM_CloseFile(fhandle); fhandle = -1; } } if (fhandle >= 0) { Con_DPrintf("%s for %s loaded from %s\n", visfilename, mapname, s_vis->pack ? s_vis->pack->filename : s_vis->filename); } } return fhandle; }