Skip to content

Commit f9a1b34

Browse files
committed
Merge branch 'development' into main
2 parents 1ccdc23 + 11f847b commit f9a1b34

File tree

12 files changed

+194
-12
lines changed

12 files changed

+194
-12
lines changed

src/api/cfcore.nim

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,16 @@ proc isFabricCompatible*(file: CfAddonFile): bool =
125125
return true
126126
return false
127127

128+
proc isQuiltCompatible*(file: CfAddonFile): bool =
129+
## returns true if `file` is compatible with the quilt loader.
130+
if "Quilt".Version in file.gameVersions:
131+
return true
132+
if file.name.toLower.match(re".*\Wquilt\W.*"):
133+
return true
134+
if isFabricCompatible(file):
135+
return true
136+
return false
137+
128138
proc isForgeCompatible*(file: CfAddonFile): bool =
129139
## returns true if `file` is compatible with the forge loader.
130140
if file.name.toLower.match(re".*\Wquilt\W.*") or file.name.toLower.match(re".*\Wfabric\W.*"):

src/api/metadata.nim

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,11 +48,13 @@ proc toModloaderId(loaderVersion: string, loader: Loader): string =
4848
## get the modloader id fitting for the given loader version and loader
4949
return case loader:
5050
of Loader.Forge: "forge-" & loaderVersion.split("-")[1]
51+
of Loader.Quilt: "forge-" & loaderVersion.split("-")[1]
5152
of Loader.Fabric: "fabric-" & loaderVersion
5253

5354
proc getModloaderId*(mcVersion: Version, loader: Loader, latest: bool = false): Future[string] {.async.} =
5455
## get the modloader id fitting for the given minecraft version and loader
5556
let loaderVersion = case loader:
5657
of Loader.Forge: await mcVersion.getForgeLoaderVersion(latest)
5758
of Loader.Fabric: mcVersion.getFabricLoaderVersion().await.toModloaderId(loader)
59+
of Loader.Quilt: await mcVersion.getForgeLoaderVersion(latest)
5860
return loaderVersion

src/cmd/init.nim

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import std/[asyncdispatch, os, osproc]
2-
import ../api/metadata
3-
import ../modpack/[manifest, loader, version]
2+
import ../api/[cfclient, cfcore, metadata]
3+
import ../modpack/[manifest, install, loader, version]
44
import ../term/[log, prompt]
55
import ../util/flow
66

@@ -13,9 +13,26 @@ proc paxInitManifest(): void =
1313
manifest.version = prompt(indentPrefix & "Modpack version", default = "1.0.0")
1414
manifest.mcVersion = Version(prompt(indentPrefix & "Minecraft version", default = "1.16.5"))
1515

16-
let loader = prompt(indentPrefix & "Loader", choices = @["forge", "fabric"], default = "forge").toLoader
16+
let loader = prompt(indentPrefix & "Loader", choices = @["forge", "fabric", "quilt"], default = "forge").toLoader
1717
manifest.mcModloaderId = waitFor(manifest.mcVersion.getModloaderId(loader))
1818
echoDebug "Installed ", $loader, " version ", manifest.mcModloaderId.fgGreen
19+
if loader == Loader.Quilt:
20+
let mcJumploaderMod = waitFor(fetchAddon(640265))
21+
let mcJumploaderModFiles = waitFor(fetchAddonFiles(mcJumploaderMod.projectId))
22+
let mcJumploaderModFile = mcJumploaderModFiles.selectAddonFile(loader, manifest.mcVersion, InstallStrategy.Recommended)
23+
let jumploaderMod = initManifestFile(
24+
projectId = mcJumploaderMod.projectId,
25+
fileId = mcJumploaderModFile.fileId,
26+
metadata = initManifestMetadata(
27+
name = mcJumploaderMod.name,
28+
explicit = true,
29+
pinned = true,
30+
dependencies = mcJumploaderModFile.dependencies
31+
)
32+
)
33+
manifest.installAddon(jumploaderMod)
34+
echoDebug "Installed Jumploader."
35+
echoWarn "Quilt support is experimental. Report all issues to https://github.com/froehlichA/pax/issues."
1936

