Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
M
MDPro3
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Locked Files
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Security & Compliance
Security & Compliance
Dependency List
License Compliance
Packages
Packages
List
Container Registry
Analytics
Analytics
CI / CD
Code Review
Insights
Issues
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Ricky
MDPro3
Commits
f2e0e37c
Commit
f2e0e37c
authored
May 24, 2024
by
SherryChaos
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
update AssetBundleRobber
parent
df5d1e67
Changes
2
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
256 additions
and
124 deletions
+256
-124
Assets/Addressables/Text/UpdateContent.txt
Assets/Addressables/Text/UpdateContent.txt
+5
-0
Assets/Scripts/Tools/AssetBundleRobber.cs
Assets/Scripts/Tools/AssetBundleRobber.cs
+251
-124
No files found.
Assets/Addressables/Text/UpdateContent.txt
View file @
f2e0e37c
MDPro3 v1.1.1更新:
1.同步YGOPro,支持组队决斗投降。
2.修复上版本中,部分新卡在本地模式下无法发动效果的错误。
3.修复上版本中,编辑卡组模式下,卡图加载过程中退出卡组编辑模式,导致游戏不能继续读取卡图的错误。
MDPro3 v1.1.0更新:
0.本次更新安卓端需要卸载老版本才能进行安装。安卓端的首选图形API改为Vulkan。
...
...
Assets/Scripts/Tools/AssetBundleRobber.cs
View file @
f2e0e37c
using
AssetStudio
;
using
System
;
using
System.Collections
;
using
System.Collections.Generic
;
using
System.IO
;
...
...
@@ -9,6 +7,8 @@ using UnityEngine;
using
UnityEngine.UI
;
using
AssetsTools.NET
;
using
AssetsTools.NET.Extra
;
using
System.Threading
;
using
System.Collections.Concurrent
;
public
class
AssetBundleRobber
:
MonoBehaviour
{
...
...
@@ -18,14 +18,21 @@ public class AssetBundleRobber : MonoBehaviour
string
masterDuelWindowsAssetBundlePath
=
"../../../Game/Steam/steamapps/common/Yu-Gi-Oh! Master Duel/LocalData/16165626/0000/"
;
string
masterDuelAndroidAssetBundlePath
=
"../../../Game/Steam/steamapps/common/Yu-Gi-Oh! Master Duel/LocalData/Android/0000/"
;
string
workingPlace
;
string
androindWorkingPlace
=
"Android/Robber/"
;
string
windowsWorkingPlace
=
"StandaloneWindows64/Robber/"
;
string
ydkIdsPath
=
"Data/YdkIds.txt"
;
public
static
int
fileCount
;
public
static
int
currentFileCount
;
public
static
Dictionary
<
string
,
string
>
ydkIds
=
new
Dictionary
<
string
,
string
>();
readonly
object
_lock
=
new
object
();
bool
noSave
=
false
;
ConcurrentQueue
<
string
>
logQueue
=
new
ConcurrentQueue
<
string
>();
int
count
=
0
;
AssetStudio
.
AssetsManager
assetManager
;
bool
fullCopy
;
string
androindWorkingPlace
=
"Android/Robber/"
;
string
windowsWorkingPlace
=
"StandaloneWindows64/Robber/"
;
string
ydkIdsPath
=
"Data/YdkIds.txt"
;
int
threads
=
32
;
public
struct
AssetbundleInfo
{
public
string
path
;
...
...
@@ -43,6 +50,7 @@ public class AssetBundleRobber : MonoBehaviour
void
Start
()
{
sText
=
text
;
assetManager
=
GetComponent
<
AssetStudio
.
AssetsManager
>();
Application
.
targetFrameRate
=
0
;
...
...
@@ -56,14 +64,11 @@ public class AssetBundleRobber : MonoBehaviour
Initialize
();
StartCoroutine
(
RefreshFileResources
());
//StartCoroutine(RefreshFileResources());
Copy
(
"5c49851c"
);
}
void
Copy
(
string
path
)
{
foreach
(
var
file
in
files
)
...
...
@@ -83,8 +88,6 @@ public class AssetBundleRobber : MonoBehaviour
Debug
.
Log
(
path
+
": Copy Done!"
);
}
bool
noSave
=
false
;
void
Initialize
()
{
if
(!
Directory
.
Exists
(
workingPlace
))
...
...
@@ -120,11 +123,12 @@ public class AssetBundleRobber : MonoBehaviour
}
if
(!
noSave
)
{
Debug
.
Log
(
"加载文件数量:"
+
files
.
Count
);
text
.
text
=
"Load FileList Complete."
;
Debug
.
Log
(
"Preloged:"
+
files
.
Count
);
}
else
text
.
text
=
"No FileList to load."
;
{
Debug
.
Log
(
"No FileList to load."
);
}
fullText
=
File
.
ReadAllText
(
ydkIdsPath
);
lines
=
fullText
.
Replace
(
"\r"
,
""
).
Split
(
'\n'
);
foreach
(
var
line
in
lines
)
...
...
@@ -135,59 +139,152 @@ public class AssetBundleRobber : MonoBehaviour
}
}
IEnumerator
RefreshFileResources
()
{
var
assetManager
=
GetComponent
<
AssetStudio
.
AssetsManager
>();
var
ie
=
assetManager
.
LoadFolderAsync
(
masterDuelAssetBundlePath
);
StartCoroutine
(
ie
);
while
(
ie
.
MoveNext
())
yield
return
null
;
bool
modified
=
false
;
int
count
=
0
;
foreach
(
var
file
in
assetManager
.
assetsFileList
)
void
AddLog
(
int
i
)
{
var
file
=
assetManager
.
assetsFileList
[
i
];
count
++;
string
filePath
=
file
.
originalPath
.
Substring
(
file
.
originalPath
.
Length
-
8
);
string
fileName
=
""
;
foreach
(
var
obj
in
file
.
Objects
)
if
(
obj
is
AssetStudio
.
AssetBundle
assetBundle
)
foreach
(
var
pair
in
assetBundle
.
m_Container
)
{
fileName
=
pair
.
Key
;
text
.
text
=
count
+
"/ "
+
assetManager
.
assetsFileList
.
Count
+
": "
+
fileName
;
yield
return
null
;
break
;
}
bool
contained
=
false
;
foreach
(
var
f
in
files
)
if
(
f
.
path
==
filePath
)
{
contained
=
true
;
break
;
}
if
(!
contained
)
{
modified
=
true
;
var
filestruct
=
new
AssetbundleInfo
();
filestruct
.
path
=
filePath
;
filestruct
.
name
=
fileName
;
filestruct
.
dependencies
=
GetDependencies
(
filePath
);
lock
(
_lock
)
{
files
.
Add
(
filestruct
);
newFiles
.
Add
(
filestruct
);
//text.text = "GetDependencies: " + count + "/" + assetManager.assetsFileList.Count;
}
var
content
=
string
.
Empty
;
content
+=
filestruct
.
path
+
"\r\n"
;
content
+=
"-"
+
filestruct
.
name
+
"\r\n"
;
foreach
(
var
depend
in
filestruct
.
dependencies
)
content
+=
"--"
+
depend
+
"\r\n"
;
File
.
AppendAllText
(
workingPlace
+
"FileList.txt"
,
content
);
logQueue
.
Enqueue
(
content
);
}
IEnumerator
RefreshFileResources
()
{
var
ie
=
assetManager
.
LoadFolderAsync
(
masterDuelAssetBundlePath
);
StartCoroutine
(
ie
);
while
(
ie
.
MoveNext
())
yield
return
null
;
Debug
.
Log
(
"new files: "
+
assetManager
.
assetsFileList
.
Count
);
indexQueue
=
new
ConcurrentQueue
<
int
>();
workerThreads
=
new
List
<
Thread
>
{
};
isProcessing
=
true
;
for
(
int
i
=
0
;
i
<
threads
;
i
++)
{
Thread
workerThread
=
new
Thread
(
ProcessLogs
);
workerThreads
.
Add
(
workerThread
);
workerThread
.
Start
();
}
ie
=
EnqueueLogs
(
assetManager
.
assetsFileList
.
Count
);
while
(
ie
.
MoveNext
())
{
text
.
text
=
"Logging: "
+
count
+
"/"
+
assetManager
.
assetsFileList
.
Count
;
if
(
logQueue
.
TryDequeue
(
out
var
log
))
File
.
AppendAllText
(
workingPlace
+
"FileList.txt"
,
log
);
yield
return
null
;
}
while
(
logQueue
.
TryDequeue
(
out
var
log
))
{
File
.
AppendAllText
(
workingPlace
+
"FileList.txt"
,
log
);
text
.
text
=
"Writing Left: "
+
logQueue
.
Count
;
yield
return
null
;
}
StartCoroutine
(
CopyBundles
());
}
private
ConcurrentQueue
<
int
>
indexQueue
;
private
List
<
Thread
>
workerThreads
;
private
bool
isProcessing
;
public
void
StopProcessingLogs
()
{
isProcessing
=
false
;
foreach
(
Thread
workerThread
in
workerThreads
)
{
workerThread
.
Join
();
}
workerThreads
.
Clear
();
}
private
IEnumerator
EnqueueLogs
(
int
count
)
{
int
processedIndexCount
=
0
;
int
indexesPerFrame
=
32
;
for
(
int
i
=
0
;
i
<
count
;
i
++)
{
indexQueue
.
Enqueue
(
i
);
processedIndexCount
++;
if
(
processedIndexCount
>=
indexesPerFrame
)
{
processedIndexCount
=
0
;
yield
return
null
;
}
}
while
(!
indexQueue
.
IsEmpty
)
{
yield
return
null
;
}
StopProcessingLogs
();
}
private
void
ProcessLogs
()
{
while
(
isProcessing
)
{
if
(
indexQueue
.
TryDequeue
(
out
int
index
))
{
AddLog
(
index
);
}
else
{
Thread
.
Sleep
(
10
);
}
}
}
public
void
OnApplicationQuit
()
{
StopProcessingLogs
();
}
IEnumerator
CopyBundles
()
{
fileCount
=
files
.
Count
;
...
...
@@ -263,16 +360,7 @@ public class AssetBundleRobber : MonoBehaviour
if
(!
Directory
.
Exists
(
targetFolder
))
Directory
.
CreateDirectory
(
targetFolder
);
File
.
Copy
(
GetFullPath
(
file
.
path
),
targetFolder
+
"/"
+
subDir
);
List
<
string
>
depens
=
new
List
<
string
>();
try
{
depens
=
GetDependencies
(
file
.
path
);
}
catch
(
Exception
e
)
{
Debug
.
Log
(
file
.
path
);
Debug
.
LogException
(
e
);
}
var
depens
=
new
List
<
string
>(
file
.
dependencies
);
foreach
(
string
depen
in
depens
)
{
if
(
File
.
Exists
(
GetFullPath
(
depen
)))
...
...
@@ -289,17 +377,11 @@ public class AssetBundleRobber : MonoBehaviour
var
targetFolder
=
workingPlace
+
"Background/"
+
subDir
;
if
(!
Directory
.
Exists
(
targetFolder
))
Directory
.
CreateDirectory
(
targetFolder
);
if
(!
File
.
Exists
(
targetFolder
+
"/"
+
subDir
))
File
.
Copy
(
GetFullPath
(
file
.
path
),
targetFolder
+
"/"
+
subDir
);
List
<
string
>
depens
=
new
List
<
string
>();
try
{
depens
=
GetDependencies
(
file
.
path
);
}
catch
(
Exception
e
)
{
Debug
.
Log
(
file
.
path
);
Debug
.
LogException
(
e
);
}
else
File
.
Copy
(
GetFullPath
(
file
.
path
),
targetFolder
+
"/"
+
subDir
+
"---------"
);
var
depens
=
new
List
<
string
>(
file
.
dependencies
);
foreach
(
string
depen
in
depens
)
{
if
(
File
.
Exists
(
GetFullPath
(
depen
)))
...
...
@@ -322,16 +404,7 @@ public class AssetBundleRobber : MonoBehaviour
if
(!
Directory
.
Exists
(
targetFolder
))
Directory
.
CreateDirectory
(
targetFolder
);
File
.
Copy
(
GetFullPath
(
file
.
path
),
targetFolder
+
"/"
+
Path
.
GetFileName
(
file
.
name
).
Replace
(
".prefab"
,
""
).
Replace
(
"ef"
,
"Ef"
));
List
<
string
>
depens
=
new
List
<
string
>();
try
{
depens
=
GetDependencies
(
file
.
path
);
}
catch
(
Exception
e
)
{
Debug
.
Log
(
file
.
path
);
Debug
.
LogException
(
e
);
}
var
depens
=
new
List
<
string
>(
file
.
dependencies
);
foreach
(
string
depen
in
depens
)
{
if
(
File
.
Exists
(
GetFullPath
(
depen
)))
...
...
@@ -355,17 +428,11 @@ public class AssetBundleRobber : MonoBehaviour
var
targetFolder
=
workingPlace
+
"MonsterCutin/"
+
subDir
;
if
(!
Directory
.
Exists
(
targetFolder
))
Directory
.
CreateDirectory
(
targetFolder
);
if
(
File
.
Exists
(
targetFolder
+
"/"
+
subDir
))
File
.
Copy
(
GetFullPath
(
file
.
path
),
targetFolder
+
"/"
+
subDir
+
"----------"
);
else
File
.
Copy
(
GetFullPath
(
file
.
path
),
targetFolder
+
"/"
+
subDir
);
List
<
string
>
depens
=
new
List
<
string
>();
try
{
depens
=
GetDependencies
(
file
.
path
);
}
catch
(
Exception
e
)
{
Debug
.
Log
(
"查找"
+
file
.
path
+
"的依赖失败:"
);
Debug
.
LogException
(
e
);
}
var
depens
=
new
List
<
string
>(
file
.
dependencies
);
foreach
(
string
depen
in
depens
)
{
if
(
File
.
Exists
(
GetFullPath
(
depen
)))
...
...
@@ -384,22 +451,19 @@ public class AssetBundleRobber : MonoBehaviour
continue
;
if
(!
Directory
.
Exists
(
workingPlace
+
"SpecialWin"
))
Directory
.
CreateDirectory
(
workingPlace
+
"SpecialWin"
);
string
subDir
=
Regex
.
Split
(
file
.
name
,
"/"
)[
8
].
Replace
(
"p"
,
""
);
string
subDir
=
Regex
.
Split
(
file
.
name
,
"/"
)[
8
];
if
(
subDir
.
Contains
(
".prefab"
))
//4027 艾克佐迪亚
{
subDir
=
subDir
.
Replace
(
".prefab"
,
""
).
Replace
(
"summonspecialwin"
,
""
);
}
else
subDir
=
subDir
.
Replace
(
"p"
,
""
);
subDir
=
GetYdkID
(
subDir
);
var
targetFolder
=
workingPlace
+
"SpecialWin/"
+
subDir
;
if
(!
Directory
.
Exists
(
targetFolder
))
Directory
.
CreateDirectory
(
targetFolder
);
File
.
Copy
(
GetFullPath
(
file
.
path
),
targetFolder
+
"/"
+
subDir
);
List
<
string
>
depens
=
new
List
<
string
>();
try
{
depens
=
GetDependencies
(
file
.
path
);
}
catch
(
Exception
e
)
{
Debug
.
Log
(
"查找"
+
file
.
path
+
"的依赖失败:"
);
Debug
.
LogException
(
e
);
}
var
depens
=
new
List
<
string
>(
file
.
dependencies
);
foreach
(
string
depen
in
depens
)
{
if
(
File
.
Exists
(
GetFullPath
(
depen
)))
...
...
@@ -411,6 +475,42 @@ public class AssetBundleRobber : MonoBehaviour
Debug
.
Log
(
"未找到"
+
file
.
path
+
"的依赖:"
+
depen
+
": "
+
GetFullPath
(
depen
));
}
}
else
if
(
type
==
AssetType
.
BGM
)
{
if
(!
Directory
.
Exists
(
workingPlace
+
"Sound/BGM"
))
Directory
.
CreateDirectory
(
workingPlace
+
"Sound/BGM"
);
var
targetName
=
workingPlace
+
"Sound/BGM/"
+
Path
.
GetFileName
(
file
.
name
).
Replace
(
".wav"
,
""
);
File
.
Copy
(
GetFullPath
(
file
.
path
),
targetName
);
}
else
if
(
type
==
AssetType
.
SE_DUEL
)
{
if
(!
Directory
.
Exists
(
workingPlace
+
"Sound/SE_DUEL"
))
Directory
.
CreateDirectory
(
workingPlace
+
"Sound/SE_DUEL"
);
var
targetName
=
workingPlace
+
"Sound/SE_DUEL/"
+
Path
.
GetFileName
(
file
.
name
).
Replace
(
".wav"
,
""
);
File
.
Copy
(
GetFullPath
(
file
.
path
),
targetName
);
}
else
if
(
type
==
AssetType
.
SE_FIELD
)
{
if
(!
Directory
.
Exists
(
workingPlace
+
"Sound/SE_FIELD"
))
Directory
.
CreateDirectory
(
workingPlace
+
"Sound/SE_FIELD"
);
var
targetName
=
workingPlace
+
"Sound/SE_FIELD/"
+
Path
.
GetFileName
(
file
.
name
).
Replace
(
".wav"
,
""
);
File
.
Copy
(
GetFullPath
(
file
.
path
),
targetName
);
}
else
if
(
type
==
AssetType
.
SE_MATE
)
{
if
(!
Directory
.
Exists
(
workingPlace
+
"Sound/SE_MATE"
))
Directory
.
CreateDirectory
(
workingPlace
+
"Sound/SE_MATE"
);
var
targetName
=
workingPlace
+
"Sound/SE_MATE/"
+
Path
.
GetFileName
(
file
.
name
).
Replace
(
".wav"
,
""
);
File
.
Copy
(
GetFullPath
(
file
.
path
),
targetName
);
}
else
if
(
type
==
AssetType
.
SE_SYS
)
{
if
(!
Directory
.
Exists
(
workingPlace
+
"Sound/SE_SYS"
))
Directory
.
CreateDirectory
(
workingPlace
+
"Sound/SE_SYS"
);
var
targetName
=
workingPlace
+
"Sound/SE_SYS/"
+
Path
.
GetFileName
(
file
.
name
).
Replace
(
".wav"
,
""
);
File
.
Copy
(
GetFullPath
(
file
.
path
),
targetName
);
}
text
.
text
=
"Copying: "
+
currentFileCount
+
"/"
+
fileCount
;
yield
return
null
;
}
...
...
@@ -426,27 +526,27 @@ public class AssetBundleRobber : MonoBehaviour
if
(
name
.
Contains
(
"/duel/bg/avatarstand/"
))
{
if
(
name
.
Contains
(
".prefab"
))
if
(
name
.
EndsWith
(
".prefab"
))
return
AssetType
.
AvatarStand
;
}
else
if
(
name
.
Contains
(
"/images/profileframe/"
))
{
if
(
name
.
Contains
(
".mat"
))
if
(
name
.
EndsWith
(
".mat"
))
return
AssetType
.
Frame
;
}
else
if
(
name
.
Contains
(
"/duel/bg/grave/"
))
{
if
(
name
.
Contains
(
".prefab"
))
if
(
name
.
EndsWith
(
".prefab"
))
return
AssetType
.
Grave
;
}
else
if
(
name
.
Contains
(
"/duel/bg/mat/"
))
{
if
(
name
.
Contains
(
".prefab"
))
if
(
name
.
EndsWith
(
".prefab"
))
return
AssetType
.
Mat
;
}
else
if
(
name
.
Contains
(
"/mate/"
))
{
if
(
name
.
Contains
(
".prefab"
))
if
(
name
.
EndsWith
(
".prefab"
))
return
AssetType
.
Mate
;
}
else
if
(
name
.
Contains
(
"/protector/"
))
...
...
@@ -456,30 +556,55 @@ public class AssetBundleRobber : MonoBehaviour
}
else
if
(
name
.
Contains
(
"/wallpaper/"
))
{
if
(
name
.
Contains
(
".prefab"
))
if
(
name
.
EndsWith
(
".prefab"
))
return
AssetType
.
Wallpaper
;
}
else
if
(
name
.
Contains
(
"/prefabs/outgamebg/back/"
))
{
if
(
name
.
Contains
(
".prefab"
))
if
(
name
.
EndsWith
(
".prefab"
))
return
AssetType
.
Background
;
}
else
if
(
name
.
Contains
(
"/duel/timeline/card/"
))
{
if
(
name
.
Contains
(
".prefab"
))
if
(
name
.
EndsWith
(
".prefab"
))
return
AssetType
.
Card
;
}
else
if
(
name
.
Contains
(
"/duel/timeline/duel/monstercutin/"
))
{
if
(
name
.
Contains
(
".prefab"
))
if
(
name
.
EndsWith
(
".prefab"
))
return
AssetType
.
MonsterCutin
;
}
else
if
(
name
.
Contains
(
"/duel/timeline/duel/universal/summon/summonspecialwin/"
))
{
if
(
name
.
Contains
(
".prefab"
))
if
(
name
.
EndsWith
(
".prefab"
))
if
(
Path
.
GetFileName
(
name
).
Contains
(
"summonspecialwin"
))
return
AssetType
.
SpecialWin
;
}
else
if
(
name
.
Contains
(
"/bgm/"
))
{
if
(
name
.
EndsWith
(
".wav"
))
return
AssetType
.
BGM
;
}
else
if
(
name
.
Contains
(
"/se_duel/"
))
{
if
(
name
.
EndsWith
(
".wav"
))
return
AssetType
.
SE_DUEL
;
}
else
if
(
name
.
Contains
(
"/se_field/"
))
{
if
(
name
.
EndsWith
(
".wav"
))
return
AssetType
.
SE_FIELD
;
}
else
if
(
name
.
Contains
(
"/se_mate/"
))
{
if
(
name
.
EndsWith
(
".wav"
))
return
AssetType
.
SE_MATE
;
}
else
if
(
name
.
Contains
(
"/se_sys/"
))
{
if
(
name
.
EndsWith
(
".wav"
))
return
AssetType
.
SE_SYS
;
}
return
AssetType
.
None
;
}
...
...
@@ -496,13 +621,16 @@ public class AssetBundleRobber : MonoBehaviour
Protector
,
Wallpaper
,
Background
,
SpecialWin
SpecialWin
,
BGM
,
SE_DUEL
,
SE_FIELD
,
SE_MATE
,
SE_SYS
}
List
<
string
>
GetDependencies
(
string
fileName
,
List
<
string
>
parentDepends
=
null
)
{
GC
.
Collect
();
byte
[]
bytes
=
Decompress
(
fileName
);
List
<
int
>
dependencyPositions
=
new
List
<
int
>();
for
(
int
i
=
0
;
i
<
bytes
.
Length
;
i
++)
...
...
@@ -572,7 +700,6 @@ public class AssetBundleRobber : MonoBehaviour
foreach
(
var
value
in
subdepends
)
if
(!
dependencies
.
Contains
(
value
))
dependencies
.
Add
(
value
);
bytes
=
null
;
return
dependencies
;
}
...
...
@@ -581,7 +708,7 @@ public class AssetBundleRobber : MonoBehaviour
var
manager
=
new
AssetsTools
.
NET
.
Extra
.
AssetsManager
();
if
(!
File
.
Exists
(
GetFullPath
(
path
)))
{
Debug
.
Log
(
"
未找到
"
+
path
);
Debug
.
Log
(
"
Not Find:
"
+
path
);
return
new
byte
[
0
];
}
BundleFileInstance
bundleInst
=
manager
.
LoadBundleFile
(
GetFullPath
(
path
),
false
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment