- [Core] fix bug with AssetMap

This commit is contained in:
Razmoth
2024-02-20 20:42:47 +04:00
parent 3946c0d01a
commit 462ac7b396
2 changed files with 23 additions and 35 deletions

View File

@@ -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);
} }

View File

@@ -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)