0xDE3AD1879A0315C443D04617BB1EC62C221A52956C677A2B707FB59A81F326C3
# quickbms script for extracting assets from Ash Echoes
# use it on any file in repo6 folder (old versions) or Store folder (newer versions)
# in case of problems adjust FILES count (only for old versions with "data" files)
# created by spiritovod
quickbmsver "0.11"
callfunction QUICKBMS_4GB_CHECK 1
math FILES = 11 # amount of "data" files + 1
math STOPPER = 0x10000 # should be 0x20000?
math NEW = 0
open FDSE "index_opt" 20 EXISTS
if EXISTS = 0
open FDSE "new_index" 20 EXISTS
math NEW = 1
endif
math INDEX = 20
get SIZE longlong INDEX
get INDICES longlong INDEX
get ZSIZE longlong INDEX
get CHUNK_SIZE long INDEX
get COMP short INDEX
get MAP short INDEX
if COMP = 1
comtype lz4
elif COMP = 4
comtype oodle
endif
xmath CHUNKS "SIZE / CHUNK_SIZE"
if SIZE % CHUNK_SIZE
math CHUNKS + 1
endif
for i = 0 < CHUNKS
get CHUNK_ZSIZE long INDEX
putarray 0 i CHUNK_ZSIZE
next i
savepos OFFSET INDEX
log MEMORY_FILE 0 0
append
for i = 0 < CHUNKS
getarray CHUNK_ZSIZE 0 i
clog MEMORY_FILE OFFSET CHUNK_ZSIZE CHUNK_SIZE INDEX
math OFFSET + CHUNK_ZSIZE
next i
append
math MEM = -1
math NAMES = 1
if NEW = 0
for i = 1 < FILES
xmath j "i - 1"
string FNAME p "data%03d" j
open FDSE FNAME i
next i
goto 0 MEM
string FOLDER = ""
get FSIZE asize MEM
savepos CUR_OFF MEM
for CUR_OFF = CUR_OFF < FSIZE
get CHECK byte MEM
xmath TYPE "CHECK >> 4"
xmath NAMEZ "CHECK & 0xF"
if TYPE = 0 # return to previous folder
string FOLDER r FOLDER
string FOLDER | "/"
string FOLDER r FOLDER
elif TYPE = 1 || TYPE = 2 # folder
if TYPE = 2
get NAMEZ byte MEM
endif
getdstring TMP_FOLDER NAMEZ MEM
string FOLDER p "%s/%s" FOLDER TMP_FOLDER
elif TYPE = 3 || TYPE = 4 || TYPE = 5 || TYPE = 6 # file
if TYPE = 4 || TYPE = 6
get NAMEZ byte MEM
endif
getdstring TMP_NAME NAMEZ MEM
string NAME p "%s/%s" FOLDER TMP_NAME
getdstring HASH 20 MEM
if TYPE = 5 || TYPE = 6
get OFFSET long MEM # in decompressed block
get SIZE long MEM
endif
callfunction find_extract 1
endif
savepos CUR_OFF MEM
next
else
callfunction check_size 1
goto 0 MEM
string FOLDER = "repo6"
get FSIZE asize MEM
savepos CUR_OFF MEM
for CUR_OFF = CUR_OFF < FSIZE
getdstring FOLDER1 2 MEM
getdstring HASHNAME 38 MEM
get PAD byte MEM
if WITH_SIZE = 0
callfunction get_string 1
else
savepos CUR_OFF MEM
findloc TMP binary "\x09" MEM ""
xmath NAMESZ "TMP - CUR_OFF"
getdstring NAME NAMESZ MEM
get PAD byte MEM
callfunction get_string 1
endif
string TMP_NAME = NAME
string TMP_NAME & "$"
if TMP_NAME = "$"
math IS_SINGLE = 1
else
math IS_SINGLE = 0
endif
string OPENED p "%s/%s/%s" FOLDER FOLDER1 HASHNAME
open FDSE OPENED 10
math FILE = 10
if IS_SINGLE = 1
callfunction extract_single 1
else
callfunction extract 1
endif
savepos CUR_OFF MEM
next
endif
startfunction find_extract
for i = 1 < FILES
goto 0 i
findloc HASH_OFF binary HASH i "" STOPPER
if HASH_OFF != ""
break
endif
next i
if HASH_OFF = ""
else
math FILE = i
math HASH_OFF + 20
goto HASH_OFF FILE
get CHUNK_OFF long FILE
get TSIZE long FILE
goto CHUNK_OFF FILE
if TYPE = 3 || TYPE = 4
callfunction extract 1
elif TYPE = 5 || TYPE = 6
get SINGLE_SIZE longlong FILE
get SINGLE_FLAGS longlong FILE
get SINGLE_ZSIZE longlong FILE
get SINGLE_CHUNK_SIZE long FILE
get ASSET_SIZE long FILE # in big endian
savepos TMP_OFF FILE
math OFFSET + TMP_OFF
goto OFFSET FILE
callfunction extract 1
endif
endif
endfunction
startfunction extract_single
goto -8 FILE
savepos END_OFF FILE
get INDEX_SIZE long FILE
math INDEX_SIZE + 8
goto INDEX_SIZE FILE SEEK_END
savepos OFFSET FILE
math i = 0
for OFFSET = OFFSET < END_OFF
getdstring HASH1 16 FILE
get SIZE long FILE
get ZSIZE long FILE
get NAMESZ short FILE
getdstring NAME NAMESZ FILE
get HASH2 long FILE
savepos OFFSET FILE
putarray NAMES i NAME
math i + 1
next
goto 0 FILE
get SINGLE_SIZE longlong FILE
get SINGLE_FLAGS longlong FILE
get SINGLE_ZSIZE longlong FILE
get SINGLE_CHUNK_SIZE long FILE
get ASSET_SIZE long FILE # in big endian
math FILES = i
for i = 0 < FILES
getarray NAME NAMES i
callfunction extract 1
goto OFFSET FILE
next i
endfunction
startfunction extract
get SIZE longlong FILE
get FLAGS longlong FILE
get ZSIZE longlong FILE
get CHUNK_SIZE long FILE
get COMP short FILE
get MAP short FILE
if COMP = 1
comtype lz4
elif COMP = 4
comtype oodle
endif
if COMP = 0
savepos OFFSET FILE
log NAME OFFSET SIZE FILE
else
xmath CHUNKS "SIZE / CHUNK_SIZE"
if SIZE % CHUNK_SIZE
math CHUNKS + 1
endif
for x = 0 < CHUNKS
get CHUNK_ZSIZE long FILE
putarray 0 x CHUNK_ZSIZE
next x
savepos OFFSET FILE
log NAME 0 0
append
for x = 0 < CHUNKS
getarray CHUNK_ZSIZE 0 x
if COMP = 4
goto OFFSET FILE
get CHUNK_SIZE long FILE
math OFFSET + 4
math CHUNK_ZSIZE - 4
endif
clog NAME OFFSET CHUNK_ZSIZE CHUNK_SIZE FILE
math OFFSET + CHUNK_ZSIZE
next x
append
endif
endfunction
startfunction check_size
goto 0 MEM
getdstring DUMMY 41 MEM
savepos CUR_OFF MEM
findloc TMP binary "\x0A" MEM ""
goto CUR_OFF MEM
findloc TMP1 binary "\x09" MEM ""
if TMP1 > TMP
math WITH_SIZE = 0
else
math WITH_SIZE = 1
endif
endfunction
startfunction get_string
savepos CUR_OFF MEM
findloc TMP binary "\x0A" MEM ""
if TMP = ""
xmath NAMESZ "FSIZE - CUR_OFF"
else
xmath NAMESZ "TMP - CUR_OFF"
endif
if WITH_SIZE = 0
getdstring NAME NAMESZ MEM
else
getdstring NAME1 NAMESZ MEM
endif
if TMP != ""
get PAD byte MEM
endif
endfunction
startfunction QUICKBMS_4GB_CHECK
math TMP64 = 0x10000000
math TMP64 * 16
if TMP64 == 0
print "You must use quickbms_4gb_files.exe with this script!"
cleanexit
endif
endfunction
谢谢你大哥
请问导出来的.uexp文件怎么打开?FModel好像不行?我用鸣潮拆分工具也拆不出来
am64lin_action1.zip (411.4 KB)
自行用umodel处理,那个工具又不是万能的
*** Wrong package tag (56DE5ECA) in file af08fyz/af08fyz_action1/Textures/af08fyz_action1.uasset. Probably the file is encrypted.
白荆回廊的uexp看过,你用文本编辑器打开看一下,atlas和json放在一个uexp里,思路就是把这两玩意提取出来放两个文件就行。
不会写程序,你用记事本打开,把内容复制出来也行
我用上面那个脚本解出来了 角色动态是视频格式的 不是spine
改一下格式就好了we改成png,也可以用格式工厂改

