@@ -7,7 +7,7 @@ public static class InstallPlanner
77 public static IReadOnlyList < InstallOperation > Plan (
88 ClassificationResult classification ,
99 IReadOnlyList < BundleFile > files ,
10- BundleManifest manifest )
10+ BundleManifest ? manifest )
1111 {
1212 if ( ! classification . IsClassified )
1313 throw new InvalidOperationException ( "Cannot plan installation for an unclassified bundle." ) ;
@@ -37,11 +37,11 @@ public static IReadOnlyList<InstallOperation> Plan(
3737 . ToList ( ) ;
3838 }
3939
40- private static List < InstallOperation > PlanVehicleAddon ( IReadOnlyList < BundleFile > files , BundleManifest manifest )
40+ private static List < InstallOperation > PlanVehicleAddon ( IReadOnlyList < BundleFile > files , BundleManifest ? manifest )
4141 {
42- var dlcPackName = manifest . DlcPackName ! ;
42+ var dlcPackName = ResolveDlcPackName ( files , manifest ) ;
4343 var dlcBase = $ "mods/update/x64/dlcpacks/{ dlcPackName } ";
44- var rootPrefix = DetermineRootPrefix ( files , manifest . SourceFolder , dlcPackName ) ;
44+ var rootPrefix = DetermineRootPrefix ( files , manifest ? . SourceFolder , dlcPackName ) ;
4545
4646 var ops = new List < InstallOperation > ( ) ;
4747
@@ -65,11 +65,17 @@ private static List<InstallOperation> PlanVehicleAddon(IReadOnlyList<BundleFile>
6565 return ops ;
6666 }
6767
68- private static List < InstallOperation > PlanVehicleReplace ( IReadOnlyList < BundleFile > files , BundleManifest manifest )
68+ private static List < InstallOperation > PlanVehicleReplace ( IReadOnlyList < BundleFile > files , BundleManifest ? manifest )
6969 {
70+ if ( manifest is null )
71+ throw new InvalidOperationException ( "vehicle_replace planning requires manifest target metadata." ) ;
72+
7073 var targetArchivePath = manifest . TargetArchivePath
7174 ?? BundleValidator . KnownSlotMapLookup ( manifest . ReplaceSlot ! ) ;
7275
76+ if ( targetArchivePath is null )
77+ throw new InvalidOperationException ( "vehicle_replace planning requires a target archive path." ) ;
78+
7379 var ops = new List < InstallOperation > ( ) ;
7480
7581 foreach ( var file in files )
@@ -90,7 +96,7 @@ private static List<InstallOperation> PlanVehicleReplace(IReadOnlyList<BundleFil
9096 return ops ;
9197 }
9298
93- private static List < InstallOperation > PlanEls ( IReadOnlyList < BundleFile > files , BundleManifest manifest )
99+ private static List < InstallOperation > PlanEls ( IReadOnlyList < BundleFile > files , BundleManifest ? manifest )
94100 {
95101 var ops = new List < InstallOperation > ( ) ;
96102
@@ -111,7 +117,7 @@ private static List<InstallOperation> PlanEls(IReadOnlyList<BundleFile> files, B
111117 return ops ;
112118 }
113119
114- private static List < InstallOperation > PlanRphPlugin ( IReadOnlyList < BundleFile > files , BundleManifest manifest )
120+ private static List < InstallOperation > PlanRphPlugin ( IReadOnlyList < BundleFile > files , BundleManifest ? manifest )
115121 {
116122 var ops = new List < InstallOperation > ( ) ;
117123
@@ -132,7 +138,7 @@ private static List<InstallOperation> PlanRphPlugin(IReadOnlyList<BundleFile> fi
132138 return ops ;
133139 }
134140
135- private static List < InstallOperation > PlanShvdnScript ( IReadOnlyList < BundleFile > files , BundleManifest manifest )
141+ private static List < InstallOperation > PlanShvdnScript ( IReadOnlyList < BundleFile > files , BundleManifest ? manifest )
136142 {
137143 var ops = new List < InstallOperation > ( ) ;
138144
@@ -154,7 +160,7 @@ private static List<InstallOperation> PlanShvdnScript(IReadOnlyList<BundleFile>
154160 return ops ;
155161 }
156162
157- private static List < InstallOperation > PlanSirenPack ( IReadOnlyList < BundleFile > files , BundleManifest manifest )
163+ private static List < InstallOperation > PlanSirenPack ( IReadOnlyList < BundleFile > files , BundleManifest ? manifest )
158164 {
159165 var ops = new List < InstallOperation > ( ) ;
160166
@@ -169,11 +175,11 @@ private static List<InstallOperation> PlanSirenPack(IReadOnlyList<BundleFile> fi
169175 return ops ;
170176 }
171177
172- private static List < InstallOperation > PlanWeaponAddon ( IReadOnlyList < BundleFile > files , BundleManifest manifest )
178+ private static List < InstallOperation > PlanWeaponAddon ( IReadOnlyList < BundleFile > files , BundleManifest ? manifest )
173179 {
174- var dlcPackName = manifest . DlcPackName ! ;
180+ var dlcPackName = ResolveDlcPackName ( files , manifest ) ;
175181 var dlcBase = $ "mods/update/x64/dlcpacks/{ dlcPackName } ";
176- var rootPrefix = DetermineRootPrefix ( files , manifest . SourceFolder , dlcPackName ) ;
182+ var rootPrefix = DetermineRootPrefix ( files , manifest ? . SourceFolder , dlcPackName ) ;
177183
178184 var ops = new List < InstallOperation > ( ) ;
179185
@@ -221,6 +227,15 @@ private static List<InstallOperation> PlanWeaponAddon(IReadOnlyList<BundleFile>
221227 return null ;
222228 }
223229
230+ private static string ResolveDlcPackName ( IReadOnlyList < BundleFile > files , BundleManifest ? manifest )
231+ {
232+ var dlcPackName = manifest ? . DlcPackName ?? BundleValidator . DetectDlcPackName ( files ) ;
233+ if ( string . IsNullOrWhiteSpace ( dlcPackName ) )
234+ throw new InvalidOperationException ( "DLC pack name cannot be determined." ) ;
235+
236+ return dlcPackName ;
237+ }
238+
224239 private static List < InstallOperation > DeduplicatePatches ( List < InstallOperation > ops )
225240 {
226241 var result = new List < InstallOperation > ( ) ;
0 commit comments