Jump to content

Diablo Immortal Models/Textures/ID's


Recommended Posts

Does anyone have an up-to-date way of getting textures and models from Diablo Immortal? 

I know you can use Casc-Explorer to download resources.mpk's and extract those to get .mesh files
Then use the .MESH to .OBJ tool to convert them to .OBJ's

My problem is that when extracting all those mpks every file is just named "file", does anyone know of way of finding out file names so I can see that "Iron helmet = resources35.mpk>file_023" or something. Also, textures. Where can I get textures?

The only alternative I have is using the WOWhead model viewer, but it's very outdated and missing metal/rough textures and a lot of models from newer seasons I'm looking for.

Last question (just wanted to ask everything while I can) is there a way to get the skeletons/armatures of the models too? I noticed that WOWheads model viewer loads something called a ".skinskeleton" but I haven't found any information on it.

Thank you <3333

Link to comment
Share on other sites

There is many steps to get texture you want. 
First need to unpack mpk. You can find python script MPK extractor or DIDT tool. (Skeletons and skin skeletons will be there, if I'm not wrong.)
After that unpack files (they are compressed with lz4, except textures. The packed with lz4 on some mip levels.)
Then find the texture file. It may contain from 1 to 9 sub texture inside of it. Somewhere was binary templates that may help you. (010 editor).
Each level packed by BC7 algorithm not all but most of them.

image.png.c32b9f6f7e42a53d2e4c8b6ac584c788.pngimage.png.6f950706485879f87ff4a6f0a58b44c7.pngimage.png.2f59d88c716b526613b5c6d7cbc8ff6c.pngimage.thumb.png.12a256ca9620e564f22c582a830996f3.png

Link to comment
Share on other sites

4 hours ago, Denizantip said:

There is many steps to get texture you want. 
First need to unpack mpk. You can find python script MPK extractor or DIDT tool. (Skeletons and skin skeletons will be there, if I'm not wrong.)
After that unpack files (they are compressed with lz4, except textures. The packed with lz4 on some mip levels.)
Then find the texture file. It may contain from 1 to 9 sub texture inside of it. Somewhere was binary templates that may help you. (010 editor).
Each level packed by BC7 algorithm not all but most of them.

image.png.c32b9f6f7e42a53d2e4c8b6ac584c788.pngimage.png.6f950706485879f87ff4a6f0a58b44c7.pngimage.png.2f59d88c716b526613b5c6d7cbc8ff6c.pngimage.thumb.png.12a256ca9620e564f22c582a830996f3.png

Oh wow thank you so much! Do you know where I can get the tools for doing this? That's interesting that the textures are all in one thing lol. What if you're looking for a specific characters textures since everythings unsorted?

Link to comment
Share on other sites

I have found tools for Diablo 2 Resurrected/3/4 but for immortal only information about how the resources was packed. As I understood it was made by outsourcing studio. So I had to parse all that files by myself. 

Link to comment
Share on other sites

  • 2 weeks later...
On 2024/5/5 at AM10点54分, INCLABLOCKA said:

哦哇非常感谢你!你知道我在哪里可以获得执行此操作的工具吗?有趣的是,纹理都是一件事,哈哈。如果您正在寻找特定的角色纹理,因为一切都未排序怎么办?

You can use this bms script to convert .4 or .0 or .1 texture files into a universal texture format. Logically speaking, it should be suitable for Diablo. This script comes from the bms official website

By the way, does anyone have any ideas on opening .anim and .skeleton? It seems that they are not the final files.

 

# quickbms script for converting texture files from games using Messiah engine into common formats (biggest mip only)

# created by spiritovod

get NAME filename

 

# ASTC format

set MEMORY_FILE binary "\x13\xAB\xA1\x5C\x00\x00\x01\x00\x00\x00\x00\x00\x00\x01\x00\x00"

 

# DXT formats

set MEMORY_FILE2 binary "\x44\x44\x53\x20\x7C\x00\x00\x00\x07\x10\x0A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x05\x00\x00\x00\x44\x58\x54\x31\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"

 

# BC7 format

set MEMORY_FILE3 binary "\x44\x44\x53\x20\x7C\x00\x00\x00\x07\x10\x0A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x04\x00\x00\x00\x44\x58\x31\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00"

 

# PVR format (ETC1 / ETC2)

set MEMORY_FILE4 binary "\x50\x56\x52\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x08\x00\x00\x00\x08\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x0F\x00\x00\x00\x50\x56\x52\x03\x03\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00"

 

idstring "\x02\x02\x02"

get VER short

get FORMAT byte

get MIPS byte

get UNK3 byte

get UNK4 long

get WIDTH short

get HEIGHT short

 

goto 0x28

for i = 1 <= MIPS

get MSIZE long

get MWIDTH short

get MHEIGHT short

get UNK5 long

get SIZE long

getdstring TYPE 4

savepos OFFSET

if i = MIPS

callfunction extract 1

endif

if TYPE = "NNNN"

math OFFSET + SIZE

elif TYPE = "ZZZ4" || TYPE = "LZMA"

get SIZE long

xmath OFFSET "OFFSET + MSIZE - 20"

endif

goto OFFSET

next i

 

startfunction extract

string INTYPE = ""

if TYPE = "ZZZ4" || TYPE = "LZMA"

get SIZE long

math MSIZE - 24

math OFFSET + 4

if TYPE = "ZZZ4"

comtype lz4

elif TYPE = "LZMA"

comtype lzma

endif

elif TYPE = "NNNN"

getdstring INTYPE 4

if INTYPE = "RIFF"

math MSIZE - 20

math SIZE = MSIZE

else

math MSIZE = SIZE

endif

comtype copy

endif

if FORMAT = 0x12 || FORMAT = 0x14 # DXT1, DTX5

putvarchr MEMORY_FILE2 0xC HEIGHT long

putvarchr MEMORY_FILE2 0x10 WIDTH long

if FORMAT = 0x14

putVarChr MEMORY_FILE2 0x57 0x35

endif

elif FORMAT = 0x03 || FORMAT = 0x19 # RGBA, BC7

putvarchr MEMORY_FILE3 0xC HEIGHT long

putvarchr MEMORY_FILE3 0x10 WIDTH long

if FORMAT = 0x03

putvarchr MEMORY_FILE3 0x80 0x1C

endif

elif FORMAT >= 0x24 && FORMAT <= 0x31

putvarchr MEMORY_FILE 7 WIDTH threebyte

putvarchr MEMORY_FILE 10 HEIGHT threebyte

if FORMAT = 0x24 # 36, ASTC 4x4

putvarchr MEMORY_FILE 4 4

putvarchr MEMORY_FILE 5 4

elif FORMAT = 0x26 # 38, ASTC 5x5

putvarchr MEMORY_FILE 4 5

putvarchr MEMORY_FILE 5 5

elif FORMAT = 0x28 # 40, ASTC 6x6

putvarchr MEMORY_FILE 4 6

putvarchr MEMORY_FILE 5 6

elif FORMAT = 0x2A # 42, ASTC 8x6

putvarchr MEMORY_FILE 4 8

putvarchr MEMORY_FILE 5 6

elif FORMAT = 0x2B # 43, ASTC 8x8

putvarchr MEMORY_FILE 4 8

putvarchr MEMORY_FILE 5 8

elif FORMAT = 0x2E || FORMAT = 0x2F # 46/47, ASTC 10x10

putvarchr MEMORY_FILE 4 10

putvarchr MEMORY_FILE 5 10

elif FORMAT = 0x31 # 49, ASTC 12x12

putvarchr MEMORY_FILE 4 12

putvarchr MEMORY_FILE 5 12

else

continue exit_here

endif

elif FORMAT = 0x1F || FORMAT == 0x20

putvarchr MEMORY_FILE4 0x18 HEIGHT long

putvarchr MEMORY_FILE4 0x1C WIDTH long

if FORMAT = 0x1F # ETC

math TEX_TYPE = 0x6

elif FORMAT = 0x20 # ETC2 RGBA

math TEX_TYPE = 0x17

endif

putvarchr MEMORY_FILE4 8 TEX_TYPE byte

else

continue exit_here

endif

 

if INTYPE = "RIFF"

string NAME + ".webp"

clog NAME OFFSET MSIZE SIZE

cleanexit

endif

append

if FORMAT = 0x12 || FORMAT = 0x14

clog MEMORY_FILE2 OFFSET MSIZE SIZE

math MEM = -2

string NAME + ".dds"

elif FORMAT = 0x03 || FORMAT = 0x19

clog MEMORY_FILE3 OFFSET MSIZE SIZE

math MEM = -3

string NAME + ".dds"

elif FORMAT = 0x1F || FORMAT = 0x20

clog MEMORY_FILE4 OFFSET MSIZE SIZE

math MEM = -4

string NAME + ".pvr"

else

clog MEMORY_FILE OFFSET MSIZE SIZE

math MEM = -1

string NAME + ".astc"

endif

append

get FSIZE asize MEM

log NAME 0 FSIZE MEM

cleanexit

endfunction

 

exit_here: 

print "This format is not supported! Add it to definitions first."

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...