Skip to content

Commit 0ba774e

Browse files
committedMay 8, 2024
Paper scripts load
1 parent 776616d commit 0ba774e

File tree

25 files changed

+182
-80
lines changed

25 files changed

+182
-80
lines changed
 

‎buildSrc/build.gradle.kts

+2-2
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@ repositories {
77
}
88

99
dependencies {
10-
implementation("org.jetbrains.kotlin:kotlin-gradle-plugin:1.9.0")
10+
implementation("org.jetbrains.kotlin:kotlin-gradle-plugin:1.9.20")
1111
implementation("com.github.johnrengelman:shadow:8.1.1")
1212
}
1313

1414
java {
15-
toolchain.languageVersion.set(JavaLanguageVersion.of(17))
15+
toolchain.languageVersion.set(JavaLanguageVersion.of(21))
1616
}

‎buildSrc/src/main/kotlin/api-plugin.gradle.kts

-3
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,6 @@ plugins {
44
id("common")
55
}
66

7-
dependencies {
8-
compileOnly("net.kyori:adventure-api:4.14.0")
9-
}
107

118
tasks.jar {
129
duplicatesStrategy = DuplicatesStrategy.EXCLUDE

‎buildSrc/src/main/kotlin/common.gradle.kts

+1
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,5 @@ version = "0.1.7"
77

88
repositories {
99
mavenCentral()
10+
maven("https://s01.oss.sonatype.org/content/repositories/snapshots/")
1011
}

‎buildSrc/src/main/kotlin/runtime-plugin.gradle.kts

-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ plugins {
99
dependencies {
1010
shadow(project(":KotlinScript-script-definition"))
1111
shadow(kotlin("script-runtime"))
12-
shadow("net.kyori:adventure-api:4.14.0")
1312
}
1413

1514
tasks {

‎gradle/libraries.versions.toml

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
[versions]
2+
minecraft = "1.20.6"
3+
paper-api = "1.20.6-R0.1-SNAPSHOT"
4+
sponge8-api = "8.1.0"
5+
6+
[libraries]
7+
paper = { group = "io.papermc.paper", name = "paper-api", version.ref = "paper-api" }
8+
sponge8 = { group = "org.spongepowered", name = "spongeapi", version.ref = "sponge8-api" }

‎gradle/toolchain.versions.toml

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
[versions]
2+
3+
[plugins]
4+
5+
[libraries]
+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
distributionBase=GRADLE_USER_HOME
22
distributionPath=wrapper/dists
3-
distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-bin.zip
3+
distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip
44
zipStoreBase=GRADLE_USER_HOME
55
zipStorePath=wrapper/dists

‎kotlin-script-api/build.gradle.kts

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
21
plugins {
32
id("api-plugin")
43
}
@@ -10,6 +9,6 @@ repositories {
109
dependencies {
1110
compileOnly(kotlin("scripting-jvm-host"))
1211
compileOnly(project(":KotlinScript-script-definition"))
13-
compileOnly("io.papermc.paper:paper-api:1.20.4-R0.1-SNAPSHOT")
12+
compileOnly(libs.paper)
1413
compileOnly("org.spongepowered:spongeapi:8.1.0")
1514
}

‎kotlin-script-api/src/main/kotlin/me/zodd/ScriptCoreLogger.kt

+58-11
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,35 @@
11
package me.zodd
22

3-
import org.apache.logging.log4j.Logger
4-
import org.spongepowered.plugin.PluginContainer
53
import java.io.File
4+
import kotlin.reflect.KClass
65
import kotlin.script.experimental.api.EvaluationResult
76
import kotlin.script.experimental.api.ResultWithDiagnostics
7+
import kotlin.script.experimental.api.ScriptCompilationConfiguration
88
import kotlin.script.experimental.api.ScriptDiagnostic
9+
import kotlin.script.experimental.api.ScriptEvaluationConfiguration
910
import kotlin.script.experimental.api.SourceCode
1011
import kotlin.script.experimental.api.asSuccess
12+
import kotlin.script.experimental.api.compilationConfiguration
1113
import kotlin.script.experimental.api.compilerOptions
1214
import kotlin.script.experimental.api.defaultImports
15+
import kotlin.script.experimental.api.hostConfiguration
1316
import kotlin.script.experimental.api.onFailure
1417
import kotlin.script.experimental.api.onSuccess
18+
import kotlin.script.experimental.api.providedProperties
19+
import kotlin.script.experimental.api.refineConfigurationBeforeEvaluate
20+
import kotlin.script.experimental.api.scriptExecutionWrapper
1521
import kotlin.script.experimental.host.toScriptSource
22+
import kotlin.script.experimental.jvm.baseClassLoader
23+
import kotlin.script.experimental.jvm.dependenciesFromClassContext
24+
import kotlin.script.experimental.jvm.dependenciesFromClassloader
1625
import kotlin.script.experimental.jvm.dependenciesFromCurrentContext
1726
import kotlin.script.experimental.jvm.jvm
27+
import kotlin.script.experimental.jvm.loadDependencies
28+
import kotlin.script.experimental.jvm.util.classpathFromClass
29+
import kotlin.script.experimental.jvm.util.classpathFromClassloader
1830
import kotlin.script.experimental.jvmhost.BasicJvmScriptingHost
1931
import kotlin.script.experimental.jvmhost.createJvmCompilationConfigurationFromTemplate
32+
import kotlin.script.experimental.jvmhost.createJvmEvaluationConfigurationFromTemplate
2033

2134
// todo: Find a better logging solution
2235
// This only affects loading, plugins use their platforms logger.
@@ -30,14 +43,19 @@ object ScriptCoreLogger {
3043
interface KtScriptPluginContainer<C, L> {
3144
// The platforms container
3245
val container: C
46+
3347
// The logger the Platform will use
3448
val logger: L
3549
}
3650

3751
/**
3852
* Represents a single Script File
3953
*/
40-
class Script(private val script: String, private val defaultPlatformImports: List<String>) {
54+
class Script(
55+
private val script: String,
56+
private val defaultPlatformImports: List<String>,
57+
private val scriptContainer: KtScriptPluginContainer<*, *>
58+
) {
4159
private val defaultImports: List<String> = listOf(
4260
//Kotlin Packages
4361
"kotlin.reflect.*",
@@ -56,19 +74,34 @@ class Script(private val script: String, private val defaultPlatformImports: Lis
5674
}
5775

5876
private val configuration = createJvmCompilationConfigurationFromTemplate<PluginScript> {
59-
compilerOptions("-jvm-target", "17")
77+
compilerOptions("-jvm-target=21")
6078
defaultImports(*mergeImports().toTypedArray())
6179
jvm {
62-
dependenciesFromCurrentContext(
63-
wholeClasspath = true
64-
)
80+
81+
dependenciesFromCurrentContext(wholeClasspath = true)
82+
6583
// https://youtrack.jetbrains.com/issue/KT-57907
6684
compilerOptions.append("-Xadd-modules=ALL-MODULE-PATH")
6785
}
6886
}
6987

88+
private val evalConfig = createJvmEvaluationConfigurationFromTemplate<PluginScript> {
89+
90+
// scriptExecutionWrapper {
91+
// val api = scriptContainer
92+
// }
93+
94+
}
95+
7096
fun eval(): ResultWithDiagnostics<EvaluationResult> {
71-
return BasicJvmScriptingHost().eval(compile(), configuration, null)
97+
return BasicJvmScriptingHost().eval(compile(), configuration, evalConfig)
98+
}
99+
100+
fun eval(
101+
configuration: ScriptCompilationConfiguration,
102+
evalConfig: ScriptEvaluationConfiguration
103+
): ResultWithDiagnostics<EvaluationResult> {
104+
return BasicJvmScriptingHost().eval(compile(), configuration, evalConfig)
72105
}
73106

74107
private fun compile(): SourceCode {
@@ -87,19 +120,33 @@ object ScriptLoader {
87120
* defaultPlatformImports should be a list of common imports for scripts to use
88121
* This will allow scripts to omit these imports
89122
*/
90-
fun loadScripts(defaultPlatformImports: List<String>) {
123+
fun loadScripts(container: KtScriptPluginContainer<*, *>, defaultPlatformImports: List<String>) {
124+
scriptFileDir.mkdirs()
125+
scriptFileDir.listFiles()?.forEach { file ->
126+
ScriptCoreLogger.logger.info("Loading script : ${file.name}...")
127+
Script(file.readText(), defaultPlatformImports, container).eval().logResult(file.name)
128+
}
129+
}
130+
131+
fun loadScripts(
132+
container: KtScriptPluginContainer<*, *>,
133+
defaultPlatformImports: List<String>,
134+
configuration: ScriptCompilationConfiguration,
135+
evalConfig: ScriptEvaluationConfiguration,
136+
) {
91137
scriptFileDir.mkdirs()
92138
scriptFileDir.listFiles()?.forEach { file ->
93139
ScriptCoreLogger.logger.info("Loading script : ${file.name}...")
94-
Script(file.readText(),defaultPlatformImports).eval().logResult(file.name)
140+
Script(file.readText(), defaultPlatformImports, container).eval(configuration, evalConfig)
141+
.logResult(file.name)
95142
}
96143
}
97144

98145
private fun ResultWithDiagnostics<EvaluationResult>.logResult(name: String) {
99146
onFailure {
100147
LogInfo(name, it.reports).printLog()
101148
}.onSuccess {
102-
ScriptCoreLogger.logger.info("Script: $name successfully loaded!")
149+
ScriptCoreLogger.logger.info("Script: $name successfully loaded! - {${it}}")
103150
asSuccess()
104151
}
105152
}

‎platforms/paper/api/build.gradle.kts

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,6 @@ repositories {
77
}
88

99
dependencies {
10-
compileOnly("io.papermc.paper:paper-api:1.20.4-R0.1-SNAPSHOT")
10+
compileOnly(libs.paper)
1111
compileOnly(project(":KotlinScript-kotlin-script-api"))
1212
}
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,24 @@
11
package me.zodd
22

33
import org.bukkit.plugin.Plugin
4-
import java.util.logging.Logger
4+
import org.slf4j.Logger
55

6-
class API(
6+
data class API(
77
override val container: Plugin,
88
override val logger: Logger,
99
) : KtScriptPluginContainer<Plugin, Logger> {
1010

1111
companion object {
1212
lateinit var container: Plugin
13+
1314
lateinit var logger: Logger
1415
}
1516

1617
init {
18+
println("Being Created")
1719
Companion.container = container
1820
Companion.logger = logger
1921
}
22+
23+
2024
}

‎platforms/paper/api/src/main/kotlin/me/zodd/Events.kt

+14-11
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
package me.zodd
22

3-
import org.bukkit.event.Event
4-
import org.bukkit.event.Listener
3+
import org.bukkit.event.entity.EntityDamageEvent
4+
import org.bukkit.event.player.PlayerJoinEvent
5+
import org.bukkit.event.player.PlayerLoginEvent
6+
import org.bukkit.event.player.PlayerQuitEvent
57
import org.bukkit.event.server.ServerLoadEvent
68

79
// === EVENTS ===
810

911
// INTERACTION
12+
fun onServerLoad(executor: (ServerLoadEvent) -> Unit) = RegistrationHelper.registerListener(executor)
1013

1114

1215
//fun onBlockLeftClick(executor: (Listener,PlayerInteractEvent) -> Unit) = RegistrationHelper.registerListener(executor)
@@ -33,21 +36,21 @@ import org.bukkit.event.server.ServerLoadEvent
3336
//
3437
//fun onEntitySpawn(executor: SpawnEntityEvent.() -> Unit) = RegistrationHelper.registerListener(executor)
3538
//
36-
//fun onEntityDamage(executor: DamageEntityEvent.() -> Unit) = RegistrationHelper.registerListener(executor)
39+
fun onEntityDamage(executor: EntityDamageEvent.() -> Unit) = RegistrationHelper.registerListener(executor)
3740
//
3841
//fun onEntityRemove(executor: DestructEntityEvent.() -> Unit) = RegistrationHelper.registerListener(executor)
3942
//
4043
//fun onEntityDeath(executor: DestructEntityEvent.Death.() -> Unit) = RegistrationHelper.registerListener(executor)
4144
//
4245
//// PLAYERS
43-
//
44-
//fun onPlayerLogin(executor: ServerSideConnectionEvent.Login.() -> Unit) = RegistrationHelper.registerListener(executor)
45-
//
46-
//fun onPlayerJoin(executor: ServerSideConnectionEvent.Join.() -> Unit) = RegistrationHelper.registerListener(executor)
47-
//
48-
//fun onPlayerLeave(executor: ServerSideConnectionEvent.Disconnect.() -> Unit) =
49-
// RegistrationHelper.registerListener(executor)
50-
//
46+
47+
fun onPlayerLogin(executor: PlayerLoginEvent.() -> Unit) = RegistrationHelper.registerListener(executor)
48+
49+
fun onPlayerJoin(executor: PlayerJoinEvent.() -> Unit) = RegistrationHelper.registerListener(executor)
50+
51+
fun onPlayerLeave(executor: PlayerQuitEvent.() -> Unit) = RegistrationHelper.registerListener(executor)
52+
53+
5154
//fun onPlayerDamage(executor: DamageEntityEvent.() -> Unit) = onEntityDamage { if (entity() is Player) executor() }
5255
//
5356
//fun onPlayerDeath(executor: DestructEntityEvent.Death.() -> Unit) =

‎platforms/paper/api/src/main/resources/META-INF/kotlin/script/templates/me.zodd.PluginScript.classname

Whitespace-only changes.

‎platforms/paper/host/build.gradle.kts

+11-3
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,26 @@
11
plugins {
22
id("host-plugin")
3-
id("io.papermc.paperweight.userdev") version "1.5.15"
3+
id("io.papermc.paperweight.userdev") version "1.7.0"
4+
id("xyz.jpenilla.run-paper") version "2.2.0"
45
}
56

67
dependencies {
78
shadow(project(":paper-api"))
89

9-
paperweight.paperDevBundle("1.20.4-R0.1-SNAPSHOT")
1010

11-
api("net.kyori:adventure-api:4.14.0")
11+
paperweight.paperDevBundle(libs.versions.paper.api)
1212
}
1313

1414
tasks {
1515
assemble {
1616
dependsOn(reobfJar)
1717
}
18+
19+
runServer {
20+
minecraftVersion(libs.versions.minecraft.get())
21+
}
22+
}
23+
24+
java {
25+
toolchain.languageVersion.set(JavaLanguageVersion.of(21))
1826
}
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,58 @@
11
package me.zodd
22

3-
import org.bukkit.event.server.ServerLoadEvent
43
import org.bukkit.plugin.java.JavaPlugin
4+
import kotlin.script.experimental.api.ScriptAcceptedLocation
5+
import kotlin.script.experimental.api.acceptedLocations
6+
import kotlin.script.experimental.api.compilerOptions
7+
import kotlin.script.experimental.api.defaultImports
8+
import kotlin.script.experimental.api.ide
9+
import kotlin.script.experimental.jvm.baseClassLoader
10+
import kotlin.script.experimental.jvm.dependenciesFromClassContext
11+
import kotlin.script.experimental.jvm.dependenciesFromClassloader
12+
import kotlin.script.experimental.jvm.dependenciesFromCurrentContext
13+
import kotlin.script.experimental.jvm.jvm
14+
import kotlin.script.experimental.jvm.loadDependencies
15+
import kotlin.script.experimental.jvmhost.createJvmCompilationConfigurationFromTemplate
16+
import kotlin.script.experimental.jvmhost.createJvmEvaluationConfigurationFromTemplate
517

618
class Host : JavaPlugin() {
19+
720
override fun onEnable() {
8-
API(this, logger)
21+
slF4JLogger.info("Loading Kotlin Scripting Host...")
922

10-
logger.info("Loading Kotlin Scripting Host...")
23+
val imports = listOf(
24+
"kotlin.reflect.*",
25+
"kotlin.reflect.jvm.*",
26+
"me.zodd.*",
27+
"net.kyori.adventure.text.*",
28+
"org.bukkit.*",
29+
"org.slf4j.Logger"
30+
)
1131

12-
ScriptLoader.loadScripts(listOf("org.bukkit.*"))
32+
val compConfig = createJvmCompilationConfigurationFromTemplate<PluginScript> {
33+
ide.acceptedLocations(ScriptAcceptedLocation.Everywhere)
34+
compilerOptions("-jvm-target=21")
35+
defaultImports(imports)
36+
jvm {
37+
dependenciesFromCurrentContext(wholeClasspath = true)
38+
compilerOptions.append("-Xadd-modules=ALL-MODULE-PATH")
39+
}
40+
}
1341

14-
onServerLoad {
15-
logger.info("Hello world!")
42+
val evalConfig = createJvmEvaluationConfigurationFromTemplate<PluginScript> {
43+
jvm {
44+
baseClassLoader.put(this@Host.classLoader)
45+
}
1646
}
1747

18-
logger.info("Finished loading scripts...")
48+
ScriptLoader.loadScripts(
49+
API(this, slF4JLogger),
50+
imports,
51+
compConfig,
52+
evalConfig
53+
)
54+
55+
slF4JLogger.info("Finished loading scripts...")
1956
}
2057
}
21-
fun onServerLoad(executor: (ServerLoadEvent) -> Unit) = RegistrationHelper.registerListener(executor)
58+

‎platforms/paper/host/src/main/resources/META-INF/kotlin/script/templates/me.zodd.PluginScript.classname

Whitespace-only changes.

‎platforms/paper/script-runtime/build.gradle.kts

+11-1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,16 @@ repositories {
88

99
dependencies {
1010
shadow(project(":paper-api"))
11-
shadow("io.papermc.paper:paper-api:1.20.4-R0.1-SNAPSHOT")
11+
shadow(libs.paper)
1212
}
1313

14+
tasks {
15+
jar {
16+
enabled = false
17+
finalizedBy("shadowJar")
18+
}
19+
shadowJar {
20+
archiveClassifier.set("")
21+
configurations.add(project.configurations.shadow.get())
22+
}
23+
}

‎platforms/paper/script-runtime/src/main/resources/META-INF/kotlin/script/templates/me.zodd.PluginScript.classname

Whitespace-only changes.

‎platforms/sponge/api/build.gradle.kts

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,6 @@ plugins {
33
}
44

55
dependencies {
6-
compileOnly("org.spongepowered:spongeapi:8.1.0")
6+
compileOnly(libs.sponge8)
77
compileOnly(project(":KotlinScript-kotlin-script-api"))
88
}

‎platforms/sponge/host/build.gradle.kts

+1-4
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
1-
import org.jetbrains.kotlin.gradle.plugin.extraProperties
2-
31
plugins {
42
id("host-plugin")
53
id("org.spongepowered.gradle.plugin") version "2.2.0"
64
}
75

86
sponge {
9-
apiVersion("8.2.0-SNAPSHOT")
7+
apiVersion(libs.versions.sponge8.api.get())
108
license("MIT")
119
loader {
1210
name("java_plain")
@@ -21,6 +19,5 @@ sponge {
2119

2220
dependencies {
2321
shadow(project(":sponge-api"))
24-
api("net.kyori:adventure-api:4.14.0")
2522
}
2623

‎platforms/sponge/host/src/main/kotlin/me/zodd/Host.kt

+3-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package me.zodd
22

33
import com.google.inject.Inject
44
import org.apache.logging.log4j.Logger
5+
import org.spongepowered.api.Sponge
56
import org.spongepowered.api.config.DefaultConfig
67
import org.spongepowered.api.event.Listener
78
import org.spongepowered.api.event.lifecycle.ConstructPluginEvent
@@ -45,9 +46,10 @@ class Host @Inject internal constructor(
4546

4647
config = loadConfig()
4748

48-
ScriptLoader.loadScripts(config.defaultImports)
49+
ScriptLoader.loadScripts(this, config.defaultImports)
4950

5051
logger.info("Finished loading scripts...")
52+
5153
}
5254

5355
@Listener
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,9 @@
11
plugins {
2-
id("common")
3-
id("com.github.johnrengelman.shadow")
2+
id("runtime-plugin")
43
}
54

65
dependencies {
7-
shadow(project(":KotlinScript-script-definition"))
8-
shadow(kotlin("script-runtime"))
96
shadow(project(":sponge-api"))
10-
shadow("org.spongepowered:spongeapi:8.1.0")
11-
shadow("net.kyori:adventure-api:4.14.0")
7+
shadow(libs.sponge8)
128
}
139

14-
tasks.jar {
15-
enabled = false
16-
finalizedBy("shadowJar")
17-
}
18-
19-
tasks.shadowJar {
20-
archiveClassifier.set("")
21-
configurations.add(project.configurations.shadow.get())
22-
}

‎platforms/sponge/script-runtime/src/main/resources/META-INF/kotlin/script/templates/me.zodd.PluginScript.classname

Whitespace-only changes.

‎script-definition/src/main/kotlin/me/zodd/PluginScript.kt

+2-12
Original file line numberDiff line numberDiff line change
@@ -5,23 +5,13 @@ import kotlin.script.experimental.api.ScriptAcceptedLocation
55
import kotlin.script.experimental.api.ScriptCompilationConfiguration
66
import kotlin.script.experimental.api.acceptedLocations
77
import kotlin.script.experimental.api.compilerOptions
8+
import kotlin.script.experimental.api.defaultImports
89
import kotlin.script.experimental.api.ide
910
import kotlin.script.experimental.jvm.dependenciesFromClassloader
11+
import kotlin.script.experimental.jvm.dependenciesFromCurrentContext
1012
import kotlin.script.experimental.jvm.jvm
1113

1214
@KotlinScript(
1315
fileExtension = "plugin.kts",
14-
compilationConfiguration = ScriptConfiguration::class
1516
)
1617
abstract class PluginScript
17-
18-
object ScriptConfiguration : ScriptCompilationConfiguration({
19-
ide.acceptedLocations(ScriptAcceptedLocation.Everywhere)
20-
compilerOptions("-jvm-target", "17")
21-
jvm {
22-
dependenciesFromClassloader(
23-
wholeClasspath = true
24-
)
25-
}
26-
})
27-

‎settings.gradle.kts

+9-1
Original file line numberDiff line numberDiff line change
@@ -46,4 +46,12 @@ fun include(name: String, block: ProjectDescriptor.() -> Unit) {
4646
project(":$name").apply(block)
4747
}
4848

49-
listOf("script-definition","kotlin-script-api").forEach(::includeProject)
49+
listOf("script-definition","kotlin-script-api").forEach(::includeProject)
50+
51+
dependencyResolutionManagement {
52+
versionCatalogs {
53+
create("libs") {
54+
from(files("gradle/libraries.versions.toml"))
55+
}
56+
}
57+
}

0 commit comments

Comments
 (0)
Please sign in to comment.