Skip to content

Commit 8662513

Browse files
authored
Merge pull request #272 from PaleoCrafter/fix/forge-project-template
Fix Forge project generation for MC1.12+ and enhance Minecraft version selection
2 parents eecb94d + 826da3a commit 8662513

File tree

6 files changed

+115
-6
lines changed

6 files changed

+115
-6
lines changed

src/main/kotlin/com/demonwav/mcdev/creator/ForgeProjectSettingsWizard.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,7 @@ class ForgeProjectSettingsWizard(private val creator: MinecraftProjectCreator) :
201201
if (fullVersion != null) {
202202
settings!!.forgeVersion = fullVersion
203203
}
204+
settings!!.mcVersion = minecraftVersionBox.selectedItem as String
204205
}
205206

206207
fun error() {

src/main/kotlin/com/demonwav/mcdev/platform/forge/ForgeProjectConfiguration.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ open class ForgeProjectConfiguration : ProjectConfiguration() {
2727

2828
var mcpVersion: String = ""
2929
var forgeVersion: String = ""
30+
var mcVersion: String = ""
3031

3132
init {
3233
type = PlatformType.FORGE

src/main/kotlin/com/demonwav/mcdev/platform/forge/ForgeTemplate.kt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,13 @@ package com.demonwav.mcdev.platform.forge
1313
import com.demonwav.mcdev.platform.BaseTemplate
1414
import com.demonwav.mcdev.platform.hybrid.SpongeForgeProjectConfiguration
1515
import com.demonwav.mcdev.util.MinecraftFileTemplateGroupFactory
16+
import com.demonwav.mcdev.util.SemanticVersion
1617
import com.intellij.openapi.project.Project
1718
import com.intellij.openapi.vfs.VirtualFile
1819
import java.util.Properties
1920

2021
object ForgeTemplate {
22+
private val MC_1_12 = SemanticVersion.parse("1.12")
2123

2224
fun applyBuildGradleTemplate(project: Project,
2325
file: VirtualFile,
@@ -32,6 +34,13 @@ object ForgeTemplate {
3234
if (configuration is SpongeForgeProjectConfiguration) {
3335
properties.setProperty("SPONGE_FORGE", "true")
3436
}
37+
// Fixes builds for MC1.12+, requires FG 2.3
38+
val mcVersion = SemanticVersion.parse(configuration.mcVersion)
39+
if (mcVersion >= MC_1_12) {
40+
properties.setProperty("FORGEGRADLE_VERSION", "2.3")
41+
} else {
42+
properties.setProperty("FORGEGRADLE_VERSION", "2.2")
43+
}
3544

3645
BaseTemplate.applyTemplate(project, file, MinecraftFileTemplateGroupFactory.FORGE_BUILD_GRADLE_TEMPLATE, properties)
3746

src/main/kotlin/com/demonwav/mcdev/platform/forge/version/ForgeVersion.kt

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
package com.demonwav.mcdev.platform.forge.version
1212

1313
import com.demonwav.mcdev.util.gson
14+
import com.demonwav.mcdev.util.SemanticVersion
1415
import com.demonwav.mcdev.util.sortVersions
1516
import java.io.IOException
1617
import java.net.URL
@@ -23,16 +24,16 @@ class ForgeVersion private constructor(private val map: Map<*, *>) {
2324
}
2425

2526
fun getRecommended(versions: List<String>): String {
26-
var recommended = "1.7"
27+
var recommended = SemanticVersion.parse("1.7")
2728
for (version in versions) {
2829
getPromo(version) ?: continue
29-
30-
if (recommended < version) {
31-
recommended = version
30+
val semantic = SemanticVersion.parse(version)
31+
if (recommended < semantic) {
32+
recommended = semantic
3233
}
3334
}
3435

35-
return recommended
36+
return recommended.versionString
3637
}
3738

3839
fun getPromo(version: String): Double? {
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
/*
2+
* Minecraft Dev for IntelliJ
3+
*
4+
* https://minecraftdev.org
5+
*
6+
* Copyright (c) 2017 minecraft-dev
7+
*
8+
* MIT License
9+
*/
10+
11+
package com.demonwav.mcdev.util
12+
13+
import com.demonwav.mcdev.util.SemanticVersion.Companion.VersionPart.PreReleasePart
14+
import com.demonwav.mcdev.util.SemanticVersion.Companion.VersionPart.ReleasePart
15+
16+
/**
17+
* Represents a comparable and generalised "semantic version".
18+
* Each constituent part (delimited by periods in a version string) contributes
19+
* to the version ranking with decreasing priority from left to right.
20+
*/
21+
class SemanticVersion(val parts: List<VersionPart>) : Comparable<SemanticVersion> {
22+
val versionString = parts.map { it.versionString }.joinToString(".");
23+
24+
override fun compareTo(other: SemanticVersion): Int {
25+
// Zipping limits the compared parts to the shorter version, then we perform a component-wise comparison
26+
// Short-circuits if any component of this version is smaller/older
27+
val result = parts.zip(other.parts).fold(0) { acc, (a, b) -> if (acc == -1) acc else a.compareTo(b) }
28+
// When all the parts are equal, the longer version wins
29+
// Generally speaking, 1.0 is considered older than 1.0.1 (see MC 1.12 vs 1.12.1)
30+
if (parts.size != other.parts.size && result == 0) {
31+
return parts.size - other.parts.size
32+
}
33+
return result
34+
}
35+
36+
override fun equals(other: Any?) =
37+
when (other) {
38+
is SemanticVersion -> parts.size == other.parts.size && parts.zip(other.parts).all { (a, b) -> a == b }
39+
else -> false
40+
}
41+
42+
override fun hashCode() = parts.hashCode()
43+
44+
companion object {
45+
/**
46+
* Parses a version string into a comparable representation.
47+
* @throws IllegalArgumentException if any part of the version string cannot be parsed as integer or split into pre-release parts.
48+
*/
49+
fun parse(value: String): SemanticVersion {
50+
fun parseInt(part: String): Int =
51+
if (part.all { it.isDigit() })
52+
part.toInt()
53+
else
54+
throw IllegalArgumentException("Failed to parse version part as integer: $part")
55+
56+
val parts = value.split('.').map {
57+
if (it.contains("_pre")) {
58+
// There have been cases of Forge builds for MC pre-releases (1.7.10_pre4)
59+
// We're consuming the 10_pre4 and extracting 10 and 4 from it
60+
val subParts = it.split("_pre")
61+
if (subParts.size == 2) {
62+
PreReleasePart(parseInt(subParts[0]), parseInt(subParts[1]))
63+
} else {
64+
throw IllegalArgumentException("Failed to split pre-release version part into two numbers: $it")
65+
}
66+
} else {
67+
ReleasePart(parseInt(it))
68+
}
69+
}
70+
return SemanticVersion(parts)
71+
}
72+
73+
sealed class VersionPart : Comparable<VersionPart> {
74+
abstract val versionString: String
75+
76+
data class ReleasePart(val version: Int) : VersionPart() {
77+
override val versionString = version.toString()
78+
79+
override fun compareTo(other: VersionPart) =
80+
when (other) {
81+
is PreReleasePart -> if (version != other.version) version - other.version else 1
82+
is ReleasePart -> version - other.version
83+
}
84+
}
85+
86+
data class PreReleasePart(val version: Int, val pre: Int) : VersionPart() {
87+
override val versionString = "${version}_pre$pre"
88+
89+
override fun compareTo(other: VersionPart) =
90+
when (other) {
91+
is PreReleasePart -> if (version != other.version) version - other.version else pre - other.pre
92+
is ReleasePart -> if (version != other.version) version - other.version else -1
93+
}
94+
}
95+
}
96+
}
97+
}

src/main/resources/fileTemplates/j2ee/forge_build.gradle.ft

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ buildscript {
1212
#end
1313
}
1414
dependencies {
15-
classpath "net.minecraftforge.gradle:ForgeGradle:2.2-SNAPSHOT"
15+
classpath "net.minecraftforge.gradle:ForgeGradle:${FORGEGRADLE_VERSION}-SNAPSHOT"
1616
#if (${SPONGE_FORGE})
1717
classpath "gradle.plugin.org.spongepowered:spongegradle:0.8.1"
1818
#end

0 commit comments

Comments
 (0)