monun / heartbeat-coroutines Goto Github PK
View Code? Open in Web Editor NEWCoroutine for Bukkit
License: GNU General Public License v3.0
Coroutine for Bukkit
License: GNU General Public License v3.0
Coroutine 예제에 damageAll()이 damaegAll()로 적혀 있음
Suspension
누적 지연 기능을 가진 클래스입니다.
Dispatchers.Hearbeat는 Coroutine을...
Dispatchers.Hearbeat -> Dispatchers.Heartbeat
README의 FSM 예시 when 부분 오류
Boolean과 Int 비교
코드는 아래와 같습니다. (예제 코드와 거의 같습니다.)
override fun onEnable() {
HeartbeatScope().launch {
val suspension = Suspension()
suspension.delay(3000L)
logger.info("Hello")
}
}
Gradle은 아래와 같고 ShadowJar로 빌드했습니다.
plugins {
id 'java'
id 'org.jetbrains.kotlin.jvm' version '1.9.0'
id 'com.github.johnrengelman.shadow' version '8.1.1'
}
group = 'space.zlfn'
version = '0.1'
repositories {
mavenCentral()
maven {
name = "papermc-repo"
url = "https://repo.papermc.io/repository/maven-public/"
}
maven {
name = "sonatype"
url = "https://oss.sonatype.org/content/groups/public/"
}
}
dependencies {
compileOnly "io.papermc.paper:paper-api:1.20.1-R0.1-SNAPSHOT"
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.2'
implementation("io.github.monun:heartbeat-coroutines:0.0.5")
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
}
.....
plugins {
id 'java'
id 'org.jetbrains.kotlin.jvm' version '1.9.0'
id 'com.github.johnrengelman.shadow' version '8.1.1'
}
group = 'space.zlfn'
version = '0.1'
repositories {
mavenCentral()
maven {
name = "papermc-repo"
url = "https://repo.papermc.io/repository/maven-public/"
}
maven {
name = "sonatype"
url = "https://oss.sonatype.org/content/groups/public/"
}
}
dependencies {
compileOnly "io.papermc.paper:paper-api:1.20.1-R0.1-SNAPSHOT"
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.2'
implementation("io.github.monun:heartbeat-coroutines:0.0.5")
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
}
def targetJavaVersion = 17
java {
def javaVersion = JavaVersion.toVersion(targetJavaVersion)
sourceCompatibility = javaVersion
targetCompatibility = javaVersion
if (JavaVersion.current() < javaVersion) {
toolchain.languageVersion = JavaLanguageVersion.of(targetJavaVersion)
}
}
tasks.withType(JavaCompile).configureEach {
if (targetJavaVersion >= 10 || JavaVersion.current().isJava10Compatible()) {
options.release = targetJavaVersion
}
}
processResources {
def props = [version: version]
inputs.properties props
filteringCharset 'UTF-8'
filesMatching('paper-plugin.yml') {
expand props
}
}
compileKotlin {
kotlinOptions {
jvmTarget = "17"
}
}
compileTestKotlin {
kotlinOptions {
jvmTarget = "17"
}
}
이렇게 빌드한 플러그인을 페이퍼 1.20.1#117에서 실행시켰을 때, 아래와 같은 에러가 발생합니다.
[20:01:54 ERROR]: Error occurred while enabling HelloMessage v0.1 (Is it up to date?)
java.lang.ExceptionInInitializerError: null
at io.github.monun.heartbeat.coroutines.HeartbeatCoroutineKt.HeartbeatScope(HeartbeatCoroutine.kt:68) ~[HelloMessage-0.1-all.jar:?]
at space.zlfn.hellomessage.HelloMessage.onEnable(HelloMessage.kt:24) ~[HelloMessage-0.1-all.jar:?]
at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:281) ~[paper-api-1.20.1-R0.1-SNAPSHOT.jar:?]
at io.papermc.paper.plugin.manager.PaperPluginInstanceManager.enablePlugin(PaperPluginInstanceManager.java:189) ~[paper-1.20.1.jar:git-Paper-117]
at io.papermc.paper.plugin.manager.PaperPluginManagerImpl.enablePlugin(PaperPluginManagerImpl.java:104) ~[paper-1.20.1.jar:git-Paper-117]
at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:507) ~[paper-api-1.20.1-R0.1-SNAPSHOT.jar:?]
at org.bukkit.craftbukkit.v1_20_R1.CraftServer.enablePlugin(CraftServer.java:640) ~[paper-1.20.1.jar:git-Paper-117]
at org.bukkit.craftbukkit.v1_20_R1.CraftServer.enablePlugins(CraftServer.java:551) ~[paper-1.20.1.jar:git-Paper-117]
at net.minecraft.server.MinecraftServer.loadWorld0(MinecraftServer.java:636) ~[paper-1.20.1.jar:git-Paper-117]
at net.minecraft.server.MinecraftServer.loadLevel(MinecraftServer.java:435) ~[paper-1.20.1.jar:git-Paper-117]
at net.minecraft.server.dedicated.DedicatedServer.initServer(DedicatedServer.java:308) ~[paper-1.20.1.jar:git-Paper-117]
at net.minecraft.server.MinecraftServer.runServer(MinecraftServer.java:1101) ~[paper-1.20.1.jar:git-Paper-117]
at net.minecraft.server.MinecraftServer.lambda$spin$0(MinecraftServer.java:318) ~[paper-1.20.1.jar:git-Paper-117]
at java.lang.Thread.run(Thread.java:1623) ~[?:?]
Caused by: java.lang.ClassCastException: class io.papermc.paper.plugin.entrypoint.classloader.PaperPluginClassLoader cannot be cast to class org.bukkit.plugin.java.PluginClassLoader (io.papermc.paper.plugin.entrypoint.classloader.PaperPluginClassLoader and org.bukkit.plugin.java.PluginClassLoader are in unnamed module of loader java.net.URLClassLoader @67424e82)
at io.github.monun.heartbeat.coroutines.Downstream.pullPlugin(Downstream.kt:26) ~[HelloMessage-0.1-all.jar:?]
at io.github.monun.heartbeat.coroutines.HeartbeatCoroutine.<clinit>(HeartbeatCoroutine.kt:14) ~[HelloMessage-0.1-all.jar:?]
... 14 more
반면 똑같은 코드를 1.18로 빌드(ShadowJar)해서 Paper 1.18.2#338에서 실행했을 때는 에러 없이 코드가 작동했습니다.
Plugman 등을 통해서 Heartbeat Coroutines를 사용하는 플러그인을 핫리로드할 경우, Heartbeat Coroutines를 사용하는 플러그인 전부의 코루틴이 중단됩니다. 이는 Heartbeat Coroutines가 실제로는 JavaPlugin 생명주기의 CoroutineScope를 제공하는 것이 아님을 시사합니다.
Heartbeat Coroutines를 사용하는 플러그인을 두 개 만들어보겠습니다.
//HelloMessage1
override fun onEnable() {
HeartbeatScope().launch {
while(true) {
logger.info("Hello, HeartBeat1!")
val sus = Suspension()
sus.delay(1000L)
}
}
}
//HelloMessage2
override fun onEnable() {
HeartbeatScope().launch {
while(true) {
logger.info("Hello, HeartBeat2!")
val sus = Suspension()
sus.delay(1000L)
}
}
}
그리고 plugman
등으로 둘 중 하나만 리로드합니다.
[19:01:36 INFO]: [HelloMessage1] Hello, HeartBeat1!
[19:01:37 INFO]: [HelloMessage2] Hello, HeartBeat2!
[19:01:37 INFO]: [HelloMessage1] Hello, HeartBeat1!
[19:01:38 INFO]: [HelloMessage2] Hello, HeartBeat2!
[19:01:38 INFO]: [HelloMessage1] Hello, HeartBeat1!
[19:01:39 INFO]: [HelloMessage2] Hello, HeartBeat2!
[19:01:39 INFO]: [HelloMessage1] Hello, HeartBeat1!
> plugman reload HelloMessage1
[19:01:40 INFO]: [HelloMessage1] Disabling HelloMessage1 v1.0
[19:01:40 INFO]: [HelloMessage1] Loading server plugin HelloMessage1 v1.0
[19:01:40 INFO]: [HelloMessage1] Enabling HelloMessage1 v1.0
[19:01:40 INFO]: [HelloMessage1] Hello, HeartBeat1!
[19:01:40 INFO]: [PlugMan] HelloMessage1 has been reloaded.
[19:01:41 INFO]: [HelloMessage1] Hello, HeartBeat1!
[19:01:42 INFO]: [HelloMessage1] Hello, HeartBeat1!
[19:01:43 INFO]: [HelloMessage1] Hello, HeartBeat1!
[19:01:44 INFO]: [HelloMessage1] Hello, HeartBeat1!
그러면 위와 같이 HelloMessage1
을 리로드하였음에 불구, HelloMessage2
의 코루틴도 중단된 것을 볼 수 있습니다.
(리로드는 HelloMessage1
만 되었기 때문에, HelloMessage2
의 메시지는 더 이상 나오지 않게 됩니다.)
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.