monun / kommand

GNU General Public License v3.0
96 stars 22 forks source link

커스텀 인첸트 registerEnchantment시 오류 발생 #12

Closed StayCake closed 3 years ago

StayCake commented 3 years ago

RegisterEnchantment 로 커스텀 인첸트 등록 시 등록 후 실행되는 모든 Kommand 내장 플러그인에서 해당 오류가 발생합니다. java.lang.ExceptionInInitializerError: null at io.github.monun.kommand.KommandArgumentSupport.<clinit>(KommandArgument.kt) ~[?:?] at io.github.monun.kommand.internal.AbstractKommandNode.<init>(AbstractKommandNode.kt:29) ~[?:?] at io.github.monun.kommand.internal.LiteralNodeImpl.<init>(LiteralNodeImpl.kt:23) ~[?:?] at io.github.monun.kommand.internal.KommandDispatcherImpl.initialize$kommand_core(KommandDispatcherImpl.kt:30) ~[?:?] at io.github.monun.kommand.internal.AbstractKommand.register(AbstractKommand.kt:39) ~[?:?] at io.github.monun.kommand.Kommand$Companion.register(Kommand.kt) ~[?:?] at io.github.monun.kommand.PluginKommand.register(Kommand.kt:38) ~[?:?] at Main$onEnable$1.invoke(Main.kt:47) ~[?:?] at Main$onEnable$1.invoke(Main.kt:46) ~[?:?] at io.github.monun.kommand.KommandKt.kommand(Kommand.kt:43) ~[?:?] at Main.onEnable(Main.kt:46) ~[?:?] at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:263) ~[patched_1.17.1.jar:git-Paper-139] at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:370) ~[patched_1.17.1.jar:git-Paper-139] at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:500) ~[patched_1.17.1.jar:git-Paper-139] at org.bukkit.craftbukkit.v1_17_R1.CraftServer.enablePlugin(CraftServer.java:527) ~[patched_1.17.1.jar:git-Paper-139] at org.bukkit.craftbukkit.v1_17_R1.CraftServer.enablePlugins(CraftServer.java:441) ~[patched_1.17.1.jar:git-Paper-139] at net.minecraft.server.MinecraftServer.loadWorld(MinecraftServer.java:639) ~[patched_1.17.1.jar:git-Paper-139] at net.minecraft.server.dedicated.DedicatedServer.initServer(DedicatedServer.java:306) ~[patched_1.17.1.jar:git-Paper-139] at net.minecraft.server.MinecraftServer.runServer(MinecraftServer.java:1126) ~[patched_1.17.1.jar:git-Paper-139] at net.minecraft.server.MinecraftServer.lambda$spin$0(MinecraftServer.java:316) ~[patched_1.17.1.jar:git-Paper-139] at java.lang.Thread.run(Thread.java:831) [?:?] Caused by: java.lang.UnsupportedOperationException: io.github.monun.kommand.KommandArgumentSupport has an error occurred while creating the instance at io.github.monun.kommand.loader.LibraryLoader.loadNMS(LibraryLoader.kt:91) ~[?:?] at io.github.monun.kommand.loader.LibraryLoader.loadNMS$default(LibraryLoader.kt:53) ~[?:?] at io.github.monun.kommand.KommandArgumentSupport$Companion.<clinit>(KommandArgument.kt:71) ~[?:?] ... 21 more Caused by: java.lang.reflect.InvocationTargetException at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[?:?] at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:78) ~[?:?] at jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[?:?] at java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) ~[?:?] at java.lang.reflect.Constructor.newInstance(Constructor.java:480) ~[?:?] at io.github.monun.kommand.loader.LibraryLoader.loadNMS(LibraryLoader.kt:80) ~[?:?] at io.github.monun.kommand.loader.LibraryLoader.loadNMS$default(LibraryLoader.kt:53) ~[?:?] at io.github.monun.kommand.KommandArgumentSupport$Companion.<clinit>(KommandArgument.kt:71) ~[?:?] ... 21 more Caused by: java.lang.ClassCastException: class enchants.RangeHarvest cannot be cast to class org.bukkit.craftbukkit.v1_17_R1.enchantments.CraftEnchantment (enchants.RangeHarvest is in unnamed module of loader org.bukkit.plugin.java.PluginClassLoader @58625d51; org.bukkit.craftbukkit.v1_17_R1.enchantments.CraftEnchantment is in unnamed module of loader 'app') at io.github.monun.kommand.v1_17_1.NMSKommandArgumentSupport.<init>(NMSKommandArgument.kt:250) ~[?:?] at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[?:?] at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:78) ~[?:?] at jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[?:?] at java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) ~[?:?] at java.lang.reflect.Constructor.newInstance(Constructor.java:480) ~[?:?] at io.github.monun.kommand.loader.LibraryLoader.loadNMS(LibraryLoader.kt:80) ~[?:?] at io.github.monun.kommand.loader.LibraryLoader.loadNMS$default(LibraryLoader.kt:53) ~[?:?] at io.github.monun.kommand.KommandArgumentSupport$Companion.<clinit>(KommandArgument.kt:71) ~[?:?] ... 21 more

