- [Core] fix bug with AssetMap
This commit is contained in:
@@ -126,7 +126,7 @@ namespace AssetStudio.GUI
|
|||||||
{
|
{
|
||||||
foreach (var asset in assetsFile.Objects)
|
foreach (var asset in assetsFile.Objects)
|
||||||
{
|
{
|
||||||
ProcessAssetData(asset, exportableAssets, entries, objectAssetItemDic, mihoyoBinDataNames, containers);
|
ProcessAssetData(asset, exportableAssets, objectAssetItemDic, mihoyoBinDataNames, containers);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
foreach ((var pptr, var name) in mihoyoBinDataNames)
|
foreach ((var pptr, var name) in mihoyoBinDataNames)
|
||||||
@@ -151,16 +151,12 @@ namespace AssetStudio.GUI
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
containers.Clear();
|
containers.Clear();
|
||||||
for (int i = exportableAssets.Count - 1; i >= 0; i--)
|
|
||||||
{
|
var matches = exportableAssets.Where(asset => entries.Any(x => x.Container == asset.Container && x.Name == asset.Text && x.Type == asset.Type && x.PathID == asset.m_PathID)).ToArray();
|
||||||
var asset = exportableAssets[i];
|
exportableAssets.Clear();
|
||||||
if (!entries.Any(x => x.Container == asset.Container && x.Name == asset.Text && x.Type == asset.Type && x.PathID == asset.m_PathID))
|
exportableAssets.AddRange(matches);
|
||||||
{
|
|
||||||
exportableAssets.Remove(asset);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
private void ProcessAssetData(Object asset, List<AssetItem> exportableAssets, AssetEntry[] entries, Dictionary<Object, AssetItem> objectAssetItemDic, List<(PPtr<Object>, string)> mihoyoBinDataNames, List<(PPtr<Object>, string)> containers)
|
private void ProcessAssetData(Object asset, List<AssetItem> exportableAssets, Dictionary<Object, AssetItem> objectAssetItemDic, List<(PPtr<Object>, string)> mihoyoBinDataNames, List<(PPtr<Object>, string)> containers)
|
||||||
{
|
{
|
||||||
var assetItem = new AssetItem(asset);
|
var assetItem = new AssetItem(asset);
|
||||||
objectAssetItemDic.Add(asset, assetItem);
|
objectAssetItemDic.Add(asset, assetItem);
|
||||||
@@ -231,12 +227,13 @@ namespace AssetStudio.GUI
|
|||||||
exportable = true;
|
exportable = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (assetItem.Text == "")
|
if (assetItem.Text == "")
|
||||||
{
|
{
|
||||||
assetItem.Text = assetItem.TypeString + assetItem.UniqueID;
|
assetItem.Text = assetItem.TypeString + assetItem.UniqueID;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (entries.Any(x => x.Name == assetItem.Text && x.Type == assetItem.Type) && exportable)
|
if (exportable)
|
||||||
{
|
{
|
||||||
exportableAssets.Add(assetItem);
|
exportableAssets.Add(assetItem);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -339,6 +339,7 @@ namespace AssetStudio
|
|||||||
|
|
||||||
private static void BuildAssetMap(string file, List<AssetEntry> assets, ClassIDType[] typeFilters = null, Regex[] nameFilters = null, Regex[] containerFilters = null)
|
private static void BuildAssetMap(string file, List<AssetEntry> assets, ClassIDType[] typeFilters = null, Regex[] nameFilters = null, Regex[] containerFilters = null)
|
||||||
{
|
{
|
||||||
|
var matches = new List<AssetEntry>();
|
||||||
var containers = new List<(PPtr<Object>, string)>();
|
var containers = new List<(PPtr<Object>, string)>();
|
||||||
var mihoyoBinDataNames = new List<(PPtr<Object>, string)>();
|
var mihoyoBinDataNames = new List<(PPtr<Object>, string)>();
|
||||||
var objectAssetItemDic = new Dictionary<Object, AssetEntry>();
|
var objectAssetItemDic = new Dictionary<Object, AssetEntry>();
|
||||||
@@ -457,25 +458,18 @@ namespace AssetStudio
|
|||||||
objectAssetItemDic.Add(obj, asset);
|
objectAssetItemDic.Add(obj, asset);
|
||||||
assetsFile.AddObject(obj);
|
assetsFile.AddObject(obj);
|
||||||
}
|
}
|
||||||
var isMatchRegex = nameFilters.IsNullOrEmpty() || nameFilters.Any(x => x.IsMatch(asset.Name) || asset.Type == ClassIDType.Animator);
|
if (exportable)
|
||||||
var isFilteredType = typeFilters.IsNullOrEmpty() || typeFilters.Contains(asset.Type) || asset.Type == ClassIDType.Animator;
|
|
||||||
if (isMatchRegex && isFilteredType && exportable)
|
|
||||||
{
|
{
|
||||||
assets.Add(asset);
|
matches.Add(asset);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
foreach ((var pptr, var asset) in animators)
|
foreach ((var pptr, var asset) in animators)
|
||||||
{
|
{
|
||||||
if (pptr.TryGet<GameObject>(out var gameObject) && (nameFilters.IsNullOrEmpty() || nameFilters.Any(x => x.IsMatch(gameObject.m_Name))) && (typeFilters.IsNullOrEmpty() || typeFilters.Contains(asset.Type)))
|
if (pptr.TryGet<GameObject>(out var gameObject))
|
||||||
{
|
{
|
||||||
asset.Name = gameObject.m_Name;
|
asset.Name = gameObject.m_Name;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
assets.Remove(asset);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
foreach ((var pptr, var name) in mihoyoBinDataNames)
|
foreach ((var pptr, var name) in mihoyoBinDataNames)
|
||||||
{
|
{
|
||||||
@@ -490,24 +484,21 @@ namespace AssetStudio
|
|||||||
else asset.Name = $"BinFile #{asset.PathID}";
|
else asset.Name = $"BinFile #{asset.PathID}";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!containerFilters.IsNullOrEmpty())
|
foreach ((var pptr, var container) in containers)
|
||||||
{
|
{
|
||||||
foreach ((var pptr, var container) in containers)
|
if (pptr.TryGet(out var obj))
|
||||||
{
|
{
|
||||||
if (pptr.TryGet(out var obj))
|
objectAssetItemDic[obj].Container = container;
|
||||||
{
|
|
||||||
var item = objectAssetItemDic[obj];
|
|
||||||
if (containerFilters.Any(x => x.IsMatch(container)))
|
|
||||||
{
|
|
||||||
item.Container = container;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
assets.Remove(item);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
assets.AddRange(matches.Where(x =>
|
||||||
|
{
|
||||||
|
var isMatchRegex = nameFilters.IsNullOrEmpty() || nameFilters.Any(y => y.IsMatch(x.Name));
|
||||||
|
var isFilteredType = typeFilters.IsNullOrEmpty() || typeFilters.Contains(x.Type);
|
||||||
|
var isContainerMatch = containerFilters.IsNullOrEmpty() || containerFilters.Any(y => y.IsMatch(x.Container));
|
||||||
|
return isMatchRegex && isFilteredType && isContainerMatch;
|
||||||
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static string[] ParseAssetMap(string mapName, ExportListType mapType, ClassIDType[] typeFilter, Regex[] nameFilter, Regex[] containerFilter)
|
public static string[] ParseAssetMap(string mapName, ExportListType mapType, ClassIDType[] typeFilter, Regex[] nameFilter, Regex[] containerFilter)
|
||||||
|
|||||||
Reference in New Issue
Block a user