Skip to content

Commit 0ccec2e

Browse files
committed
[HSR Game Repair] Fix persistent URLs, missing M_ files, and missing assets (DesignV, NativeDataV)
1 parent 1c079a1 commit 0ccec2e

6 files changed

Lines changed: 91 additions & 46 deletions

CollapseLauncher/Classes/RepairManagement/StarRailV2/StarRailPersistentRefResult.FinalizeFetch.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ public async Task FinalizeCacheFetchAsync(StarRailRepairV2 instance,
6161
tempStream.Position = 0;
6262

6363
// -- Parse manifest and get the first asset from stock metadata
64-
StarRailAssetSignaturelessMetadata metadataLuaV = new(".bytes");
64+
StarRailAssetBytesSignaturelessMetadata metadataLuaV = new();
6565
await metadataLuaV.ParseAsync(tempStream, true, token);
6666

6767
// -- Get stock dictionary asset

CollapseLauncher/Classes/RepairManagement/StarRailV2/StarRailPersistentRefResult.GetPersistentFiles.cs

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ public List<FilePropertiesRemote> GetPersistentFiles(
9797
BaseDirs.StreamingVideo,
9898
BaseDirs.PersistentVideo,
9999
BaseUrls.Video,
100-
BaseUrls.Video,
100+
BaseUrls.VideoPersistent,
101101
true,
102102
fileList,
103103
unusedAssets,
@@ -111,7 +111,7 @@ public List<FilePropertiesRemote> GetPersistentFiles(
111111
BaseDirs.StreamingAudio,
112112
BaseDirs.PersistentAudio,
113113
BaseUrls.Audio,
114-
BaseUrls.Audio,
114+
BaseUrls.AudioPersistent,
115115
true,
116116
fileList,
117117
unusedAssets,
@@ -141,6 +141,34 @@ public List<FilePropertiesRemote> GetPersistentFiles(
141141
Metadata.RawResV.DataList);
142142
}
143143

144+
if (Metadata.DesignV != null)
145+
{
146+
AddAdditionalAssets(gameDirPath,
147+
BaseDirs.StreamingDesignData,
148+
BaseDirs.PersistentDesignData,
149+
BaseUrls.DesignData,
150+
BaseUrls.DesignData,
151+
false,
152+
fileList,
153+
unusedAssets,
154+
oldDic,
155+
Metadata.DesignV.DataList);
156+
}
157+
158+
if (Metadata.NativeDataV != null)
159+
{
160+
AddAdditionalAssets(gameDirPath,
161+
BaseDirs.StreamingNativeData,
162+
BaseDirs.PersistentNativeData,
163+
BaseUrls.NativeData,
164+
BaseUrls.NativeData,
165+
false,
166+
fileList,
167+
unusedAssets,
168+
oldDic,
169+
Metadata.NativeDataV.DataList);
170+
}
171+
144172
if (Metadata.CacheLua != null)
145173
{
146174
AddAdditionalAssets(gameDirPath,
@@ -300,7 +328,7 @@ private static void AddAdditionalAssets<T>(
300328
CRCArray = asset.MD5Checksum,
301329
FT = StarRailRepairV2.DetermineFileTypeFromExtension(asset.Filename ?? ""),
302330
IsHasHashMark = isHashMarked,
303-
AssociatedObject = asset
331+
AssociatedObject = asset,
304332
};
305333
fileDic.TryAdd(relPathInPersistent, file);
306334
fileList.Add(file);

CollapseLauncher/Classes/RepairManagement/StarRailV2/StarRailPersistentRefResult.cs

Lines changed: 43 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,11 @@ public static async Task<StarRailPersistentRefResult> GetCacheReferenceAsync(
5555
AsbBlock = "",
5656
AsbBlockPersistent = "",
5757
Audio = "",
58+
AudioPersistent = "",
5859
DesignData = "",
5960
NativeData = "",
6061
Video = "",
62+
VideoPersistent = "",
6163
RawRes = "",
6264
CacheLua = mainUrlLua,
6365
CacheIFix = mainUrlIFix
@@ -104,23 +106,16 @@ public static async Task<StarRailPersistentRefResult> GetCacheReferenceAsync(
104106
aDirIFix,
105107
token);
106108

107-
// -- Save local index files
108-
// Notes to Dev: HoYo no longer provides a proper raw bytes data anymore and the client creates it based
109-
// on data provided by "handleArchive", so we need to emulate how the game generates these data.
110-
await SaveLocalIndexFiles(instance, handleLua, aDirLua, "LuaV", token);
111-
await SaveLocalIndexFiles(instance, handleIFix, aDirIFix, "IFixV", token);
112-
113109
// -- Load metadata files
114110
// -- LuaV
115-
StarRailAssetSignaturelessMetadata? metadataLuaV = new(".bytes");
116-
metadataLuaV = await LoadMetadataFile(instance,
117-
handleLua,
118-
client,
119-
baseUrls.CacheLua,
120-
"LuaV",
121-
metadataLuaV,
122-
aDirLua,
123-
token);
111+
StarRailAssetBytesSignaturelessMetadata? metadataLuaV =
112+
await LoadMetadataFile<StarRailAssetBytesSignaturelessMetadata>(instance,
113+
handleLua,
114+
client,
115+
baseUrls.CacheLua,
116+
"LuaV",
117+
aDirLua,
118+
token);
124119

125120
// -- IFixV
126121
StarRailAssetCsvMetadata? metadataIFixV =
@@ -200,10 +195,12 @@ public static async Task<StarRailPersistentRefResult> GetRepairReferenceAsync(
200195
// We also made the second check for the actual block URLs below so HoYo wouldn't be able to fuck around with our code
201196
// anymore.
202197
string mainUrlAudio = mainUrlAsb.CombineURLFromString("AudioBlock");
198+
string mainUrlAudioAlt = mainUrlAsbAlt.CombineURLFromString("AudioBlock");
203199
string mainUrlAsbBlock = mainUrlAsb.CombineURLFromString("Block");
204200
string mainUrlAsbBlockAlt = mainUrlAsbAlt.CombineURLFromString("Block");
205201
string mainUrlNativeData = mainUrlDesignData.CombineURLFromString("NativeData");
206202
string mainUrlVideo = mainUrlAsb.CombineURLFromString("Video");
203+
string mainUrlVideoAlt = mainUrlAsbAlt.CombineURLFromString("Video");
207204
string mainUrlRawRes = mainUrlAsb.CombineURLFromString("RawRes");
208205

209206
AssetBaseUrls baseUrl = new()
@@ -212,10 +209,12 @@ public static async Task<StarRailPersistentRefResult> GetRepairReferenceAsync(
212209
DesignData = mainUrlDesignData,
213210
Archive = mainUrlArchive,
214211
Audio = mainUrlAudio,
212+
AudioPersistent = mainUrlAudioAlt,
215213
AsbBlock = mainUrlAsbBlock,
216214
AsbBlockPersistent = mainUrlAsbBlockAlt,
217215
NativeData = mainUrlNativeData,
218216
Video = mainUrlVideo,
217+
VideoPersistent = mainUrlVideoAlt,
219218
RawRes = mainUrlRawRes
220219
};
221220

@@ -273,28 +272,16 @@ public static async Task<StarRailPersistentRefResult> GetRepairReferenceAsync(
273272
LogType.Debug,
274273
true);
275274

276-
// -- Save local index files
277-
// Notes to Dev: HoYo no longer provides a proper raw bytes data anymore and the client creates it based
278-
// on data provided by "handleArchive", so we need to emulate how the game generates these data.
279-
await SaveLocalIndexFiles(instance, handleDesignArchive, aDirDesignData, "DesignV", token);
280-
await SaveLocalIndexFiles(instance, handleArchive, aDirAsbBlock, "AsbV", token);
281-
await SaveLocalIndexFiles(instance, handleArchive, aDirAsbBlock, "BlockV", token);
282-
await SaveLocalIndexFiles(instance, handleArchive, aDirAsbBlock, "Start_AsbV", token);
283-
await SaveLocalIndexFiles(instance, handleArchive, aDirAsbBlock, "Start_BlockV", token);
284-
await SaveLocalIndexFiles(instance, handleArchive, aDirAudio, "AudioV", token);
285-
await SaveLocalIndexFiles(instance, handleArchive, aDirVideo, "VideoV", token);
286-
await SaveLocalIndexFiles(instance, handleArchive, aDirRawRes, "RawResV", token);
287-
288275
// -- Load metadata files
289276
// -- DesignV
290-
StarRailAssetSignaturelessMetadata? metadataDesignV =
291-
await LoadMetadataFile<StarRailAssetSignaturelessMetadata>(instance,
292-
handleDesignArchive,
293-
client,
294-
baseUrl.DesignData,
295-
"DesignV",
296-
aDirDesignData,
297-
token);
277+
StarRailAssetBytesSignaturelessMetadata? metadataDesignV =
278+
await LoadMetadataFile<StarRailAssetBytesSignaturelessMetadata>(instance,
279+
handleDesignArchive,
280+
client,
281+
baseUrl.DesignData,
282+
"DesignV",
283+
aDirDesignData,
284+
token);
298285

299286
// -- NativeDataV
300287
StarRailAssetNativeDataMetadata? metadataNativeDataV =
@@ -333,7 +320,7 @@ await LoadMetadataFile<StarRailAssetBundleMetadata>(instance,
333320
client,
334321
baseUrl.AsbBlockPersistent,
335322
"AsbV",
336-
null,
323+
aDirAsbBlock,
337324
token);
338325

339326
// -- BlockV
@@ -343,7 +330,7 @@ await LoadMetadataFile<StarRailAssetBlockMetadata>(instance,
343330
client,
344331
baseUrl.AsbBlockPersistent,
345332
"BlockV",
346-
null,
333+
aDirAsbBlock,
347334
token);
348335

349336
// -- AudioV
@@ -376,6 +363,19 @@ await LoadMetadataFile<StarRailAssetJsonMetadata>(instance,
376363
aDirRawRes,
377364
token);
378365

366+
// -- Save local index files
367+
// Notes to Dev: HoYo no longer provides a proper raw bytes data anymore and the client creates it based
368+
// on data provided by "handleArchive", so we need to emulate how the game generates these data.
369+
await SaveLocalIndexFiles(instance, handleDesignArchive, aDirDesignData, "DesignV", token);
370+
await SaveLocalIndexFiles(instance, handleDesignArchive, aDirNativeData, "NativeDataV", token);
371+
await SaveLocalIndexFiles(instance, handleArchive, aDirAsbBlock, "AsbV", token);
372+
await SaveLocalIndexFiles(instance, handleArchive, aDirAsbBlock, "BlockV", token);
373+
await SaveLocalIndexFiles(instance, handleArchive, aDirAsbBlock, "Start_AsbV", token);
374+
await SaveLocalIndexFiles(instance, handleArchive, aDirAsbBlock, "Start_BlockV", token);
375+
await SaveLocalIndexFiles(instance, handleArchive, aDirAudio, "AudioV", token);
376+
await SaveLocalIndexFiles(instance, handleArchive, aDirVideo, "VideoV", token);
377+
await SaveLocalIndexFiles(instance, handleArchive, aDirRawRes, "RawResV", token);
378+
379379
// Perform URL test & swap for Audio and Video
380380
await baseUrl.TestAndSwapUrlAsync(client,
381381
mainUrlAsbAlt.CombineURLFromString("AudioBlock"),
@@ -410,7 +410,7 @@ await baseUrl.TestAndSwapUrlAsync(client,
410410
}
411411

412412
private static async ValueTask SaveLocalIndexFiles(
413-
StarRailRepairV2 instance,
413+
StarRailRepairV2 instance,
414414
Dictionary<string, StarRailRefMainInfo> handleArchiveSource,
415415
string outputDir,
416416
string indexKey,
@@ -617,16 +617,20 @@ public class AssetBaseUrls
617617
public required string DesignData { get; init; }
618618
public required string Archive { get; set; }
619619
public required string Audio { get; set; }
620+
public required string AudioPersistent { get; set; }
620621
public required string AsbBlock { get; set; }
621622
public required string AsbBlockPersistent { get; set; }
622623
public required string NativeData { get; init; }
623624
public required string Video { get; set; }
625+
public required string VideoPersistent { get; set; }
624626
public required string RawRes { get; init; }
625627

626628
public string? CacheLua { get; init; }
627629
public string? CacheIFix { get; init; }
628630

629-
public void SwapAsbPersistentUrl() => (AsbBlock, AsbBlockPersistent) = (AsbBlockPersistent, AsbBlock);
631+
public void SwapAsbPersistentUrl() =>
632+
(AsbBlock, AsbBlockPersistent, Video, VideoPersistent, Audio, AudioPersistent) =
633+
(AsbBlockPersistent, AsbBlock, VideoPersistent, Video, AudioPersistent, Audio);
630634

631635
public async Task TestAndSwapUrlAsync(
632636
HttpClient client,
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
#pragma warning disable IDE0290 // Shut the fuck up
2+
#pragma warning disable IDE0130
3+
#nullable enable
4+
5+
namespace CollapseLauncher.RepairManagement.StarRail.Struct.Assets;
6+
7+
/// <summary>
8+
/// Star Rail .Bytes Signatureless Metadata parser for DesignDataV and LuaV. This parser is read-only and cannot be written back.<br/>
9+
/// </summary>
10+
public sealed class StarRailAssetBytesSignaturelessMetadata : StarRailAssetSignaturelessMetadata
11+
{
12+
public StarRailAssetBytesSignaturelessMetadata() : base(".bytes") { }
13+
}

CollapseLauncher/Classes/RepairManagement/StarRailV2/Struct/Assets/StarRailAssetNativeDataMetadata.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ public ReadOnlySpan<byte> Shifted4BytesMD5Checksum
157157
}
158158
}
159159

160-
public class Metadata : StarRailAssetGenericFileInfo
160+
public class Metadata : StarRailAssetFlaggable
161161
{
162162
public static Span<byte> Parse(Span<byte> filenameBuffer,
163163
ref FileInfoStruct assetInfo,

CollapseLauncher/Classes/RepairManagement/StarRailV2/Struct/Assets/StarRailAssetSignaturelessMetadata.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@
1616
namespace CollapseLauncher.RepairManagement.StarRail.Struct.Assets;
1717

1818
/// <summary>
19-
/// Star Rail Signatureless Metadata parser for LuaV, DesignV. This parser is read-only and cannot be written back.<br/>
19+
/// Star Rail Signatureless Metadata parser. This parser is read-only and cannot be written back.<br/>
2020
/// </summary>
21-
public sealed class StarRailAssetSignaturelessMetadata : StarRailAssetBinaryMetadata<StarRailAssetSignaturelessMetadata.Metadata>
21+
public abstract class StarRailAssetSignaturelessMetadata : StarRailAssetBinaryMetadata<StarRailAssetSignaturelessMetadata.Metadata>
2222
{
2323
public StarRailAssetSignaturelessMetadata() : this(null)
2424
{

0 commit comments

Comments
 (0)