@@ -154,15 +154,50 @@ func fetchForgeStyle(q VersionListQuery, url string) (*ModLoaderVersions, error)
154154}
155155
156156func fetchNeoForgeStyle (q VersionListQuery , url string ) (* ModLoaderVersions , error ) {
157- // NeoForge style:
157+ // NeoForge style, for mc versions above 26.1:
158+ // If minecraft versions are in the form of year.major.minor-(pre-release),
159+ // then neoforge versions are in the form of year.major.minor.x(nf-pre-release)+(pre-release)
160+ // Eg, for minecraft 26.1-snapshot-6, neoforge has versions 26.1.0.0-alpha.9+snapshot-6 and 26.1.0.0-alpha.10+snapshot-6
161+
162+ var mcSplit = strings .SplitN (q .McVersion , "." , 3 )
163+
164+ if len (mcSplit ) < 2 {
165+ // This does not appear to be a minecraft version that's formatted in a way that neoforge's scheme supports
166+ return nil , fmt .Errorf ("packwiz cannot detect compatible %s versions for this Minecraft version (%s)" , q .Loader .FriendlyName , q .McVersion )
167+ }
168+
169+ var year = mcSplit [0 ]
170+ var major = mcSplit [1 ]
171+ var minor = "0"
172+ var prerelease = ""
173+
174+ if len (mcSplit ) == 3 {
175+ minor , prerelease , _ = strings .Cut (mcSplit [2 ], "-" )
176+ } else {
177+ major , prerelease , _ = strings .Cut (mcSplit [1 ], "-" )
178+ }
179+
180+ var requiredPrefix = year + "." + major + "." + minor
181+ var requiredSuffix = prerelease
182+
183+ return fetchMavenWithFilterMap (q , url , func (version string ) * string {
184+ if strings .HasPrefix (version , requiredPrefix ) && strings .HasSuffix (version , requiredSuffix ) {
185+ return & version
186+ }
187+ return nil
188+ })
189+ }
190+
191+ func fetchOldNeoForgeStyle (q VersionListQuery , url string ) (* ModLoaderVersions , error ) {
192+ // NeoForge style, for mc versions below 1.21.11:
158193 // If minecraft versions are in the form of 1.a.b, then neoforge versions are in the form of a.b.x
159194 // Eg, for minecraft 1.20.6, neoforge version 20.6.2 and 20.6.83-beta would both be valid versions
160195 // for minecraft 1.20.2, neoforge version 20.2.23-beta
161196 // for minecraft 1.21, neoforge version 21.0.143 would be valid
162197
163198 var mcSplit = strings .Split (q .McVersion , "." )
164199 if len (mcSplit ) < 2 {
165- // This does not appear to be a minecraft version that's formatted in a way that matches neoforge
200+ // This does not appear to be a minecraft version that's formatted in a way that neoforge's scheme supports
166201 return nil , fmt .Errorf ("packwiz cannot detect compatible %s versions for this Minecraft version (%s)" , q .Loader .FriendlyName , q .McVersion )
167202 }
168203 var mcMajor = mcSplit [1 ]
@@ -247,7 +282,18 @@ func fetchForNeoForge(q VersionListQuery) (*ModLoaderVersions, error) {
247282 if q .McVersion == "1.20.1" {
248283 return fetchForgeStyle (q , "https://maven.neoforged.net/releases/net/neoforged/forge/maven-metadata.xml" )
249284 } else {
250- return fetchNeoForgeStyle (q , "https://maven.neoforged.net/releases/net/neoforged/neoforge/maven-metadata.xml" )
285+ // Mojang changed versioning schemes between 1.21.11 and 26.1
286+ // The old versioning scheme was 1.major.minor, which changed to year.major(.patch)
287+ // With snapshot releases for 26.1 being eg 26.1-snapshot.1
288+
289+ // NeoForge's versioning scheme changed with that. Luckily all versions using the old versioning
290+ // scheme start with "1.". Well, some things don't (alpha versions, snapshot versions, etc) but NeoForge
291+ // doesn't support any of those either way.
292+ if strings .HasPrefix (q .McVersion , "1." ) {
293+ return fetchOldNeoForgeStyle (q , "https://maven.neoforged.net/releases/net/neoforged/neoforge/maven-metadata.xml" )
294+ } else {
295+ return fetchNeoForgeStyle (q , "https://maven.neoforged.net/releases/net/neoforged/neoforge/maven-metadata.xml" )
296+ }
251297 }
252298}
253299
0 commit comments