mirror of
https://github.com/mangosfour/server.git
synced 2025-12-13 13:37:05 +00:00
Fixed maps extractor. Patch provided by andstan. Not tested.
This commit is contained in:
parent
e58df484a2
commit
4c4f80df5a
3 changed files with 224 additions and 215 deletions
Binary file not shown.
|
|
@ -24,7 +24,6 @@ vec wmoc;
|
||||||
Cell * cell;
|
Cell * cell;
|
||||||
uint32 wmo_count;
|
uint32 wmo_count;
|
||||||
mcell *mcells;
|
mcell *mcells;
|
||||||
|
|
||||||
int holetab_h[4] = {0x1111, 0x2222, 0x4444, 0x8888};
|
int holetab_h[4] = {0x1111, 0x2222, 0x4444, 0x8888};
|
||||||
int holetab_v[4] = {0x000F, 0x00F0, 0x0F00, 0xF000};
|
int holetab_v[4] = {0x000F, 0x00F0, 0x0F00, 0xF000};
|
||||||
|
|
||||||
|
|
@ -35,7 +34,7 @@ bool LoadADT(char* filename)
|
||||||
|
|
||||||
if(mf.isEof())
|
if(mf.isEof())
|
||||||
{
|
{
|
||||||
//printf("No such file.\n");
|
//printf("No such file %s\n",filename);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
mcells=new mcell;
|
mcells=new mcell;
|
||||||
|
|
@ -47,8 +46,10 @@ bool LoadADT(char* filename)
|
||||||
|
|
||||||
wmo_count=0;
|
wmo_count=0;
|
||||||
bool found=false;
|
bool found=false;
|
||||||
//uint32 fs=mf.getSize()-3;
|
|
||||||
//while (mf.getPos()<fs)
|
MH2O_presence = false;
|
||||||
|
chunk_num = 0;
|
||||||
|
k = 0;
|
||||||
while (!mf.isEof())
|
while (!mf.isEof())
|
||||||
{
|
{
|
||||||
uint32 fourcc;
|
uint32 fourcc;
|
||||||
|
|
@ -56,143 +57,116 @@ bool LoadADT(char* filename)
|
||||||
mf.read(&size, 4);
|
mf.read(&size, 4);
|
||||||
|
|
||||||
size_t nextpos = mf.getPos() + size;
|
size_t nextpos = mf.getPos() + size;
|
||||||
switch(fourcc)
|
|
||||||
{
|
|
||||||
case 0x4d43494e: // MCIN
|
|
||||||
{
|
|
||||||
//printf("Found chunks info\n");
|
|
||||||
// mapchunk offsets/sizes
|
|
||||||
for (int i=0; i<256; i++)
|
|
||||||
{
|
|
||||||
mf.read(&mcnk_offsets[i],4);
|
|
||||||
mf.read(&mcnk_sizes[i],4);
|
|
||||||
mf.seekRelative(8);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 0x4d4f4446: // MODF
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
if(size)
|
|
||||||
{
|
|
||||||
//printf("\nwmo count %d\n",size/64);
|
|
||||||
wmo_count =size/64;
|
|
||||||
for (int i=0; i<wmo_count; i++)
|
|
||||||
{
|
|
||||||
int id;
|
|
||||||
mf.read(&id, 4);
|
|
||||||
WMO *wmo = (WMO*)wmomanager.items[wmomanager.get(wmos[id])];
|
|
||||||
WMOInstance inst(wmo, mf);
|
|
||||||
wmois.push_back(inst);
|
|
||||||
}
|
|
||||||
}*/
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 0x4d574d4f: // MWMO
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
if (size)
|
|
||||||
{
|
|
||||||
char *buf = new char[size];
|
|
||||||
mf.read(buf, size);
|
|
||||||
char *p=buf;
|
|
||||||
while (p<buf+size)
|
|
||||||
{
|
|
||||||
std::string path(p);
|
|
||||||
p+=strlen(p)+1;
|
|
||||||
fixname(path);
|
|
||||||
|
|
||||||
wmomanager.add(path);
|
//if(fourcc==0x4d484452) // MHDR header
|
||||||
wmos.push_back(path);
|
//if(fourcc==0x4d564552) // MVER
|
||||||
}
|
if(fourcc==0x4d43494e) // MCIN
|
||||||
delete[] buf;
|
{
|
||||||
}*/
|
for (int i=0; i<256; i++)
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 0x4d564552: // MVER
|
|
||||||
case 0x4d484452: // MHDR header
|
|
||||||
case 0x4d434e4b: // MCNK
|
|
||||||
case 0x4d544558: // MTEX textures (strings)
|
|
||||||
case 0x4d4d4458: // MMDX m2 models (strings)
|
|
||||||
case 0x4d4d4944: // MMID offsets for strings in MMDX
|
|
||||||
case 0x4d574944: // MWID offsets for strings in MWMO
|
|
||||||
case 0x4d444446: // MDDF
|
|
||||||
case 0x4d46424f: // MFBO new in BC
|
|
||||||
case 0x4d48324f: // MH2O new in WotLK
|
|
||||||
case 0x4D545846: // MTXF new in WotLK
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
{
|
{
|
||||||
// mf.seekRelative(-3);
|
mf.read(&mcnk_offsets[i],4);
|
||||||
printf("Unhandled map chunk: %u\n",fourcc);
|
mf.read(&mcnk_sizes[i],4);
|
||||||
break;
|
mf.seekRelative(8);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
//if(fourcc==0x4d544558) // MTEX textures (strings)
|
||||||
|
//if(fourcc==0x4d4d4458) // MMDX m2 models (strings)
|
||||||
|
//if(fourcc==0x4d4d4944) // MMID offsets for strings in MMDX
|
||||||
|
//if(fourcc==0x4d574d4f) // MWMO
|
||||||
|
//if(fourcc==0x4d574944) // MWID offsets for strings in MWMO
|
||||||
|
//if(fourcc==0x4d444446) // MDDF
|
||||||
|
//if(fourcc==0x4d4f4446) // MODF
|
||||||
|
if(fourcc==0x4d48324f && size) // MH2O new in WotLK
|
||||||
|
{
|
||||||
|
MH2O_presence = true;
|
||||||
|
// çäåñü íàäî çàïîìíèòü áàçîâóþ ïîçèöèþ â ôàéëå òê âñå ñìåùåíèÿ áóäóò îò íåãî
|
||||||
|
uint32 base_pos = mf.getPos();
|
||||||
|
uint32 header_pos = 0;
|
||||||
|
LiqOffsData = new MH2O_offsData;
|
||||||
|
LiqChunkData1 = new MH2O_Data1;
|
||||||
|
ChunkLiqHeght = new float[81];
|
||||||
|
for(;chunk_num < 256; chunk_num++)
|
||||||
|
{
|
||||||
|
mf.read(LiqOffsData,12);
|
||||||
|
header_pos = mf.getPos();
|
||||||
|
if(LiqOffsData->offsData1 !=0) // åñëè äàííûå â Data1 î âîäå åñòü, òî èõ íàäî êîíâåðòèðîâàòü
|
||||||
|
{
|
||||||
|
mf.seek(base_pos + LiqOffsData->offsData1);// ïåðåõîäèì ïî ñìåùåíèþ èç offsData1 ÎÒ ÍÀ×ÀËÀ êóñêà
|
||||||
|
mf.read(LiqChunkData1,24); // ñ÷èòûâàåì ñàìè äàííûå â ñòðóêòóðó òèïà MH2O_Data1
|
||||||
|
// çàíîñèì äàííûå ôëàãà äëÿ êóñêà
|
||||||
|
if(LiqChunkData1->flags & 4 || LiqChunkData1->flags & 8)
|
||||||
|
MapLiqFlag[chunk_num] |=1;
|
||||||
|
if(LiqChunkData1->flags & 16)
|
||||||
|
MapLiqFlag[chunk_num] |=2;
|
||||||
|
// ïðåäâàðèòåëüíî çàïîëíÿåì âåñü êóñîê äàííûìè - íåò âîäû
|
||||||
|
for(int j=0;j<81;j++)
|
||||||
|
{
|
||||||
|
ChunkLiqHeght[j] = -999999; // no liquid/water
|
||||||
|
}
|
||||||
|
// òåïåðü âû÷èñëÿåì òå ÷òî ñ âîäîé è ïåðåçàïèñûâàåì èõ â êóñêå
|
||||||
|
for(int b=0; b <= LiqChunkData1->height; b++)
|
||||||
|
{
|
||||||
|
for(int c=LiqChunkData1->xOffset; c <= (LiqChunkData1->xOffset+LiqChunkData1->width); c++)
|
||||||
|
{
|
||||||
|
int n = (9*(LiqChunkData1->yOffset + b))+c;
|
||||||
|
ChunkLiqHeght[n] = LiqChunkData1->heightLevel1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mf.seek(header_pos); // è íå çàáûòü âåðíóòüñÿ íà èñõîäíóþ ïîçèöèþ èìåííî Â ÕÈÄÅÐÅ
|
||||||
|
}
|
||||||
|
else // åñëè äàííûõ â Data1 íåò, òî íàäî çàïîëíèòü âåñü êóñîê, íî äàííûìè - íåò âîäû
|
||||||
|
{
|
||||||
|
for(int j=0; j<81; j++)
|
||||||
|
ChunkLiqHeght[j] = -999999; // no liquid/water
|
||||||
|
}
|
||||||
|
if(!(chunk_num%16))
|
||||||
|
m = 1024*(chunk_num/16); // ñìåùåíèå ïî ðÿäàì êóñêîâ ñ ïåðåêðûòèåì = 1024
|
||||||
|
k = m +(chunk_num%16)*8; // óñòàíàâëèâàåìñÿ íà íà÷àëüíûé èíäåêñ äëÿ çàïîëíåíèÿ ðÿäà
|
||||||
|
// çàíîñèì äàííûå êóñêà â ìàññèâ äëÿ êàðòû, ñ ïåðåêðûòèåì è îáðåçàíèåì êóñêîâ òê äàííûõ 81
|
||||||
|
// ýòî àíàëîã ñòàðîãî îáðåçàíèÿ ãðàíè÷íûõ ïðàâûõ-áîêîâûõ è íèæíèõ äàííûõ
|
||||||
|
for(int p=0;p<72;p+=9) // íèæíèå 8 íå çàíîñèì òê îíè äóáëèðóåòñÿ ñëåä êóñêîì
|
||||||
|
{
|
||||||
|
for(int s=0; s<8; s++) // 9 çíà÷åíèå â ñòðîêå íå çàíîñèì òê îíî äóáëèðóåòñÿ ñëåä êóñêîì, à â ïðàâûõ-áîêîâûõ îáðåçàåòñÿ äëÿ 128õ128
|
||||||
|
{
|
||||||
|
MapLiqHeight[k] = ChunkLiqHeght[p+s];// :)
|
||||||
|
k++;
|
||||||
|
}
|
||||||
|
k=k+120;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
delete LiqOffsData;
|
||||||
|
delete LiqChunkData1;
|
||||||
|
delete []ChunkLiqHeght;
|
||||||
|
|
||||||
|
}
|
||||||
|
//case 0x4d434e4b: // MCNK
|
||||||
|
//case 0x4d46424f: // MFBO new in BC
|
||||||
|
//case 0x4d545846: // MTXF new in WotLK
|
||||||
mf.seek(nextpos);
|
mf.seek(nextpos);
|
||||||
}
|
}
|
||||||
|
|
||||||
//printf("Loading chunks info\n");
|
//printf("Loading chunks info\n");
|
||||||
// read individual map chunks
|
// read individual map chunks
|
||||||
for (int j=0; j<16; j++)
|
for (int j=0; j<16; j++)
|
||||||
|
{
|
||||||
for (int i=0; i<16; i++)
|
for (int i=0; i<16; i++)
|
||||||
{
|
{
|
||||||
mf.seek((int)mcnk_offsets[j*16+i]);
|
mf.seek((int)mcnk_offsets[j*16+i]);
|
||||||
LoadMapChunk(mf,&(mcells->ch[i][j]));
|
LoadMapChunk(mf,&(mcells->ch[i][j]));
|
||||||
|
chunk_num++;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
/*
|
|
||||||
for(uint32 t=0;t<wmo_count ;t++)
|
|
||||||
{
|
|
||||||
wmois[t].draw();
|
|
||||||
}*/
|
|
||||||
|
|
||||||
mf.close();
|
mf.close();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct MapChunkHeader {
|
|
||||||
uint32 flags;
|
|
||||||
uint32 ix;
|
|
||||||
uint32 iy;
|
|
||||||
uint32 nLayers;
|
|
||||||
uint32 nDoodadRefs;
|
|
||||||
uint32 ofsHeight;
|
|
||||||
uint32 ofsNormal;
|
|
||||||
uint32 ofsLayer;
|
|
||||||
uint32 ofsRefs;
|
|
||||||
uint32 ofsAlpha;
|
|
||||||
uint32 sizeAlpha;
|
|
||||||
uint32 ofsShadow;
|
|
||||||
uint32 sizeShadow;
|
|
||||||
uint32 areaid;
|
|
||||||
uint32 nMapObjRefs;
|
|
||||||
uint32 holes;
|
|
||||||
uint16 s1;
|
|
||||||
uint16 s2;
|
|
||||||
uint32 d1;
|
|
||||||
uint32 d2;
|
|
||||||
uint32 d3;
|
|
||||||
uint32 predTex;
|
|
||||||
uint32 nEffectDoodad;
|
|
||||||
uint32 ofsSndEmitters;
|
|
||||||
uint32 nSndEmitters;
|
|
||||||
uint32 ofsLiquid;
|
|
||||||
uint32 sizeLiquid;
|
|
||||||
float zpos;
|
|
||||||
float xpos;
|
|
||||||
float ypos;
|
|
||||||
uint32 textureId;
|
|
||||||
uint32 props;
|
|
||||||
uint32 effectId;
|
|
||||||
};
|
|
||||||
|
|
||||||
bool isHole(int holes, int i, int j)
|
bool isHole(int holes, int i, int j)
|
||||||
{
|
{
|
||||||
int testi = i/2;
|
int testi = i/2;
|
||||||
int testj = j/4;
|
int testj = j/4;
|
||||||
if(testi>3) testi = 3;
|
if(testi>3) testi = 3;
|
||||||
if(testj>3) testj = 3;
|
if(testj>3) testj = 3;
|
||||||
return (holes & holetab_h[testi] & holetab_v[testj])!=0;
|
return (holes & holetab_h[testi] & holetab_v[testj])!=0;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline
|
inline
|
||||||
|
|
@ -207,9 +181,8 @@ void LoadMapChunk(MPQFile & mf, chunk*_chunk)
|
||||||
mf.read(&size, 4);
|
mf.read(&size, 4);
|
||||||
|
|
||||||
size_t lastpos = mf.getPos() + size;
|
size_t lastpos = mf.getPos() + size;
|
||||||
mf.read(&header, 0x80);
|
mf.read(&header, 0x80); // what if header size got changed?
|
||||||
_chunk->area_id =header.areaid ;
|
_chunk->area_id =header.areaid ;
|
||||||
_chunk->flag =0;
|
|
||||||
|
|
||||||
float xbase = header.xpos;
|
float xbase = header.xpos;
|
||||||
float ybase = header.ypos;
|
float ybase = header.ypos;
|
||||||
|
|
@ -222,13 +195,11 @@ void LoadMapChunk(MPQFile & mf, chunk*_chunk)
|
||||||
float zmin=999999999.0f;
|
float zmin=999999999.0f;
|
||||||
float zmax=-999999999.0f;
|
float zmax=-999999999.0f;
|
||||||
//must be there, bl!zz uses some crazy format
|
//must be there, bl!zz uses some crazy format
|
||||||
int nTextures;
|
//int nTextures;
|
||||||
while (mf.getPos() < lastpos)
|
while (mf.getPos() < lastpos)
|
||||||
{
|
{
|
||||||
mf.read(&fourcc,4);
|
mf.read(&fourcc,4);
|
||||||
mf.read(&size, 4);
|
mf.read(&size, 4);
|
||||||
//if(size!=580)
|
|
||||||
// printf("\n sz=%d",size);
|
|
||||||
size_t nextpos = mf.getPos() + size;
|
size_t nextpos = mf.getPos() + size;
|
||||||
if(fourcc==0x4d435654) // MCVT
|
if(fourcc==0x4d435654) // MCVT
|
||||||
{
|
{
|
||||||
|
|
@ -258,9 +229,9 @@ void LoadMapChunk(MPQFile & mf, chunk*_chunk)
|
||||||
}
|
}
|
||||||
else if(fourcc==0x4d434e52) // MCNR
|
else if(fourcc==0x4d434e52) // MCNR
|
||||||
{
|
{
|
||||||
nextpos = mf.getPos() + 0x1C0; // size fix
|
nextpos = mf.getPos() + 0x1C0; // size fix
|
||||||
}
|
}
|
||||||
else if(fourcc==0x4d434c51) // MCLQ
|
else if(fourcc==0x4d434c51 && !MH2O_presence) // íå áóäåì ó÷èòûâàòü åñëè óæå áûëè äàííûå â MH2O, ïåðåñòðàõîâêà :) // MCLQ
|
||||||
{
|
{
|
||||||
// liquid / water level
|
// liquid / water level
|
||||||
//bool haswater;
|
//bool haswater;
|
||||||
|
|
@ -268,47 +239,51 @@ void LoadMapChunk(MPQFile & mf, chunk*_chunk)
|
||||||
mf.read(fcc1,4);
|
mf.read(fcc1,4);
|
||||||
flipcc(fcc1);
|
flipcc(fcc1);
|
||||||
fcc1[4]=0;
|
fcc1[4]=0;
|
||||||
|
ChunkLiqHeght = new float[81];
|
||||||
|
|
||||||
if (!strcmp(fcc1,"MCSE"))
|
if (!strcmp(fcc1,"MCSE"))
|
||||||
{
|
{
|
||||||
for(int i=0;i<9;i++)
|
for(int j=0;j<81;j++)
|
||||||
for(int j=0;j<9;j++)
|
{
|
||||||
_chunk->waterlevel[i][j]=-999999; // no liquid/water
|
ChunkLiqHeght[j] = -999999; // no liquid/water
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
float maxheight;
|
float maxheight;
|
||||||
mf.read(&maxheight, 4);
|
mf.read(&maxheight, 4);
|
||||||
|
for(int j=0;j<81;j++)
|
||||||
for(int j=0;j<9;j++)
|
{
|
||||||
for(int i=0;i<9;i++)
|
mf.read(&h, 4);
|
||||||
{
|
mf.read(&h, 4);
|
||||||
mf.read(&h, 4);
|
if(h > maxheight)
|
||||||
mf.read(&h, 4);
|
ChunkLiqHeght[j] = -999999;
|
||||||
if(h > maxheight)
|
else
|
||||||
_chunk->waterlevel[i][j]=-999999;
|
ChunkLiqHeght[j] = h;
|
||||||
else
|
}
|
||||||
_chunk->waterlevel[i][j]=h;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(chunkflags & 4 || chunkflags & 8)
|
if(chunkflags & 4 || chunkflags & 8)
|
||||||
_chunk->flag |=1;
|
MapLiqFlag[chunk_num] |= 1;
|
||||||
if(chunkflags & 16)
|
if(chunkflags & 16)
|
||||||
_chunk->flag |=2;
|
MapLiqFlag[chunk_num] |= 2;
|
||||||
}
|
}
|
||||||
|
// çàïîëíåì òàê æå êàê â MH2O
|
||||||
|
if(!(chunk_num%16))
|
||||||
|
m = 1024*(chunk_num/16);
|
||||||
|
k = m +(chunk_num%16)*8;
|
||||||
|
|
||||||
|
for(int p=0;p<72;p+=9)
|
||||||
|
{
|
||||||
|
for(int s=0; s<8; s++)
|
||||||
|
{
|
||||||
|
MapLiqHeight[k] = ChunkLiqHeght[p+s]; // :)
|
||||||
|
k++;
|
||||||
|
}
|
||||||
|
k=k+120;
|
||||||
|
}
|
||||||
|
delete []ChunkLiqHeght;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else if (fourcc==0x4d434c59) // MCLY
|
|
||||||
{
|
|
||||||
// texture info
|
|
||||||
nTextures = (int)size;
|
|
||||||
}
|
|
||||||
else if (fourcc==0x4d43414c) // MCAL
|
|
||||||
{
|
|
||||||
if (nTextures<=0)
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
mf.seek(nextpos);
|
mf.seek(nextpos);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -330,10 +305,6 @@ double GetZ(double x,double z)
|
||||||
{
|
{
|
||||||
vec v[3];
|
vec v[3];
|
||||||
vec p;
|
vec p;
|
||||||
|
|
||||||
//bool inWMO=false;
|
|
||||||
|
|
||||||
//if(!inWMO)
|
|
||||||
{
|
{
|
||||||
//find out quadrant
|
//find out quadrant
|
||||||
int xc=(int)(x/UNITSIZE);
|
int xc=(int)(x/UNITSIZE);
|
||||||
|
|
@ -380,19 +351,6 @@ double GetZ(double x,double z)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
inline
|
|
||||||
void TransformWaterData()
|
|
||||||
{
|
|
||||||
cell= new Cell;
|
|
||||||
|
|
||||||
for(int x=0;x<128;x++)
|
|
||||||
for(int y=0;y<128;y++)
|
|
||||||
cell->v9[x][y] = mcells->ch[x/8][y/8].waterlevel[x%8][y%8];
|
|
||||||
|
|
||||||
//and the last 1
|
|
||||||
cell->v9[128][128] = mcells->ch[15][15].waterlevel[8][8];
|
|
||||||
}
|
|
||||||
|
|
||||||
inline
|
inline
|
||||||
void TransformData()
|
void TransformData()
|
||||||
{
|
{
|
||||||
|
|
@ -423,14 +381,24 @@ const char MAP_MAGIC[] = "MAP_2.01";
|
||||||
|
|
||||||
bool ConvertADT(char * filename,char * filename2)
|
bool ConvertADT(char * filename,char * filename2)
|
||||||
{
|
{
|
||||||
//if(!strstr(filename,"oth_32_48"))return false;
|
MapLiqHeight = new float[16384];
|
||||||
|
MapLiqFlag = new char[256];
|
||||||
|
for(int j=0; j<256; j++)
|
||||||
|
MapLiqFlag[j] = 0;
|
||||||
|
|
||||||
if(!LoadADT(filename))
|
if(!LoadADT(filename))
|
||||||
|
{
|
||||||
|
delete [] MapLiqHeight;
|
||||||
|
delete [] MapLiqFlag;
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
FILE *output=fopen(filename2,"wb");
|
FILE *output=fopen(filename2,"wb");
|
||||||
if(!output)
|
if(!output)
|
||||||
{
|
{
|
||||||
printf("Can't create the output file '%s'\n",filename2);
|
printf("Can't create the output file '%s'\n",filename2);
|
||||||
|
delete [] MapLiqHeight;
|
||||||
|
delete [] MapLiqFlag;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -441,7 +409,7 @@ bool ConvertADT(char * filename,char * filename2)
|
||||||
{
|
{
|
||||||
for(unsigned int y=0;y<16;y++)
|
for(unsigned int y=0;y<16;y++)
|
||||||
{
|
{
|
||||||
if(mcells->ch[y][x].area_id && mcells->ch[y][x].area_id < 0x121F)
|
if(mcells->ch[y][x].area_id && mcells->ch[y][x].area_id < 0x102D)
|
||||||
{
|
{
|
||||||
if(areas[mcells->ch[y][x].area_id]==0xffff)
|
if(areas[mcells->ch[y][x].area_id]==0xffff)
|
||||||
printf("\nCan't find area flag for areaid %u.\n",mcells->ch[y][x].area_id);
|
printf("\nCan't find area flag for areaid %u.\n",mcells->ch[y][x].area_id);
|
||||||
|
|
@ -456,17 +424,12 @@ bool ConvertADT(char * filename,char * filename2)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for(unsigned int x=0;x<16;x++)
|
fwrite(MapLiqFlag,1,256,output); //!!!!!!!!
|
||||||
for(unsigned int y=0;y<16;y++)
|
delete [] MapLiqFlag;
|
||||||
fwrite(&mcells->ch[y][x].flag,1,1,output);
|
|
||||||
|
fwrite(MapLiqHeight,sizeof(float),16384,output); //!!!!!!!!
|
||||||
TransformWaterData();
|
delete [] MapLiqHeight;
|
||||||
|
|
||||||
for(unsigned int x=0;x<128;x++)
|
|
||||||
for(unsigned int y=0;y<128;y++)
|
|
||||||
fwrite(&cell->v9[y][x],1,sizeof(float),output);
|
|
||||||
|
|
||||||
delete cell;
|
|
||||||
TransformData();
|
TransformData();
|
||||||
|
|
||||||
for(unsigned int x=0;x<iRes;x++)
|
for(unsigned int x=0;x<iRes;x++)
|
||||||
|
|
@ -481,20 +444,6 @@ bool ConvertADT(char * filename,char * filename2)
|
||||||
|
|
||||||
fclose(output);
|
fclose(output);
|
||||||
delete cell;
|
delete cell;
|
||||||
/*
|
|
||||||
for (std::vector<std::string>::iterator it = wmos.begin(); it != wmos.end(); ++it)
|
|
||||||
wmomanager.delbyname(*it);
|
|
||||||
|
|
||||||
wmos.clear();
|
|
||||||
wmois.clear();
|
|
||||||
|
|
||||||
for (std::vector<model>::iterator it = wmomodel.begin(); it != wmomodel.end(); ++it)
|
|
||||||
{
|
|
||||||
it->tr.clear();
|
|
||||||
|
|
||||||
}
|
|
||||||
//printf("\n %d \n",in);
|
|
||||||
wmomodel.clear();
|
|
||||||
//polygons.clear();*/
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -10,34 +10,31 @@ typedef unsigned short uint16;
|
||||||
typedef unsigned int uint32;
|
typedef unsigned int uint32;
|
||||||
class Liquid;
|
class Liquid;
|
||||||
typedef struct {
|
typedef struct {
|
||||||
float x;
|
float x;
|
||||||
float y;
|
float y;
|
||||||
float z;
|
float z;
|
||||||
}svec;
|
} svec;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
double x;
|
double x;
|
||||||
double y;
|
double y;
|
||||||
double z;
|
double z;
|
||||||
}vec;
|
} vec;
|
||||||
|
|
||||||
typedef struct{
|
typedef struct{
|
||||||
vec v[3];
|
vec v[3];
|
||||||
}triangle;
|
} triangle;
|
||||||
|
|
||||||
typedef struct{
|
typedef struct{
|
||||||
float v9[16*8+1][16*8+1];
|
float v9[16*8+1][16*8+1];
|
||||||
float v8[16*8][16*8];
|
float v8[16*8][16*8];
|
||||||
}Cell;
|
} Cell;
|
||||||
|
|
||||||
typedef struct{
|
typedef struct{
|
||||||
double v9[9][9];
|
double v9[9][9];
|
||||||
double v8[8][8];
|
double v8[8][8];
|
||||||
uint16 area_id;
|
uint16 area_id;
|
||||||
//Liquid *lq;
|
} chunk;
|
||||||
float waterlevel[9][9];
|
|
||||||
uint8 flag;
|
|
||||||
}chunk;
|
|
||||||
|
|
||||||
class WMO;
|
class WMO;
|
||||||
class WMOManager;
|
class WMOManager;
|
||||||
|
|
@ -45,9 +42,72 @@ void fixname(std::string &name);
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
chunk ch[16][16];
|
chunk ch[16][16];
|
||||||
}mcell;
|
} mcell;
|
||||||
|
|
||||||
|
struct MapChunkHeader {
|
||||||
|
uint32 flags;
|
||||||
|
uint32 ix;
|
||||||
|
uint32 iy;
|
||||||
|
uint32 nLayers;
|
||||||
|
uint32 nDoodadRefs;
|
||||||
|
uint32 ofsHeight;
|
||||||
|
uint32 ofsNormal;
|
||||||
|
uint32 ofsLayer;
|
||||||
|
uint32 ofsRefs;
|
||||||
|
uint32 ofsAlpha;
|
||||||
|
uint32 sizeAlpha;
|
||||||
|
uint32 ofsShadow;
|
||||||
|
uint32 sizeShadow;
|
||||||
|
uint32 areaid;
|
||||||
|
uint32 nMapObjRefs;
|
||||||
|
uint32 holes;
|
||||||
|
uint16 s1;
|
||||||
|
uint16 s2;
|
||||||
|
uint32 d1;
|
||||||
|
uint32 d2;
|
||||||
|
uint32 d3;
|
||||||
|
uint32 predTex;
|
||||||
|
uint32 nEffectDoodad;
|
||||||
|
uint32 ofsSndEmitters;
|
||||||
|
uint32 nSndEmitters;
|
||||||
|
uint32 ofsLiquid; // not use in WotLK
|
||||||
|
uint32 sizeLiquid; // not use in WotLK
|
||||||
|
float zpos;
|
||||||
|
float xpos;
|
||||||
|
float ypos;
|
||||||
|
uint32 textureId; // new offsColorValues in WotLK
|
||||||
|
uint32 props;
|
||||||
|
uint32 effectId;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint32 offsData1;
|
||||||
|
uint32 used;
|
||||||
|
uint32 offsData2;
|
||||||
|
} MH2O_offsData;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint16 flags;
|
||||||
|
uint16 type;
|
||||||
|
float heightLevel1;
|
||||||
|
float heightLevel2;
|
||||||
|
byte xOffset;
|
||||||
|
byte yOffset;
|
||||||
|
byte width;
|
||||||
|
byte height;
|
||||||
|
uint32 ofsData2a;
|
||||||
|
uint32 ofsData2b;
|
||||||
|
} MH2O_Data1;
|
||||||
|
|
||||||
class MPQFile;
|
class MPQFile;
|
||||||
void LoadMapChunk(MPQFile &,chunk*);
|
|
||||||
|
bool MH2O_presence;
|
||||||
|
MH2O_offsData *LiqOffsData;
|
||||||
|
MH2O_Data1 *LiqChunkData1;
|
||||||
|
float *ChunkLiqHeght, *MapLiqHeight;
|
||||||
|
char* MapLiqFlag;
|
||||||
|
uint32 k, m, chunk_num;
|
||||||
|
void LoadMapChunk(MPQFile &, chunk*);
|
||||||
bool LoadWMO(char* filename);
|
bool LoadWMO(char* filename);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue