Black Desert Online Modding Tools (3 Viewers)

suzu ( 鈴

Content Creator
3D Artist
Modder
Joined
Mar 27, 2016
i tryed modding my custom armor.
but I can't rename the texture.
.
1. pew_00_ub_0037.pac -> pew_00_ub_0037_mesh00_lod0.dae
2. import to pew_00_ub_0037_mesh00_lod0.dae.(using blender)
3. delete body mesh. and working custom armor(using custom texture. test.dds)
4. pew_00_ub_0037_mesh00_lod0.dae -> pew_00_ub_0037.pac

but texture name fixed pew_00_ub_0037.dds.

how i can use custom texture name?
You need to edit uv in the blender. You can change it by applying a texture to the edited uv.
 

latuel

Avid Affiliate
Joined
Mar 24, 2016
You need to edit uv in the blender. You can change it by applying a texture to the edited uv.

i'll make nude benesil.
but i want try don't use partcutdesc.xml.

i using base file pew_00_nude_0001_noalpha.pac

1. pew_00_nude_0001_noalpha.pac -> pew_00_nude_0001_noalpha_mesh00_lod0.dae (pac2dae with bone)
2. pew_10_ub_0006.pac -> pew_10_ub_0006_mesh00_lod0.dae (pac2dae)
3. import pew_00_nude_0001_noalpha_mesh00_lod0.dae, pew_10_ub_0006_mesh00_lod0.dae (using blender)
4. delete body mesh and set parent benesil mesh.


5. export pew_00_nude_0001_noalpha_mesh00_lod0.dae
6. pew_00_nude_0001_noalpha_mesh00_lod0.dae -> pew_00_nude_0001_noalpha.pac (dae2pac with bone)
7. rename pew_00_nude_0001_noalpha.pac -> pew_10_ub_0006.pac


but
6. pew_00_nude_0001_noalpha_mesh00_lod0.dae -> pew_00_nude_0001_noalpha.pac (dae2pac with bone)
texture name changed.



PEW_00_Contribute_0012_Upgrade_e.dds -> PEW_01_Nude_0001.dds

What went wrong?
 

Attachments

  • 001.png
    001.png
    237.3 KB · Views: 300
  • 002.png
    002.png
    223.8 KB · Views: 256

suzu ( 鈴

Content Creator
3D Artist
Modder
Joined
Mar 27, 2016
i'll make nude benesil.
but i want try don't use partcutdesc.xml.

i using base file pew_00_nude_0001_noalpha.pac

1. pew_00_nude_0001_noalpha.pac -> pew_00_nude_0001_noalpha_mesh00_lod0.dae (pac2dae with bone)
2. pew_10_ub_0006.pac -> pew_10_ub_0006_mesh00_lod0.dae (pac2dae)
3. import pew_00_nude_0001_noalpha_mesh00_lod0.dae, pew_10_ub_0006_mesh00_lod0.dae (using blender)
4. delete body mesh and set parent benesil mesh.


5. export pew_00_nude_0001_noalpha_mesh00_lod0.dae
6. pew_00_nude_0001_noalpha_mesh00_lod0.dae -> pew_00_nude_0001_noalpha.pac (dae2pac with bone)
7. rename pew_00_nude_0001_noalpha.pac -> pew_10_ub_0006.pac


but
6. pew_00_nude_0001_noalpha_mesh00_lod0.dae -> pew_00_nude_0001_noalpha.pac (dae2pac with bone)
texture name changed.



PEW_00_Contribute_0012_Upgrade_e.dds -> PEW_01_Nude_0001.dds

What went wrong?
Everything is wrong.
I think you will understand 3DCG software if you learn a little more.
 

tangerina123

Potential Patron
Joined
May 31, 2017
AuBxykK.png

Hey man i've been trying to use it on the SA version of the game without success. All i get is that none of the paz files were found in the .meta... Any ideias why? I want to simple get the xsml tables translated to pt-br..
 

BlackFireBR

Content Creator
Joined
Sep 2, 2013
AuBxykK.png

Hey man i've been trying to use it on the SA version of the game without success. All i get is that none of the paz files were found in the .meta... Any ideias why? I want to simple get the xsml tables translated to pt-br..
Parece que você copiou todos os .PAZ pra pasta "files_to_patch". Não é assim que usa a ferramenta.
Tipo, você consegue obter todos os xsml tables usando o File Extractor, filtrando por "xsml" e depois que você modificar os arquivos, bota somente esses .xsml na pasta "files_to_patch" e usa a opção "Keep Files and folders structures from the files_to_patch folder" quando for injetar (Não esquece de manter a estrutura de pastas correta dentro da pasta "files_to_patch".)

Translation:
It looks like you've copied add the the .PAZ files to the "files_to_patch" folder. This is not how you are supposed to use this tool.
You can get all the xsml tables using File Extractor, filtering by "xsml" and then after you modify the files, put only those .xsml files in the "files_to_patch" folder and use the option "Keep Files and folders structures from the files_to_patch folder" when you are injecting. (Don't forget to keep the correct folder structure inside the "files_to_patch" folder)
 

tangerina123

Potential Patron
Joined
May 31, 2017
Obrigado! Entendi o principio da coisa, eu estava misturando as funções, o meta é para injetar dentro do jogo e extractor pra extrair. Entretanto, procurei pelos formatos xlsm (que é o formato extraido das outras versões) e tive o seguinte retorno:
(Thank you! Now i understood what i was doing wrong. However, when ai search for xlsm it gives me the following:)
riwvD1u.png

Tentei então o formato que você falou xsml e tive o seguinte retorno:
(So i tried xslm extension and it gave me:)
4QqmTf4.png

Dai fui olhar na raiz do arquivo e tinha a seguinte pasta stringtable com os arquivos:
(Then i looked up on folder's root and there was a folder name stringtable with the following:)
MJ0DjdU.png


Mas somente o languagedata_original.xlsm abria e todos os outros acusavam erro:
(But only language_data.xlsm was opening and all others were giving me file formart error:)
rDtNB5f.png



Então, aloprei e mandei extrair tudo e o programa me retornou:
(Then i tried to unpack everything:)
ZyEydWO.png


Confesso, to perdido e preciso de uma luz!
(I admit, i'm totally lost on what to do next!)
 

BlackFireBR

Content Creator
Joined
Sep 2, 2013
Obrigado! Entendi o principio da coisa, eu estava misturando as funções, o meta é para injetar dentro do jogo e extractor pra extrair. Entretanto, procurei pelos formatos xlsm (que é o formato extraido das outras versões) e tive o seguinte retorno:
(Thank you! Now i understood what i was doing wrong. However, when ai search for xlsm it gives me the following:)
riwvD1u.png

Tentei então o formato que você falou xsml e tive o seguinte retorno:
(So i tried xslm extension and it gave me:)
4QqmTf4.png

Dai fui olhar na raiz do arquivo e tinha a seguinte pasta stringtable com os arquivos:
(Then i looked up on folder's root and there was a folder name stringtable with the following:)
MJ0DjdU.png


Mas somente o languagedata_original.xlsm abria e todos os outros acusavam erro:
(But only language_data.xlsm was opening and all others were giving me file formart error:)
rDtNB5f.png



Então, aloprei e mandei extrair tudo e o programa me retornou:
(Then i tried to unpack everything:)
ZyEydWO.png


Confesso, to perdido e preciso de uma luz!
(I admit, i'm totally lost on what to do next!)
Some people managed to read those "corrupted" .xlsm files by using the "Open with Repair" option in Excel. Give that a try.
To fix the "Extract all files" error, try using this older version of the blackdesert.bms file that we used to use back when the NA/KR .meta file had a section that we couldn't read and we had to skip it. Maybe for the SA version they are still using the same thing. If they are, this will work:
quickbms_script-black_desert.zip
Just extract it to your "Paz" folder
 

Vyn

Potential Patron
Joined
Jun 2, 2017
Hello. I want to make an english patch (text to english) for Black Desert SA, I read the explanation made to Tangerina123,but I am wondering If I just can extrac all the .xlsm files from the NA version and then just put them on the "files_to_patch" = inside the PAZ folder of SA?.

Thanks in advance
 

BlackFireBR

Content Creator
Joined
Sep 2, 2013
Meta Injector updated: v2.0
meta2.jpg
changelog:
  • Added the "Meta File Status" feature which tells you how many files are currently patched in your meta file.
  • Added the menu option "4 - List patched files" which shows the name of all the files that are currently patched in your meta file.
    This is an enhanced version from my Resorepless. It not only displays the results way faster but also shows the folder name, and the results are sorted by folder name, and then by file name for a better view when visually searching if a file is patched or not.
  • Fixed the option "Keep files and folders structures from the files_to_patch folder": It wasn't keeping the structure correctly.
  • Changed the way the files are copied. It's now faster for larger files.
  • Fixed tool not exiting when the option "0 - Exit" was selected.
  • Fixed tool letting "access denied" files being considerate as "successfully copied"
  • Changes the text from some error messages.
  • Changed the formatting on some error messages.
Download here: Meta Injector v.2.0
 
Last edited:

BlackFireBR

Content Creator
Joined
Sep 2, 2013
Hello. I want to make an english patch (text to english) for Black Desert SA, I read the explanation made to Tangerina123,but I am wondering If I just can extrac all the .xlsm files from the NA version and then just put them on the "files_to_patch" = inside the PAZ folder of SA?.

Thanks in advance
I was trying to do this this whole afternoon, and I didn't obtain any success. It seems that it is useless to use Meta Injector to make the game look for modified stringtables.
I extracted the string tables from NA (stringtable\en) and I renamed them one by one to make sure it matched the names from the pt version (stringtable\pt). After that I injected them using Meta Injector, and they are simply ignored and the game uses the original stringtables.
I don't know how to make this work. If anyone finds a solution, please post it.
 

buzarini

Potential Patron
Joined
Jan 17, 2017
Meta Injector updated: v2.0
Does not work. Files are copied, but not patched.
******************************************************
* *
* Meta Injector v2.0b *
* *
******************************************************
How do you want to copy the files from the "files_to_patch" folder to their original locations?

Keep files and folders structures from the "files_to_patch" folder.
-> Let the program decide where they should go. (Recommended)

Notice: This option will not work if 2 or more files have the same name (like stringtables).
Use the other option if that's your case.

ENTER - Confirm
ARROWS - Change Selected Option
BACKSPACE - Go back

Counting files...

2 files were found in files_to_patch\

0 backups were found
Скопировано файлов: 1.

A new backup was created: pad00000[2017-06-03].meta.backup

FILE : pad00000[2017-06-03].meta.backup
PAZ_COUNT : 5479
FILES_COUNT: 471879

Searching for hash: 631490897
found.

Filling File Blocks...
FILE_BLOCKS_COUNT: 471879 (0 missing files)

FILE_BLOCKS_START: 65760 (0 bytes skipped)
FILE_BLOCKS_END : 13278372 (0 bytes more than the expected)

Decrypting Folder Names...
Encrypted folder names total length: 207048

Saving Folder Names...
Folder Names saved: 4044

Decrypting File Names...
Encrypted file names total length: 10202680

Saving file names...
File Names saved: 471879 (0 less than expected)


Quick sorting File Blocks...
Done.


Searching for files in the meta file...

(1/2): languagedata_en.txt Found!
(2/2): questmon.dds Found!

Copying files from "files_to_patch\" to their right locations...
(1/2) - languagedata_en.txt Скопировано файлов: 1.
(2/2) - questmon.dds Скопировано файлов: 1.

Done

Copied: 0 of 2 files.

Warning: Some files failed to copy!


Для продолжения нажмите любую клавишу . . .


We are about to make changes to your pad00000.meta file.
Please make sure you have made a manual backup before proceeding...

Для продолжения нажмите любую клавишу . . .


Patching Meta File...
HASH FOLDER_NUM FILE_NUM BYTE_IN_META_FILE| FILE_NAME

Finished!

Those files have failed to patch:
languagedata_en.txt
questmon.dds



-------------- Overall Results --------------
Patched: 0 Not Patched: 2 Skipped: 0

Для продолжения нажмите любую клавишу . . .
 

BlackFireBR

Content Creator
Joined
Sep 2, 2013
Does not work. Files are copied, but not patched.
Searching for files in the meta file...

(1/2): languagedata_en.txt Found!
(2/2): questmon.dds Found!

Copying files from "files_to_patch\" to their right locations...
(1/2) - languagedata_en.txt Скопировано файлов: 1.
(2/2) - questmon.dds Скопировано файлов: 1.

Done

Copied: 0 of 2 files.

Warning: Some files failed to copy!


Для продолжения нажмите любую клавишу . . .

Those files have failed to patch:
languagedata_en.txt
questmon.dds



-------------- Overall Results --------------
Patched: 0 Not Patched: 2 Skipped: 0
Thanks for the feedback. It was indeed not working. I fixed it now:

v2.0c
- Fixed files successfully being copied but not being counted.
- "Searching for files in the meta file" now only shows output when something goes wrong.
- Program pauses if at least one file was "Not found" in the meta file
- The amount of files to be copied can now be different from the total files in the "file_to_patch", if some of the files were "Not found" in the meta file.
- The program now shows which files failed to copy if at least one of them failed.
- The final list of files that failed to patch has now only 1 file per line, instead of 4 (v1.9)
- The program now doesn't halt before patching the meta file, it just does.

Download: Meta Injector v2.0c
 

buzarini

Potential Patron
Joined
Jan 17, 2017
Thanks for the feedback. It was indeed not working. I fixed it now:
Again does not work. Files are successfully copied, but not patched.
******************************************************
* *
* Meta Injector v2.0c *
* *
******************************************************
How do you want to copy the files from the "files_to_patch" folder to their original locations?

Keep files and folders structures from the "files_to_patch" folder.
-> Let the program decide where they should go. (Recommended)

Notice: This option will not work if 2 or more files have the same name (like stringtables).
Use the other option if that's your case.

ENTER - Confirm
ARROWS - Change Selected Option
BACKSPACE - Go back

Counting files...

2 files were found in files_to_patch\

0 backups were found
Скопировано файлов: 1.

A new backup was created: pad00000[2017-06-03].meta.backup

FILE : pad00000[2017-06-03].meta.backup
PAZ_COUNT : 5479
FILES_COUNT: 471879

Searching for hash: 631490897
found.

Filling File Blocks...
FILE_BLOCKS_COUNT: 471879 (0 missing files)

FILE_BLOCKS_START: 65760 (0 bytes skipped)
FILE_BLOCKS_END : 13278372 (0 bytes more than the expected)

Decrypting Folder Names...
Encrypted folder names total length: 207048

Saving Folder Names...
Folder Names saved: 4044

Decrypting File Names...
Encrypted file names total length: 10202680

Saving file names...
File Names saved: 471879 (0 less than expected)


Quick sorting File Blocks...
Done.


Searching for files in the meta file...
Done.

Copying files from "files_to_patch\" to their right locations...
(1/2) - languagedata_en.txt Скопировано файлов: 1.
(2/2) - questmon.dds Скопировано файлов: 1.
Done

Copied: 0 of 2 files.

Not copied:
languagedata_en.txt
questmon.dds

Warning: Those files failed to copy.

Для продолжения нажмите любую клавишу . . .


Patching Meta File...
HASH FOLDER_NUM FILE_NUM BYTE_IN_META_FILE| FILE_NAME

Finished!

Those files have failed to patch:
languagedata_en.txt
questmon.dds



-------------- Overall Results --------------
Patched: 0 Not Patched: 2 Skipped: 0

Для продолжения нажмите любую клавишу . . .
******************************************************
* *
* Meta Injector v1.9 *
* *
******************************************************
How do you want to copy the files from the "files_to_patch" folder to their original locations?

Keep Files and folders structures from the "files_to_patch" folder.
-> Let the program decide where they should go. (Recommended)

Notice: This option will not work if 2 or more files have the same name.
Use the other option if that's your case.

ENTER - Confirm
ARROWS - Change Selected Option
BACKSPACE - Go back

Counting files...

2 files were found in files_to_patch\

0 backups were found
Скопировано файлов: 1.

A new backup was created: pad00000[2017-06-03].meta.backup

FILE : pad00000[2017-06-03].meta.backup
PAZ_COUNT : 5393
FILES_COUNT: 465812

Searching for hash: 631490897
found.

Filling File Blocks...
FILE_BLOCKS_COUNT: 465812 (0 missing files)

FILE_BLOCKS_START: 64728 (0 bytes skipped)
FILE_BLOCKS_END : 13107464 (0 bytes more than the expected)

Decrypting Folder Names...
Encrypted folder names total length: 202328

Saving Folder Names...
Folder Names saved: 3950

Decrypting File Names...
Encrypted file names total length: 10041336

Saving file names...
File Names saved: 465812 (0 less than expected)


Quick sorting File Blocks...
Done.


Searching for files in the meta file...

(1/2): languagedata_en.txt Found!
(2/2): questmon.dds Found!

Copying files from "files_to_patch\" to their right locations...
1) - languagedata_en.txt 1 file(s) copied.
2) - questmon.dds 1 file(s) copied.

Done

Copied: 2 of 2 files.


We are about to make changes to your pad00000.meta file.
Please make sure you have made a manual backup before proceeding...

Для продолжения нажмите любую клавишу . . .


Patching Meta File...
HASH FOLDER_NUM FILE_NUM BYTE_IN_META_FILE| FILE_NAME
001 - 2879AC52 D70C0000 C2760600 (04271308) | languagedata_en.txt
002 - D3024BAB DD0B0000 CEC10500 (08785636) | questmon.dds

Finished!


-------------- Overall Results --------------
Patched: 2 Not Patched: 0 Skipped: 0

All files have been patched successfully!

Для продолжения нажмите любую клавишу . . .
 
Last edited:

BlackFireBR

Content Creator
Joined
Sep 2, 2013
Again does not work. Files are successfully copied, but not patched.
******************************************************
* *
* Meta Injector v2.0c *
* *
******************************************************
How do you want to copy the files from the "files_to_patch" folder to their original locations?

Keep files and folders structures from the "files_to_patch" folder.
-> Let the program decide where they should go. (Recommended)

Notice: This option will not work if 2 or more files have the same name (like stringtables).
Use the other option if that's your case.

ENTER - Confirm
ARROWS - Change Selected Option
BACKSPACE - Go back

Counting files...

2 files were found in files_to_patch\

0 backups were found
Скопировано файлов: 1.

A new backup was created: pad00000[2017-06-03].meta.backup

FILE : pad00000[2017-06-03].meta.backup
PAZ_COUNT : 5479
FILES_COUNT: 471879

Searching for hash: 631490897
found.

Filling File Blocks...
FILE_BLOCKS_COUNT: 471879 (0 missing files)

FILE_BLOCKS_START: 65760 (0 bytes skipped)
FILE_BLOCKS_END : 13278372 (0 bytes more than the expected)

Decrypting Folder Names...
Encrypted folder names total length: 207048

Saving Folder Names...
Folder Names saved: 4044

Decrypting File Names...
Encrypted file names total length: 10202680

Saving file names...
File Names saved: 471879 (0 less than expected)


Quick sorting File Blocks...
Done.


Searching for files in the meta file...
Done.

Copying files from "files_to_patch\" to their right locations...
(1/2) - languagedata_en.txt Скопировано файлов: 1.
(2/2) - questmon.dds Скопировано файлов: 1.
Done

Copied: 0 of 2 files.

Not copied:
languagedata_en.txt
questmon.dds

Warning: Those files failed to copy.

Для продолжения нажмите любую клавишу . . .


Patching Meta File...
HASH FOLDER_NUM FILE_NUM BYTE_IN_META_FILE| FILE_NAME

Finished!

Those files have failed to patch:
languagedata_en.txt
questmon.dds



-------------- Overall Results --------------
Patched: 0 Not Patched: 2 Skipped: 0

Для продолжения нажмите любую клавишу . . .
******************************************************
* *
* Meta Injector v1.9 *
* *
******************************************************
How do you want to copy the files from the "files_to_patch" folder to their original locations?

Keep Files and folders structures from the "files_to_patch" folder.
-> Let the program decide where they should go. (Recommended)

Notice: This option will not work if 2 or more files have the same name.
Use the other option if that's your case.

ENTER - Confirm
ARROWS - Change Selected Option
BACKSPACE - Go back

Counting files...

2 files were found in files_to_patch\

0 backups were found
Скопировано файлов: 1.

A new backup was created: pad00000[2017-06-03].meta.backup

FILE : pad00000[2017-06-03].meta.backup
PAZ_COUNT : 5393
FILES_COUNT: 465812

Searching for hash: 631490897
found.

Filling File Blocks...
FILE_BLOCKS_COUNT: 465812 (0 missing files)

FILE_BLOCKS_START: 64728 (0 bytes skipped)
FILE_BLOCKS_END : 13107464 (0 bytes more than the expected)

Decrypting Folder Names...
Encrypted folder names total length: 202328

Saving Folder Names...
Folder Names saved: 3950

Decrypting File Names...
Encrypted file names total length: 10041336

Saving file names...
File Names saved: 465812 (0 less than expected)


Quick sorting File Blocks...
Done.


Searching for files in the meta file...

(1/2): languagedata_en.txt Found!
(2/2): questmon.dds Found!

Copying files from "files_to_patch\" to their right locations...
1) - languagedata_en.txt 1 file(s) copied.
2) - questmon.dds 1 file(s) copied.

Done

Copied: 2 of 2 files.


We are about to make changes to your pad00000.meta file.
Please make sure you have made a manual backup before proceeding...

Для продолжения нажмите любую клавишу . . .


Patching Meta File...
HASH FOLDER_NUM FILE_NUM BYTE_IN_META_FILE| FILE_NAME
001 - 2879AC52 D70C0000 C2760600 (04271308) | languagedata_en.txt
002 - D3024BAB DD0B0000 CEC10500 (08785636) | questmon.dds

Finished!


-------------- Overall Results --------------
Patched: 2 Not Patched: 0 Skipped: 0

All files have been patched successfully!

Для продолжения нажмите любую клавишу . . .
My bad. I was relying on the fact that the user would use the Windows in English, that's why this problem was happening to you.
I changed the verification method to simply check if the file exists after the copy and if the sizes are the same. It should work now.
Let me know if you still encounter any issue.

v2.0d
- Fixed files not being recognized as successfully copied if your windows is not in English.
- Fixed "ESC" not skipping files when asking if you want to replace them
- Now if all files fail to copy or to be found in the meta file, when the tool tries to patch the meta file, it just says "No files to patch"
- Fixed label "Not copied" showing even if all file have been successfully copied.

Download: Meta Injector v2.0d
 
Last edited:

Garkin

Avid Affiliate
Joined
Dec 28, 2016
I was trying to do this this whole afternoon, and I didn't obtain any success. It seems that it is useless to use Meta Injector to make the game look for modified stringtables.
I extracted the string tables from NA (stringtable\en) and I renamed them one by one to make sure it matched the names from the pt version (stringtable\pt). After that I injected them using Meta Injector, and they are simply ignored and the game uses the original stringtables.
I don't know how to make this work. If anyone finds a solution, please post it.
A few updates back game stopped using "stringtable/??/languagedata.xlsm" files for translated texts, now all texts are in "stringtable/??/languagedata_??.txt". I have tested that they can be replaced using your meta injector.

How to get translation files from NA/EU version:
Code:
quickbms.exe -f "*languagedata_en.txt" blackdesert.bms PAD05388.PAZ
quickbms.exe -f "*languagedata_de.txt" blackdesert.bms PAD03774.PAZ
quickbms.exe -f "*languagedata_fr.txt" blackdesert.bms PAD05389.PAZ
 
Last edited:

Garkin

Avid Affiliate
Joined
Dec 28, 2016
I have suggestion for Meta injector - many times I just don't know that there is a game update, so I'm getting "corrupted files" message. Can you add option to remove filecheck?
It's easy. Delete file "config.filecheck" and restore file "version.dat" (4 bytes text file which contains client version followed by 0x0A, client version are 1st 4 bytes in meta file).
 

BlackFireBR

Content Creator
Joined
Sep 2, 2013
I have suggestion for Meta injector - many times I just don't know that there is a game update, so I'm getting "corrupted files" message. Can you add option to remove filecheck?
It's easy. Delete file "config.filecheck" and restore file "version.dat" (4 bytes text file which contains client version followed by 0x0A, client version are 1st 4 bytes in meta file).
Done:
Meta Injector v2.0e
- Added an option to prevent launcher file re-check
- When you restore a backup, it automatically prevents the file re-check next time you open the launcher.
- Now if you get the "corrupted files detected" message when there is an update. All you have to do is "Restore a backup" and once you open the launcher again, it won't re-check all your game files this time.
Download: Meta Injector v2.0e
 

Vyn

Potential Patron
Joined
Jun 2, 2017
A few updates back game stopped using "stringtable/??/languagedata.xlsm" files for translated texts, now all texts are in "stringtable/??/languagedata_??.txt". I have tested that they can be replaced using your meta injector.

How to get translation files from NA/EU version:
Code:
quickbms.exe -f "*languagedata_en.txt" blackdesert.bms PAD05388.PAZ
quickbms.exe -f "*languagedata_de.txt" blackdesert.bms PAD03774.PAZ
quickbms.exe -f "*languagedata_fr.txt" blackdesert.bms PAD05389.PAZ


Hi. How did you find that PAD05388.PAZ is the file which contains "stingtable", can you please explain how to do it?

I can now extract the stringtable from NA or SA client by using extract by extension but I don't know from what .paz file # was obtain


Or anyone else can help with this?

Thanks
 
Last edited:

Garkin

Avid Affiliate
Joined
Dec 28, 2016
Hi. How did you find that PAD05388.PAZ is the file which contains "stingtable", can you please explain how to do it?

I can now extract the stringtable from NA or SA client by using extract by extension but I don't know from what .paz file # was obtain


Or anyone else can help with this?

Thanks
How to list content of .paz file:
Code:
quickbms.exe -l blackdesert.bms pad05388.paz
If you don't have QuickBMS or .bms script, both can be found on QuickBMS home page, google it.

But actually I did it a bit different way, I have used modified .bms script and dumped list of all game files to text file. If you are interested what did I use:
Code:
quickbms.exe -l blackdesert-commented.bms pad00000.meta > filelist.txt

Script "blackdesert-commented.bms" is modified from "simple_extraction.bms" script which you can find inside of BlackFireBR's PAZ Files Browser package:
Code:
# Black Desert (script 0.2.3) by BlackFire ***modified***
#  This is a modified version of the original script found at
#  http://aluigi.altervista.org/bms/blackdesert.bms
# For a visual guide on how the .meta and .PAZ file is sctructured, see this thread:
# https://www.undertow.club/posts/129716
# If you are using Notepad++, change the Language to "Visual Basic" to get a nice color code

quickbmsver "0.7.4"
comtype blackdesert         # Defines the compression type that will be used, when extracting a file  (used by log and clog commands)
encryption ice "\x51\xF3\x0F\x11\x04\x24\x6A\x00" # Defines the encryption type that will be used, when decrypting a file (used by log and clog commands)

get EXT extension           # gets the extension of the opened file


if EXT == "meta"            #If the file extension is .meta

    # pre-allocation, improves speed (doesn't matter if the values are bigger)
    putarray 0 0x4000  ""   # Array that is going to store the PAZs names
    putarray 1 0x2000  ""   # Array that is going to store the folder names
    putarray 2 0x80000 ""   # Array that is going to store the file names

    get VERSION long        # Reads the first 4 bytes (long) of the meta file and stores it in the variable VERSION. # In C: fread(&VERSION,sizeof(long),1,metaFile);
    print "Client Version: %VERSION%"
    get pPAZCount long      # Reads how many PAZ files your game has. # In C: fread(&pPAZCount,sizeof(long),1,metaFile);
    print "pPAZCount: %pPAZCount%"

    # Paz files informations
    for i = 0 < pPAZCount
        get PAZ_NUM long
        get HASH long
        get PAZ_SIZE long

        string PAZ_NAME p= "PAD%05d.PAZ" PAZ_NUM        # Using the number stored in PAZ_NUM with 5 digits,creates a string that will hold the complete .PAZ file name (E.g.:PAD00001.PAZ) # In C: sprintf(paz_name,"PAD%.5d.PAZ",paz_num);
        putarray 0 PAZ_NUM PAZ_NAME                     # Stores in the array 0 in the position [PAZ_NUM], the string we just created # In C: array0[paz_num] = paz_name;
    next i

    get FILES_COUNT long                                # Reads how many files your game has. # In C: fread(&files_count,sizeof(long),1,metaFile)
    print "FILES_COUNT: %FILES_COUNT%"

    math FILE_BLOCKS_COUNT = FILES_COUNT
    print "FILE_BLOCKS_COUNT: %FILE_BLOCKS_COUNT%"

    savepos FILE_BLOCKS_START                           # Saves the current position in the file in a variable. This position is the beginning of the blocks that have the following format: HASH|FOLDER_NUM|FILE_NUM|PAZ_NUM|OFFSET|ZSIZE|SIZE # # In C: long file_blocks_start = ftell(metafile);
    print "FILE_BLOCKS_START: %FILE_BLOCKS_START%"

    savepos CURRENT_POS                                 # This position should be 28 bytes after the end of the fileblocks, because it read a whole file block before the while checked if it was valid

    xmath FILE_BLOCKS_END "FILE_BLOCKS_START + (FILE_BLOCKS_COUNT * 28)"  # Calculates the position where the file blocks ends #
    print "FILE_BLOCKS_END: %FILE_BLOCKS_END%"

    goto FILE_BLOCKS_END

    get FOLDER_NAMES_TOTAL_LENGTH long                  # Gets the total length of the strings that are comming next, that are the folder names strings # In C: fread(&folder_names_total_length,sizeof(long),1,metaFile);
    print "FOLDER_NAMES_TOTAL_LENGTH: %FOLDER_NAMES_TOTAL_LENGTH%"

    savepos FOLDER_NAMES_START                          # Saves the position where the folder names strings start # In C: long folder_names_start = ftell(fp);
    print "FOLDER_NAMES_START: %FOLDER_NAMES_START%"

    log MEMORY_FILE FOLDER_NAMES_START FOLDER_NAMES_TOTAL_LENGTH    # Saves all the next "FOLDER_NAMES_TOTAL_LENGTH" bytes, starting from the offset "FOLDER_NAMES_START" in a temporary memory called MEMORY_FILE # In C: fread(memory_file,1,folder_names_total_length,metaFile);

    xmath FOLDER_NAMES_END "FOLDER_NAMES_START + FOLDER_NAMES_TOTAL_LENGTH"     # Calculates which byte the folder names strings end # In C: long folder_names_end = folder_names_start + folders_name_total_length;
    print "FOLDER_NAMES_END: %FOLDER_NAMES_END%"

    goto FOLDER_NAMES_END                                                       # Goes to that position # In C: fseek(metaFile,folder_names_end,SEEK_SET);

    get FILE_NAMES_TOTAL_LENGTH long                    # Gets the total length of the strings that are comming next, that are the file names strings # In C: fread(&file_names_total_length,sizeof(long),1,metaFile);
    print "FILE_NAMES_TOTAL_LENGTH: %FILE_NAMES_TOTAL_LENGTH%"

    savepos FILE_NAMES_START                            # Saves the position where the file names strings start # In C: long file_names_start = ftell(fp);
    print "FILE_NAMES_START: %FILE_NAMES_START%"

    log MEMORY_FILE2 FILE_NAMES_START FILE_NAMES_TOTAL_LENGTH   # Saves all the next "FILE_NAMES_TOTAL_LENGTH" bytes, starting from the offset "FILE_NAMES_START" in a temporary memory called MEMORY_FILE2 # In C: fread(memory_file2,1,file_names_total_length,metaFile);

    math FOLDER_NAMES_TOTAL_LENGTH -= 8                 # Don't know why, but it ignores the last 8 bytes of the folder names string (2 irrelevent longs, maybe?)

    # Reads the string which has all the folder names, assigning each folder name to a different position in the array 1 (folders array)
    print "Collecting folder names..."
    math i = 0
    for TMP = 0 < FOLDER_NAMES_TOTAL_LENGTH
        get INDEX_NUM long MEMORY_FILE          # Reads from the MEMORY_FILE the the index number of the current folder
        get SUB_FOLDERS long MEMORY_FILE        # Reads from the MEMORY_FILE the number of subfolder of the current folder
        get FOLDER_NAME string MEMORY_FILE      # Reads from the MEMORY_FILE a folder name, as string, until a '\0' is found. E.g: "character/"

        if FOLDER_NAME == ""                    # If no name was read, means that we reached the end of the folder names
            break
        endif

        putarray 1 i FOLDER_NAME                # Stores the folder name, in the position i of the array 1 (folders array) # In C: array1[i] = folder_name;

        savepos TMP MEMORY_FILE
    next i

    print "Collecting file names..."
    math i = 0
    # Reads the string which has all the file names, assigning each file name to a different position in the array 2 (files array)
    for TMP = 0 < FILE_NAMES_TOTAL_LENGTH

        get FILE_NAME string MEMORY_FILE2       # Reads from the MEMORY_FILE a file name, as string, until a '\0' is found.

        if FILE_NAME == ""                      # If no name was read, means that we reached the end of the file names
            break
        endif

        putarray 2 i FILE_NAME                  # Stores the folder name, in the position i of the array 1 (folders array) # In C: array1[i] = file_name;
        savepos TMP MEMORY_FILE2
    next i



    # Now we are going to extract the files, combining the information we find in the file blocks, with the arrays filled with the file and folder names
    goto FILE_BLOCKS_START          # Goes back to the beginning of the file blocks
    for i = 0 < FILE_BLOCKS_COUNT   # For all file blocks
        get HASH long               # The unique indentifier of this file
        get FOLDER_NUM long         # The index in the array 1 (folders array) which has the folder name from this file
        get FILE_NUM long           # The index in the array 2 (files array) which has the file name from this file
        get PAZ_NUM long            # The number of the .PAZ file that the file is located
        get OFFSET long             # The offset inside the .PAZ file specified which the file starts
        get ZSIZE long              # The compressed size of the file
        get SIZE long               # The uncompressed size of the file

        getarray PAZ_NAME 0 PAZ_NUM         # Gets the PAZ name at the position [PAZ_NUM] of the array 0 (PAZ names array) and stores is in the PAZ_NAME variable           # In C: paz_name    = array0[paz_num];
        getarray FOLDER_NAME 1 FOLDER_NUM   # Gets the folder name at the position [FOLDER_NUM] of the array 1 (folders array) and stores is in the FOLDER_NAME variable    # In C: folder_name = array1[paz_num];
        getarray FILE_NAME 2 FILE_NUM       # Gets the file name at the position [FILE_NUM] of the array 1 (folders array) and stores is in the FILE_NAME variable          # In C: file_name   = array2[paz_num];
        string FILE_PATH = FOLDER_NAME
        string FILE_PATH += FILE_NAME       # Creates a string and concatenates folder name with the file name strings, so we get the full path to the file. Eg: "character/multiplemodeldesc.xml"

        open FDSE PAZ_NAME 1        # Open the .PAZ file specified in the PAZ_NAME variable

        print "\n[FOLDER NAME]: %FOLDER_NAME%\n[ FILE_NAME ]: %FILE_NAME%\n  HASH   |FOLDER_NUM|FILE_NUM|PAZ_NUM| OFFSET|ZSIZE|SIZE\n%HASH%|   %FOLDER_NUM%   | %FILE_NUM% |  %PAZ_NUM% |%OFFSET%|%ZSIZE%|%SIZE%"

        # If uncompressed size is greater than compressed size, it means that the file is compressed, so we use "clog" which uncompresses and extracts the file
        if SIZE > ZSIZE
            # Uncompress and extracts the file and saves it just like is specified in "FILE_PATH", OFFSET is what byte of the .PAZ file the file starts, ZSIZE is the compressed size and SIZE is the uncompressed size, this uses the compression algothithm defined with the "comtype" command
            clog FILE_PATH OFFSET ZSIZE SIZE 1
        else  # If uncompressed size is lesser or equal than compressed size, it means that the file is NOT compressed, so we use "log" which just extracts the file NOTE: It seems that all files are compressed and this is used just to prevent crashes
            # Simply extracts the file and saves it just like is specified in "FILE_PATH", OFFSET is what byte of the .PAZ file the file start and SIZE is the file size
            log FILE_PATH OFFSET ZSIZE 1
        endif

        print ""
        xmath PERCENTAGE "i*100/FILE_BLOCKS_COUNT"
        print "Files Extracted: %i%/%FILE_BLOCKS_COUNT% (%PERCENTAGE% Percent Completed)"
    next i


else if EXT == "PAZ"  #If the file extension is .PAZ

    get DUMMY long          # Reads the first 4 bytes (long) of the meta file and stores it in the variable DUMMY. # In C: fread(&dummy,sizeof(long),1,metaFile);
    get TOTAL_FILES long    # Reads how many files this .PAZ file has. # In C: fread(&paz_files,sizeof(long),1,metaFile);
    get FILE_PATHS_TOTAL_LENGTH long    # Gets the total length of the strings that are the folder names and file names like this "character/multiplemodeldesc.xml"

    savepos FILE_BLOCKS_START   # Saves the current file's position, which is where the file blocks start # In C: long file_paths_start = ftell(file);
    xmath FILE_BLOCKS_END "FILE_BLOCKS_START + (TOTAL_FILES * 4 * 6)"   # Calculates the position where the file blocks end and it's where the file paths start
    log MEMORY_FILE FILE_BLOCKS_END FILE_PATHS_TOTAL_LENGTH             # Starting for the offset where the file blocks end, it reads the next "FILE_PATHS_TOTAL_LENGTH" bytes and stores them in the MEMORY_FILE file # In C: fread(MEMORY_FILE,1,FILE_PATHS_TOTAL_LENGTH,file);

    # Reads the bytes which has all the file paths, assigning each folder name to a different position in the array 0
    math i = 0
    for TMP = 0 < FILE_PATHS_TOTAL_LENGTH
        get FILE_PATH string MEMORY_FILE  # Reads from the MEMORY_FILE a file path, as string, until a '\0' is found. E.g: "character/"

        if FILE_PATH == ""  # If nothing was read, means that we reached the end of the file paths
            break
        endif

        putarray 0 i FILE_PATH  # Stores the folder name, in the position i of the array 0  # In C: array0[i] = file_path;
        savepos TMP MEMORY_FILE
    next i

    for i = 0 < TOTAL_FILES
        get HASH long         # The unique indentifier of this file
        get FOLDER_NUM long   # The index in the array 0  which has the folder name from this file
        get FILE_NUM long     # The index in the array 0  which has the file name from this file
        get OFFSET long       # The offset inside the .PAZ file specified which the file starts
        get ZSIZE long        # The compressed size of the file
        get SIZE long         # The uncompressed size of the file

        getarray FOLDER_NAME 0 FOLDER_NUM   # Gets the folder name at the position [FOLDER_NUM] of the array 1 (folders array) and stores is in the FOLDER_NAME variable    # In C: folder_name = array1[paz_num];
        getarray FILE_NAME 0 FILE_NUM       # Gets the file name at the position [FILE_NUM] of the array 1 (folders array) and stores is in the FILE_NAME variable          # In C: file_name   = array2[paz_num];
        string FILE_PATH = FOLDER_NAME
        string FILE_PATH += FILE_NAME       # Creates a string and concatenates folder name with the file name strings, so we get the full path to the file. Eg: "character/multiplemodeldesc.xml"

        print "\n[FOLDER NAME]: %FOLDER_NAME%\n[ FILE_NAME ]: %FILE_NAME%\n  HASH   |FOLDER_NUM|FILE_NUM| OFFSET|ZSIZE|SIZE\n%HASH%|   %FOLDER_NUM%   | %FILE_NUM% |%OFFSET%|%ZSIZE%|%SIZE%"

        # If uncompressed size is greater than compressed size, it means that the file is compressed, so we use "clog" which uncompresses and extracts the file
        if SIZE > ZSIZE
        # Uncompress and extracts the file and saves it just like is specified in "FILE_PATH", OFFSET is what byte of the .PAZ file the file starts, ZSIZE is the compressed size and SIZE is the uncompressed size, this uses the compression algothithm defined with the "comtype" command
            clog FILE_PATH OFFSET ZSIZE SIZE
        else  # If uncompressed size is lesser or equal than compressed size, it means that the file is NOT compressed, so we use "log" which just extracts the file NOTE: It seems that all files are compressed and this is used just to prevent crashes
            # Simply extracts the file and saves it just like is specified in "FILE_PATH", OFFSET is what byte of the .PAZ file the file start and SIZE is the file size
            log FILE_PATH OFFSET ZSIZE
        endif

    next i
endif

A few lines from filelist.txt which shows that "stringtable/en/languagedata_en.txt" is inside of pad05388.paz (PAZ_NUM = 5388):
Code:
[FOLDER NAME]: stringtable/en/
[ FILE_NAME ]: languagedata_en.txt
  HASH   |FOLDER_NUM|FILE_NUM|PAZ_NUM| OFFSET|ZSIZE|SIZE
1387034920|   3335   | 427561 |  5388 |76|12732320|66733584
  0000004c 66733584   stringtable/en/languagedata_en.txt
Files Extracted: 152207/471879 (32 Percent Completed)
 
Last edited:

Users who are viewing this thread

Top


Are you 18 or older?

This website requires you to be 18 years of age or older. Please verify your age to view the content, or click Exit to leave.