2037
echoInfo "Creating manifest.."
2138
removeDir(packFolder)

src/cmd/version.nim

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import ../modpack/[manifest, loader, version]
44
import ../term/log
55

66
proc paxVersion*(version: string, loader: string, latest: bool): void =
7-
## change the minecraft version (and set the recommended fabric/forge version for it)
7+
## change the minecraft version (and set the recommended fabric/forge/quilt version for it)
88
requirePaxProject()
99

1010
echoDebug "Loading data from manifest.."

src/modpack/install.nim

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,11 @@ proc selectAddonFile*(files: seq[CfAddonFile], mpLoader: Loader, mpMcVersion: Ve
4343
if result.isNil or result.fileId < file.fileId:
4444
let onFabric = mpLoader == Loader.Fabric and file.isFabricCompatible
4545
let onForge = mpLoader == Loader.Forge and file.isForgeCompatible
46+
let onQuilt = mpLoader == Loader.Quilt and file.isQuiltCompatible
4647
let onStable = strategy == InstallStrategy.Stable and file.isStable(mpMcVersion)
4748
let onRecommended = strategy == InstallStrategy.Recommended and file.isRecommended(mpMcVersion)
4849
let onNewest = strategy == InstallStrategy.Newest and file.isNewest(mpMcVersion)
49-
if onFabric or onForge:
50+
if onFabric or onForge or onQuilt:
5051
if onStable or onRecommended or onNewest:
5152
result = file
5253

src/modpack/loader.nim

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,19 @@ import std/[strformat, strutils]
77

88
type
99
Loader* = enum
10-
Fabric, Forge
10+
Fabric, Forge, Quilt
1111

1212
converter toLoader*(str: string): Loader =
1313
## cast a string to a Loader.
1414
let str = str.toLower
1515
return
1616
if str.contains("forge"): Loader.Forge
1717
elif str.contains("fabric"): Loader.Fabric
18+
elif str.contains("quilt"): Loader.Quilt
1819
else: raise newException(ValueError, fmt"'{str}' is not a loader")
1920

2021
proc `$`*(loader: Loader): string =
2122
return case loader:
2223
of Loader.Forge: "forge"
23-
of Loader.Fabric: "fabric"
24+
of Loader.Fabric: "fabric"
25+
of Loader.Quilt: "quilt"

src/modpack/manifest.nim

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -135,8 +135,12 @@ converter toJson*(manifest: Manifest): JsonNode =
135135
}
136136

137137
proc loader*(manifest: Manifest): Loader =
138-
## returns the loader from the manifest (either Fabric or Forge)
139-
return manifest.mcModloaderId.toLoader
138+
## returns the loader from the manifest (either Fabric, Forge or Quilt)
139+
let loader = manifest.mcModloaderId.toLoader
140+
# Quilt uses the Forge loader and JumpQuilt, so handle that edge case
141+
if loader == Loader.Forge and manifest.files.filter(f => f.projectId == 640265).len > 0:
142+
return Loader.Quilt
143+
return loader
140144

141145
proc isInstalled*(manifest: Manifest, projectId: int): bool =
142146
## returns true if the ManifestFile with the given `projectId` is installed

