Skip to content

Commit dfd8b68

Browse files
authored
Support neoforge for 26.1 and above (packwiz#386)
1 parent 945f852 commit dfd8b68

3 files changed

Lines changed: 60 additions & 3 deletions

File tree

core/version_test_files/neoforge.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,7 @@
161161
<version>21.10.23-beta</version>
162162
<version>21.10.24-beta</version>
163163
<version>21.10.25-beta</version>
164+
<version>26.1.0.0-alpha.1+snapshot-1</version>
164165
<version>21.1.212</version>
165166
<version>21.8.48</version>
166167
<version>21.10.28-beta</version>
@@ -177,6 +178,10 @@
177178
<version>21.10.34-beta</version>
178179
<version>21.10.42-beta</version>
179180
<version>21.10.43-beta</version>
181+
<version>26.1.0.0-alpha.9+snapshot-6</version>
182+
<version>26.1.0.0-alpha.10+snapshot-6</version>
183+
<version>26.1.0.0-alpha.11+snapshot-7</version>
184+
<version>26.1.0.0-alpha.12+snapshot-7</version>
180185
</versions>
181186
<lastUpdated>20251101100329</lastUpdated>
182187
</versioning>

core/versionutil.go

Lines changed: 49 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -154,15 +154,50 @@ func fetchForgeStyle(q VersionListQuery, url string) (*ModLoaderVersions, error)
154154
}
155155

156156
func 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

core/versionutil_test.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,3 +127,9 @@ func TestNeoForge1211(t *testing.T) {
127127
func TestNeoForge1210(t *testing.T) {
128128
expectLatest(t, "neoforge", "1.21.10", "21.10.43-beta")
129129
}
130+
131+
func TestNeoForge261snapshot6(t *testing.T) {
132+
expectLatest(t, "neoforge", "26.1-snapshot-6", "26.1.0.0-alpha.10+snapshot-6")
133+
expectValid(t, "neoforge", "26.1-snapshot-6", "26.1.0.0-alpha.9+snapshot-6")
134+
expectInvalid(t, "neoforge", "26.1-snapshot-6", "26.1.0.0-alpha.11+snapshot-7")
135+
}

0 commit comments

Comments
 (0)