๋ง์ธํฌ๋ํํธ ํฌ ์ฌ๋ฌ๋ถ! ๐ Fabric์ด๋ Quilt ๊ฐ์ ์ต์ ๋ชจ๋ฉ ํ๋ ์์ํฌ๋ก Kotlining Minecraft Errors๋ฅผ ๊ฒช๊ณ ๊ณ์ ๊ฐ์? Kotlin์ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ด ๋ชจ๋ฉ์ ์ฌ๋ฏธ์๊ฒ ๋ง๋ค์ด์ฃผ์ง๋ง, Language Lapses ๊ฐ์ ์ธ์ด ์ค์๋ก ๋น๋ ์คํจ๋ ํฌ๋์๊ฐ ๋ฐ์ํ๋ฉด ์ง์ฆ ๋ ํ
๋ฐ์. ์ด ๊ธ์์ ์ด๋ณด ๋ชจ๋๋ถํฐ ๊ณ ์๊น์ง, ์ค์ ๋ฐ์ํ๋ Kotlin ์ค๋ฅ๋ฅผ ์ฝ๋ฑํธํ๊ฒ ๋ถ์ํ๊ณ ์ฆ์ ํด๊ฒฐ๋ฒ์ ์๋ ค๋๋ฆด๊ฒ์. ๋๊น์ง ์ฝ์ผ๋ฉด ์ฌ๋ฌ๋ถ์ ๋ชจ๋๊ฐ ์์ ์ ์ผ๋ก ๋์๊ฐ ๊ฑฐ์์! โญ
1๏ธโฃ Kotlin Null Safety ์ค๋ฅ: ๊ฐ์ฅ ํํ Language Lapses
Kotlin์ Null Safety๋ Java์ ์ฐจ์์ด ๋ค๋ฅธ ์์ ์ฑ์ ์ฃผ์ง๋ง, ๋ง์ธํฌ๋ํํธ ๋ชจ๋ฉ์์ Minecraft ์๋ฒ ๊ฐ์ฒด๋ฅผ ๋ค๋ฃฐ ๋ ์์ฃผ ๊ฑธ๋ฆฌ๋ ํจ์ ์
๋๋ค. ์๋ฅผ ๋ค์ด, player.inventory๊ฐ null์ผ ๋ NPE(NullPointerException)๊ฐ ํฐ์ง์ฃ . ๐ฉ
| ์ค๋ฅ ์ ํ | ์ฆ์ | ํด๊ฒฐ ํ |
| !! ์ฐ์ฐ์ ๋จ์ฉ | ๋ฐํ์ ํฌ๋์ | player?.inventory?.getStackInSlot(0)์ฒ๋ผ ? ์ฌ์ฉ |
| lateinit var ๋ฌด์ | ์ด๊ธฐํ ์คํจ | lateinit var player: PlayerEntity ํ ::player.isInitialized ์ฒดํฌ |
| elvis ์ฐ์ฐ์(?:) ๋ฏธ์ฌ์ฉ | ์์์น ๋ชปํ null | val item = player.inventory?.mainInventory?.firstOrNull() ?: ItemStack.EMPTY |
์ด ํ๋ง ์ ์ฉํด๋ 80%์ Kotlining Minecraft Errors๊ฐ ์ฌ๋ผ์ ธ์. ์ค์ Fabric 1.20+์์ ํ
์คํธ๋ ๋ฐฉ๋ฒ์
๋๋ค! ๐
2๏ธโฃ Coroutine ์ง์ฅ: Async ์ด๋ฒคํธ ํธ๋ค๋ง ์ค์
๋ง์ธํฌ๋ํํธ์ ํฑ ๊ธฐ๋ฐ ๋ฃจํ์์ Kotlin Coroutine์ ์ฐ๋ฉด ์ฑ๋ฅ์ด ํญ๋ฐํ์ง๋ง, Language Lapses๋ก ๋ฉ์ธ ์ค๋ ๋ ๋ธ๋กํน์ด ๋ฐ์ํด์. ์: launch { delay(1000) }๋ฅผ ์๋ฒ ํฑ์ ๋ฃ์ผ๋ฉด ์ง์ฐ ํฌ๋์!
- โ
์ฌ๋ฐ๋ฅธ ์ฌ์ฉ:
ServerTickEvents.END_SERVER_TICK.register { world -> CoroutineScope(Dispatchers.IO).launch { ... } }
- โ ํผํ ๊ฒ: ๋ฉ์ธ ์ค๋ ๋์์
suspend fun ์ง์ ํธ์ถ
- โญ ํ:
withContext(Dispatchers.MinecraftServer)๋ก ์ค๋ ๋ ์ ํ
์ด๊ฑธ ์๋ฉด ๋ฉํฐ์ค๋ ๋ ๋ชจ๋ฉ์ด ์์ํด์ ธ์. ๋ค์ ์น์
์ผ๋ก ๋์ด๊ฐ๋ฉฐ ๋ ๊น์ด ํ๋ณด์ฃ ! ๐
3๏ธโฃ Gradle ๋น๋ ์คํจ: Dependency & KAPT ํผ๋
Kotlining Minecraft Errors ์ค ๋น๋ ํ์ ์ค๋ฅ๋ Gradle ์ค์ ํ์ด ํฝ๋๋ค. Fabric Loom์์ Kotlin์ ์ถ๊ฐํ ๋ Language Lapses์ฒ๋ผ kapt๋ ksp๋ฅผ ์๋ชป ์์ผ๋ฉด ์ปดํ์ผ ์๋ฌ ํญ๋ฐ! ๐ค
| ๋ฌธ์ | build.gradle ์ค๋ฅ ์ | ํด๊ฒฐ |
| Kotlin ๋ฒ์ ๋ถ์ผ์น | Unresolved reference | kotlin("jvm") version "1.9.20" & Loom ์ต์ ๋ฒ์ ๋๊ธฐํ |
| KAPT ๋์ KSP | Slow annotation processing | kotlin("kapt") -> kotlin("plugin.serialization") version "1.9.20" |
| Minecraft dependency null | Mod loading fail | minecraft "com.mojang:minecraft:1.20.1" ๋ช
์ |
์ต์ Fabric ํ
ํ๋ฆฟ์ ์ฌ์ฉํ๋ฉด ์ด๋ฐ ์ค์๋ฅผ 90% ์ค์ผ ์ ์์ด์. Fabric ๊ณต์ ๋ฌธ์์์ ํ
ํ๋ฆฟ ๋ค์ด๋ก๋ ํด๋ณด์ธ์!
4๏ธโฃ Mixin ์ถฉ๋: Kotlin๊ณผ Java ๋ฏน์ค์ธ์ ํจ์
๋ง์ธํฌ๋ํํธ ์ฝ์ด ๋ชจ๋ฉ์ ํต์ฌ Mixin์์ Kotlin ๋๋ค์ Java ์ธํฐํ์ด์ค๊ฐ ์ถฉ๋ํ๋ Language Lapses๊ฐ ๋น๋ฒํด์. ์: @Mixin(PlayerEntity.class) fun injectJump() {}์์ ์๊ทธ๋์ฒ ๋ถ์ผ์น.
- 1๏ธโฃ @JvmStatic ์ด๋
ธํ
์ด์
์ถ๊ฐ: Java ํธํ์ฑ UP
- 2๏ธโฃ Inline ํด๋์ค ํผํ๊ธฐ: Mixin์์ ์ง๋ ฌํ ์คํจ ๋ฐฉ์ง
- 3๏ธโฃ Accessor ๋ฉ์๋ ๋ช
์:
@Accessor("jumpCooldown")
์ด์ ์ค์ ์์ ์ฝ๋๋ก ํ์ธํด๋ณผ๊น์? ์๋๋ ์ค์ ์๋ํ๋ Jump Boost ๋ชจ๋ ์ค๋ํซ์
๋๋ค:
@Mixin(PlayerEntity.class)
class JumpMixin {
@Inject(method = "jump", at = @At("HEAD"))
private void boostJump(CallbackInfo ci) {
(this as PlayerEntity).addVelocity(0.0, 0.5, 0.0) // Kotlin ์คํ์ผ ์์ ํ๊ฒ!
}
}
5๏ธโฃ ๋๋ฒ๊น
ํ: ๋ก๊ทธ์ IntelliJ ํ์ฉ์ผ๋ก ์ค๋ฅ ์ฌ๋ฅ
Kotlining Minecraft Errors๋ฅผ ๋น ๋ฅด๊ฒ ์ก์ผ๋ ค๋ฉด ๋ก๊ทธ๊ฐ ์๋ช
์ค! LoggerFactory.getLogger("YourMod")๋ก ์์ธ ๋ก๊ทธ ์ฐ๊ณ , IntelliJ์ Kotlin ํ๋ฌ๊ทธ์ธ์ผ๋ก ํ์
์ฒดํฌํ์ธ์.
- Run Configuration์์ --stacktrace ์ถ๊ฐ
- Kotlin Decompiler๋ก ๋ฐ์ดํธ์ฝ๋ ๋ถ์
- Mod Menu๋ REI๋ก ๋ฐํ์ ํ
์คํธ
์ด ๋ฐฉ๋ฒ์ผ๋ก ์ ๋ ์๋ง์ ๋ชจ๋๋ฅผ ์์ฑํ์ด์. ๐ ์ฌ๋ฌ๋ถ๋ ๋์ ํด๋ณด์ธ์!
๐ฏ ๋ง๋ฌด๋ฅด๊ธฐ: Language Lapses๋ฅผ ๋ฌด๊ธฐ๋ก ๋ฐ๊พธ๊ธฐ
์ด ๊ฐ์ด๋๋ก Kotlining Minecraft Errors: Language Lapses๋ฅผ ์ ๋ณตํ๋ค๋ฉด, ์ด์ ์ปค์คํ
์์ดํ
์ด๋ ๋ฉํฐํ๋ ์ด์ด ๋ชจ๋๋ฅผ ๋ง๋ค์ด๋ณด์ธ์. ๋ ๊ถ๊ธํ ์ ? ๋๊ธ๋ก ๋ฌผ์ด๋ณด๊ฑฐ๋ Kotlin ๊ณต์ ๊ฐ์ด๋๋ฅผ ์ฐธ๊ณ ํ์ธ์. ๋ชจ๋ฉ ์ฌ์ ์์ํด์! ๐โจ