Re: [Request] Guild Wars 2 DAT
Posted: Tue Apr 24, 2012 11:31 pm
Well now its slightly happening because of load but a few tries will get it working again though.
Yep, just saw that this morning after the update was finished. I'll have to rescan my DAT then ;Dkthackeray wrote:If the build matches the latest query, it just launches the game and doesn't look at either manifest.Loumie wrote: Does anyone know if the client is always making a query to retrieve it at boot ?
I didn't spend much time on the strs files, but I didn't have time to look at the ones that seems maybe encrypted of some sort, maybe that's what you're talking about because I didn't see anything special. Just a BOM, a size, a string, and other values that are here when it is not in "clear".kthackeray wrote:The strs files themselves are actually pretty interesting. Using the same format as the original game.Loumie wrote: I'm looking at the txtm file for now, to see how they map the strs files~
Hey,
So, here is a dll, with the sources, which contain a simple function "inflate" (in gw2Inflate.h) that decompresses a file.
I'm using codeblocks/GCC because the C compiler of VS is not even compliant with C99 (unless I missed something).
It successfully decompresses the files of the last version with about 50~ fails out of 187919 files. These fails seems to happen at the end of the decoding, usually the last bytes in the files, I don't have time to look at it right now though.
Feel free to point at eventual mistakes, I'm more a C++ programmer than a pure C one ;D.
Cheers.
That is kinda what we have been doing all along. THere is no way atm to find the real file-name. At least we haven't found any correlation tables. But if we need specific files, we find their number, and download them.Dolkar wrote:What about sniffing out the location of in-game files and downloading them uncompressed without using the official downloader? That might be much easier than unpacking them from the .dat file.
The first thing that is probably getting downloaded is the list of the files and their locations (possibly even names?). I'll try to sniff that one out when I have some time. Or has anyone already successfully done that?
Thank you for reposting this. I was trying to find it for a while after I missed it.Gornoth wrote:Here is a dll that decompresses the guild wars 2 .dat.
It was created by Loumie at gamerevision.
Hey,
So, here is a dll, with the sources, which contain a simple function "inflate" (in gw2Inflate.h) that decompresses a file.
I'm using codeblocks/GCC because the C compiler of VS is not even compliant with C99 (unless I missed something).
It successfully decompresses the files of the last version with about 50~ fails out of 187919 files. These fails seems to happen at the end of the decoding, usually the last bytes in the files, I don't have time to look at it right now though.
Feel free to point at eventual mistakes, I'm more a C++ programmer than a pure C one ;D.
Cheers.
I got it from someone else that got it, but I did message you on GameRevision for the DLL (I am Daegalus there) but its cool No harm and I understand the reason. But the DLL works great.Loumie wrote:Yeah, I edited out the link on gamerevision when I got fed up to only receive PMs from people wanting a full extractor program.
Anyway, I would have given it to you if you had asked me Nimba, you've shared plenty enough ;D
Cheers.
Code: Select all
case 'XCD3':
CreateDirectory("GWDat/ATEX/3DCX",NULL);
printf(" 3DCX");
sprintf(newname,"GWDat/ATEX/3DCX/%s.atex\0",Name);
break;
Code: Select all
case 'UETA':
CreateDirectory("GWDat/ATEU",NULL);
printf(" ATEU");
switch (k)
{
case '1TXD':
CreateDirectory("GWDat/ATEU/DXT1",NULL);
printf(" DXT1");
sprintf(newname,"GWDat/ATEU/DXT1/%s.ateu\0",Name);
break;
case '2TXD':
CreateDirectory("GWDat/ATEU/DXT2",NULL);
printf(" DXT2");
sprintf(newname,"GWDat/ATEU/DXT2/%s.ateu\0",Name);
break;
case '3TXD':
CreateDirectory("GWDat/ATEU/DXT3",NULL);
printf(" DXT3");
sprintf(newname,"GWDat/ATEU/DXT3/%s.ateu\0",Name);
break;
break;
case '5TXD':
CreateDirectory("GWDat/ATEU/DXT5",NULL);
printf(" DXT5");
sprintf(newname,"GWDat/ATEU/DXT5/%s.ateu\0",Name);
break;
break;
case 'LTXD':
CreateDirectory("GWDat/ATEU/DXTL",NULL);
printf(" DXTL");
sprintf(newname,"GWDat/ATEU/DXTL/%s.ateu\0",Name);
break;
}
break;
case 'PETA':
CreateDirectory("GWDat/ATEP",NULL);
printf(" ATEP");
switch (k)
{
case '1TXD':
CreateDirectory("GWDat/ATEP/DXT1",NULL);
printf(" DXT1");
sprintf(newname,"GWDat/ATEP/DXT1/%s.atep\0",Name);
break;
case '5TXD':
CreateDirectory("GWDat/ATEP/DXT5",NULL);
printf(" DXT5");
sprintf(newname,"GWDat/ATEP/DXT5/%s.atep\0",Name);
break;
}
break;
case 'ffba':
CreateDirectory("GWDat/abff",NULL);
printf(" abff");
sprintf(newname,"GWDat/abff/%s.abff\0",Name);
break;
// FP
case 83536:
CreateDirectory("GWDat/PF",NULL);
char type[9];
for (int z=8; z<16;z++)
type[z-8] = Output[z];
type[8] = '\0';
printf(" PF %s", type);
char dirname[18];
sprintf(dirname, "GWDat/PF/%s\0", type);
if (strcmp("ABNKBKCK", type) == 0)
{
CreateDirectory(dirname, NULL);
sprintf(newname,"GWDat/PF/%s/%s.mp3\0",type, Name);
}
else
{
CreateDirectory(dirname, NULL);
sprintf(newname,"GWDat/PF/%s/%s.pf\0",type, Name);
}
break;
case 'dnsa':
CreateDirectory("GWDat/asnd",NULL);
printf(" asnd");
sprintf(newname,"GWDat/asnd/%s.asnd\0",Name);
break;
case 'srts':
CreateDirectory("GWDat/strs",NULL);
printf(" strs");
sprintf(newname,"GWDat/strs/%s.strs\0",Name);
break;
Code: Select all
if (strcmp("ASNDASND", type) == 0)
{
char oggOrNot[5];
for (int z=92; z<96;z++)
oggOrNot[z-92] = Output[z];
oggOrNot[4] = '\0';
CreateDirectory(dirname, NULL);
if (strcmp(oggOrNot, "OggS") == 0)
sprintf(newname,"GWDat/PF/%s/%s.ogg\0",type, Name);
else
sprintf(newname,"GWDat/PF/%s/%s.mp3\0",type, Name);
}