Skip to content

Commit 34f7ec9

Browse files
Load addons as plugins
1 parent 9faf223 commit 34f7ec9

File tree

78 files changed

+731
-999
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

78 files changed

+731
-999
lines changed

gradle/libs.versions.toml

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
format.version = "1.1"
33

44
[versions]
5+
bytebase = "0.4.8"
56
cbf = "0.15"
67
invui = "1.37"
78
jgrapht = "1.5.2"
@@ -15,13 +16,15 @@ xenondevs-commons = "1.18"
1516
[libraries]
1617
awssdk-s3 = { group = "software.amazon.awssdk", name = "s3", version = "2.28.21" }
1718
bstats = { group = "xyz.xenondevs.bstats", name = "bstats-bukkit", version = "3.0.1" }
18-
bytbase-runtime = { group = "xyz.xenondevs.bytebase", name = "ByteBase-Runtime", version = "0.4.8" }
19+
bytebase = { group = "xyz.xenondevs.bytebase", name = "ByteBase", version.ref = "bytebase" }
20+
bytebase-runtime = { group = "xyz.xenondevs.bytebase", name = "ByteBase-Runtime", version.ref = "bytebase" }
1921
caffeine = { group = "com.github.ben-manes.caffeine", name = "caffeine", version = "3.1.8" }
2022
commons-collections = { group = "xyz.xenondevs.commons", name = "commons-collections", version.ref = "xenondevs-commons" }
2123
commons-gson = { group = "xyz.xenondevs.commons", name = "commons-gson", version.ref = "xenondevs-commons" }
2224
commons-guava = { group = "xyz.xenondevs.commons", name = "commons-guava", version.ref = "xenondevs-commons" }
2325
commons-provider = { group = "xyz.xenondevs.commons", name = "commons-provider", version.ref = "xenondevs-commons" }
2426
commons-reflection = { group = "xyz.xenondevs.commons", name = "commons-reflection", version.ref = "xenondevs-commons" }
27+
configurate-yaml = { group = "org.spongepowered", name = "configurate-yaml", version = "4.1.2" }
2528
cosmic-binary-format = { group = "xyz.xenondevs.cbf", name = "cosmic-binary-format", version.ref = "cbf" }
2629
fuzzywuzzy = { group = "me.xdrop", name = "fuzzywuzzy", version = "1.4.0" }
2730
gson = { group = "com.google.code.gson", name = "gson", version = "2.11.0" }
@@ -44,9 +47,6 @@ ktor-serialization-gson-jvm = { group = "io.ktor", name = "ktor-serialization-gs
4447
ktor-server-cio-jvm = { group = "io.ktor", name = "ktor-server-cio-jvm", version.ref = "ktor" }
4548
ktor-server-core-jvm = { group = "io.ktor", name = "ktor-server-core-jvm", version.ref = "ktor" }
4649
lz4 = { group = "org.lz4", name = "lz4-java", version = "1.8.0" }
47-
maven-resolver-connector-basic = { group = "org.apache.maven.resolver", name = "maven-resolver-connector-basic", version = "1.9.18" }
48-
maven-resolver-provider = { group = "org.apache.maven", name = "maven-resolver-provider", version = "3.9.9" }
49-
maven-resolver-transport-http = { group = "org.apache.maven.resolver", name = "maven-resolver-transport-http", version = "1.9.22" }
5050
minecraft-asset-downloader = { group = "xyz.xenondevs", name = "minecraft-asset-downloader", version = "1.3" }
5151
minecraft-model-renderer = { group = "xyz.xenondevs", name = "minecraft-model-renderer", version = "1.3" }
5252
paper-api = { group = "io.papermc.paper", name = "paper-api", version.ref = "paper" }
@@ -58,7 +58,6 @@ cbf = ["cosmic-binary-format"]
5858
jgrapht = ["jgrapht-core", "jgrapht-io"]
5959
kotlin = ["kotlin-stdlib", "kotlin-reflect", "kotlinx-coroutines-core-jvm", "kotlinx-coroutines-debug"]
6060
ktor = ["ktor-server-core-jvm", "ktor-server-cio-jvm", "ktor-client-core-jvm", "ktor-client-cio-jvm", "ktor-client-content-negotiation", "ktor-serialization-gson-jvm"]
61-
maven-resolver = ["maven-resolver-provider", "maven-resolver-connector-basic", "maven-resolver-transport-http"]
6261
minecraft-assets = ["minecraft-asset-downloader", "minecraft-model-renderer"]
6362
test = ["kotlin-test-junit", "junit-jupiter"]
6463
xenondevs-commons = ["commons-collections", "commons-gson", "commons-guava", "commons-provider", "commons-reflection"]

nova-gradle-plugin/build.gradle.kts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,19 @@ plugins {
66
}
77

88
dependencies {
9-
implementation(libs.gson)
9+
compileOnly(project(":nova"))
1010
implementation(libs.bundles.xenondevs.commons)
1111
implementation(libs.bundles.minecraft.assets)
12+
implementation(libs.configurate.yaml)
13+
implementation(libs.bytebase)
14+
compileOnly(libs.paper.api)
1215
}
1316

1417
gradlePlugin {
1518
plugins {
1619
create("nova-gradle-plugin") {
1720
id = "xyz.xenondevs.nova.nova-gradle-plugin"
18-
description = "Nova gradle plugin to assist with addon development"
21+
description = "Gradle plugin for creating Nova addons"
1922
implementationClass = "xyz.xenondevs.novagradle.NovaGradlePlugin"
2023
}
2124
}

nova-gradle-plugin/src/main/kotlin/xyz/xenondevs/novagradle/NovaGradlePlugin.kt

Lines changed: 40 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -6,45 +6,64 @@ import org.gradle.jvm.tasks.Jar
66
import org.gradle.kotlin.dsl.create
77
import org.gradle.kotlin.dsl.getByName
88
import org.gradle.kotlin.dsl.register
9-
import xyz.xenondevs.novagradle.task.AddonMetadataExtension
10-
import xyz.xenondevs.novagradle.task.AddonMetadataTask
9+
import xyz.xenondevs.novagradle.task.AddonExtension
10+
import xyz.xenondevs.novagradle.task.AddonJarTask
1111
import xyz.xenondevs.novagradle.task.GenerateLanguageFilesTask
1212
import xyz.xenondevs.novagradle.task.GenerateWailaTexturesExtension
1313
import xyz.xenondevs.novagradle.task.GenerateWailaTexturesTask
14-
import xyz.xenondevs.novagradle.util.AddonUtils
14+
import xyz.xenondevs.novagradle.task.PluginDependency
15+
import xyz.xenondevs.novagradle.task.PluginDependency.Load
16+
import xyz.xenondevs.novagradle.task.PluginDependency.Stage
17+
import xyz.xenondevs.novagradle.util.TaskUtils
1518

1619
class NovaGradlePlugin : Plugin<Project> {
1720

1821
override fun apply(project: Project) {
19-
val addonExt = project.extensions.create<AddonMetadataExtension>("addon")
20-
val addonMetadataTask = project.tasks.register<AddonMetadataTask>("addonMetadata")
21-
val jarTask = addonExt.jarTask.orElse(project.tasks.getByName<Jar>("jar"))
22-
addonMetadataTask.configure {
23-
this.id.set(addonExt.id)
22+
val libraryLoaderCfg = project.configurations.create("libraryLoader")
23+
project.configurations.getByName("implementation").extendsFrom(libraryLoaderCfg)
24+
25+
val addonExt = project.extensions.create<AddonExtension>("addon")
26+
val addonJarTask = project.tasks.register<AddonJarTask>("addonJar") {
27+
group = "build"
28+
dependsOn("jar")
29+
}
30+
addonJarTask.configure {
2431
this.addonName.set(addonExt.name)
25-
this.version.set(addonExt.version)
26-
this.novaVersion.set(addonExt.novaVersion)
2732
this.main.set(addonExt.main)
33+
this.loader.set(addonExt.loader)
34+
this.bootstrapper.set(addonExt.bootstrapper)
35+
this.version.set(addonExt.version)
36+
this.dependencies.set(addonExt.dependencies)
37+
this.dependencies.add(PluginDependency("Nova", Stage.BOOTSTRAP, Load.BEFORE, true, true))
38+
this.dependencies.add(PluginDependency("Nova", Stage.SERVER, Load.BEFORE, true, true))
39+
this.addonDescription.set(addonExt.description)
2840
this.authors.set(addonExt.authors)
29-
this.depend.set(addonExt.depend)
30-
this.softdepend.set(addonExt.softdepend)
31-
this.jarTask.set(jarTask)
41+
this.contributors.set(addonExt.contributors)
42+
this.website.set(addonExt.website)
43+
this.prefix.set(addonExt.prefix)
44+
45+
this.input.set(TaskUtils.getOutputFile(project.tasks.getByName<Jar>("jar")))
46+
this.output.set(
47+
addonExt.destination
48+
.orElse(project.layout.buildDirectory.dir("libs/"))
49+
.map {
50+
val name = addonExt.name.getOrElse(project.name)
51+
val version = addonExt.version.getOrElse(project.version.toString())
52+
it.file("$name-$version.jar")
53+
}
54+
)
3255
}
33-
jarTask.get().finalizedBy(addonMetadataTask)
3456

3557
val wailaExt = project.extensions.create<GenerateWailaTexturesExtension>("generateWailaTextures")
3658
val wailaTask = project.tasks.register<GenerateWailaTexturesTask>("generateWailaTextures")
3759
wailaTask.configure {
38-
novaVersion.set(wailaExt.novaVersion.orElse(addonExt.novaVersion))
39-
resourcesDir.set(wailaExt.resourcesDir.orElse("src/main/resources/"))
40-
addonId.set(wailaExt.addonId.orElse(addonExt.id).orElse(resourcesDir.map { AddonUtils.getAddonId(project, it) }))
41-
filter.set(wailaExt.filter.orElse { true })
60+
this.resourcesDir.set(wailaExt.resourcesDir.orElse("src/main/resources/"))
61+
this.addonId.set(addonExt.name.map { it.lowercase() })
62+
this.filter.set(wailaExt.filter.orElse { true })
4263
}
4364

4465
project.tasks.register<GenerateLanguageFilesTask>("generateLanguageFiles")
45-
46-
val novaCfg = project.configurations.create("nova")
47-
project.configurations.getByName("implementation").extendsFrom(novaCfg)
4866
}
4967

68+
5069
}
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
package xyz.xenondevs.novagradle.task
2+
3+
import org.gradle.api.file.DirectoryProperty
4+
import org.gradle.api.provider.ListProperty
5+
import org.gradle.api.provider.Property
6+
import xyz.xenondevs.novagradle.task.PluginDependency.Load
7+
import xyz.xenondevs.novagradle.task.PluginDependency.Stage
8+
import java.io.Serializable
9+
10+
abstract class AddonExtension {
11+
12+
abstract val name: Property<String>
13+
abstract val version: Property<String>
14+
abstract val main: Property<String>
15+
abstract val bootstrapper: Property<String>
16+
abstract val loader: Property<String>
17+
abstract val dependencies: ListProperty<PluginDependency>
18+
abstract val description: Property<String>
19+
abstract val authors: ListProperty<String>
20+
abstract val contributors: ListProperty<String>
21+
abstract val website: Property<String>
22+
abstract val prefix: Property<String>
23+
abstract val destination: DirectoryProperty
24+
25+
/**
26+
* Creates a dependency on a plugin named [name] in both the [Stage.BOOTSTRAP] and [Stage.SERVER] stages.
27+
* The load order is defined by [load], the plugin will require the dependency if [required] is true, and the plugin's
28+
* classes will be accessible if [joinClasspath] is true.
29+
*/
30+
fun dependency(name: String, load: Load = Load.OMIT, required: Boolean = true, joinClasspath: Boolean = true) {
31+
dependency(name, Stage.BOOTSTRAP, load, required, joinClasspath)
32+
dependency(name, Stage.SERVER, load, required, joinClasspath)
33+
}
34+
35+
/**
36+
* Creates a dependency on a plugin named [name] in the specified [stage].
37+
* The load order is defined by [load], the plugin will require the dependency if [required] is true, and the plugin's
38+
* classes will be accessible if [joinClasspath] is true.
39+
*/
40+
fun dependency(name: String, stage: Stage, load: Load = Load.OMIT, required: Boolean = true, joinClasspath: Boolean = true) {
41+
dependencies.add(PluginDependency(name, stage, load, required, joinClasspath))
42+
}
43+
44+
}
45+
46+
data class PluginDependency(val name: String, val stage: Stage, val load: Load, val required: Boolean, val joinClasspath: Boolean) : Serializable {
47+
48+
/**
49+
* The stage in which the dependency exists.
50+
*/
51+
enum class Stage {
52+
BOOTSTRAP, SERVER
53+
}
54+
55+
/**
56+
* Defines the load order of the dependency and your plugin.
57+
*/
58+
enum class Load {
59+
60+
/**
61+
* The dependency will be loaded before your plugin.
62+
*/
63+
BEFORE,
64+
65+
/**
66+
* The dependency will be loaded after your plugin.
67+
*/
68+
AFTER,
69+
70+
/**
71+
* The load order is unspecified.
72+
*/
73+
OMIT
74+
}
75+
76+
}

0 commit comments

Comments
 (0)