Index: src/shared/vmap/ModelContainer.cpp =================================================================== --- src/shared/vmap/ModelContainer.cpp (revision 4943) +++ src/shared/vmap/ModelContainer.cpp (working copy) @@ -21,6 +21,9 @@ #include +#include +#include + #include "ModelContainer.h" #include "VMapDefinitions.h" @@ -361,52 +364,53 @@ char ident[8]; char chunk[4]; unsigned int ival; - FILE *rf = fopen(filename, "rb"); + gzFile rf = gzopen(filename, "rb"); + if(!rf) rf = gzopen((std::string(filename)+".gz").c_str(),"rb"); if(rf) { free(); result = true; - if(result && fread(ident,8,1,rf) != 1) result = false; - if(result && fread(&flags,sizeof(unsigned int),1,rf) != 1) result = false; + if(result && gzread(rf,ident,8) != 8) result = false; + if(result && gzread(rf,&flags,sizeof(unsigned int)) != sizeof(unsigned int)) result = false; //POS - if(result && fread(chunk,4,1,rf) != 1) result = false; - if(result && fread(&size,4,1,rf) != 1) result = false; + if(result && gzread(rf,chunk,4) != 4) result = false; + if(result && gzread(rf,&size,4) != 4) result = false; Vector3 basePos; - if(result && fread(&basePos,sizeof(float),3,rf) != 3) result = false; + if(result && gzread(rf,&basePos,sizeof(float)*3) != sizeof(float)*3) result = false; setBasePosition(basePos); //---- Box - if(result && fread(chunk,4,1,rf) != 1) result = false; - if(result && fread(&size,4,1,rf) != 1) result = false; + if(result && gzread(rf,chunk,4) != 4) result = false; + if(result && gzread(rf,&size,4) != 4) result = false; Vector3 low,high; - if(result && fread(&low,sizeof(float),3,rf) != 3) result = false; - if(result && fread(&high,sizeof(float),3,rf) != 3) result = false; + if(result && gzread(rf,&low,sizeof(float)*3) != sizeof(float)*3) result = false; + if(result && gzread(rf,&high,sizeof(float)*3) != sizeof(float)*3) result = false; setBounds(low, high); //---- TreeNodes - if(result && fread(chunk,4,1,rf) != 1) result = false; - if(result && fread(&size,4,1,rf) != 1) result = false; + if(result && gzread(rf,chunk,4) != 4) result = false; + if(result && gzread(rf,&size,4) != 4) result = false; - if(result && fread(&ival,sizeof(unsigned int),1,rf) != 1) result = false; + if(result && gzread(rf,&ival,sizeof(unsigned int)) != sizeof(unsigned int)) result = false; if(result) setNNodes(ival); if(result) setTreeNodeArray(new TreeNode[getNNodes()]); - if(result && fread(getTreeNodes(),sizeof(TreeNode),getNNodes(),rf) != getNNodes()) result = false; + if(result && gzread(rf,getTreeNodes(),sizeof(TreeNode)*getNNodes()) != sizeof(TreeNode)*getNNodes()) result = false; //---- TriengleBoxes - if(result && fread(chunk,4,1,rf) != 1) result = false; - if(result && fread(&size,4,1,rf) != 1) result = false; + if(result && gzread(rf,chunk,4) != 4) result = false; + if(result && gzread(rf,&size,4) != 4) result = false; - if(result && fread(&ival,sizeof(unsigned int),1,rf) != 1) result = false; + if(result && gzread(rf,&ival,sizeof(unsigned int)) != sizeof(unsigned int)) result = false; setNTriangles(ival); if(result) setTriangleArray(new TriangleBox[getNTriangles()]); - if(result && fread(getTriangles(),sizeof(TriangleBox),getNTriangles(),rf) != getNTriangles()) result = false; + if(result && gzread(rf,getTriangles(),sizeof(TriangleBox)*getNTriangles()) != sizeof(TriangleBox)*getNTriangles()) result = false; //---- SubModel - if(result && fread(chunk,4,1,rf) != 1) result = false; - if(result && fread(&size,4,1,rf) != 1) result = false; + if(result && gzread(rf,chunk,4) != 4) result = false; + if(result && gzread(rf,&size,4) != 4) result = false; - if(result && fread(&iNSubModel,sizeof(unsigned int),1,rf) != 1) result = false; + if(result && gzread(rf,&iNSubModel,sizeof(unsigned int)) != sizeof(unsigned int)) result = false; if(result) iSubModel = new SubModel[iNSubModel]; if(result) @@ -414,13 +418,13 @@ for(unsigned int i=0;i +#include + typedef std::map AreaFlagByAreaID; typedef std::map AreaFlagByMapID; @@ -153,13 +155,14 @@ else { // sort problematic dbc to (1) non compatible and (2) non-existed - FILE * f=fopen(filename.c_str(),"rb"); + gzFile f=gzopen(filename.c_str(),"rb"); + if(!f) f=gzopen((filename+".gz").c_str(),"rb"); if(f) { char buf[100]; snprintf(buf,100," (exist, but have %d fields instead %d) Wrong client version DBC file?",storage.fieldCount,strlen(storage.fmt)); errlist.push_back(filename + buf); - fclose(f); + gzclose(f); } else errlist.push_back(filename); Index: src/shared/Database/dbcfile.cpp =================================================================== --- src/shared/Database/dbcfile.cpp (revision 4943) +++ src/shared/Database/dbcfile.cpp (working copy) @@ -20,6 +20,9 @@ #include #include +#include +#include + #include "dbcfile.h" DBCFile::DBCFile() @@ -37,19 +40,20 @@ delete [] data; data=NULL; } - FILE * f=fopen(filename,"rb"); - if(!f)return false; + gzFile f=gzopen(filename,"rb"); + if(!f) f=gzopen((std::string(filename)+".gz").c_str(),"rb"); + if(!f) return false; - fread(&header,4,1,f); // Number of records + gzread(f,&header,4); // Number of records if(header!=0x43424457) { //printf("not dbc file"); return false; //'WDBC' } - fread(&recordCount,4,1,f); // Number of records - fread(&fieldCount,4,1,f); // Number of fields - fread(&recordSize,4,1,f); // Size of a record - fread(&stringSize,4,1,f); // String size + gzread(f,&recordCount,4); // Number of records + gzread(f,&fieldCount,4); // Number of fields + gzread(f,&recordSize,4); // Size of a record + gzread(f,&stringSize,4); // String size fieldsOffset = new uint32[fieldCount]; fieldsOffset[0] = 0; @@ -64,8 +68,8 @@ data = new unsigned char[recordSize*recordCount+stringSize]; stringTable = data + recordSize*recordCount; - fread(data,recordSize*recordCount+stringSize,1,f); - fclose(f); + gzread(f,data,recordSize*recordCount+stringSize); + gzclose(f); return true; } Index: src/game/Map.cpp =================================================================== --- src/game/Map.cpp (revision 4943) +++ src/game/Map.cpp (working copy) @@ -37,6 +37,8 @@ #include "MapInstanced.h" #include "VMapFactory.h" +#include + #define DEFAULT_GRID_EXPIRY 300 #define MAX_GRID_LOAD_TIME 50 @@ -56,12 +58,16 @@ bool Map::ExistMap(uint32 mapid,int x,int y) { - int len = sWorld.GetDataPath().length()+strlen("maps/%03u%02u%02u.map")+1; + int len = sWorld.GetDataPath().length()+strlen("maps/%03u%02u%02u.map")+4; char* tmp = new char[len]; snprintf(tmp, len, (char *)(sWorld.GetDataPath()+"maps/%03u%02u%02u.map").c_str(),mapid,x,y); - FILE *pf=fopen(tmp,"rb"); - + gzFile pf=gzopen(tmp,"rb"); + if (!pf) { + strcat(tmp,".gz"); + pf=gzopen(tmp,"rb"); + } + if(!pf) { sLog.outError("Check existing of map file '%s': not exist!",tmp); @@ -70,17 +76,17 @@ } char magic[8]; - fread(magic,1,8,pf); + gzread(pf,magic,8); if(strncmp(MAP_MAGIC,magic,8)) { sLog.outError("Map file '%s' is non-compatible version (outdated?). Please, create new using ad.exe program.",tmp); delete [] tmp; - fclose(pf); //close file before return + gzclose(pf); //close file before return return false; } delete [] tmp; - fclose(pf); + gzclose(pf); return true; } @@ -156,12 +162,17 @@ // map file name char *tmp=NULL; // Pihhan: dataPath length + "maps/" + 3+2+2+ ".map" length may be > 32 ! - int len = sWorld.GetDataPath().length()+strlen("maps/%03u%02u%02u.map")+1; + int len = sWorld.GetDataPath().length()+strlen("maps/%03u%02u%02u.map")+4; tmp = new char[len]; snprintf(tmp, len, (char *)(sWorld.GetDataPath()+"maps/%03u%02u%02u.map").c_str(),mapid,x,y); sLog.outDetail("Loading map %s",tmp); // loading data - FILE *pf=fopen(tmp,"rb"); + gzFile pf=gzopen(tmp,"rb"); + if (!pf) { + strcat(tmp,".gz"); + pf=gzopen(tmp,"rb"); + } + if(!pf) { delete [] tmp; @@ -169,19 +180,19 @@ } char magic[8]; - fread(magic,1,8,pf); + gzread(pf,magic,8); if(strncmp(MAP_MAGIC,magic,8)) { sLog.outError("Map file '%s' is non-compatible version (outdated?). Please, create new using ad.exe program.",tmp); delete [] tmp; - fclose(pf); //close file before return + gzclose(pf); //close file before return return; } delete [] tmp; GridMap * buf= new GridMap; - fread(buf,1,sizeof(GridMap),pf); - fclose(pf); + gzread(pf,buf,sizeof(GridMap)); + gzclose(pf); GridMaps[x][y] = buf; }