monun commented 3 years ago

libraries에 kommand-api가 아닌 kommand를 사용하세요

monun commented 3 years ago

아 사용하셨네요 그런데 커스텀인챈트 플러그인이 제가 뭔지 모르겠습니다

StayCake commented 3 years ago

아 사용하셨네요 그런데 커스텀인챈트 플러그인이 제가 뭔지 모르겠습니다

직접 만든 플러그인을 사용하고 있습니다. Unsafe 등록을 막기 위해 Enchantment 클래스에서 직접 registerEnchantment를 통해 등록 후 작동하는 플러그인 입니다.

StayCake commented 3 years ago

아 사용하셨네요 그런데 커스텀인챈트 플러그인이 제가 뭔지 모르겠습니다.

Enchantment ID 충돌이었습니다. 내부에서 해결했습니다.

StayCake commented 3 years ago

아 사용하셨네요 그런데 커스텀인챈트 플러그인이 제가 뭔지 모르겠습니다.

Enchantment ID 충돌이었습니다. 내부에서 해결했습니다.

해당 환경에서 RegisterEnchantment가 주석 처리 되어 있었습니다. 다시한번 확인 부탁드립니다. 문제를 일으키는 플러그인은 아래와 같습니다 https://github.com/StayCake/CustomEnchant

patrick-choe commented 3 years ago
Caused by: java.lang.ClassCastException: class enchants.RangeHarvest cannot be cast to class org.bukkit.craftbukkit.v1_17_R1.enchantments.CraftEnchantment

Kommand 내부에서는, org.bukkit.enchantments.Enchantment 에 registerEnchantment 로 등록된 모든 인챈트들을 가져와, CraftEnchantment 로 캐스팅 후, handle을 가져와 이를 이용해 net.minecraft.world.item.enchantment.Enchantment 와 org.bukkit.enchantments.Enchantment 를 이어주는 맵을 작성합니다.

여기서, 작성자분께서 만드신 플러그인은, minecraft 내부의 인챈트가 아닌, Bukkit의 Enchantment를 확장한 클래스이다보니 발생하는 오류로 추정됩니다.

아마 현재로써는 Bukkit API로만 작성된 Enchantment를 kommand에서 사용할 마땅한 해결책이 없지 않을까 싶습니다.

StayCake commented 3 years ago
Caused by: java.lang.ClassCastException: class enchants.RangeHarvest cannot be cast to class org.bukkit.craftbukkit.v1_17_R1.enchantments.CraftEnchantment

Kommand 내부에서는, org.bukkit.enchantments.Enchantment 에 registerEnchantment 로 등록된 모든 인챈트들을 가져와, CraftEnchantment 로 캐스팅 후, handle을 가져와 이를 이용해 net.minecraft.world.item.enchantment.Enchantment 와 org.bukkit.enchantments.Enchantment 를 이어주는 맵을 작성합니다.

여기서, 작성자분께서 만드신 플러그인은, minecraft 내부의 인챈트가 아닌, Bukkit의 Enchantment를 확장한 클래스이다보니 발생하는 오류로 추정됩니다.

아마 현재로써는 Bukkit API로만 작성된 Enchantment를 kommand에서 사용할 마땅한 해결책이 없지 않을까 싶습니다.

Kommand를 포기하거나 인첸트가 아닌 다른 방식으로 속성을 적용해야 할 수 밖에 없는 상황인 것이군요. 알겠습니다.