src/pax.nim

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ let versionCmd = (
115115
help = "Minecraft version"
116116
),
117117
loader: newStringArg(@["-l", "--loader"],
118-
choices = @["fabric", "forge"],
118+
choices = @["fabric", "forge", "quilt"],
119119
help = "which loader to use"
120120
),
121121
latest: newCountArg(@["--latest"],

tests/api/tmetadata.nim

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,4 +50,17 @@ asyncBlock:
5050
doAssertRaises(MetadataClientError):
5151
discard await getModloaderId("0.0.0".Version, Loader.Forge)
5252

53+
asyncBlock: # getModLoaderId on Quilt delegates to Forge
54+
let forgeId = await getModloaderId("1.12.2".Version, Loader.Forge)
55+
let quiltId = await getModloaderId("1.12.2".Version, Loader.Quilt)
56+
doAssert forgeId == quiltId
57+
asyncBlock:
58+
let forgeId = await getModloaderId("1.16.5".Version, Loader.Forge)
59+
let quiltId = await getModloaderId("1.16.5".Version, Loader.Quilt)
60+
doAssert forgeId == quiltId
61+
asyncBlock:
62+
let forgeId = await getModloaderId("1.16.5".Version, Loader.Forge, latest = true)
63+
let quiltId = await getModloaderId("1.16.5".Version, Loader.Quilt, latest = true)
64+
doAssert forgeId == quiltId
65+
5366
runTests()

tests/cmd/tinit/tinit_quilt.nim

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
discard """
2+
joinable: false
3+
batchable: false
4+
input: '''
5+
y
6+
testmodpack
7+
testauthor
8+
1.2.3
9+
1.18.2
10+
quilt
11+
'''
12+
"""
13+
14+
import std/[sequtils, strutils, sugar, os, json]
15+
import cmd/init
16+
17+
block:
18+
removeDir("./modpack")
19+
paxInit(force = false, skipManifest = false, skipGit = true)
20+
let manifest = readFile("./modpack/manifest.json").parseJson
21+
22+
doAssert manifest["minecraft"]["version"].getStr == "1.18.2"
23+
doAssert manifest["minecraft"]["modLoaders"][0]["id"].getStr.startsWith("forge")
24+
doAssert manifest["version"].getStr == "1.2.3"
25+
doAssert manifest["author"].getStr == "testauthor"
26+
doAssert manifest["name"].getStr == "testmodpack"
27+
doAssert manifest["files"].getElems.filter(f => f["projectID"].getInt == 640265).len > 0

tests/modpack/tinstall.nim

Lines changed: 107 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,14 +145,78 @@ block: # select out of implied fabric mods
145145
doAssert mods.selectAddonFile(loader, mcVersion, InstallStrategy.Recommended) == mods[0]
146146
doAssert mods.selectAddonFile(loader, mcVersion, InstallStrategy.Newest) == mods[0]
147147

148+
block: # select out of specified quilt mods
149+
let loader = Loader.Quilt
150+
var mcVersion: Version
151+
let mods = @[
152+
initCfAddonFile(301, "rei-1.0.2.jar", @["1.14.1", "1.14.4", "Quilt"], CfAddonFileReleaseType.Release),
153+
initCfAddonFile(201, "rei-1.0.1.jar", @["1.14", "1.14.1", "Quilt"], CfAddonFileReleaseType.Release),
154+
initCfAddonFile(101, "rei-1.0.0.jar", @["1.14", "Quilt"], CfAddonFileReleaseType.Beta)
155+
]
156+
157+
mcVersion = "1.12".Version
158+
doAssertRaises(PaxInstallError):
159+
discard mods.selectAddonFile(loader, mcVersion, InstallStrategy.Stable)
160+
doAssertRaises(PaxInstallError):
161+
discard mods.selectAddonFile(loader, mcVersion, InstallStrategy.Recommended)
162+
doAssertRaises(PaxInstallError):
163+
discard mods.selectAddonFile(loader, mcVersion, InstallStrategy.Newest)
164+
165+
mcVersion = "1.14".Version
166+
doAssert mods.selectAddonFile(loader, mcVersion, InstallStrategy.Stable) == mods[1]
167+
doAssert mods.selectAddonFile(loader, mcVersion, InstallStrategy.Recommended) == mods[1]
168+
doAssert mods.selectAddonFile(loader, mcVersion, InstallStrategy.Newest) == mods[0]
169+
170+
mcVersion = "1.14.1".Version
171+
doAssert mods.selectAddonFile(loader, mcVersion, InstallStrategy.Stable) == mods[0]
172+
doAssert mods.selectAddonFile(loader, mcVersion, InstallStrategy.Recommended) == mods[0]
173+
doAssert mods.selectAddonFile(loader, mcVersion, InstallStrategy.Newest) == mods[0]
174+
175+
mcVersion = "1.14.4".Version
176+
doAssert mods.selectAddonFile(loader, mcVersion, InstallStrategy.Stable) == mods[0]
177+
doAssert mods.selectAddonFile(loader, mcVersion, InstallStrategy.Recommended) == mods[0]
178+
doAssert mods.selectAddonFile(loader, mcVersion, InstallStrategy.Newest) == mods[0]
179+
180+
block: # select out of implied quilt mods
181+
let loader = Loader.Quilt
182+
var mcVersion: Version
183+
let mods = @[
184+
initCfAddonFile(301, "rei-1.0.2-quilt.jar", @["1.14.1", "1.14.4"], CfAddonFileReleaseType.Alpha),
185+
initCfAddonFile(201, "rei-1.0.1-fabric.jar", @["1.14", "1.14.1"], CfAddonFileReleaseType.Beta),
186+
initCfAddonFile(101, "rei-1.0.0-fabric.jar", @["1.14", "Fabric", "Quilt"], CfAddonFileReleaseType.Release)
187+
]
188+
189+
mcVersion = "1.12".Version
190+
doAssertRaises(PaxInstallError):
191+
discard mods.selectAddonFile(loader, mcVersion, InstallStrategy.Stable)
192+
doAssertRaises(PaxInstallError):
193+
discard mods.selectAddonFile(loader, mcVersion, InstallStrategy.Recommended)
194+
doAssertRaises(PaxInstallError):
195+
discard mods.selectAddonFile(loader, mcVersion, InstallStrategy.Newest)
196+
197+
mcVersion = "1.14".Version
198+
doAssert mods.selectAddonFile(loader, mcVersion, InstallStrategy.Stable) == mods[2]
199+
doAssert mods.selectAddonFile(loader, mcVersion, InstallStrategy.Recommended) == mods[1]
200+
doAssert mods.selectAddonFile(loader, mcVersion, InstallStrategy.Newest) == mods[0]
201+
202+
mcVersion = "1.14.1".Version
203+
doAssert mods.selectAddonFile(loader, mcVersion, InstallStrategy.Stable) == mods[0]
204+
doAssert mods.selectAddonFile(loader, mcVersion, InstallStrategy.Recommended) == mods[0]
205+
doAssert mods.selectAddonFile(loader, mcVersion, InstallStrategy.Newest) == mods[0]
206+
207+
mcVersion = "1.14.4".Version
208+
doAssert mods.selectAddonFile(loader, mcVersion, InstallStrategy.Stable) == mods[0]
209+
doAssert mods.selectAddonFile(loader, mcVersion, InstallStrategy.Recommended) == mods[0]
210+
doAssert mods.selectAddonFile(loader, mcVersion, InstallStrategy.Newest) == mods[0]
211+
148212
block: # select out of mixed mods
149213
var loader: Loader
150214
var mcVersion: Version
151215
let mods = @[
152216
initCfAddonFile(801, "abc-1.3.2-fabric.jar", @["1.16.1", "1.16.2"], CfAddonFileReleaseType.Release),
153217
initCfAddonFile(701, "abc-1.3.2-FORGE.jar", @["1.16.1", "1.16.2"], CfAddonFileReleaseType.Release),
154218
initCfAddonFile(601, "abc-1.2.2.jar", @["1.16", "1.16.1", "Forge"], CfAddonFileReleaseType.Alpha),
155-
initCfAddonFile(501, "abc-1.2.1.jar", @["1.16.1", "Fabric"], CfAddonFileReleaseType.Alpha),
219+
initCfAddonFile(501, "abc-1.2.1.jar", @["1.16.1", "Fabric", "Quilt"], CfAddonFileReleaseType.Alpha),
156220
initCfAddonFile(401, "abc-1.2.1.jar", @["1.16", "1.16.1", "Forge"], CfAddonFileReleaseType.Release),
157221
initCfAddonFile(301, "abc-1.2.0-FABRIC.jar", @["1.16"], CfAddonFileReleaseType.Release),
158222
initCfAddonFile(201, "abc-1.0.1.jar", @["1.14.4"], CfAddonFileReleaseType.Beta),
@@ -237,6 +301,48 @@ block: # select out of mixed mods
237301
doAssert mods.selectAddonFile(loader, mcVersion, InstallStrategy.Recommended) == mods[0]
238302
doAssert mods.selectAddonFile(loader, mcVersion, InstallStrategy.Newest) == mods[0]
239303

304+
# Set loader to quilt
305+
loader = Loader.Quilt
306+
307+
mcVersion = "1.12".Version
308+
doAssertRaises(PaxInstallError):
309+
discard mods.selectAddonFile(loader, mcVersion, InstallStrategy.Stable)
310+
doAssertRaises(PaxInstallError):
311+
discard mods.selectAddonFile(loader, mcVersion, InstallStrategy.Recommended)
312+
doAssertRaises(PaxInstallError):
313+
discard mods.selectAddonFile(loader, mcVersion, InstallStrategy.Newest)
314+
315+
mcVersion = "1.14".Version
316+
doAssertRaises(PaxInstallError):
317+
discard mods.selectAddonFile(loader, mcVersion, InstallStrategy.Stable)
318+
doAssertRaises(PaxInstallError):
319+
discard mods.selectAddonFile(loader, mcVersion, InstallStrategy.Recommended)
320+
doAssertRaises(PaxInstallError):
321+
discard mods.selectAddonFile(loader, mcVersion, InstallStrategy.Newest)
322+
323+
mcVersion = "1.14.1".Version
324+
doAssertRaises(PaxInstallError):
325+
discard mods.selectAddonFile(loader, mcVersion, InstallStrategy.Stable)
326+
doAssertRaises(PaxInstallError):
327+
discard mods.selectAddonFile(loader, mcVersion, InstallStrategy.Recommended)
328+
doAssertRaises(PaxInstallError):
329+
discard mods.selectAddonFile(loader, mcVersion, InstallStrategy.Newest)
330+
331+
mcVersion = "1.16".Version
332+
doAssert mods.selectAddonFile(loader, mcVersion, InstallStrategy.Stable) == mods[5]
333+
doAssert mods.selectAddonFile(loader, mcVersion, InstallStrategy.Recommended) == mods[5]
334+
doAssert mods.selectAddonFile(loader, mcVersion, InstallStrategy.Newest) == mods[0]
335+
336+
mcVersion = "1.16.1".Version
337+
doAssert mods.selectAddonFile(loader, mcVersion, InstallStrategy.Stable) == mods[0]
338+
doAssert mods.selectAddonFile(loader, mcVersion, InstallStrategy.Recommended) == mods[0]
339+
doAssert mods.selectAddonFile(loader, mcVersion, InstallStrategy.Newest) == mods[0]
340+
341+
mcVersion = "1.16.2".Version
342+
doAssert mods.selectAddonFile(loader, mcVersion, InstallStrategy.Stable) == mods[0]
343+
doAssert mods.selectAddonFile(loader, mcVersion, InstallStrategy.Recommended) == mods[0]
344+
doAssert mods.selectAddonFile(loader, mcVersion, InstallStrategy.Newest) == mods[0]
345+
240346
block: # prevent quilt mods from being selected for forge
241347
let loader = Loader.Forge
242348
let mcVersion = "1.16.1".Version

tests/modpack/tversion.nim

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,6 @@ block: # `minor` function
2626
doAssert "1.13-Snapshot".Version.minor == "1.13".Version
2727

2828
block: # `proper` function
29-
doAssert @["1.16.4".Version, "Fabric".Version, "Forge".Version].proper == @["1.16.4".Version]
29+
doAssert @["1.16.4".Version, "Fabric".Version, "Forge".Version, "Quilt".Version].proper == @["1.16.4".Version]
3030
doAssert @["Forge".Version, "1.12-Snapshot".Version].proper == @["1.12-Snapshot".Version]
3131

0 commit comments

Comments
 (0)